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 @@