diff --git a/src/Ui/UiServer.py b/src/Ui/UiServer.py index e8cdd545..4bf41b58 100644 --- a/src/Ui/UiServer.py +++ b/src/Ui/UiServer.py @@ -2,7 +2,6 @@ import logging import time import cgi import socket -import sys import gevent from gevent.pywsgi import WSGIServer @@ -16,6 +15,17 @@ from Debug import Debug import importlib +class LogDb(logging.StreamHandler): + def __init__(self, ui_server): + self.lines = [] + self.ui_server = ui_server + return super(LogDb, self).__init__() + + def emit(self, record): + self.ui_server.updateWebsocket(log_event=record.levelname) + self.lines.append([time.time(), record.levelname, self.format(record)]) + + # Skip websocket handler if not necessary class UiWSGIHandler(WSGIHandler): @@ -53,7 +63,6 @@ class UiWSGIHandler(WSGIHandler): class UiServer: - def __init__(self): self.ip = config.ui_ip self.port = config.ui_port @@ -86,6 +95,10 @@ class UiServer: self.sites = SiteManager.site_manager.list() self.log = logging.getLogger(__name__) + self.logdb_errors = LogDb(ui_server=self) + self.logdb_errors.setLevel(logging.getLevelName("ERROR")) + logging.getLogger('').addHandler(self.logdb_errors) + # After WebUI started def afterStarted(self): from util import Platform @@ -196,5 +209,10 @@ class UiServer: time.sleep(1) def updateWebsocket(self, **kwargs): + if kwargs: + param = {"event": list(kwargs.items())[0]} + else: + param = None + for ws in self.websockets: - ws.event("serverChanged", kwargs) + ws.event("serverChanged", param) diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py index 6d6559f2..9a245377 100644 --- a/src/Ui/UiWebsocket.py +++ b/src/Ui/UiWebsocket.py @@ -139,6 +139,8 @@ class UiWebsocket(object): self.cmd("setSiteInfo", site_info) elif channel == "serverChanged": server_info = self.formatServerInfo() + if len(params) > 0 and params[0]: # Extra data + server_info.update(params[0]) self.cmd("setServerInfo", server_info) elif channel == "announcerChanged": site = params[0] @@ -1101,6 +1103,11 @@ class UiWebsocket(object): self.user.save() self.response(to, "ok") + @flag.admin + @flag.no_multiuser + def actionServerErrors(self, to): + return self.server.logdb_errors.lines + @flag.admin @flag.no_multiuser def actionServerUpdate(self, to): @@ -1227,4 +1234,4 @@ class UiWebsocket(object): else: gevent.spawn(main.file_server.checkSites, check_files=False, force_port_check=True) - self.response(to, "ok") + self.response(to, "ok") \ No newline at end of file