Update terminalManagement

This commit is contained in:
chrys87 2017-08-22 13:08:48 +02:00 committed by GitHub
parent 5c9e984043
commit 0a1ca95836

View File

@ -1,11 +1,13 @@
import os import os
import struct
import sys
import pty import pty
import tty
import shlex import shlex
import signal import signal
import select
from pathlib import Path from pathlib import Path
import asyncio
import pyte import pyte
class Terminal: class Terminal:
@ -30,7 +32,7 @@ class Terminal:
return {"c": (cursor.x, cursor.y), "lines": lines} return {"c": (cursor.x, cursor.y), "lines": lines}
def open_terminal(command="bash", columns=80, lines=24): def open_terminal(command="bash -i", columns=80, lines=24):
p_pid, master_fd = pty.fork() p_pid, master_fd = pty.fork()
if p_pid == 0: # Child. if p_pid == 0: # Child.
argv = shlex.split(command) argv = shlex.split(command)
@ -41,6 +43,7 @@ def open_terminal(command="bash", columns=80, lines=24):
p_out = os.fdopen(master_fd, "w+b", 0) p_out = os.fdopen(master_fd, "w+b", 0)
return Terminal(columns, lines, p_out), p_pid, p_out return Terminal(columns, lines, p_out), p_pid, p_out
def convert_to_text(dump): def convert_to_text(dump):
lines = dump['lines'] lines = dump['lines']
strLines = '' strLines = ''
@ -50,36 +53,54 @@ def convert_to_text(dump):
strLines += c[0] strLines += c[0]
return strLines return strLines
t,p,o = open_terminal()
t.feed(o.read(10000))
convert_to_text(t.dump())
t.feed(b'ls\r')
t.feed(o.read(10000))
convert_to_text(t.dump())
def HandleTerminal(): def HandleTerminal():
terminal, p_pid, p_out, master_fd = open_terminal() try:
while True: terminal, p_pid, p_out = open_terminal()
try: signal_pipe = os.pipe()
r, w, x = select.select([p_out, master_fd],[],[],500000) Running = True
if r == []: tty.setraw(0)
continue while Running:
for fd in r: try:
print(fd,r) r, w, x = select.select([sys.stdin, p_out,signal_pipe[0]],[],[],0)
msg = fd.read(65536) if r == []:
if fd == p_out: continue
terminal.feed(msg) for fd in r:
master_fd.write(msg) if fd == signal_pipe[0]:
if fd == master_fd: msgBytes = os.read(signal_pipe[0], 1)
terminal.feed(msg) if fd == sys.stdin:
p_out.write(msg msgBytes = os.read(sys.stdin.fileno(), 65536)
print(terminal.screen.display) terminal.feed(msgBytes)
except Exception as e: # Process died? p_out.write(msgBytes)
print(e) if fd == p_out:
#finally: try:
# os.kill(p_pid, signal.SIGTERM) msgBytes = p_out.read(65536)
# p_out.close() except (EOFError, OSError):
sys.exit(0)
terminal.feed(msgBytes)
os.write(sys.stdout.fileno(), msgBytes)
#print(terminal.screen.display)
except Exception as e: # Process died?
print(e)
Running = False
except Exception as e: # Process died?
print(e)
Running = False
finally:
p_out.close()
os.kill(p_pid, signal.SIGTERM)
def get_terminal_size(fd):
s = struct.pack('HHHH', 0, 0, 0, 0)
rows, cols, _, _ = struct.unpack('HHHH', fcntl.ioctl(fd, termios.TIOCGWINSZ, s))
return rows, cols
def resize_terminal(fd):
s = struct.pack('HHHH', 0, 0, 0, 0)
s = fcntl.ioctl(0, termios.TIOCGWINSZ, s)
fcntl.ioctl(fd, termios.TIOCSWINSZ, s)
rows, cols, _, _ = struct.unpack('hhhh', s)
return rows, cols
if __name__ == "__main__": if __name__ == "__main__":
HandleTerminal() HandleTerminal()