[tor-commits] [arm/master] Removing the last hints of TorCtl

atagar at torproject.org atagar at torproject.org
Mon Dec 17 04:25:17 UTC 2012


commit 37f7e9597126392b326287bd6685d00d6627682b
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Dec 16 20:06:04 2012 -0800

    Removing the last hints of TorCtl
    
    Dropping our TorCtl dependency and removing its last bits from the codebase.
    There is definitely a lot of cleanup left to do, but we now no longer have that
    dependency.
---
 README                 |    6 +++---
 armrc.sample           |    2 +-
 setup.py               |    6 +-----
 src/cli/controller.py  |    3 +--
 src/cli/headerPanel.py |    1 -
 src/prereq.py          |   44 +++-----------------------------------------
 src/test.py            |    2 +-
 src/util/torConfig.py  |    2 --
 src/util/torTools.py   |   36 +++++++++++-------------------------
 9 files changed, 21 insertions(+), 81 deletions(-)

diff --git a/README b/README
index 05f18cb..e5676f7 100644
--- a/README
+++ b/README
@@ -20,7 +20,7 @@ An interview by Brenno Winter discussing the project is available at:
 
 Requirements:
 Python 2.5
-TorCtl (this is included with arm)
+Stem (this is included with arm)
 Tor is running with an available control port. This means either...
   ... starting Tor with '--controlport <PORT>'
   ... or including 'ControlPort <PORT>' in your torrc
@@ -203,7 +203,7 @@ Layout:
       popups.py              - toolkit providing display popups
       wizard.py              - provides the relay setup wizard
       
-      logPanel.py            - (page 1) displays tor, arm, and torctl events
+      logPanel.py            - (page 1) displays tor, arm, and stem events
       configPanel.py         - (page 3) editor panel for the tor configuration
       torrcPanel.py          - (page 4) displays torrc and validation
       interpretorPanel.py    - (page 5) interpretor for control port access
@@ -222,6 +222,6 @@ Layout:
       textInput.py   - expands the capabilities of text input fields
       torConfig.py   - functions for working with the torrc and config options
       torInterpretor.py - provides a shell around raw control port access
-      torTools.py    - TorCtl wrapper, providing caching and derived information
+      torTools.py    - Stem wrapper, providing caching and derived information
       uiTools.py     - helper functions for presenting the user interface
 
diff --git a/armrc.sample b/armrc.sample
index 1b264f7..5fb9564 100644
--- a/armrc.sample
+++ b/armrc.sample
@@ -271,7 +271,7 @@ log.startTime INFO
 log.configEntryNotFound NONE
 log.configEntryUndefined NOTICE
 log.configEntryTypeError NOTICE
-log.torCtlPortClosed NOTICE
+log.stemPortClosed NOTICE
 log.torEventTypeUnrecognized INFO
 log.torPrefixPathInvalid NOTICE
 log.procCallMade DEBUG
diff --git a/setup.py b/setup.py
index c94ac1f..7d035ed 100644
--- a/setup.py
+++ b/setup.py
@@ -90,11 +90,7 @@ if "install" in sys.argv:
   except IOError, exc:
     print "Unable to compress man page: %s" % exc
 
-# When installing we include a bundled copy of TorCtl. However, when creating
-# a deb we have a dependency on the python-torctl package instead:
-# http://packages.debian.org/unstable/main/python-torctl
-installPackages = ['arm', 'arm.cli', 'arm.cli.graphing', 'arm.cli.connections', 'arm.cli.menu', 'arm.util', 'arm.TorCtl', 'arm.stem']
-if isDebInstall: installPackages.remove('arm.TorCtl')
+installPackages = ['arm', 'arm.cli', 'arm.cli.graphing', 'arm.cli.connections', 'arm.cli.menu', 'arm.util', 'arm.stem']
 
 setup(name='arm',
       version=VERSION,
diff --git a/src/cli/controller.py b/src/cli/controller.py
index f01ef8a..de77e5a 100644
--- a/src/cli/controller.py
+++ b/src/cli/controller.py
@@ -22,7 +22,6 @@ import cli.graphing.connStats
 import cli.graphing.resourceStats
 import cli.connections.connPanel
 
-from TorCtl import TorCtl
 from stem.control import Controller
 
 from util import connections, conf, enum, hostnames, log, panel, sysTools, torConfig, torTools
@@ -564,7 +563,7 @@ def shutdownDaemons():
   for panelImpl in control.getDaemonPanels(): panelImpl.stop()
   for panelImpl in control.getDaemonPanels(): panelImpl.join()
   
-  # joins on TorCtl event thread
+  # joins on stem threads
   torTools.getConn().close()
   
   # joins on utility daemon threads - this might take a moment since the
diff --git a/src/cli/headerPanel.py b/src/cli/headerPanel.py
index ce43e06..cf37ac1 100644
--- a/src/cli/headerPanel.py
+++ b/src/cli/headerPanel.py
@@ -19,7 +19,6 @@ import time
 import curses
 import threading
 
-import TorCtl.TorCtl
 import stem
 import stem.connection
 
diff --git a/src/prereq.py b/src/prereq.py
index f8ab73d..c01dfbd 100644
--- a/src/prereq.py
+++ b/src/prereq.py
@@ -12,23 +12,12 @@ import tempfile
 
 # Library dependencies can be fetched on request. By default this is via
 # the following mirrors with their sha256 signatures checked.
-TORCTL_ARCHIVE = "http://www.atagar.com/arm/resources/deps/11-06-16/torctl.tar.gz"
-TORCTL_SIG = "5460adb1394c368ba492cc33d6681618b3d3062b3f5f70b2a87520fc291701c3"
+#STEM_ARCHIVE = "http://www.atagar.com/arm/resources/deps/11-06-16/torctl.tar.gz"
+#STEM_SIG = "5460adb1394c368ba492cc33d6681618b3d3062b3f5f70b2a87520fc291701c3"
 
 # optionally we can do an unverified fetch from the library's sources
 STEM_REPO = "git://git.torproject.org/stem.git"
 
-def isTorCtlAvailable():
-  """
-  True if TorCtl is already available on the platform, false otherwise.
-  """
-  
-  try:
-    import TorCtl
-    return True
-  except ImportError:
-    return False
-
 def isStemAvailable():
   """
   True if stem is already available on the platform, false otherwise.
@@ -40,30 +29,6 @@ def isStemAvailable():
   except ImportError:
     return False
 
-def promptTorCtlInstall():
-  """
-  Asks the user to install TorCtl. This returns True if it was installed and
-  False otherwise (if it was either declined or failed to be fetched).
-  """
-  
-  userInput = raw_input("Arm requires TorCtl to run, but it's unavailable. Would you like to install it? (y/n): ")
-  
-  # if user says no then terminate
-  if not userInput.lower() in ("y", "yes"): return False
-  
-  # attempt to install TorCtl, printing the issue if unsuccessful
-  try:
-    fetchLibrary(TORCTL_ARCHIVE, TORCTL_SIG)
-    
-    if not isTorCtlAvailable():
-      raise IOError("Unable to install TorCtl, sorry")
-    
-    print "TorCtl successfully installed"
-    return True
-  except IOError, exc:
-    print exc
-    return False
-
 def promptStemInstall():
   """
   Asks the user to install stem. This returns True if it was installed and
@@ -77,6 +42,7 @@ def promptStemInstall():
   
   # attempt to install stem, printing the issue if unsuccessful
   try:
+    #fetchLibrary(STEM_ARCHIVE, STEM_SIG)
     installStem()
     
     if not isStemAvailable():
@@ -163,10 +129,6 @@ if __name__ == '__main__':
     print("arm requires python version 2.5 or greater\n")
     sys.exit(1)
   
-  if not isTorCtlAvailable():
-    isInstalled = promptTorCtlInstall()
-    if not isInstalled: sys.exit(1)
-  
   if not isStemAvailable():
     isInstalled = promptStemInstall()
     if not isInstalled: sys.exit(1)
diff --git a/src/test.py b/src/test.py
index af80879..7129120 100644
--- a/src/test.py
+++ b/src/test.py
@@ -23,7 +23,7 @@ conn = None
 while True:
   userInput = raw_input(MENU)
   
-  # initiate the TorCtl connection if the test needs it
+  # initiate the stem connection if the test needs it
   if userInput in ("1", "2", "4") and not conn:
     conn = torTools.getConn()
     conn.init()
diff --git a/src/util/torConfig.py b/src/util/torConfig.py
index c9ae6ef..0f6452d 100644
--- a/src/util/torConfig.py
+++ b/src/util/torConfig.py
@@ -471,8 +471,6 @@ def saveConf(destination = None, contents = None):
       log.log(log.DEBUG, logMsg % ("SAVECONF", time.time() - startTime))
       return # if successful then we're done
     except:
-      # example error:
-      # TorCtl.TorCtl.ErrorReply: 551 Unable to write configuration to disk.
       pass
   
   # if the SAVECONF fails or this is a custom save then write contents directly
diff --git a/src/util/torTools.py b/src/util/torTools.py
index d2f1b0c..a5add1a 100644
--- a/src/util/torTools.py
+++ b/src/util/torTools.py
@@ -14,7 +14,7 @@ import Queue
 
 import stem
 import stem.control
-from TorCtl import TorCtl
+import stem.descriptor
 
 from util import connections, enum, log, procTools, sysTools, uiTools
 
@@ -45,7 +45,7 @@ UNDEFINED = "<Undefined_ >"
 
 UNKNOWN = "UNKNOWN" # value used by cached information if undefined
 CONFIG = {"features.pathPrefix": "",
-          "log.torCtlPortClosed": log.NOTICE,
+          "log.stemPortClosed": log.NOTICE,
           "log.torPrefixPathInvalid": log.NOTICE,
           "log.bsdJailFound": log.INFO,
           "log.unknownBsdJailId": log.WARN}
@@ -265,22 +265,21 @@ def isTorRunning():
 def getConn():
   """
   Singleton constructor for a Controller. Be aware that this starts as being
-  uninitialized, needing a TorCtl instance before it's fully functional.
+  uninitialized, needing a stem Controller before it's fully functional.
   """
   
   global CONTROLLER
   if CONTROLLER == None: CONTROLLER = Controller()
   return CONTROLLER
 
-class Controller(TorCtl.PostEventListener):
+class Controller:
   """
-  TorCtl wrapper providing convenience functions, listener functionality for
-  tor's state, and the capability for controller connections to be restarted
-  if closed.
+  Stem wrapper providing convenience functions (mostly from the days of using
+  TorCtl), listener functionality for tor's state, and the capability for
+  controller connections to be restarted if closed.
   """
   
   def __init__(self):
-    TorCtl.PostEventListener.__init__(self)
     self.controller = None
     self.connLock = threading.RLock()
     self.statusListeners = []           # callback functions for tor's state changes
@@ -321,7 +320,7 @@ class Controller(TorCtl.PostEventListener):
   
   def init(self, controller):
     """
-    Uses the given TorCtl instance for future operations, notifying listeners
+    Uses the given stem instance for future operations, notifying listeners
     about the change.
     
     Arguments:
@@ -373,7 +372,7 @@ class Controller(TorCtl.PostEventListener):
   
   def close(self):
     """
-    Closes the current TorCtl instance and notifies listeners.
+    Closes the current stem instance and notifies listeners.
     """
     
     self.connLock.acquire()
@@ -394,7 +393,7 @@ class Controller(TorCtl.PostEventListener):
   
   def isAlive(self):
     """
-    Returns True if this has been initialized with a working TorCtl instance,
+    Returns True if this has been initialized with a working stem instance,
     False otherwise.
     """
     
@@ -1252,8 +1251,6 @@ class Controller(TorCtl.PostEventListener):
           self._cachedParam = {}
         except Exception, exc:
           # new torrc parameters caused an error (tor's likely shut down)
-          # BUG: this doesn't work - torrc errors still cause TorCtl to crash... :(
-          # http://bugs.noreply.org/flyspray/index.php?do=details&id=1329
           raisedException = IOError(str(exc))
       else:
         try:
@@ -1532,17 +1529,6 @@ class Controller(TorCtl.PostEventListener):
     if len(attachedMatches) == 1:
       return attachedMatches[0]
     
-    # Highly unlikely, but still haven't found it. Last we'll use some
-    # tricks from Mike's ConsensusTracker, excluding possiblities that
-    # have...
-    # - lost their Running flag
-    # - list a bandwidth of 0
-    # - have 'opt hibernating' set
-    # 
-    # This involves constructing a TorCtl Router and checking its 'down'
-    # flag (which is set by the three conditions above). This is the last
-    # resort since it involves a couple GETINFO queries.
-    
     for entryPort, entryFingerprint in list(potentialMatches):
       try:
         nsEntry = self.controller.get_network_status(entryFingerprint)
@@ -1884,7 +1870,7 @@ class Controller(TorCtl.PostEventListener):
       
       # gives a notice that the control port has closed
       if eventType == State.CLOSED:
-        log.log(CONFIG["log.torCtlPortClosed"], "Tor control port closed")
+        log.log(CONFIG["log.stemPortClosed"], "Tor control port closed")
       
       for callback in self.statusListeners:
         callback(self, eventType)





More information about the tor-commits mailing list