diff --git a/README.md b/README.md index 1101252..c043b1a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ Shows all mirror regions `/dl_map` shows download map for images +`/geoip` +show geoip info from requestor IP + `/region/REGIONCODE/` will redirect to desired configurd regions: NA - north america diff --git a/app/main.py b/app/main.py index af94667..584a8f7 100644 --- a/app/main.py +++ b/app/main.py @@ -1,8 +1,7 @@ """ flask app to redirect request to appropriate armbian mirror and image """ -import uwsgi import json -import logging +import uwsgi from flask import ( Flask, @@ -12,17 +11,16 @@ from flask import ( # from markupsafe import escape from download_image_map import Parser from mirror_list import Mirror +from geolite2 import geolite2 from ruamel.yaml import YAML -from ruamel.yaml.scalarstring import ( - FoldedScalarString, - LiteralScalarString, -) +# from ruamel.yaml.scalarstring import ( +# FoldedScalarString, +# LiteralScalarString, +# ) def load_mirrors(): """ open mirrors file and return contents """ -# with open('mirrors.conf', 'r') as row: -# all_mirrors=row.read().splitlines() global mode yaml = YAML() yaml.indent(mapping=2, sequence=4, offset=2) @@ -54,11 +52,22 @@ def get_ip(): def get_region(IP): """ this is where we geoip and return region code """ - return None + try: + match = reader.get(IP) + conti = match['continent']['code'] +# FIXME Get Contient List from Configuration File + if conti in ("EU", "NA", "AS"): + print("Match {} to continent {}".format(IP, conti)) + return conti + except: + print("match failure for IP: {}".format(IP)) + print(json.dumps(match)) + else: + return None def get_redirect(path, IP): - """ get redirect based on path and IP(future) """ + """ get redirect based on path and IP """ global mode global dl_map region = get_region(IP) @@ -68,14 +77,12 @@ def get_redirect(path, IP): region = split_path[1] del split_path[0:2] path = "{}".format("/".join(split_path)) - print("path: {}".format(path)) if mode == "dl_map" and len(split_path) == 2: key = "{}/{}".format(split_path[0], split_path[1]) new_path = dl_map.get(key, path) return "{}{}".format(mirror.next(region), new_path) if path == '': return mirror.next(region) - print("path: {}".format(path)) return "{}{}".format(mirror.next(region), path) @@ -84,7 +91,7 @@ if mode == "dl_map": parser = Parser('userdata.csv') dl_map = parser.parsed_data - +reader = geolite2.reader() app = Flask(__name__) @@ -98,7 +105,7 @@ def status(): def signal_reload(): """ trigger graceful reload via uWSGI """ uwsgi.reload() - return "reloded" + return "reloding" @ app.route('/mirrors') @@ -122,9 +129,14 @@ def show_dl_map(): return "no map. in direct mode" +@ app.route('/geoip') +def show_geoip(): + return json.dumps(reader.get(get_ip())) + @ app.route('/', defaults={'path': ''}) @ app.route('/') def catch_all(path): + """ default app route for redirect """ return redirect(get_redirect(path, get_ip()), 302) diff --git a/app/requirements.txt b/app/requirements.txt index 4083179..96820a8 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -1,5 +1,8 @@ flask +uwsgi #boto3 python-dotenv uwsgi ruamel.yaml +maxminddb +maxminddb-geolite2