commit 3bce181e63a152c8061a4d2fba5b4caa39a7ec8c Author: Yehuda Deutsch Date: Mon Aug 12 17:52:30 2019 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e82f394 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.7-alpine + +MAINTAINER Yehuda Deutsch + +RUN pip install sanic + +WORKDIR /code +COPY app.py /code + +CMD ["python", "app.py"] diff --git a/app.py b/app.py new file mode 100644 index 0000000..bff597e --- /dev/null +++ b/app.py @@ -0,0 +1,62 @@ +from ipaddress import ip_address +from sanic import Sanic +from sanic.response import text, json +from sanic.views import HTTPMethodView + + +class GetClientIpMixin: + def get_client_ip(self, request): + possible_ip = request.ip + + for header_name in ('x-real-ip', 'x-forwarded-for'): + candidate_ip = None + header_value = request.headers.get(header_name) + for ip in header_value.split(',')[::-1]: + candidate_ip = ip_address(ip.strip()) + if candidate_ip.is_global: + break + if candidate_ip: + possible_ip = candidate_ip + break + + return str(possible_ip) + + +class MainView(HTTPMethodView, GetClientIpMixin): + def get(self, request): + return text(self.get_client_ip(request)) + + +class JsonView(HTTPMethodView, GetClientIpMixin): + def get(self, request): + return json({'ip_address': self.get_client_ip(request)}) + + +class Application(object): + app = Sanic() + + def __init__(self, args): + self.args = args + self.app.add_route(MainView.as_view(), '/') + self.app.add_route(JsonView.as_view(), '/json') + + def run(self): + self.app.run(host=self.args.interface, port=self.args.port) + + +if __name__ == '__main__': + import os + from argparse import ArgumentParser + + default_host = os.environ.get('APP_HOST', 'localhost') + default_port = int(os.environ.get('APP_PORT', 8081)) + default_trusted = os.environ.get('TRUSTED_PROXIES') or None + + parser = ArgumentParser('app.py') + parser.add_argument('--interface', '-i', type=str, help='Interface to listen on', default=default_host) + parser.add_argument('--port', '-p', type=int, help='Port to listen on', default=default_port) + parser.add_argument('--proxies', type=str, help='A list of trusted proxies, comma separated. you can use CIDRs.', default=default_trusted) + args = parser.parse_args() + + txip = Application(args) + txip.run()