GeoIP
GeoIP install
apt-get install geoip-bin
To get city level geolocalisation we can get the free city db:
mkdir /usr/local/share/GeoIP cd /usr/local/share/GeoIP wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz gunzip GeoLiteCity.dat.gz ln -s /usr/local/share/GeoIP/GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
geoiplookup 85.234.207.107 GeoIP Country Edition: BE, Belgium GeoIP City Edition, Rev 1: BE, 02, Ixelles, (null), 50.833302, 4.366700, 0, 0 GeoIP City Edition, Rev 0: BE, 02, Ixelles, (null), 50.833302, 4.366700
For more precise localisation, you can try the online demo
Usage with AWFFull
cf AWFFull page
in /etc/awffull/awffull.conf:
GeoIP yes
Actually awffull is not compiled with GeoIP support but we can rebuild the package
awffull -v (interrupt it, it's at the beginning) => GeoIP is not available in this binary. Ignoring request to use.
ok, don't be impressed ;-)
the building process of awffull is pretty well done, if it detects the headers of GeoIP it uses it, as simply as that.
apt-get build-dep awffull apt-get source awffull cd awffull-3.7.1/ apt-get install libgeoip1 libgeoip-dev dpkg-buildpackage -uc -b
Et voilà! You can install the new .deb freshly created.
Now you can run it, it will give e.g.
awffull -v => awffull 3.7.1 (Linux 2.6.17-2-vserver-amd64) English => Using GeoIP for IP Address Lookups: /usr/share/GeoIP/GeoIP.dat
One bad point: we didn't fix the dependancies of our new package, for a local use this is ok but for larger use we should have added the libgeoip1 package in the list of dependencies of awffull.
Usage with Zope
cf Zope page
First import the database on your MySQL db as <db_name>.csv as descibed here
Add a Python Script in zope (e.g. geoip):
from Products.PythonScripts.standard import html_quote request = container.REQUEST RESPONSE = request.RESPONSE ip = context.REQUEST.REMOTE_ADDR line = string.split(ip,'.') ip0 = line[0] ip1 = line[1] ip2 = line[2] ip3 = line[3] ipnum = int(ip0) * 16777216 + int(ip1) * 65536 + int(ip2) * 256 + int(ip3) * 1 print ipnum return printed
Add a Z Mysql Method (e.g. select_GeoIP) with as Arguments ipnum
SELECT cn from <db_name>.csv where start < <dtml-sqlvar ipnum type="string"> and end > <dtml-sqlvar ipnum type="string">
In a DTML Method, test :
<dtml-in expr="select_GeoIPs(ipnum=geoip())">Hoo, you are from <dtml-var cn>, Welcome !</dtml-in>
Same for latitude and longitude of the country Country Geolocalization