Re: Update geoip-city

2020-03-31 Thread Adrian Reber
We tried it and it failed because python-iso3116 (a new dependency) is
not available from EPEL. Will retry once we have a solution for iso3116.

Adrian

On Tue, Mar 31, 2020 at 07:23:56AM -0400, Stephen John Smoogen wrote:
> Let me know when you want to run the playbook.
> 
> On Tue, 31 Mar 2020 at 05:45, Adrian Reber  wrote:
> 
> > Attached is the patch to take the upstream update of geoip-city to
> > Fedora infrastructure.
> >
> > I would like to try this first in staging and need some help to run the
> > corresponding playbook to see if it works in our environment.
> >
> > Adrian
> > ___
> > infrastructure mailing list -- infrastructure@lists.fedoraproject.org
> > To unsubscribe send an email to
> > infrastructure-le...@lists.fedoraproject.org
> > 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/infrastructure@lists.fedoraproject.org
> >
> 
> 
> -- 
> Stephen J Smoogen.

> ___
> infrastructure mailing list -- infrastructure@lists.fedoraproject.org
> To unsubscribe send an email to infrastructure-le...@lists.fedoraproject.org
> 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/infrastructure@lists.fedoraproject.org



signature.asc
Description: PGP signature
___
infrastructure mailing list -- infrastructure@lists.fedoraproject.org
To unsubscribe send an email to infrastructure-le...@lists.fedoraproject.org
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/infrastructure@lists.fedoraproject.org


Re: Update geoip-city

2020-03-31 Thread Stephen John Smoogen
Let me know when you want to run the playbook.

On Tue, 31 Mar 2020 at 05:45, Adrian Reber  wrote:

> Attached is the patch to take the upstream update of geoip-city to
> Fedora infrastructure.
>
> I would like to try this first in staging and need some help to run the
> corresponding playbook to see if it works in our environment.
>
> Adrian
> ___
> infrastructure mailing list -- infrastructure@lists.fedoraproject.org
> To unsubscribe send an email to
> infrastructure-le...@lists.fedoraproject.org
> 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/infrastructure@lists.fedoraproject.org
>


-- 
Stephen J Smoogen.
___
infrastructure mailing list -- infrastructure@lists.fedoraproject.org
To unsubscribe send an email to infrastructure-le...@lists.fedoraproject.org
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/infrastructure@lists.fedoraproject.org


Update geoip-city

2020-03-31 Thread Adrian Reber
Attached is the patch to take the upstream update of geoip-city to
Fedora infrastructure.

I would like to try this first in staging and need some help to run the
corresponding playbook to see if it works in our environment.

Adrian
>From 59d639cbdc360d81ccb28f617aa58250e79202ef Mon Sep 17 00:00:00 2001
From: Adrian Reber 
Date: Tue, 31 Mar 2020 11:40:40 +0200
Subject: [PATCH] geoip-city-wsgi: update geoip-city-wsgi

The geoip-city-wsgi script has been updated upstream to support geoip2
and Python 3. This pulls the update to Fedora infrastructure.

Signed-off-by: Adrian Reber 
---
 .../geoip-city-wsgi/app/files/geoip-city.wsgi | 42 +++
 roles/geoip-city-wsgi/app/tasks/main.yml  |  7 +---
 2 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/roles/geoip-city-wsgi/app/files/geoip-city.wsgi 
b/roles/geoip-city-wsgi/app/files/geoip-city.wsgi
index 94358205a..dc5822c42 100755
--- a/roles/geoip-city-wsgi/app/files/geoip-city.wsgi
+++ b/roles/geoip-city-wsgi/app/files/geoip-city.wsgi
@@ -11,14 +11,14 @@
 #  accelerator) in front of the application server running this WSGI,
 #  to avoid looking "behind" the real client's own forward HTTP proxy.
 
-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):
@@ -32,18 +32,18 @@ def get_client_ip(environ, request):
 request_data = request.GET
 
 if 'ip' in request_data:
-client_ip = strip(request_data['ip'])
+client_ip = request_data['ip'].strip()
 elif 'X-Forwarded-For' in request.headers and 'geoip_city.noreverseproxy' 
not in environ:
-client_ip = real_client_ip(strip(request.headers['X-Forwarded-For']))
+client_ip = real_client_ip(request.headers['X-Forwarded-For'].strip())
 else:
 client_ip = request.environ['REMOTE_ADDR']
 
-client_ip = unicode(client_ip, 'utf8', 'replace')
 return client_ip
 
 def application(environ, start_response):
 request = WSGIRequest(environ)
 response = WSGIResponse()
+results = {}
 code = 500
 
 try:
@@ -51,15 +51,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)
diff --git a/roles/geoip-city-wsgi/app/tasks/main.yml 
b/roles/geoip-city-wsgi/app/tasks/main.yml
index 3f0fea39e..29bdcd865 100644
--- a/roles/geoip-city-wsgi/app/tasks/main.yml
+++ b/roles/geoip-city-wsgi/app/tasks/main.yml
@@ -11,16 +11,13 @@
   - geoip-city-wsgi
   - geoip-city-wsgi/app
 
-- name: install GeoIP-data
-  package: name=GeoIP-data state=present
+- name: install geolite2-city
+  package: name=geolite2-city state=present
   tags:
   - packages
   - geoip-city-wsgi
   - geoip-city-wsgi/app
 
-- name: link the data file to the one we use
-  file: state=link dest=/usr/share/GeoIP/GeoIPCity.dat 
src=/usr/share/GeoIP/GeoLiteCity.dat
-
 - name: install geoip-city-wsgi.conf file
   copy: >
 src="geoip-city-wsgi.conf"
-- 
2.24.1

___
infrastructure mailing list -- infrastructure@lists.