Fix asyncio event loop error in Flask routes

parent 340465fa
...@@ -42,6 +42,7 @@ active_terminals = {} ...@@ -42,6 +42,7 @@ active_terminals = {}
debug = False debug = False
server_password = None server_password = None
args = None args = None
loop = None
# Flask app for web interface # Flask app for web interface
app = Flask(__name__) app = Flask(__name__)
...@@ -184,7 +185,7 @@ def connect_terminal(client_id): ...@@ -184,7 +185,7 @@ def connect_terminal(client_id):
if client_id in clients: if client_id in clients:
request_id = str(uuid.uuid4()) request_id = str(uuid.uuid4())
active_terminals[request_id] = {'client_id': client_id, 'username': username, 'data': []} active_terminals[request_id] = {'client_id': client_id, 'username': username, 'data': []}
asyncio.create_task(send_terminal_request(request_id, client_id, username)) loop.call_soon_threadsafe(lambda: asyncio.create_task(send_terminal_request(request_id, client_id, username)))
return jsonify({'request_id': request_id}) return jsonify({'request_id': request_id})
return jsonify({'error': 'Client not connected'}), 400 return jsonify({'error': 'Client not connected'}), 400
...@@ -202,7 +203,7 @@ def terminal_data(client_id): ...@@ -202,7 +203,7 @@ def terminal_data(client_id):
request_id = request.form.get('request_id') request_id = request.form.get('request_id')
data = request.form.get('data') data = request.form.get('data')
if request_id in active_terminals: if request_id in active_terminals:
asyncio.create_task(send_terminal_data(request_id, active_terminals[request_id]['client_id'], data)) loop.call_soon_threadsafe(lambda: asyncio.create_task(send_terminal_data(request_id, active_terminals[request_id]['client_id'], data)))
return 'OK' return 'OK'
else: else:
request_id = request.args.get('request_id') request_id = request.args.get('request_id')
...@@ -224,7 +225,7 @@ async def send_terminal_data(request_id, client_id, data): ...@@ -224,7 +225,7 @@ async def send_terminal_data(request_id, client_id, data):
def disconnect_terminal(client_id): def disconnect_terminal(client_id):
request_id = request.form.get('request_id') request_id = request.form.get('request_id')
if request_id in active_terminals: if request_id in active_terminals:
asyncio.create_task(send_terminal_close(request_id, active_terminals[request_id]['client_id'])) loop.call_soon_threadsafe(lambda: asyncio.create_task(send_terminal_close(request_id, active_terminals[request_id]['client_id'])))
del active_terminals[request_id] del active_terminals[request_id]
return 'OK' return 'OK'
...@@ -373,6 +374,9 @@ async def main(): ...@@ -373,6 +374,9 @@ async def main():
# Start WebSocket server # Start WebSocket server
ws_server = await websockets.serve(handle_websocket, args.host, args.port, ssl=ssl_context) ws_server = await websockets.serve(handle_websocket, args.host, args.port, ssl=ssl_context)
global loop
loop = asyncio.get_running_loop()
print(f"WebSocket SSH Daemon running on {args.host}:{args.port}") print(f"WebSocket SSH Daemon running on {args.host}:{args.port}")
# Start web interface if specified # Start web interface if specified
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment