]>
Commit | Line | Data |
---|---|---|
940227cb MT |
1 | #!/usr/bin/python |
2 | ||
9068dba1 | 3 | import IPy |
638e9782 MT |
4 | import re |
5 | ||
9068dba1 | 6 | import countries |
940227cb | 7 | |
9068dba1 | 8 | from misc import Object |
940227cb | 9 | |
9068dba1 MT |
10 | class GeoIP(Object): |
11 | def guess_address_family(self, addr): | |
12 | if ":" in addr: | |
13 | return 6 | |
940227cb | 14 | |
9068dba1 | 15 | return 4 |
65afea2f | 16 | |
9068dba1 MT |
17 | def get_country(self, addr): |
18 | ret = self.get_all(addr) | |
940227cb | 19 | |
9068dba1 MT |
20 | if ret: |
21 | return ret.country | |
119f55d7 | 22 | |
9068dba1 MT |
23 | def get_location(self, addr): |
24 | family = self.guess_address_family(addr) | |
940227cb | 25 | |
9068dba1 MT |
26 | if family == 6: |
27 | query = "SELECT *, NULL AS city, NULL AS postal_code FROM geoip_ipv6 WHERE %s \ | |
28 | BETWEEN start_ip AND end_ip LIMIT 1" | |
29 | elif family == 4: | |
30 | query = "SELECT * FROM geoip_ipv4 WHERE inet_to_bigint(%s) \ | |
31 | BETWEEN start_ip AND end_ip LIMIT 1" | |
0673d1b0 | 32 | |
9068dba1 | 33 | return self.db.get(query, addr) |
0673d1b0 | 34 | |
9068dba1 MT |
35 | def get_asn(self, addr): |
36 | family = self.guess_address_family(addr) | |
940227cb | 37 | |
9068dba1 MT |
38 | if family == 6: |
39 | query = "SELECT asn FROM geoip_asnv6 WHERE %s \ | |
40 | BETWEEN start_ip AND end_ip LIMIT 1" | |
41 | elif family == 4: | |
42 | query = "SELECT asn FROM geoip_asnv4 WHERE inet_to_bigint(%s) \ | |
43 | BETWEEN start_ip AND end_ip LIMIT 1" | |
0673d1b0 | 44 | |
9068dba1 | 45 | ret = self.db.get(query, addr) |
0673d1b0 | 46 | |
9068dba1 MT |
47 | if ret: |
48 | return ret.asn | |
0673d1b0 | 49 | |
9068dba1 MT |
50 | def get_all(self, addr): |
51 | location = self.get_location(addr) | |
0673d1b0 | 52 | |
9068dba1 MT |
53 | if location: |
54 | location["asn"] = self.get_asn(addr) | |
940227cb | 55 | |
9068dba1 | 56 | return location |
119f55d7 | 57 | |
9068dba1 MT |
58 | _countries = { |
59 | "A1" : "Anonymous Proxy", | |
60 | "A2" : "Satellite Provider", | |
61 | "AP" : "Asia/Pacific Region", | |
62 | "EU" : "Europe", | |
63 | } | |
119f55d7 | 64 | |
9068dba1 | 65 | def get_country_name(self, code): |
119f55d7 MT |
66 | # Return description of some exceptional codes. |
67 | try: | |
9068dba1 | 68 | return self._countries[code] |
119f55d7 MT |
69 | except KeyError: |
70 | pass | |
71 | ||
9068dba1 MT |
72 | country = countries.get_by_code(code) |
73 | if not country: | |
74 | return code | |
940227cb | 75 | |
9068dba1 | 76 | return country |