Ticket #6266: geoipclean.py

File geoipclean.py, 1.6 KB (added by nickm, 8 years ago)
Line 
1#!/usr/bin/python
2
3import bisect
4
5def readfile(f):
6    res = []
7    for line in f:
8        line = line.strip()
9        if line.startswith("#"):
10            continue
11        if not line:
12            continue
13        try:
14            lo,hi,cc=line.split(",")
15        except ValueError, e:
16            print e, `line`
17        lo=int(lo)
18        hi=int(hi)
19        assert 0 <= lo <= hi < (1L<<32)
20        res.append((lo, hi, cc))
21    return res
22
23db = readfile(open("geoip3"))
24db_orig = db[:]
25ok = 0
26ouch = 0
27
28for idx in xrange(1, len(db)-1):
29    prevCC = db[idx-1][2]
30    thisCC = db[idx][2]
31    nextCC = db[idx+1][2]
32    if thisCC == 'A1':
33        if prevCC == nextCC:
34            ok += 1
35            db[idx] = (db[idx][0], db[idx][1], prevCC)
36        else:
37            ouch += 1
38
39print ok / float(ok+ouch)
40
41def ipToNum(ip):
42    bs = [int(b) for b in ip.split(".")]
43    assert(len(bs) == 4)
44    return (bs[0] << 24) | (bs[1] << 16) | (bs[2] << 8) | bs[3]
45
46
47def getRecord(db, num):
48    search = (num, 0, "")
49    idx = bisect.bisect_left(db, search)
50    if idx == 0:
51        return "ZZ"
52    r = db[idx-1]
53    if r[0] <= num <= r[1]:
54        return r[2]
55    else:
56        return "ZZ"
57
58def getIPsFromConsensus(f):
59    res = set()
60    for line in f:
61        if line.startswith('r '):
62            ip = line.split()[5]
63            res.add(ip)
64    return res
65
66prev = 0
67post = 0
68n = 0
69
70for ip in getIPsFromConsensus(open("/home/nickm/.tor/cached-microdesc-consensus")):
71    r = getRecord(db_orig, ipToNum(ip))
72    r2 = getRecord(db, ipToNum(ip))
73    if r == 'A1':
74        prev += 1
75    if r2 == 'A1':
76        post += 1
77    n += 1
78
79print "prev:", prev/float(n), prev
80print "post:", post/float(n), post