diff --git a/app/classes/shared/cmd.py b/app/classes/shared/cmd.py index a46c1b49..06f29434 100644 --- a/app/classes/shared/cmd.py +++ b/app/classes/shared/cmd.py @@ -10,6 +10,7 @@ logger = logging.getLogger(__name__) from app.classes.shared.console import console from app.classes.shared.helpers import helper from app.classes.shared.tasks import tasks_manager +from app.classes.web.websocket_helper import websocket_helper try: import requests @@ -43,7 +44,9 @@ class MainPrompt(cmd.Cmd): def do_exit(self, line): logger.info("Stopping all server daemons / threads") console.info("Stopping all server daemons / threads - This may take a few seconds") + websocket_helper.disconnect_all() self._clean_shutdown() + console.info('Waiting for main thread to stop') while True: if tasks_manager.get_main_thread_run_status(): sys.exit(0) diff --git a/app/classes/shared/tasks.py b/app/classes/shared/tasks.py index 8c5dc2cb..2e33722f 100644 --- a/app/classes/shared/tasks.py +++ b/app/classes/shared/tasks.py @@ -4,11 +4,12 @@ import json import time import logging import threading +import asyncio from app.classes.shared.helpers import helper from app.classes.shared.console import console from app.classes.web.tornado import webserver -from app.classes.web.websocket_handler import WebSocketHandler +from app.classes.web.websocket_helper import websocket_helper from app.classes.minecraft.stats import stats from app.classes.shared.controller import controller @@ -40,7 +41,7 @@ class TasksManager: self.command_thread = threading.Thread(target=self.command_watcher, daemon=True, name="command_watcher") self.command_thread.start() - self.realtime_thread = threading.Thread(target=self.realtime_thread, daemon=True, name="realtime") + self.realtime_thread = threading.Thread(target=self.realtime, daemon=True, name="realtime") self.realtime_thread.start() def get_main_thread_run_status(self): @@ -137,8 +138,40 @@ class TasksManager: schedule.every(12).hours.do(server_jar_obj.refresh_cache) @staticmethod - def realtime_thread(): - console.debug('realtime zero') + def realtime(): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + console.debug('realtime start') + host_stats = db_helper.get_latest_hosts_stats() + + while True: + + if host_stats.get('cpu_usage') != \ + db_helper.get_latest_hosts_stats().get('cpu_usage') or \ + host_stats.get('mem_percent') != \ + db_helper.get_latest_hosts_stats().get('mem_percent'): + # Stats are different + + console.debug('realtime 1') + host_stats = db_helper.get_latest_hosts_stats() + if len(websocket_helper.clients) > 0: + # There are clients + console.debug('realtime 11') + websocket_helper.broadcast('update_host_stats', { + 'cpu_usage': host_stats.get('cpu_usage'), + 'cpu_cores': host_stats.get('cpu_cores'), + 'cpu_cur_freq': host_stats.get('cpu_cur_freq'), + 'cpu_max_freq': host_stats.get('cpu_max_freq'), + 'mem_percent': host_stats.get('mem_percent'), + 'mem_usage': host_stats.get('mem_usage') + }) + time.sleep(4) + else: + # Stats are same + console.debug('realtime 0') + time.sleep(8) + tasks_manager = TasksManager() diff --git a/app/classes/web/websocket_handler.py b/app/classes/web/websocket_handler.py index 3cb4192b..1b03e855 100644 --- a/app/classes/web/websocket_handler.py +++ b/app/classes/web/websocket_handler.py @@ -2,37 +2,23 @@ import json import tornado.websocket from app.classes.shared.console import console -from app.classes.shared.models import db_helper +from app.classes.web.websocket_helper import websocket_helper class WebSocketHandler(tornado.websocket.WebSocketHandler): - connections = set() def open(self): - self.connections.add(self) + websocket_helper.addClient(self) console.debug('Opened WebSocket connection') - self.broadcast('client_joined', { - 'foo': 'bar', - }) + websocket_helper.broadcast('client_joined', {}) def on_message(self, rawMessage): - # broadcast - # for client in self.connections: - # client.write_message(message) - - # send message to client this message was sent by - # self.write_message console.debug('Got message from WebSocket connection {}'.format(rawMessage)) message = json.loads(rawMessage) console.debug('Type: {}, Data: {}'.format(message['type'], message['data'])) def on_close(self): - self.connections.remove(self) + websocket_helper.removeClient(self) console.debug('Closed WebSocket connection') - def broadcast(self, message_type: str, data): - console.debug('Sending: ' + str(json.dumps({'type': message_type, 'data': data}))) - message = str(json.dumps({'type': message_type, 'data': data})) - for client in self.connections: - client.write_message(message) diff --git a/app/classes/web/websocket_helper.py b/app/classes/web/websocket_helper.py new file mode 100644 index 00000000..49eaedcd --- /dev/null +++ b/app/classes/web/websocket_helper.py @@ -0,0 +1,29 @@ +import json + +from app.classes.shared.console import console + +class WebSocketHelper: + clients = set() + + def addClient(self, client): + self.clients.add(client) + + def removeClient(self, client): + self.clients.add(client) + + def broadcast(self, message_type: str, data): + console.debug('Sending: ' + str(json.dumps({'type': message_type, 'data': data}))) + message = str(json.dumps({'type': message_type, 'data': data})) + for client in self.clients: + try: + client.write_message(message) + except: + pass + + def disconnect_all(self): + console.info('Disconnecting WebSocket clients') + for client in self.clients: + client.close() + console.info('Disconnected WebSocket clients') + +websocket_helper = WebSocketHelper() \ No newline at end of file diff --git a/app/frontend/templates/panel/dashboard.html b/app/frontend/templates/panel/dashboard.html index 9fdf743f..f1324728 100644 --- a/app/frontend/templates/panel/dashboard.html +++ b/app/frontend/templates/panel/dashboard.html @@ -34,12 +34,11 @@
- {{ data.get('hosts_data').get('cpu_usage') }} {{ _('CPU Usage') }} - +
+ {{ data.get('hosts_data').get('cpu_usage') }} {{ _('CPU Usage') }}
-- {{ data.get('hosts_data').get('mem_percent') }}% {{ _('Memory Usage') }} +
+ {{ data.get('hosts_data').get('mem_percent') }}% {{ _('Memory Usage') }}