bgpwtf/cccampix: draw the rest of the fucking owl
Change-Id: I49fd5906e69512e8f2d414f406edc0179522f225
diff --git a/bgpwtf/cccampix/frontend/server.py b/bgpwtf/cccampix/frontend/server.py
new file mode 100644
index 0000000..6ab5245
--- /dev/null
+++ b/bgpwtf/cccampix/frontend/server.py
@@ -0,0 +1,61 @@
+import argparse
+import logging
+import multiprocessing
+
+from gevent import monkey
+
+monkey.patch_all()
+
+import grpc.experimental.gevent as grpc_gevent
+grpc_gevent.init_gevent()
+
+from werkzeug.contrib.fixers import ProxyFix
+import gunicorn.app.base
+
+from bgpwtf.cccampix.frontend.frontend import create_app
+
+
+class StandaloneApplication(gunicorn.app.base.BaseApplication):
+ def __init__(self, app, options=None):
+ self.options = options or {}
+ self.application = app
+ super(StandaloneApplication, self).__init__()
+
+ def load_config(self):
+ config = dict(
+ [
+ (key, value)
+ for key, value in options.items()
+ if key in self.cfg.settings and value is not None
+ ]
+ )
+ for key, value in config.items():
+ self.cfg.set(key.lower(), value)
+
+ def load(self):
+ return self.application
+
+
+parser = argparse.ArgumentParser(description="Run the IXP frontend")
+parser.add_argument("--flask_secret", required=True, help="Flask App Secret")
+parser.add_argument("--workers", type=int, default=4, help="Number of gunicorn workers to run")
+parser.add_argument("--listen", default="0.0.0.0:8080", help="Listen address")
+parser.add_argument("--verifier", default="127.0.0.1:4200", help="Address of verifier service")
+
+if __name__ == '__main__':
+ args = parser.parse_args()
+
+ options = {
+ "bind": args.listen,
+ "workers": args.workers,
+ "sendfile": False,
+ "timeout": 240,
+ }
+
+ config = {
+ "verifier": args.verifier,
+ }
+ app = create_app(config)
+ app.secret_key = args.flask_secret
+ app = ProxyFix(app)
+ StandaloneApplication(app, options).run()