From 4c1723180b42138f40610e8cfc501eed51fdff92 Mon Sep 17 00:00:00 2001
From: Oleksii Shevchuk
Date: Mon, 31 Oct 2016 17:01:24 +0200
Subject: [PATCH] Disable locks, add default args to default shells (repl)
---
pupy/modules/interactive_shell.py | 45 +++++++++++++++----------------
1 file changed, 21 insertions(+), 24 deletions(-)
diff --git a/pupy/modules/interactive_shell.py b/pupy/modules/interactive_shell.py
index ebaf554c..28b43b6d 100644
--- a/pupy/modules/interactive_shell.py
+++ b/pupy/modules/interactive_shell.py
@@ -16,7 +16,7 @@ if sys.platform!="win32":
import array
import time
import StringIO
-from threading import Event, Thread, Lock
+from threading import Event, Thread
import rpyc
import cmd
@@ -24,11 +24,11 @@ class CmdRepl(cmd.Cmd):
def __init__(self, write_cb, completion, CRLF=False, interpreter=None):
self._write_cb = write_cb
self._complete = completion
- self._write_lock = Lock()
self.prompt = '\r'
- self._crlf = CRLF
+ self._crlf = ('\r\n' if CRLF else '\n')
self._interpreter = interpreter
self._setting_prompt = False
+ self._last_cmd = None
cmd.Cmd.__init__(self)
def _con_write(self, data):
@@ -38,13 +38,12 @@ class CmdRepl(cmd.Cmd):
return
if not self._complete.is_set():
- with self._write_lock:
- self.stdout.write(data)
- self.stdout.flush()
- if '\n' in data:
- self.prompt = data.rsplit('\n', 1)[-1]
- else:
- self.prompt += data
+ self.stdout.write(data)
+ self.stdout.flush()
+ if '\n' in data:
+ self.prompt = data.rsplit('\n', 1)[-1]
+ else:
+ self.prompt += data
def do_EOF(self, line):
return True
@@ -69,25 +68,23 @@ class CmdRepl(cmd.Cmd):
pass
def default(self, line):
- with self._write_lock:
- self._write_cb(line + ('\r\n' if self._crlf else '\n'))
- self.prompt = ''
+ self._write_cb(line + self._crlf)
+ self.prompt = ''
def postloop(self):
self._complete.set()
def set_prompt(self, prompt='# '):
methods = {
- 'cmd.exe': 'set PROMPT={}'.format(prompt),
- 'sh': 'export PS1="{}"'.format(prompt)
+ 'cmd.exe': [ 'set PROMPT={}'.format(prompt) ],
+ 'sh': [ 'export PS1="{}"'.format(prompt) ]
}
method = methods.get(self._interpreter, None)
if method:
- with self._write_lock:
- self._setting_prompt = True
- self.prompt = prompt
- self._write_cb(method + ('\r\n' if self._crlf else '\n'))
+ self._setting_prompt = True
+ self.prompt = prompt
+ self._write_cb(self._crlf.join(method) + self._crlf)
__class_name__="InteractiveShell"
@config(cat="admin")
@@ -188,16 +185,16 @@ class InteractiveShell(PupyModule):
def repl(self, args):
self.client.load_package('pupyutils.safepopen')
encoding=None
- program="/bin/sh"
+ program = [ "/bin/sh", "-i" ]
if self.client.is_android():
- program="/system/bin/sh"
+ program = [ "/system/bin/sh" ]
elif self.client.is_windows():
- program="cmd.exe"
+ program = [ 'cmd.exe', '/Q' ]
if args.program:
- program=args.program
+ program = [ args.program ]
self.pipe = self.client.conn.modules['pupyutils.safepopen'].SafePopen(
- [ program ],
+ program,
interactive=True,
)