From cf6c894f58d52f945d32ac1318a63f7fbc339a50 Mon Sep 17 00:00:00 2001
From: Oleksii Shevchuk
Date: Mon, 31 Oct 2016 13:12:30 +0200
Subject: [PATCH] Try to setup/guess the prompt
---
pupy/modules/interactive_shell.py | 41 ++++++++++++++++++++++++++++---
1 file changed, 38 insertions(+), 3 deletions(-)
diff --git a/pupy/modules/interactive_shell.py b/pupy/modules/interactive_shell.py
index 7e9162ce..9142e999 100644
--- a/pupy/modules/interactive_shell.py
+++ b/pupy/modules/interactive_shell.py
@@ -21,14 +21,22 @@ import rpyc
import cmd
class CmdRepl(cmd.Cmd):
- def __init__(self, write_cb, completion):
+ 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._interpreter = interpreter
+ self._setting_prompt = False
cmd.Cmd.__init__(self)
def _con_write(self, data):
+ if self._setting_prompt:
+ if self.prompt in data:
+ self._setting_prompt = False
+ return
+
if not self._complete.is_set():
with self._write_lock:
self.stdout.write(data)
@@ -41,6 +49,12 @@ class CmdRepl(cmd.Cmd):
def do_EOF(self, line):
return True
+ def do_help(self, line):
+ self.default(' '.join(['help', line]))
+
+ def completenames(self):
+ return []
+
def precmd(self, line):
if self._complete.is_set():
return 'EOF'
@@ -56,12 +70,25 @@ class CmdRepl(cmd.Cmd):
def default(self, line):
with self._write_lock:
- self._write_cb(line + '\n')
+ self._write_cb(line + ('\r\n' if self._crlf else '\n'))
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)
+ }
+
+ 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'))
+
__class_name__="InteractiveShell"
@config(cat="admin")
class InteractiveShell(PupyModule):
@@ -178,8 +205,16 @@ class InteractiveShell(PupyModule):
sys.stdout.write('\r\nREPL started. Ctrl-C will the module \r\n')
- repl = CmdRepl(self.pipe.write, self.complete)
+ if self.client.is_windows():
+ crlf = True
+ interpreter = 'cmd.exe'
+ else:
+ crlf = False
+ interpreter = 'sh'
+
+ repl = CmdRepl(self.pipe.write, self.complete, crlf, interpreter)
self.pipe.execute(self.complete.set, repl._con_write)
+ repl.set_prompt()
repl_thread = Thread(target=repl.cmdloop)
repl_thread.daemon = True