[tor-commits] [stem/master] Adding an easy method for getting a controller instance

atagar at torproject.org atagar at torproject.org
Wed Aug 22 01:12:46 UTC 2012


commit f999b627dc3ab00cdd7c245d4811ad7b0a2cc20c
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Aug 18 11:21:08 2012 -0700

    Adding an easy method for getting a controller instance
    
    Adding a 'prompt' script that kicks off a python interpretor with a readily
    available stem.control.Controller instance. This starts a tor test instance if
    it isn't already running and offers to shut it down when done.
    
    The purpose of this script is to make it easy to get a controller instance we
    can exercise. The sh shebang makes this *nix specific, though I suppose windows
    users can still use it by running 'bash prompt'.
    
    Example usage:
    
      atagar at morrigan:~/Desktop/stem$ ./prompt
      Welcome to stem's testing prompt. You currently have a controller available
      via the 'control' variable.
    
      >>> control.get_info('version')
      '0.2.1.30'
      >>> quit()
    
      Would you like to stop the tor instance we made? (y/n, default: n): y
---
 prompt           |   19 +++++++++++
 test/__init__.py |    1 +
 test/prompt.py   |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 109 insertions(+), 0 deletions(-)

diff --git a/prompt b/prompt
new file mode 100755
index 0000000..e833fd2
--- /dev/null
+++ b/prompt
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# Provides a quick method of getting a controller that we can use to test stem
+# with. This starts tor if it isn't already running and provides us with a
+# controller instance. When done it gives us the option to stop the tor.
+#
+#   atagar at morrigan:~/Desktop/stem$ ./prompt 
+#   Welcome to stem's testing prompt. You currently have a controller available
+#   via the 'control' variable.
+#
+#   >>> control.get_info("version")
+#   '0.2.1.30'
+#   >>> quit()
+#
+#   Would you like to stop the tor instance we made? (y/n, default: n): y
+
+python -i -c "import test.prompt; test.prompt.print_usage(); control = test.prompt.controller()"
+python -c "import test.prompt; test.prompt.stop(True)"
+
diff --git a/test/__init__.py b/test/__init__.py
index c0297aa..78d6543 100644
--- a/test/__init__.py
+++ b/test/__init__.py
@@ -6,6 +6,7 @@ __all__ = [
   "check_whitespace",
   "mocking",
   "output",
+  "prompt",
   "runner",
 ]
 
diff --git a/test/prompt.py b/test/prompt.py
new file mode 100644
index 0000000..eccdbec
--- /dev/null
+++ b/test/prompt.py
@@ -0,0 +1,89 @@
+"""
+Simple helper methods to make troubleshooting with the python interpretor
+easier.
+
+::
+
+  >>> from test.prompt import *
+  >>> control = controller()
+  >>> control.get_info("version")
+  '0.2.1.30'
+
+  >>> is_running()
+  True
+
+  >>> stop()
+"""
+
+import os
+import signal
+
+import stem.control
+import stem.process
+import stem.util.system
+
+CONTROL_PORT = 2779
+
+STOP_CONFIRMATION = "Would you like to stop the tor instance we made? (y/n, default: n): "
+
+def print_usage():
+  """
+  Provides a welcoming message.
+  """
+  
+  print "Welcome to stem's testing prompt. You currently have a controller available"
+  print "via the 'control' variable."
+  print
+
+def start():
+  """
+  Starts up a tor instance that we can attach a contorller to.
+  """
+  
+  tor_config = {
+    'SocksPort': '0',
+    'ControlPort': str(CONTROL_PORT),
+    'ExitPolicy': 'reject *:*',
+  }
+  
+  stem.process.launch_tor_with_config(config = tor_config, completion_percent = 5)
+
+def stop(prompt = False):
+  """
+  Stops the tor instance spawned by this module.
+  
+  :param bool prompt: asks user for confirmation that they would like to stop tor if True
+  """
+  
+  tor_pid = stem.util.system.get_pid_by_port(CONTROL_PORT)
+  
+  if tor_pid:
+    if prompt:
+      print
+      response = raw_input(STOP_CONFIRMATION)
+      if not response.lower() in ("y", "yes"): return
+  
+    os.kill(tor_pid, signal.SIGTERM)
+
+def is_running():
+  """
+  Checks if we're likely running a tor instance spawned by this module. This is
+  simply a check if our custom control port is in use, so it can be confused by
+  other applications (not likely, but possable).
+  
+  :returns: True if the control port is used, False otherwise
+  """
+  
+  return bool(stem.util.system.get_pid_by_port(CONTROL_PORT))
+
+def controller():
+  """
+  Provides a Controller for our tor instance. This starts tor if it isn't
+  already running.
+  """
+  
+  if not is_running(): start()
+  control = stem.control.Controller.from_port(control_port = CONTROL_PORT)
+  control.authenticate()
+  return control
+





More information about the tor-commits mailing list