Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/isida/4.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiSabler <dissy@ya.ru>2014-07-12 15:53:18 +0400
committerdiSabler <dissy@ya.ru>2014-07-12 15:53:18 +0400
commitc6dc34fc185f51bb8dcfd9f469d91c7e9ba1cb7a (patch)
tree8e0e81c237873e20157dbd84d46cefb468c5ee80
parent061710aca4cf6f899676a2a7e1fa17dc252cc8b4 (diff)
add: local geo base for sqlite3
-rw-r--r--dev-tools/geoip_to_sqlite3/geo2db.py132
-rw-r--r--plugins/geoip.py2
2 files changed, 133 insertions, 1 deletions
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 <dsy@dsy.name> #
+# #
+# 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 <http://www.gnu.org/licenses/>. #
+# #
+# --------------------------------------------------------------------------- #
+# 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')]