Coverage for webgeodyn/server/server.py: 0%
72 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-12-18 09:33 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-12-18 09:33 +0000
1import tornado.ioloop as ioloop
2import tornado.web as web
3from tornado.httpserver import HTTPServer
4from tornado.log import enable_pretty_logging, gen_log
5from tornado.concurrent import run_on_executor
7import json
8import signal
9import os
10import sys
11import urllib
12import webbrowser
13import uuid
14import logging
16from webgeodyn.server.datahandlers import *
17from webgeodyn.obsdata import ObsData
19static_path = os.path.normpath(os.path.join(os.path.dirname(__file__) , "..", "www")) # path of static files
20listeningport = 8080
23class CloseHandler(RequestHandler):
24 closeUUID = str(uuid.uuid4())
26 def get(self):
27 self.write(json.dumps({'closeUUID': self.closeUUID}))
29 def post(self):
30 gen_log.info("User closed web browser.")
31 str_data = tornado.escape.url_unescape(self.request.body)
32 json_request = json.loads(str_data)
33 if json_request.get("closeUUID") == self.closeUUID:
34 ioloop.IOLoop.current().add_timeout(datetime.timedelta(seconds=1), stopServer)
37def stopServer(*args):
38 gen_log.info(" Asking server to exit...")
39 ioloop.IOLoop.current().stop()
42def startServer(models, archive, allowarchive=False, allowclose=True, showbrowser=True, debug=False, obs_directory=None):
43 import tornado.options
45 obsdata = ObsData(obs_directory=obs_directory)
47 DEFAULT_LEVEL = logging.DEBUG
48 DEFAULT_FORMAT = '[%(levelname)s - %(asctime)s] %(message)s'
50 # Enable logging through tornado.web.Application.log_request in stdout
51 tornado.log.enable_pretty_logging()
53 # Logging in seperate files (not used for now)
54 # access_file = logging.FileHandler(os.path.join(os.path.dirname(__file__), 'log/access.log'))
55 # access_file.setLevel(DEFAULT_LEVEL)
56 # access_file.setFormatter(tornado.log.LogFormatter(fmt=DEFAULT_FORMAT))
57 # tornado.log.access_log.addHandler(access_file)
58 # general_file = logging.FileHandler(os.path.join(os.path.dirname(__file__), 'log/general.log'))
59 # general_file.setLevel(DEFAULT_LEVEL)
60 # general_file.setFormatter(tornado.log.LogFormatter(fmt=DEFAULT_FORMAT))
61 # tornado.log.gen_log.addHandler(general_file)
62 # app_file = logging.FileHandler(os.path.join(os.path.dirname(__file__), 'log/app.log'))
63 # tornado.log.app_log.addHandler(app_file)
65 # Custom log function to have more info than the default logging function
66 def log_function(handler):
67 if handler.get_status() < 400:
68 log_method = access_log.info
69 elif handler.get_status() < 500:
70 log_method = access_log.warning
71 else:
72 log_method = access_log.error
73 request_time = 1000.0 * handler.request.request_time()
74 request_ip = handler.request.headers.get('X-Real-IP') or handler.request.remote_ip
76 log_method("{0} {1.method} {1.uri} ({1.host} {2}) in {3:.2f}ms"
77 .format(handler.get_status(), handler.request, request_ip, request_time))
78 return
80 settings = {
81 "cookie_secret": str(uuid.uuid4()),
82 "autoreload": debug,
83 "debug": debug,
84 "log_function": log_function,
85 #"login_url": "/"
86 }
88 handlers = [
89 url(r"/getdatalist", DataListHandler, {"models": models, "obsdata": obsdata}),
90 url(r"/getglobedata", GlobeDataHandler, {"models": models, "obsdata": obsdata}),
91 url(r"/getloddata", LodDataHandler, {"models": models, "obsdata": obsdata}),
92 url(r"/getspherharmdata", SpherHarmDataHandler, {"models": models, "obsdata": obsdata}),
93 url(r"/getspectradata", SpectraDataHandler, {"models": models, "obsdata": obsdata}),
94 url(r"/gettimeseriedata", TimeSerieDataHandler, {"models": models, "obsdata": obsdata}),
95 url(r"/getobservatorydata", ObservatoryDataHandler, {"models": models, "obsdata": obsdata}),
96 url(r"/getexportfileinfo", ExportFileInfoHandler, {"models": models, "obsdata": obsdata}),
97 ]
99 if allowarchive == True:
100 handlers.append(url(r"/getexportarchiveinfo", ExportFileInfoHandler, {"models": archive, "obsdata": obsdata})),
101 handlers.append(url(r"/getarchivelist", DataListHandler, {"models": archive, "obsdata": obsdata})),
103 if allowclose:
104 handlers.append(url(r"/close", CloseHandler))
106 # Add file handler for each model that link to the directory of the zip archive for export
107 # Model
108 for model_name, model in models.items():
109 handlers.append(url(r'/'+model_name+r'/('+model_name+r'\.zip)', StaticFileHandler, {'path': model.dataDirectory}))
110 # Archive
111 for archive_name, archive in archive.items():
112 handlers.append(url(r'/'+archive_name+r'/('+archive_name+r'\.zip)', StaticFileHandler, {'path': archive.dataDirectory}))
114 handlers.append(url(r'/(.*)', StaticFileHandler,
115 {'path': static_path, 'default_filename': 'index.html'}))
118 app = tornado.web.Application(handlers, **settings)
120 server = app.listen(listeningport, xheaders=True)
122 loop = ioloop.IOLoop.current()
123 #signal.signal(signal.SIGQUIT, sig_exit) # SIGQUIT is send by our supervisord to stop this server.
124 #signal.signal(signal.SIGTERM, sig_exit) # SIGTERM is send by Ctrl+C or supervisord's default.
125 #signal.signal(signal.SIGINT, sig_exit)
126 local_address = "http://localhost:"+str(listeningport)+"/"
127 gen_log.info('Server listening to ' + str(listeningport) + ' local_address:{local_address}')
129 if showbrowser:
130 webbrowser.open("http://localhost:"+str(listeningport)+"/", new=1, autoraise=True)
132 try:
133 loop.start()
134 except KeyboardInterrupt:
135 gen_log.info("KeyboardInterrupt")
136 stopServer()
138 server.stop()
139 gen_log.info("Server stopped.")