]>
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 | 23 | def get_location(self, addr): |
5488a9f4 MT |
24 | query = "SELECT * FROM geoip \ |
25 | WHERE %s BETWEEN start_ip AND end_ip LIMIT 1" | |
0673d1b0 | 26 | |
9068dba1 | 27 | return self.db.get(query, addr) |
0673d1b0 | 28 | |
9068dba1 | 29 | def get_asn(self, addr): |
5488a9f4 MT |
30 | query = "SELECT asn FROM geoip_asn \ |
31 | WHERE %s BETWEEN start_ip AND end_ip LIMIT 1" | |
0673d1b0 | 32 | |
9068dba1 | 33 | ret = self.db.get(query, addr) |
0673d1b0 | 34 | |
9068dba1 MT |
35 | if ret: |
36 | return ret.asn | |
0673d1b0 | 37 | |
9068dba1 MT |
38 | def get_all(self, addr): |
39 | location = self.get_location(addr) | |
0673d1b0 | 40 | |
9068dba1 MT |
41 | if location: |
42 | location["asn"] = self.get_asn(addr) | |
940227cb | 43 | |
9068dba1 | 44 | return location |
119f55d7 | 45 | |
9068dba1 MT |
46 | _countries = { |
47 | "A1" : "Anonymous Proxy", | |
48 | "A2" : "Satellite Provider", | |
49 | "AP" : "Asia/Pacific Region", | |
50 | "EU" : "Europe", | |
51 | } | |
119f55d7 | 52 | |
9068dba1 | 53 | def get_country_name(self, code): |
119f55d7 MT |
54 | # Return description of some exceptional codes. |
55 | try: | |
9068dba1 | 56 | return self._countries[code] |
119f55d7 MT |
57 | except KeyError: |
58 | pass | |
59 | ||
9068dba1 MT |
60 | country = countries.get_by_code(code) |
61 | if not country: | |
62 | return code | |
940227cb | 63 | |
9068dba1 | 64 | return country |