aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.py')
-rwxr-xr-xsrc/server.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/server.py b/src/server.py
new file mode 100755
index 0000000..75723bd
--- /dev/null
+++ b/src/server.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python3
+
+# Copyright (c) 2021 Egor Tensin <Egor.Tensin@gmail.com>
+# This file is part of the "linux-status" project.
+# For details, see https://github.com/egor-tensin/linux-status.
+# Distributed under the MIT License.
+
+# This script launches a HTTP server and uses app.py for processing a set of
+# custom URLs. See that file for the reasons behind this.
+
+import argparse
+import http.server
+import os
+import sys
+import traceback
+
+from app import Request, Response
+
+
+DEFAULT_PORT = 18101
+
+
+def script_dir():
+ return os.path.dirname(os.path.realpath(__file__))
+
+
+def default_html_dir():
+ return os.path.join(script_dir(), 'html')
+
+
+class RequestHandler(http.server.SimpleHTTPRequestHandler):
+ def do_GET(self):
+ try:
+ request = Request.from_http_path(self.path)
+ except ValueError:
+ return super().do_GET()
+ try:
+ response = request.process()
+ response.write_to_request_handler(self)
+ except:
+ status = http.server.HTTPStatus.INTERNAL_SERVER_ERROR
+ response = Response(traceback.format_exc(), status)
+ response.write_to_request_handler(self)
+ return
+
+
+def make_server(port):
+ addr = ('', port)
+ server = http.server.HTTPServer
+ if sys.version_info >= (3, 7):
+ server = http.server.ThreadingHTTPServer
+ return server(addr, RequestHandler)
+
+
+def parse_args(args=None):
+ if args is None:
+ args = sys.argv[1:]
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-p', '--port', metavar='PORT',
+ type=int, default=DEFAULT_PORT,
+ help='set port number')
+ parser.add_argument('-d', '--dir', metavar='DIR',
+ default=default_html_dir(),
+ help='HTML directory path')
+ return parser.parse_args(args)
+
+
+def main(args=None):
+ args = parse_args(args)
+
+ # It's a failsafe; the script is not allowed to serve a random current
+ # working directory.
+ os.chdir(args.dir)
+
+ httpd = make_server(args.port)
+ try:
+ httpd.serve_forever()
+ except KeyboardInterrupt:
+ print('\nKeyboard interrupt received, exiting...')
+
+
+if __name__ == '__main__':
+ main()