Because we are using asyncs here we should ack ASAP

This commit is contained in:
Oleksii Shevchuk 2018-03-10 22:20:18 +02:00
parent df5be6775e
commit 48e568e0f8
2 changed files with 26 additions and 9 deletions

View File

@ -14,9 +14,11 @@ if sys.platform!="win32":
import pupylib.PupySignalHandler
import fcntl
import array
import time
import StringIO
from threading import Event, Thread
from Queue import Queue
import rpyc
from modules.lib.utils.cmdrepl import CmdRepl
@ -29,7 +31,6 @@ class InteractiveShell(PupyModule):
"""
max_clients=1
pipe = None
complete = Event()
rec = 'ttyrec'
dependencies = {
@ -39,7 +40,10 @@ class InteractiveShell(PupyModule):
def __init__(self, *args, **kwargs):
PupyModule.__init__(self,*args, **kwargs)
self.set_pty_size=None
self.set_pty_size = None
self.read_queue = Queue()
self.complete = Event()
def init_argparse(self):
self.arg_parser = PupyArgumentParser(description=self.__doc__)
@ -72,6 +76,13 @@ class InteractiveShell(PupyModule):
t.daemon = True
t.start()
def _start_render_loop(self):
t = Thread(
target=self._render_loop
)
t.daemon = True
t.start()
def _read_stdin_non_block(self):
buf = []
fd = sys.stdin.fileno()
@ -102,6 +113,15 @@ class InteractiveShell(PupyModule):
self.stdout.write('\r\n')
self.complete.set()
def _render_loop(self):
while not self.complete.is_set():
data = self.read_queue.get()
if data is None:
break
self.stdout.write(data)
self.stdout.flush()
def _read_loop_base(self, write_cb):
lastbuf = b''
write_cb = rpyc.async(write_cb)
@ -130,11 +150,6 @@ class InteractiveShell(PupyModule):
write_cb(buf)
lastbuf = buf
def _remote_read(self, data):
if not self.complete.is_set():
self.stdout.write(data)
self.stdout.flush()
def run(self, args):
if 'linux' in sys.platform and not args.pseudo_tty:
try:
@ -215,8 +230,9 @@ class InteractiveShell(PupyModule):
self._signal_winch(None, None) # set the remote tty sie to the current terminal size
self.complete = Event()
ps.start_read_loop(self._remote_read, self.complete.set)
ps.start_read_loop(self.read_queue.put, self.complete.set)
self._start_read_loop(ps.write)
self._start_render_loop()
self._signal_winch(None, None)
@ -238,6 +254,7 @@ class InteractiveShell(PupyModule):
self.set_pty_size=None
self.complete.set()
self.read_queue.put(None)
def interrupt(self):
if self.complete:

View File

@ -213,7 +213,7 @@ class PtyShell(object):
if x or r:
try:
data = os.read(fd, 8192)
data = os.read(fd, 32768)
except OSError, e:
if e.errno in (errno.EAGAIN, errno.EWOULDBLOCK):
continue