#!/usr/bin/python # Copyright (C) 2010 Michael Ligh # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # [NOTES] ----------------------------------------------------------- # 1) Tested on Linux (Ubuntu), Windows XP/7, and Mac OS X # 2) You should redirect the output of this program to an HTML file # 3) If the map doesn't render in Firefox, try Internet Explorer #-------------------------------------------------------------------- import os,sys from optparse import OptionParser try: from pygeoip import GeoIP except ImportError: print 'pygeoip is not installed, see http://code.google.com/p/pygeoip/' sys.exit() __PATH_TO_DATABASE__ = 'GeoLiteCity.dat' __GEO_HEADER__ = """
""" def output_geo(gi, ip_list): print __GEO_HEADER__ countries = {} for ip in ip_list: try: rec = gi.record_by_addr(ip) except: continue if rec == None: continue if 'country_code' not in rec.keys(): continue if rec['country_code'] in countries.keys(): countries[rec['country_code']] += 1 else: countries[rec['country_code']] = 1 print " data.addRows(%d);" % (len(countries)) c = 0 for country, value in countries.items(): print " data.setValue(%d, 0, '%s');" % (c, country) print " data.setValue(%d, 1, %d);" % (c, value) c += 1 print __GEO_FOOTER__ if __name__=='__main__': parser = OptionParser() parser.add_option("-f", "--file", action="store", dest="filename", type="string", help="filename with CRLF-separated IPs") parser.add_option("-a", "--addr", action="store", dest="addr", type="string", help="CSV list of IPs") (opts, args) = parser.parse_args() if opts.filename != None: ip_list = open(opts.filename).readlines() elif opts.addr != None: ip_list = opts.addr.split(',') else: parser.print_help() parser.error("You must supply a list of IPs or file with IPs!") gi = GeoIP(__PATH_TO_DATABASE__) output_geo(gi, ip_list)