diff --git a/app/classes/shared/controller.py b/app/classes/shared/controller.py index cd568504..72b33ed6 100644 --- a/app/classes/shared/controller.py +++ b/app/classes/shared/controller.py @@ -285,7 +285,7 @@ class Controller: server_command = 'java -Xms{}M -Xmx{}M -jar {} nogui'.format(helper.float_to_string(min_mem), helper.float_to_string(max_mem), full_jar_path) - print('command: ' + server_command) + logger.debug('command: ' + server_command) server_log_file = "{}/logs/latest.log".format(new_server_dir) server_stop = "stop" diff --git a/app/classes/shared/server.py b/app/classes/shared/server.py index c4901125..b9e029bf 100644 --- a/app/classes/shared/server.py +++ b/app/classes/shared/server.py @@ -53,20 +53,11 @@ class ServerOutBuf: self.line_buffer += char def new_line_handler(self, new_line): - console.debug('New line: {}'.format(new_line)) - + new_line = re.sub('(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)|(> )', '', new_line) + new_line = re.sub('[A-z]{2}\b\b', '', new_line) highlighted = helper.log_colors(html.escape(new_line)) - print('broadcasting new vterm line') - - websocket_helper.broadcast_page_params( - '/panel/server_detail', - { - 'id': self.server_id - }, - 'notification', - 'test test test' - ) + logger.debug('Broadcasting new virtual terminal line') # TODO: Do not send data to clients who do not have permission to view this server's console websocket_helper.broadcast_page_params( @@ -76,8 +67,7 @@ class ServerOutBuf: }, 'vterm_new_line', { - 'line': highlighted + '
', - 'server_id': self.server_id + 'line': highlighted + '
' } ) @@ -137,7 +127,7 @@ class Server: def run_threaded_server(self): # start the server - self.server_thread = threading.Thread(target=self.start_server, daemon=True) + self.server_thread = threading.Thread(target=self.start_server, daemon=True, name='{}_server_thread'.format(self.server_id)) self.server_thread.start() def setup_server_run_command(self): @@ -185,8 +175,8 @@ class Server: self.process = pexpect.spawn(self.server_command, cwd=self.server_path, timeout=None, encoding='utf-8') out_buf = ServerOutBuf(self.process, self.server_id) - console.cyan('Start vterm listener') - threading.Thread(target=out_buf.check, daemon=True).start() + logger.debug('Starting virtual terminal listener for server {}'.format(self.name)) + threading.Thread(target=out_buf.check, daemon=True, name='{}_virtual_terminal'.format(self.server_id)).start() self.is_crashed = False diff --git a/app/classes/shared/tasks.py b/app/classes/shared/tasks.py index 69c98e93..2d2586a8 100644 --- a/app/classes/shared/tasks.py +++ b/app/classes/shared/tasks.py @@ -196,7 +196,6 @@ class TasksManager: host_stats = db_helper.get_latest_hosts_stats() if len(websocket_helper.clients) > 0: - print('there are clients') # There are clients websocket_helper.broadcast_page('/panel/dashboard', 'update_host_stats', { 'cpu_usage': host_stats.get('cpu_usage'), diff --git a/app/classes/web/ajax_handler.py b/app/classes/web/ajax_handler.py index 35bfb990..68572b61 100644 --- a/app/classes/web/ajax_handler.py +++ b/app/classes/web/ajax_handler.py @@ -6,6 +6,7 @@ import bleach import os import shutil import html +import re from app.classes.shared.console import console from app.classes.shared.models import Users, installer @@ -71,6 +72,8 @@ class AjaxHandler(BaseHandler): for d in data: try: + d = re.sub('(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)|(> )', '', d) + d = re.sub('[A-z]{2}\b\b', '', d) line = helper.log_colors(html.escape(d)) self.write('{}
'.format(line)) # self.write(d.encode("utf-8")) @@ -152,7 +155,6 @@ class AjaxHandler(BaseHandler): file_name = self.get_body_argument('file_name', default=None, strip=True) file_path = os.path.join(file_parent, file_name) server_id = self.get_argument('id', None) - print(server_id) if not self.check_server_id(server_id, 'create_file'): return else: server_id = bleach.clean(server_id) @@ -172,7 +174,6 @@ class AjaxHandler(BaseHandler): dir_name = self.get_body_argument('dir_name', default=None, strip=True) dir_path = os.path.join(dir_parent, dir_name) server_id = self.get_argument('id', None) - print(server_id) if not self.check_server_id(server_id, 'create_dir'): return else: server_id = bleach.clean(server_id) @@ -211,7 +212,6 @@ class AjaxHandler(BaseHandler): elif page == "del_dir": dir_path = self.get_body_argument('dir_path', default=None, strip=True) server_id = self.get_argument('id', None) - print(server_id) console.warning("delete {} for server {}".format(file_path, server_id)) @@ -235,9 +235,6 @@ class AjaxHandler(BaseHandler): file_contents = self.get_body_argument('file_contents', default=None, strip=True) file_path = self.get_body_argument('file_path', default=None, strip=True) server_id = self.get_argument('id', None) - print(file_contents) - print(file_path) - print(server_id) if not self.check_server_id(server_id, 'save_file'): return else: server_id = bleach.clean(server_id) @@ -256,7 +253,6 @@ class AjaxHandler(BaseHandler): item_path = self.get_body_argument('item_path', default=None, strip=True) new_item_name = self.get_body_argument('new_item_name', default=None, strip=True) server_id = self.get_argument('id', None) - print(server_id) if not self.check_server_id(server_id, 'rename_item'): return else: server_id = bleach.clean(server_id) diff --git a/app/classes/web/tornado.py b/app/classes/web/tornado.py index ced565ea..e3f51619 100644 --- a/app/classes/web/tornado.py +++ b/app/classes/web/tornado.py @@ -159,7 +159,7 @@ class Webserver: console.info("Server Init Complete: Listening For Connections:") - self.ioloop = tornado.ioloop.IOLoop.instance() + self.ioloop = tornado.ioloop.IOLoop.current() self.ioloop.start() def stop_web_server(self): diff --git a/app/classes/web/websocket_handler.py b/app/classes/web/websocket_handler.py index 3c83dbc0..ad98c2ab 100644 --- a/app/classes/web/websocket_handler.py +++ b/app/classes/web/websocket_handler.py @@ -1,14 +1,21 @@ import json import logging +import asyncio from urllib.parse import parse_qsl -import tornado.websocket from app.classes.shared.models import Users, db_helper from app.classes.shared.helpers import helper from app.classes.web.websocket_helper import websocket_helper logger = logging.getLogger(__name__) +try: + import tornado.websocket + +except ModuleNotFoundError as e: + logger.critical("Import Error: Unable to load {} module".format(e, e.name)) + console.critical("Import Error: Unable to load {} module".format(e, e.name)) + sys.exit(1) class SocketHandler(tornado.websocket.WebSocketHandler): @@ -16,6 +23,7 @@ class SocketHandler(tornado.websocket.WebSocketHandler): self.controller = controller self.tasks_manager = tasks_manager self.translator = translator + self.io_loop = tornado.ioloop.IOLoop.current() def get_remote_ip(self): remote_ip = self.request.headers.get("X-Real-IP") or \ @@ -67,3 +75,9 @@ class SocketHandler(tornado.websocket.WebSocketHandler): logger.debug('Closed WebSocket connection') # websocket_helper.broadcast('notification', 'Client disconnected') + async def write_message_int(self, message): + self.write_message(message) + + def write_message_helper(self, message): + asyncio.run_coroutine_threadsafe(self.write_message_int(message), self.io_loop.asyncio_loop) + diff --git a/app/classes/web/websocket_helper.py b/app/classes/web/websocket_helper.py index 5fdd72fb..99935ad3 100644 --- a/app/classes/web/websocket_helper.py +++ b/app/classes/web/websocket_helper.py @@ -1,10 +1,20 @@ import json import logging +import sys, threading, asyncio from app.classes.shared.console import console logger = logging.getLogger(__name__) + +try: + import tornado.ioloop + +except ModuleNotFoundError as e: + logger.critical("Import Error: Unable to load {} module".format(e, e.name)) + console.critical("Import Error: Unable to load {} module".format(e, e.name)) + sys.exit(1) + class WebSocketHelper: def __init__(self): self.clients = set() @@ -14,19 +24,19 @@ class WebSocketHelper: def remove_client(self, client): self.clients.remove(client) - + def send_message(self, client, event_type: str, data): if client.check_auth(): message = str(json.dumps({'event': event_type, 'data': data})) - client.write_message(message) + client.write_message_helper(message) def broadcast(self, event_type: str, data): logger.debug('Sending to {} clients: {}'.format(len(self.clients), json.dumps({'event': event_type, 'data': data}))) for client in self.clients: try: self.send_message(client, event_type, data) - except Exception: - pass + except Exception as e: + logger.exception('Error catched while sending WebSocket message to {}'.format(client.get_remote_ip())) def broadcast_page(self, page: str, event_type: str, data): def filter_fn(client): @@ -39,8 +49,8 @@ class WebSocketHelper: for client in clients: try: self.send_message(client, event_type, data) - except Exception: - pass + except Exception as e: + logger.exception('Error catched while sending WebSocket message to {}'.format(client.get_remote_ip())) def broadcast_page_params(self, page: str, params: dict, event_type: str, data): def filter_fn(client): @@ -58,8 +68,8 @@ class WebSocketHelper: for client in clients: try: self.send_message(client, event_type, data) - except Exception: - pass + except Exception as e: + logger.exception('Error catched while sending WebSocket message to {}'.format(client.get_remote_ip())) def disconnect_all(self): console.info('Disconnecting WebSocket clients') diff --git a/app/config/config.json b/app/config/config.json index 693c1440..27f08bb8 100644 --- a/app/config/config.json +++ b/app/config/config.json @@ -10,7 +10,7 @@ "stats_update_frequency": 30, "delete_default_json": false, "show_contribute_link": true, - "virtual_terminal_lines": 30, + "virtual_terminal_lines": 70, "max_log_lines": 700, "keywords": ["help", "chunk"] } diff --git a/app/frontend/templates/panel/server_term.html b/app/frontend/templates/panel/server_term.html index 92c7e54c..74e09171 100644 --- a/app/frontend/templates/panel/server_term.html +++ b/app/frontend/templates/panel/server_term.html @@ -65,7 +65,7 @@ @@ -147,7 +147,6 @@ let server_id = '{{ data['server_stats']['server_id']['server_id'] }}'; function get_server_log(){ - if( !$("#stop_scroll").is(':checked')){ $.ajax({ type: 'GET', url: '/ajax/server_log?id={{ data['server_stats']['server_id']['server_id'] }}', @@ -155,15 +154,15 @@ success: function (data) { console.log('Got Log From Server') $('#virt_console').html(data); - scroll(); - }, + scrollConsole(); + }, }); - } } function new_line_handler(data) { - if (server_id === data.server_id) { - $('#virt_console').append(data.line) + $('#virt_console').append(data.line) + if (!$("#stop_scroll").is(':checked')) { + scrollConsole() } } @@ -177,13 +176,7 @@ console.log( "ready!" ); get_server_log() - if (webSocket) { - webSocket.on('vterm_new_line', new_line_handler) - } else { - setInterval(function(){ - get_server_log() // this will run after every 5 seconds - }, 1500); - } + webSocket.on('vterm_new_line', new_line_handler) }); $('#server_command').on('keydown', function (e) { @@ -206,7 +199,7 @@ }); - function scroll(){ + function scrollConsole(){ var logview = $('#virt_console'); if(logview.length) logview.scrollTop(logview[0].scrollHeight - logview.height()); diff --git a/app/translations/en_EN.json b/app/translations/en_EN.json index d22eff97..16f47d6a 100644 --- a/app/translations/en_EN.json +++ b/app/translations/en_EN.json @@ -120,7 +120,7 @@ "playerControls": "Player Management" }, "serverTerm": { - "stopRefresh": "Stop Refresh", + "stopScroll": "Stop Auto Scrollling", "commandInput": "Enter your command", "sendCommand": "Send command", "start": "Start", diff --git a/app/translations/fi_FI.json b/app/translations/fi_FI.json index c13182fa..a9a34a0e 100644 --- a/app/translations/fi_FI.json +++ b/app/translations/fi_FI.json @@ -120,7 +120,7 @@ "playerControls": "Pelaajahallinta" }, "serverTerm": { - "stopRefresh": "Lopeta päivitys", + "stopScroll": "Lopeta automaattinen vieritys", "commandInput": "Kirjoita komento", "sendCommand": "Lähetä komento", "start": "Käynnistä",