67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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))
 |