From c6dc34fc185f51bb8dcfd9f469d91c7e9ba1cb7a Mon Sep 17 00:00:00 2001 From: diSabler Date: Sat, 12 Jul 2014 15:53:18 +0400 Subject: add: local geo base for sqlite3 --- dev-tools/geoip_to_sqlite3/geo2db.py | 132 +++++++++++++++++++++++++++++++++++ plugins/geoip.py | 2 +- 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 dev-tools/geoip_to_sqlite3/geo2db.py diff --git a/dev-tools/geoip_to_sqlite3/geo2db.py b/dev-tools/geoip_to_sqlite3/geo2db.py new file mode 100644 index 0000000..98d927b --- /dev/null +++ b/dev-tools/geoip_to_sqlite3/geo2db.py @@ -0,0 +1,132 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# --------------------------------------------------------------------------- # +# # +# GEOIP to SQLite3 # +# Copyright (C) diSabler # +# # +# 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 . # +# # +# --------------------------------------------------------------------------- # +# REQUIRED: wget, unzip # +# --------------------------------------------------------------------------- # + +import csv,os + +URL = 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity-latest.zip' +DUMP = 'geoip.dump' + +_SQL1 = '''DROP TABLE geoip_blocks; +CREATE TABLE geoip_blocks ( + startIpNum bigint, + endIpNum bigint, + locId integer +); +INSERT INTO geoip_blocks VALUES''' + +_SQL2 = '''(0,0,0); +CREATE INDEX geoip_blocks_1 ON geoip_blocks (startIpNum,endIpNum,locId); +CREATE INDEX geoip_blocks_2 ON geoip_blocks (locId,startIpNum,endIpNum); +DELETE FROM geoip_blocks WHERE locId=0;''' + +_SQL3 = '''DROP TABLE geoip_location; +CREATE TABLE geoip_location ( + locId integer, + country text, + region text, + city text, + postalCode text, + latitude real, + longitude real, + metroCode text, + areaCode text +); +INSERT INTO geoip_location VALUES''' + +_SQL4 = '''(0,'','','','',0,0,'',''); +CREATE INDEX geoip_location_1 ON geoip_location (locId); +DELETE FROM geoip_location WHERE locId=0;''' + +print 'Download GEOIP file' + +ZIPFILE = URL.split('/')[-1] + +try: os.remove(ZIPFILE) +except: pass +os.system('wget %s' % URL) +os.system('unzip %s' % ZIPFILE) +try: os.remove(ZIPFILE) +except: pass + +FOLDER = [t for t in os.listdir('.') if t.startswith(ZIPFILE.split('-',1)[0]) and os.path.isdir(t)][0] +BLOCKS_CSV = '%s/GeoLiteCity-Blocks.csv' % FOLDER +LOCATION_CSV = '%s/GeoLiteCity-Location.csv' % FOLDER + +print 'Remove old dump file: %s' % DUMP + +try: os.remove(DUMP) +except: pass + +DMP = open(DUMP, 'a') +# ------------- Blocks ------------- +DMP.write(_SQL1) +print 'Parse: %s' % BLOCKS_CSV + +csvfile = open(BLOCKS_CSV, 'rb') +csvreader = csv.reader(csvfile, delimiter=',', quotechar='"') +CNT = 0 +for row in csvreader: + if len(row) > 1 and row[0].isdigit(): + ROW = '(%s),\n' % ','.join(row) + DMP.write(ROW) + CNT += 1 + if not CNT % 498: + os.system('printf "."') + DMP.write('(0,0,0);\nINSERT INTO geoip_blocks VALUES') + +print '\nTotal blocks: %s' % CNT + +DMP.write(_SQL2) +# ------------- Location ------------- +DMP.write(_SQL3) + +print 'Parse: %s' % LOCATION_CSV + +csvfile = open(LOCATION_CSV, 'rb') +csvreader = csv.reader(csvfile, delimiter=',', quotechar='"') +CNT = 0 +for row in csvreader: + if len(row) > 1 and row[0].isdigit(): + ROW = '(%s),\n' % ','.join(["'%s'" % t.replace("'","`") for t in row]) + try: ROW = ROW.decode('latin-1').encode('utf8') + except: + print 'Error!', ROW + ROW = ''.join([['?',l][l<='~'] for l in ROW]) + DMP.write(ROW) + CNT += 1 + if not CNT % 498: + os.system('printf "."') + DMP.write('(0,\'\',\'\',\'\',\'\',0,0,\'\',\'\');\nINSERT INTO geoip_location VALUES') + +print '\nTotal locations: %s' % CNT + +DMP.write(_SQL4) +DMP.close() + +print 'Import dump file to SQLite3. Be patient!' +os.system('cat %s | sqlite3 ../../data/sqlite3.db' % DUMP) + +print 'Done!' +# The end is near! diff --git a/plugins/geoip.py b/plugins/geoip.py index a8555df..85f7625 100644 --- a/plugins/geoip.py +++ b/plugins/geoip.py @@ -44,4 +44,4 @@ def geoip(type, jid, nick, text): global execute -if base_type == 'pgsql': execute = [(4, 'geo', geoip, 2, 'GEOIP information about IP or domain')] +if base_type in ['pgsql','sqlite3']: execute = [(4, 'geo', geoip, 2, 'GEOIP information about IP or domain')] -- cgit v1.2.3