]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/request_handler_server.py
- revert CSS changes, they make status page barely readable
[tld-builder.git] / TLD_Builder / request_handler_server.py
1 #!/usr/bin/python3
2
3 import socket
4 import string
5 import time
6 import log
7 import ssl
8 import sys
9 import traceback
10 import os
11 from config import config, init_conf
12
13 from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
14
15 import request_handler
16 import path
17
18 class MyHandler(BaseHTTPRequestHandler):
19
20     def do_GET(self):
21         self.send_error(401);
22
23     def do_POST(self):
24         global rootnode
25         try:
26             length = int(self.headers.get('content-length'))
27             filename = self.headers.get('x-filename')
28             if not length:
29                 log.error("request_handler_server: [%s]: 401 Unauthorized" % self.client_address[0])
30                 self.send_error(401)
31                 self.end_headers()
32                 return
33
34             query = self.rfile.read(length)
35
36             if not request_handler.handle_request_main(query, filename = filename):
37                 error = log.last_log();
38                 log.error("request_handler_server: [%s]: handle_request_main(..., %s) failed" % (self.client_address[0], filename))
39                 self.send_error(500, "%s: request failed. %s" % (filename, error))
40                 self.end_headers()
41                 return
42
43             self.send_response(200)
44             self.end_headers()
45
46         except Exception as e:
47             self.send_error(500, "%s: %s" % (filename, e))
48             self.end_headers()
49             log.error("request_handler_server: [%s]: exception: %s\n%s" % (self.client_address[0], e, traceback.format_exc()))
50             raise
51             pass
52
53 def write_css():
54     css_src = os.path.join(os.path.dirname(__file__), 'style.css')
55     css_file = path.www_dir + "/style.css"
56     # skip if file exists and code is not newer
57     if os.path.exists(css_file) and os.stat(css_src).st_mtime < os.stat(css_file).st_mtime:
58         return
59
60     old_umask = os.umask(0o0022)
61     r = open(css_src, 'r')
62     f = open(css_file, "w")
63     f.write(r.read())
64     f.close()
65     r.close()
66     os.umask(old_umask)
67
68 def main(srv_ssl=False):
69     write_css();
70     socket.setdefaulttimeout(30)
71     try:
72         init_conf()
73         host = ""
74         port = config.request_handler_server_port
75         if srv_ssl:
76             port = config.request_handler_server_ssl_port
77
78         try:
79             server = ThreadingHTTPServer((host, port), MyHandler)
80             if srv_ssl:
81                 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
82                 context.load_cert_chain(certfile=path.conf_dir + "/" + config.request_handler_server_ssl_cert,
83                                         keyfile=path.conf_dir + "/" + config.request_handler_server_ssl_key)
84                 context.load_verify_locations(cafile="/etc/certs/ca-certificates.crt")
85                 server.socket = context.wrap_socket(server.socket, server_side=True)
86         except Exception as e:
87             log.notice("request_handler_server: can't start server on [%s:%d], ssl=%s: %s" % (host, port, str(srv_ssl), e))
88             print >> sys.stderr, "ERROR: Can't start server on [%s:%d], ssl=%s: %s" % (host, port, str(srv_ssl), e)
89             sys.exit(1)
90
91         log.notice('request_handler_server: started on [%s:%d], ssl=%s...' % (host, port, str(srv_ssl)))
92         server.serve_forever()
93     except KeyboardInterrupt:
94         log.notice('request_handler_server: ^C received, shutting down server')
95         server.socket.close()
96
97 if __name__ == '__main__':
98     srv_ssl = False
99     if len(sys.argv) == 2 and sys.argv[1] == "ssl":
100         srv_ssl = True
101
102     main(srv_ssl)