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