> Wow. Awesome work!
>
> Thanks for diving in and getting this going.
>
> In another email thread someone, Adrian said he had some code to do
> this, but if you already have it working, perhaps he could review your
> code/setup and we could then push it into ansible?
>
> Thanks again for working on this!
>
> kevin
Sounds good. I submitted the PR on GitHub yesterday. I’ve also included the git
patch below.
---
geoip-city.wsgi | 36 +++++++++++++++++++++++++++++++-----
1 file changed, 31 insertions(+), 5 deletions(-)
diff --git a/geoip-city.wsgi b/geoip-city.wsgi
index 9435820..4f9d4d7 100755
--- a/geoip-city.wsgi
+++ b/geoip-city.wsgi
@@ -13,12 +13,13 @@
from string import zfill, atoi, strip, replace
from paste.wsgiwrappers import *
-import GeoIP
+from iso3166 import countries
+import geoip2.database
+import geoip2.errors
import json
global gi
-gi = GeoIP.open("/usr/share/GeoIP/GeoLiteCity.dat", GeoIP.GEOIP_STANDARD)
-gi.set_charset(GeoIP.GEOIP_CHARSET_UTF8)
+gi = geoip2.database.Reader("/usr/share/GeoIP/GeoLite2-City.mmdb")
def real_client_ip(xforwardedfor):
@@ -44,6 +45,7 @@ def get_client_ip(environ, request):
def application(environ, start_response):
request = WSGIRequest(environ)
response = WSGIResponse()
+ results = {}
code = 500
try:
@@ -51,15 +53,39 @@ def application(environ, start_response):
if client_ip is None:
code = 400
raise Exception
- results = gi.record_by_addr(client_ip)
- if results is None:
+ data = gi.city(client_ip)
+ if data is None:
code = 404
raise Exception
+ except geoip2.errors.AddressNotFoundError:
+ response.status_code = 404
+ return response(environ, start_response)
except:
response.status_code=code
return response(environ, start_response)
results['ip'] = client_ip
+
+ # map geoip2 data to a structure that matches the prior geoip format
+ results['city'] = data.city.name
+ results['region_name'] = data.subdivisions.most_specific.name
+ results['region'] = data.subdivisions.most_specific.iso_code
+ results['postal_code'] = data.postal.code
+ results['country_name'] = data.country.name
+ results['country_code'] = data.country.iso_code
+ results['time_zone'] = data.location.time_zone
+ results['latitude'] = data.location.latitude
+ results['longitude'] = data.location.longitude
+ results['metro_code'] = data.location.metro_code
+ results['dma_code'] = data.location.metro_code
+
+ # geoip2 no longer includes country_code3, so it has to be pulled
+ # from iso3166.countries
+ if data.country.iso_code in countries:
+ results['country_code3'] = countries[data.country.iso_code].alpha3
+ else:
+ results['country_code3'] = None
+
results = json.dumps(results)
response.headers['Content-Length'] = str(len(results))
response.write(results)
--
2.21.0 (Apple Git-122.2)
_______________________________________________
infrastructure mailing list -- [email protected]
To unsubscribe send an email to [email protected]
Fedora Code of Conduct:
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives:
https://lists.fedoraproject.org/archives/list/[email protected]