commit c21dbc32601b467968c0a900f0b79c2738b7d1e3 Author: Damian Johnson atagar@torproject.org Date: Sat May 14 14:11:56 2011 -0700
Dropping the last raw TorCtl usage
This removes the last direct usage of TorCtl by arm. Instead, all access is done via the torTools Connection wrapper class. In addition to being easier and provide better performance, removing this last direct TorCtl usage should allow for arm to be arbitrarily detatched and reattached to Tor instances while running (the option for reattaching is coming soon...). --- src/cli/controller.py | 52 ++++----------------------------------- src/cli/graphing/graphPanel.py | 5 +++- 2 files changed, 10 insertions(+), 47 deletions(-)
diff --git a/src/cli/controller.py b/src/cli/controller.py index 030b1d3..4916faf 100644 --- a/src/cli/controller.py +++ b/src/cli/controller.py @@ -7,13 +7,9 @@ Curses (terminal) interface for the arm relay status monitor. """
import os -import re import math import time import curses -import curses.textpad -import socket -from TorCtl import TorCtl
import popups import headerPanel @@ -21,7 +17,6 @@ import graphing.graphPanel import logPanel import configPanel import torrcPanel -import descriptorPopup
import cli.connections.connPanel import cli.connections.connEntry @@ -43,6 +38,7 @@ def refresh(): PANELS = {} STDSCR = None IS_PAUSED = False +PAGE = 0
def getScreen(): return STDSCR @@ -214,10 +210,10 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): """ Starts arm interface reflecting information on provided control port.
- stdscr - curses window - conn - active Tor control port connection - loggedEvents - types of events to be logged (plus an optional "UNKNOWN" for - otherwise unrecognized events) + stdscr - curses window + startTime - unix time for when arm was started + loggedEvents - event types we've been configured to log + isBlindMode - flag to indicate if the user's turned off connection lookups """
global PANELS, STDSCR, REFRESH_FLAG, PAGE, IS_PAUSED @@ -240,9 +236,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): # pauses/unpauses connection resolution according to if tor's connected or not torTools.getConn().addStatusListener(connResetListener)
- # TODO: incrementally drop this requirement until everything's using the singleton - conn = torTools.getConn().getTorCtl() - curses.halfdelay(REFRESH_RATE * 10) # uses getch call as timer for REFRESH_RATE seconds try: curses.use_default_colors() # allows things like semi-transparent backgrounds (call can fail with ERR) except curses.error: pass @@ -254,17 +247,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): # attempts to determine tor's current pid (left as None if unresolveable, logging an error later) torPid = torTools.getConn().getMyPid()
- #try: - # confLocation = conn.get_info("config-file")["config-file"] - # if confLocation[0] != "/": - # # relative path - attempt to add process pwd - # try: - # results = sysTools.call("pwdx %s" % torPid) - # if len(results) == 1 and len(results[0].split()) == 2: confLocation = "%s/%s" % (results[0].split()[1], confLocation) - # except IOError: pass # pwdx call failed - #except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): - # confLocation = "" - # loads the torrc and provides warnings in case of validation errors try: loadedTorrc = torConfig.getTorrc() @@ -317,12 +299,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): elif graphType == 2 and not isBlindMode: panels["graph"].setStats("connections") elif graphType == 3: panels["graph"].setStats("system resources")
- # listeners that update bandwidth and log panels with Tor status - #conn.add_event_listener(panels["log"]) - conn.add_event_listener(panels["graph"].stats["bandwidth"]) - conn.add_event_listener(panels["graph"].stats["system resources"]) - if not isBlindMode: conn.add_event_listener(panels["graph"].stats["connections"]) - # prepopulates bandwidth values from state file if CONFIG["features.graph.bw.prepopulate"]: isSuccessful = panels["graph"].stats["bandwidth"].prepopulateFromState() @@ -332,11 +308,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): #panels["log"].loggedEvents = loggedEvents # strips any that couldn't be set panels["log"].setLoggedEvents(loggedEvents) # strips any that couldn't be set
- # directs logged TorCtl events to log panel - #TorUtil.loglevel = "DEBUG" - #TorUtil.logfile = panels["log"] - #torTools.getConn().addTorCtlListener(panels["log"].tor_ctl_event) - # provides a notice about any event types tor supports but arm doesn't missingEventTypes = logPanel.getMissingEventTypes() if missingEventTypes: @@ -350,16 +321,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): panels["log"].start() panels["conn"].start()
- # warns if tor isn't updating descriptors - #try: - # if conn.get_option("FetchUselessDescriptors")[0][1] == "0" and conn.get_option("DirPort")[0][1] == "0": - # warning = """Descriptors won't be updated (causing some connection information to be stale) unless: - #a. 'FetchUselessDescriptors 1' is set in your torrc - #b. the directory service is provided ('DirPort' defined) - #c. or tor is used as a client""" - # log.log(log.WARN, warning) - #except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass - isUnresponsive = False # true if it's been over ten seconds since the last BW event (probably due to Tor closing) isPaused = False # if true updates are frozen overrideKey = None # immediately runs with this input rather than waiting for the user if set @@ -523,8 +484,7 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode): panels["conn"].join() panels["log"].join()
- conn = torTools.getConn() - conn.close() # joins on TorCtl event thread + torTools.getConn().close() # joins on TorCtl event thread
# joins on utility daemon threads - this might take a moment since # the internal threadpools being joined might be sleeping diff --git a/src/cli/graphing/graphPanel.py b/src/cli/graphing/graphPanel.py index ef0267d..ae8e73c 100644 --- a/src/cli/graphing/graphPanel.py +++ b/src/cli/graphing/graphPanel.py @@ -22,7 +22,7 @@ from TorCtl import TorCtl
import cli.popups
-from util import enum, panel, uiTools +from util import enum, panel, torTools, uiTools
# time intervals at which graphs can be updated UPDATE_INTERVALS = [("each second", 1), ("5 seconds", 5), ("30 seconds", 30), @@ -92,6 +92,9 @@ class GraphStats(TorCtl.PostEventListener): # iterative insert needed to avoid making shallow copies (nasty, nasty gotcha) self.primaryCounts[i] = (self.maxCol + 1) * [0] self.secondaryCounts[i] = (self.maxCol + 1) * [0] + + # tracks BW events + torTools.getConn().addEventListener(self)
def clone(self, newCopy=None): """
tor-commits@lists.torproject.org