PRoces handler.
This commit is contained in:
parent
9b49e659e5
commit
823892a302
@ -11,20 +11,40 @@ 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.process = subprocess.Popen(
|
self.command = command
|
||||||
command.split(" "),
|
self.start_process(self.command)
|
||||||
stdin=self.slave,
|
|
||||||
stdout=self.slave,
|
def start_process(self, command):
|
||||||
stderr=self.slave,
|
if not self.is_running():
|
||||||
bufsize=0,
|
if self.master:
|
||||||
universal_newlines=True,
|
os.close(self.master)
|
||||||
)
|
os.close(self.slave)
|
||||||
|
self.master = None
|
||||||
|
self.slave = None
|
||||||
|
|
||||||
|
self.master, self.slave = pty.openpty()
|
||||||
|
self.process = subprocess.Popen(
|
||||||
|
command.split(" "),
|
||||||
|
stdin=self.slave,
|
||||||
|
stdout=self.slave,
|
||||||
|
stderr=self.slave,
|
||||||
|
bufsize=0,
|
||||||
|
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:
|
||||||
print("Terminating process")
|
await self.close()
|
||||||
self.process.terminate()
|
break
|
||||||
print("Terminated process")
|
|
||||||
for ws in self.sockets:
|
async def close(self):
|
||||||
try:
|
print("Terminating process")
|
||||||
await ws.close()
|
if self.process:
|
||||||
except Exception:
|
self.process.terminate()
|
||||||
pass
|
self.process = None
|
||||||
break
|
if self.master:
|
||||||
|
os.close(self.master)
|
||||||
|
os.close(self.slave)
|
||||||
|
self.master = None
|
||||||
|
self.slave = None
|
||||||
|
|
||||||
|
print("Terminated process")
|
||||||
|
for ws in self.sockets:
|
||||||
|
try:
|
||||||
|
await ws.close()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
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
|
||||||
await asyncio.get_event_loop().run_in_executor(
|
try:
|
||||||
None, os.write, self.master, data
|
await asyncio.get_event_loop().run_in_executor(
|
||||||
)
|
None, os.write, self.master, data
|
||||||
|
)
|
||||||
|
except Exception as ex:
|
||||||
|
print(ex)
|
||||||
|
await self.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user