--- /dev/null
+#!/usr/bin/python
+
+import socket
+import string
+import cgi
+import time
+import log
+import sys
+import traceback
+import os
+from config import config, init_conf
+
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+
+import request_handler
+import path
+
+class MyHandler(BaseHTTPRequestHandler):
+
+ def do_GET(self):
+ self.send_error(401);
+
+ def do_POST(self):
+ global rootnode
+ try:
+ length = int(self.headers.getheader('content-length'))
+ ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
+ if ctype != 'application/x-www-form-urlencoded':
+ log.error("request_handler_server: [%s]: 401 Unauthorized" % self.client_address[0])
+ self.send_error(401)
+ self.end_headers()
+ return
+
+ query = self.rfile.read(length)
+
+ filename = self.headers.getheader('x-filename')
+
+ if not request_handler.handle_request_main(query, filename = filename):
+ error = log.last_log();
+ log.error("request_handler_server: [%s]: handle_request_main(..., %s) failed" % (self.client_address[0], filename))
+ self.send_error(500, "%s: request failed. %s" % (filename, error))
+ self.end_headers()
+ return
+
+ self.send_response(200)
+ self.end_headers()
+
+ except Exception, e:
+ self.send_error(500, "%s: %s" % (filename, e))
+ self.end_headers()
+ log.error("request_handler_server: [%s]: exception: %s\n%s" % (self.client_address[0], e, traceback.format_exc()))
+ raise
+ pass
+
+def write_css():
+ css_file = path.www_dir + "/style.css"
+ # skip if file exists and code is not newer
+ if os.path.exists(css_file) and os.stat(__file__).st_mtime < os.stat(css_file).st_mtime:
+ return
+
+ # css from www.pld-linux.org wiki theme, using css usage firebug plugin to cleanup
+ css = """
+html {
+ background-color: white;
+ color: #5e5e5e;
+ font-family: Tahoma, Arial, Lucida Grande, sans-serif;
+ font-size: 0.75em;
+ line-height: 1.25em;
+}
+
+a {
+ text-decoration: underline;
+ color: #006;
+}
+
+a:hover {
+ color: #006;
+}
+
+pre {
+ background: #FFF8EB;
+ border: 1pt solid #FFE2AB;
+ font-family: courier, monospace;
+ padding: 0.5em;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+@media screen, projection {
+ html {
+ background-color: #f3efe3;
+ }
+
+ body {
+ position: relative;
+ }
+
+ div {
+ background-color: white;
+ margin: 10px 0px;
+ padding: 2px;
+ }
+ div > a {
+ font-weight: bold;
+ color: #5e5e5e;
+ }
+ div > a:hover {
+ color: #5e5e5e;
+ }
+ div.upgrade {
+ background-color: #e4f1cf;
+ }
+ div:target {
+ background-color: #ffffcc;
+ color: black;
+ }
+}
+@media print {
+ a {
+ background-color: inherit;
+ color: inherit;
+ }
+}
+
+@media projection {
+ html { line-height: 1.8em; }
+ body, b, a, p { font-size: 22pt; }
+}
+"""
+ old_umask = os.umask(0022)
+ f = open(css_file, "w")
+ f.write(css)
+ f.close()
+ os.umask(old_umask)
+
+def write_js():
+ js_file = path.www_dir + "/script.js"
+ # skip if file exists and code is not newer
+ if os.path.exists(js_file) and os.stat(__file__).st_mtime < os.stat(js_file).st_mtime:
+ return
+
+ js = """
+// update date stamps to reflect viewers timezone
+function update_tz(t) {
+ var el, off, dt,
+ collection = document.getElementsByTagName('span');
+ for (off in collection) {
+ el = collection[off];
+ if (el.id == 'tz') {
+ dt = new Date(el.innerHTML).toString();
+ // strip timezone name, it is usually wrong when not initialized
+ // from TZ env, but reverse calculated from os data
+ dt = dt.replace(/\s+\(.+\)/, "");
+ // strip "GMT"
+ dt = dt.replace(/GMT/, "");
+ el.innerHTML = dt;
+ }
+ }
+}
+window.onload = update_tz;
+"""
+ old_umask = os.umask(0022)
+ f = open(js_file, "w")
+ f.write(js)
+ f.close()
+ os.umask(old_umask)
+
+def main():
+ write_css();
+ write_js();
+ socket.setdefaulttimeout(30)
+ try:
+ init_conf()
+ host = ""
+ port = config.request_handler_server_port
+
+ try:
+ server = HTTPServer((host, port), MyHandler)
+ except Exception, e:
+ log.notice("request_handler_server: can't start server on [%s:%d]: %s" % (host, port, e))
+ print >> sys.stderr, "ERROR: Can't start server on [%s:%d]: %s" % (host, port, e)
+ sys.exit(1)
+
+ log.notice('request_handler_server: started on [%s:%d]...' % (host, port))
+ server.serve_forever()
+ except KeyboardInterrupt:
+ log.notice('request_handler_server: ^C received, shutting down server')
+ server.socket.close()
+
+if __name__ == '__main__':
+ main()
+