PRoces handler.

This commit is contained in:
retoor 2025-04-13 14:47:10 +02:00
parent 9b49e659e5
commit 823892a302

View File

@ -11,10 +11,23 @@ commands = {
class TerminalSession: class TerminalSession:
def __init__(self, command): def __init__(self, command):
self.master, self.slave = pty.openpty() self.master, self.slave = None,None
self.process = None
self.sockets = [] self.sockets = []
self.history = b"" self.history = b""
self.history_size = 1024 * 20 self.history_size = 1024 * 20
self.command = command
self.start_process(self.command)
def start_process(self, command):
if not self.is_running():
if self.master:
os.close(self.master)
os.close(self.slave)
self.master = None
self.slave = None
self.master, self.slave = pty.openpty()
self.process = subprocess.Popen( self.process = subprocess.Popen(
command.split(" "), command.split(" "),
stdin=self.slave, stdin=self.slave,
@ -24,7 +37,14 @@ class TerminalSession:
universal_newlines=True, universal_newlines=True,
) )
def is_running(self):
if not self.process:
return False
loop = asyncio.get_event_loop()
return self.process.poll() is None
async def add_websocket(self, ws): async def add_websocket(self, ws):
self.start_process(self.command)
asyncio.create_task(self.read_output(ws)) asyncio.create_task(self.read_output(ws))
async def read_output(self, ws): async def read_output(self, ws):
@ -52,21 +72,37 @@ class TerminalSession:
except: except:
self.sockets.remove(ws) self.sockets.remove(ws)
except Exception: except Exception:
await self.close()
break
async def close(self):
print("Terminating process") print("Terminating process")
if self.process:
self.process.terminate() self.process.terminate()
self.process = None
if self.master:
os.close(self.master)
os.close(self.slave)
self.master = None
self.slave = None
print("Terminated process") print("Terminated process")
for ws in self.sockets: for ws in self.sockets:
try: try:
await ws.close() await ws.close()
except Exception: except Exception:
pass pass
break self.sockets = []
async def write_input(self, data): async def write_input(self, data):
try: try:
data = data.encode() data = data.encode()
except AttributeError: except AttributeError:
pass pass
try:
await asyncio.get_event_loop().run_in_executor( await asyncio.get_event_loop().run_in_executor(
None, os.write, self.master, data None, os.write, self.master, data
) )
except Exception as ex:
print(ex)
await self.close()