[tor-commits] [stem/master] Python interpretor when running the prompt

atagar at torproject.org atagar at torproject.org
Sun May 11 01:02:50 UTC 2014


commit dcf0852106423d413c262e7aa87abc8b5695346d
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat May 10 15:37:47 2014 -0700

    Python interpretor when running the prompt
    
    Support for providing the user with a python interpretor when they include the
    '--python' argument. This is what our old 'prompt' command once provided, and
    is handy when you'd like to get a quick and easy Controller to interact with.
---
 stem/interpretor/__init__.py       |   37 +++++++++++++++++++++-------------
 stem/interpretor/arguments.py      |    6 +++++-
 stem/interpretor/settings.cfg      |   39 +++++++++++++++++++++++++++++++++---
 test/unit/interpretor/arguments.py |    6 +++++-
 4 files changed, 69 insertions(+), 19 deletions(-)

diff --git a/stem/interpretor/__init__.py b/stem/interpretor/__init__.py
index 892b3b3..9ebcea7 100644
--- a/stem/interpretor/__init__.py
+++ b/stem/interpretor/__init__.py
@@ -8,6 +8,7 @@ features such as tab completion, history, and IRC-style functions (like /help).
 
 __all__ = ['arguments', 'autocomplete', 'commands', 'help', 'msg']
 
+import code
 import os
 import sys
 
@@ -69,17 +70,25 @@ def main():
     sys.exit(1)
 
   with controller:
-    autocompleter = stem.interpretor.autocomplete.Autocompleter(controller)
-    readline.parse_and_bind('tab: complete')
-    readline.set_completer(autocompleter.complete)
-    readline.set_completer_delims('\n')
-
-    interpretor = stem.interpretor.commands.ControlInterpretor(controller)
-
-    while True:
-      try:
-        user_input = raw_input(PROMPT)
-        print interpretor.run_command(user_input)
-      except (KeyboardInterrupt, EOFError, stem.SocketClosed) as exc:
-        print  # move cursor to the following line
-        break
+    if args.python_prompt:
+      console = code.InteractiveConsole({
+        'controller': controller,
+        'stem': stem,
+        'stem.control': stem.control,
+      })
+      console.interact(msg('msg.python_banner', version = controller.get_info('version')))
+    else:
+      autocompleter = stem.interpretor.autocomplete.Autocompleter(controller)
+      readline.parse_and_bind('tab: complete')
+      readline.set_completer(autocompleter.complete)
+      readline.set_completer_delims('\n')
+
+      interpretor = stem.interpretor.commands.ControlInterpretor(controller)
+
+      while True:
+        try:
+          user_input = raw_input(PROMPT)
+          print interpretor.run_command(user_input)
+        except (KeyboardInterrupt, EOFError, stem.SocketClosed) as exc:
+          print  # move cursor to the following line
+          break
diff --git a/stem/interpretor/arguments.py b/stem/interpretor/arguments.py
index 733da27..6dc327b 100644
--- a/stem/interpretor/arguments.py
+++ b/stem/interpretor/arguments.py
@@ -17,14 +17,16 @@ DEFAULT_ARGS = {
   'user_provided_port': False,
   'control_socket': '/var/run/tor/control',
   'user_provided_socket': False,
+  'python_prompt': False,
   'print_help': False,
 }
 
-OPT = 'i:s:h'
+OPT = 'i:s:ph'
 
 OPT_EXPANDED = [
   'interface=',
   'socket=',
+  'python',
   'help',
 ]
 
@@ -68,6 +70,8 @@ def parse(argv):
     elif opt in ('-s', '--socket'):
       args['control_socket'] = arg
       args['user_provided_socket'] = True
+    elif opt in ('-p', '--python'):
+      args['python_prompt'] = True
     elif opt in ('-h', '--help'):
       args['print_help'] = True
 
diff --git a/stem/interpretor/settings.cfg b/stem/interpretor/settings.cfg
index feec575..73fb067 100644
--- a/stem/interpretor/settings.cfg
+++ b/stem/interpretor/settings.cfg
@@ -11,17 +11,50 @@
 msg.multiline_unimplemented_notice Multi-line control options like this are not yet implemented.
 
 msg.help
-|Usage prompt [OPTION]
-|Interactive interpretor for Tor.
+|Interactive interpretor for Tor. This can provide you with either direct
+|access to Tor's control interface or a python prompt connected to Tor...
+|
+|  % prompt -i 9051
+|  >>> GETINFO version
+|  0.2.5.1-alpha-dev (git-245ecfff36c0cecc)
+|
+|  >>> /help GETINFO
+|  [ description of tor's GETINFO command ]
+|
+|  >>> /quit
+|
+|  % prompt -pi 9051
+|  >>> controller.get_info('version')
+|  '0.2.5.1-alpha-dev (git-245ecfff36c0cecc)'
+|
+|  >>> for port in controller.get_ports(stem.control.Listener.CONTROL):
+|  ...   print 'you have a control port available on %s' % port
+|  ... 
+|  you have a control port available on 9051
+|
+|  >>> quit()
+|
+|================================================================================
 |
 |  -i, --interface [ADDRESS:]PORT  change control interface from {address}:{port}
 |  -s, --socket SOCKET_PATH        attach using unix domain socket if present,
 |                                    SOCKET_PATH defaults to: {socket}
+|  -p, --python                    provides a python interpretor connected to
+|                                    Tor rather than attaching directly
 |  -h, --help                      presents this help
 |
 |Example:
 |prompt -i 1643            attach to control port 1643
-|prompt -s ~/.tor/socket   attach to a control socket in your home directory
+|prompt -ps ~/.tor/socket  attach to this control socket, and provide a python
+|                          interpretor
+
+msg.python_banner
+|Welcome to Stem's interpretor prompt. You presently have a connection to Tor
+|available via your 'controller' variable. For example...
+|
+|  >>> print controller.get_info('version')
+|  {version}
+|
 
  #################
 # OUTPUT OF /HELP #
diff --git a/test/unit/interpretor/arguments.py b/test/unit/interpretor/arguments.py
index ab835c4..1141877 100644
--- a/test/unit/interpretor/arguments.py
+++ b/test/unit/interpretor/arguments.py
@@ -22,6 +22,9 @@ class TestArgumentParsing(unittest.TestCase):
     args = parse(['--socket', '/tmp/my_socket'])
     self.assertEqual('/tmp/my_socket', args.control_socket)
 
+    args = parse(['--python'])
+    self.assertEqual(True, args.python_prompt)
+
     args = parse(['--help'])
     self.assertEqual(True, args.print_help)
 
@@ -29,7 +32,8 @@ class TestArgumentParsing(unittest.TestCase):
     args = parse(['-i', '1643'])
     self.assertEqual(1643, args.control_port)
 
-    args = parse(['-s', '~/.tor/socket'])
+    args = parse(['-ps', '~/.tor/socket'])
+    self.assertEqual(True, args.python_prompt)
     self.assertEqual('~/.tor/socket', args.control_socket)
 
   def test_that_we_reject_unrecognized_arguments(self):





More information about the tor-commits mailing list