Veel näidiseid
This commit is contained in:
@@ -32,6 +32,24 @@ Käivitamiseks:
|
||||
(cat access.log; zcat access.log.1.gz) | top2
|
||||
```
|
||||
|
||||
# top3
|
||||
|
||||
Pythoni skript mis loeb standardsisendist Apache logikirjed sisse ning genereerib neist
|
||||
värvitud maailmakaardi SVG faili ```top.svg```.
|
||||
|
||||
Skripti sõltuvuste paigaldamiseks:
|
||||
|
||||
```bash
|
||||
apt install python-geoip python-numpy geoip-database # Ubuntu, Debian
|
||||
dnf install python2-GeoIP # Fedora
|
||||
```
|
||||
|
||||
Käivitamiseks:
|
||||
|
||||
```bash
|
||||
cat access.log | top3 tee/failini/BlankMap-World6.svg
|
||||
```
|
||||
|
||||
# top4
|
||||
|
||||
Pythonis kirjutatud skript mis leiab enim külastatud URL-id.
|
||||
|
||||
61
bin/filter2
61
bin/filter2
@@ -15,7 +15,7 @@ try:
|
||||
scope_begin = datetime.strptime(sys.argv[2], "%Y-%m-%d %H:%M:%S")
|
||||
except ValueError:
|
||||
# Ei suutnud parsida kellaaega YYYY-mm-dd HH:MM:SS formaadis,
|
||||
# proovime test formaati veel
|
||||
# proovime teist formaati veel
|
||||
scope_begin = datetime.strptime(sys.argv[2], "%d/%m/%Y %H:%M:%S")
|
||||
except IndexError:
|
||||
scope_begin = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
@@ -35,31 +35,38 @@ for root, dirs, files in os.walk(dir_logs):
|
||||
# iga kausta kohta (root) on kättesaadav alamkataloogide nimekiri (dirs)
|
||||
# ning failide nimekiri (files)
|
||||
for filename in files:
|
||||
if filename.startswith("access.log"):
|
||||
path = os.path.join(root, filename)
|
||||
file_end = datetime.fromtimestamp(
|
||||
os.stat(path).st_mtime)
|
||||
if scope_begin > file_end:
|
||||
sys.stderr.write("Jätan vahele %s faili kuna logifaili lõpp oli %s\n" %
|
||||
(path, file_end))
|
||||
continue
|
||||
if not filename.startswith("access.log"):
|
||||
continue
|
||||
|
||||
file_start = None
|
||||
with gzip.open(path) if path.endswith(".gz") else open(path) as fh:
|
||||
for line in fh:
|
||||
m = re.match(RE_LOG_ENTRY, line)
|
||||
if not m:
|
||||
continue
|
||||
dt = datetime.strptime(m.group("timestamp")[:-6], "%d/%b/%Y:%H:%M:%S")
|
||||
if not file_start: # loeme esimest rida sellest failist
|
||||
file_start = dt
|
||||
if scope_end < file_start:
|
||||
sys.stderr.write("Jätan vahele %s faili kuna logifaili algus oli %s\n" % (path, file_start))
|
||||
# Hüppa ridade lugemise tsükklist välja, järgmise faili juurde
|
||||
break
|
||||
else:
|
||||
sys.stderr.write("Otsin logikirjeid failist %s\n" % path)
|
||||
if dt > scope_end:
|
||||
# Kleebi kokku faili absoluutne tee praegusest kataloogist ja failinimest
|
||||
path = os.path.join(root, filename)
|
||||
|
||||
# Loe faili muutmise (samas ka viimase logikirje) kuupäev ja kellaaeg
|
||||
file_end = datetime.fromtimestamp(os.stat(path).st_mtime)
|
||||
|
||||
# Kui otsitav ajavahemik algab peale viimase logikirje kuupäeva ja kellaaega,
|
||||
# pole mõtet seda faili inspekteerida
|
||||
if scope_begin > file_end:
|
||||
sys.stderr.write("Jätan vahele %s faili kuna logifaili lõpp oli %s\n" %
|
||||
(path, file_end))
|
||||
continue
|
||||
|
||||
file_start = None
|
||||
with gzip.open(path) if path.endswith(".gz") else open(path) as fh:
|
||||
for line in fh:
|
||||
m = re.match(RE_LOG_ENTRY, line)
|
||||
if not m:
|
||||
continue
|
||||
dt = datetime.strptime(m.group("timestamp")[:-6], "%d/%b/%Y:%H:%M:%S")
|
||||
if not file_start: # loeme esimest rida sellest failist
|
||||
file_start = dt
|
||||
if scope_end < file_start:
|
||||
sys.stderr.write("Jätan vahele %s faili kuna logifaili algus oli %s\n" % (path, file_start))
|
||||
# Hüppa ridade lugemise tsükklist välja, järgmise faili juurde
|
||||
break
|
||||
if dt > scope_begin:
|
||||
print line.strip()
|
||||
else:
|
||||
sys.stderr.write("Otsin logikirjeid failist %s\n" % path)
|
||||
if dt > scope_end:
|
||||
break
|
||||
if dt > scope_begin:
|
||||
print line.strip()
|
||||
|
||||
66
bin/top3
Executable file
66
bin/top3
Executable file
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/python
|
||||
# encoding: utf-8
|
||||
|
||||
import GeoIP
|
||||
import sys
|
||||
from numpy import interp
|
||||
from collections import Counter
|
||||
from lxml import etree
|
||||
from lxml.cssselect import CSSSelector
|
||||
|
||||
try:
|
||||
blank_map_path, = sys.argv[1:]
|
||||
except ValueError:
|
||||
print "Anna argumentideks tee BlankMap-World6.svg failini"
|
||||
sys.exit(254)
|
||||
|
||||
# Loe sisse värvimata kaardifail kasutades lxml moodulit
|
||||
# https://upload.wikimedia.org/wikipedia/commons/0/03/BlankMap-World6.svg
|
||||
document = etree.parse(open(blank_map_path))
|
||||
|
||||
# Lae GeoIP andmebaas
|
||||
gi = GeoIP.open("/usr/share/GeoIP/GeoIP.dat", GeoIP.GEOIP_MEMORY_CACHE)
|
||||
|
||||
# Loo tühi Counter objekt
|
||||
hits = Counter()
|
||||
|
||||
# Käi ridahaaval üle standardsisendi
|
||||
for line in sys.stdin:
|
||||
# Kui reas ei esine GET sõnet, hüppa järgmisse tsükklisse
|
||||
if "GET" not in line:
|
||||
continue
|
||||
|
||||
# Löö rida tühikute järgi juppideks
|
||||
fields = line.split()
|
||||
|
||||
# IP aadress esimeses tulbas
|
||||
remote_addr = fields[0]
|
||||
|
||||
# Proovi teisendada IP riigikoodiks GeoIP abil
|
||||
country = gi.country_code_by_addr(remote_addr)
|
||||
if not country:
|
||||
# IP aadressi ei saa vastendada riigiga kui tegu on nt sisevõrgu aadressidega,
|
||||
# lisaks /usr/share/GeoIP/GeoIP.dat andmebaasis pole IPv6 aadresse
|
||||
continue
|
||||
hits[country] += 1
|
||||
|
||||
for country, count in hits.items():
|
||||
# Interpoleeri külastuste arv vahemikus 0 kuni kõige enam külastusi saanud riik
|
||||
# värvitoonide vahemikku 120 (roheline) kuni 0 (punane)
|
||||
hue = interp(count, [0, max(hits.values())], [180, 0])
|
||||
|
||||
# Leia XPath abil elemendid mille id attribuut on pandud riigikoodiks
|
||||
for element in document.xpath("//*[@id='%s']" % country.lower()):
|
||||
|
||||
# Pane riigi <g> tagile külge stiili attribuut
|
||||
# kus värvikood võetakse HSL värviruumist (hue ehk toon, külluslikkus 60% ja heledus 60%)
|
||||
element.set("style", "fill:hsl(%.2f, 60%%, 60%%)" % hue)
|
||||
|
||||
# Eemalda kõigilt alamelementidelt class attribuut kus sisaldub viide hallile värvile
|
||||
for subelement in element:
|
||||
subelement.attrib.pop("class", "")
|
||||
|
||||
# Kirjuta väljund faili top.svg
|
||||
# Proovi avada see fail Firefox või Chrome abil nt
|
||||
with open("top.svg", "w") as fh:
|
||||
fh.write(etree.tostring(document))
|
||||
Reference in New Issue
Block a user