]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/backend/geoip.py
Major update of the webapp.
[people/shoehn/ipfire.org.git] / webapp / backend / geoip.py
1 #!/usr/bin/python
2
3 import IPy
4 import re
5
6 import countries
7
8 from misc import Object
9
10 class GeoIP(Object):
11 def guess_address_family(self, addr):
12 if ":" in addr:
13 return 6
14
15 return 4
16
17 def get_country(self, addr):
18 ret = self.get_all(addr)
19
20 if ret:
21 return ret.country
22
23 def get_location(self, addr):
24 family = self.guess_address_family(addr)
25
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"
32
33 return self.db.get(query, addr)
34
35 def get_asn(self, addr):
36 family = self.guess_address_family(addr)
37
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"
44
45 ret = self.db.get(query, addr)
46
47 if ret:
48 return ret.asn
49
50 def get_all(self, addr):
51 location = self.get_location(addr)
52
53 if location:
54 location["asn"] = self.get_asn(addr)
55
56 return location
57
58 _countries = {
59 "A1" : "Anonymous Proxy",
60 "A2" : "Satellite Provider",
61 "AP" : "Asia/Pacific Region",
62 "EU" : "Europe",
63 }
64
65 def get_country_name(self, code):
66 # Return description of some exceptional codes.
67 try:
68 return self._countries[code]
69 except KeyError:
70 pass
71
72 country = countries.get_by_code(code)
73 if not country:
74 return code
75
76 return country