]> git.ipfire.org Git - ipfire.org.git/blame - webapp/backend/geoip.py
Major update of the webapp.
[ipfire.org.git] / webapp / backend / geoip.py
CommitLineData
940227cb
MT
1#!/usr/bin/python
2
9068dba1 3import IPy
638e9782
MT
4import re
5
9068dba1 6import countries
940227cb 7
9068dba1 8from misc import Object
940227cb 9
9068dba1
MT
10class 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