[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r19637: {arm} Tad too hasty with last commit. Moving log help into starter (in arm/trunk: . interface)



Author: atagar
Date: 2009-06-06 13:23:27 -0400 (Sat, 06 Jun 2009)
New Revision: 19637

Modified:
   arm/trunk/arm.py
   arm/trunk/interface/controller.py
   arm/trunk/interface/logPanel.py
Log:
Tad too hasty with last commit. Moving log help into starter to avoid importing headache.



Modified: arm/trunk/arm.py
===================================================================
--- arm/trunk/arm.py	2009-06-06 17:09:34 UTC (rev 19636)
+++ arm/trunk/arm.py	2009-06-06 17:23:27 UTC (rev 19637)
@@ -14,8 +14,6 @@
 import getpass
 import binascii
 
-from interface import logPanel
-
 DEFAULT_CONTROL_ADDR = "127.0.0.1"
 DEFAULT_CONTROL_PORT = 9051
 DEFAULT_AUTH_COOKIE = os.path.expanduser("~/.tor/control_auth_cookie") # TODO: Check if this is valid for macs
@@ -23,6 +21,13 @@
 
 NO_AUTH, COOKIE_AUTH, PASSWORD_AUTH = range(3) # enums for authentication type
 
+EVENT_LISTING = """        d DEBUG     a ADDRMAP       l NEWDESC         u AUTHDIR_NEWDESCS
+        i INFO      b BW            m NS              v CLIENTS_SEEN
+        n NOTICE    c CIRC          o ORCONN          x STATUS_GENERAL
+        w WARN      f DESCCHANGED   s STREAM          y STATUS_CLIENT
+        e ERR       g GUARD         t STREAM_BW       z STATUS_SERVER
+        Aliases:    A All Events    U Unknown Events  R Runlevels (dinwe)"""
+
 HELP_TEXT = """Usage arm [OPTION]
 Terminal Tor relay status monitor.
 
@@ -40,7 +45,7 @@
 arm -c                  authenticate using the default cookie
 arm -i 1643 -p          prompt for password using control port 1643
 arm -e=we -p=nemesis    use password 'nemesis' with 'WARN'/'ERR' events
-""" % (DEFAULT_CONTROL_ADDR, DEFAULT_CONTROL_PORT, DEFAULT_AUTH_COOKIE, DEFAULT_LOGGED_EVENTS, logPanel.EVENT_LISTING)
+""" % (DEFAULT_CONTROL_ADDR, DEFAULT_CONTROL_PORT, DEFAULT_AUTH_COOKIE, DEFAULT_LOGGED_EVENTS, EVENT_LISTING)
 
 EVENT_LISTING = """        d DEBUG     a ADDRMAP       l NEWDESC         u AUTHDIR_NEWDESCS
         i INFO      b BW            m NS              v CLIENTS_SEEN
@@ -178,6 +183,7 @@
     from TorCtl import TorUtil
     
     from interface import controller
+    from interface import logPanel
   except ImportError:
     print "Unable to load TorCtl (see readme for instructions)"
     sys.exit()

Modified: arm/trunk/interface/controller.py
===================================================================
--- arm/trunk/interface/controller.py	2009-06-06 17:09:34 UTC (rev 19636)
+++ arm/trunk/interface/controller.py	2009-06-06 17:23:27 UTC (rev 19637)
@@ -11,6 +11,7 @@
 from threading import RLock
 from TorCtl import TorCtl
 
+import arm
 import util
 import staticPanel
 import bandwidthPanel
@@ -186,7 +187,7 @@
         bwPanel.clear()
         bwPanel.addstr(0, 0, "Event Types:", util.LABEL_ATTR)
         lineNum = 1
-        for line in logPanel.EVENT_LISTING.split("\n"):
+        for line in arm.EVENT_LISTING.split("\n"):
           line = line.strip()
           bwPanel.addstr(lineNum, 0, line[:x - 1])
           lineNum += 1

Modified: arm/trunk/interface/logPanel.py
===================================================================
--- arm/trunk/interface/logPanel.py	2009-06-06 17:09:34 UTC (rev 19636)
+++ arm/trunk/interface/logPanel.py	2009-06-06 17:23:27 UTC (rev 19637)
@@ -5,6 +5,7 @@
 import time
 import curses
 from curses.ascii import isprint
+from TorCtl import TorCtl
 
 import util
 
@@ -18,13 +19,6 @@
   "w": "WARN",    "f": "DESCCHANGED", "s": "STREAM",    "y": "STATUS_CLIENT",
   "e": "ERR",     "g": "GUARD",       "t": "STREAM_BW", "z": "STATUS_SERVER"}
   
-EVENT_LISTING = """        d DEBUG     a ADDRMAP       l NEWDESC         u AUTHDIR_NEWDESCS
-        i INFO      b BW            m NS              v CLIENTS_SEEN
-        n NOTICE    c CIRC          o ORCONN          x STATUS_GENERAL
-        w WARN      f DESCCHANGED   s STREAM          y STATUS_CLIENT
-        e ERR       g GUARD         t STREAM_BW       z STATUS_SERVER
-        Aliases:    A All Events    U Unknown Events  R Runlevels (dinwe)"""
-
 def expandEvents(eventAbbr):
   """
   Expands event abbreviations to their full names. Beside mappings privided in
@@ -57,200 +51,195 @@
   if invalidFlags: raise ValueError(invalidFlags)
   else: return expandedEvents
 
-try:
-  from TorCtl import TorCtl
+class LogMonitor(TorCtl.PostEventListener, util.Panel):
+  """
+  Tor event listener, noting messages, the time, and their type in a panel.
+  """
   
-  class LogMonitor(TorCtl.PostEventListener, util.Panel):
+  def __init__(self, lock, loggedEvents):
+    TorCtl.PostEventListener.__init__(self)
+    util.Panel.__init__(self, lock, -1)
+    self.msgLog = []                      # tuples of (logText, color)
+    self.isPaused = False
+    self.pauseBuffer = []                 # location where messages are buffered if paused
+    self.loggedEvents = loggedEvents      # events we're listening to
+    self.lastHeartbeat = time.time()      # time of last BW event
+  
+  # Listens for all event types and redirects to registerEvent
+  def circ_status_event(self, event):
+    optionalParams = ""
+    if event.purpose: optionalParams += " PURPOSE: %s" % event.purpose
+    if event.reason: optionalParams += " REASON: %s" % event.reason
+    if event.remote_reason: optionalParams += " REMOTE_REASON: %s" % event.remote_reason
+    self.registerEvent("CIRC", "ID: %-3s STATUS: %-10s PATH: %s%s" % (event.circ_id, event.status, ", ".join(event.path), optionalParams), "yellow")
+  
+  def stream_status_event(self, event):
+    # TODO: not sure how to stimulate event - needs sanity check
+    try:
+      self.registerEvent("STREAM", "ID: %s STATUS: %s CIRC_ID: %s TARGET: %s:%s REASON: %s REMOTE_REASON: %s SOURCE: %s SOURCE_ADDR: %s PURPOSE: %s" % (event.strm_id, event.status, event.circ_id, event.target_host, event.target_port, event.reason, event.remote_reason, event.source, event.source_addr, event.purpose), "white")
+    except TypeError:
+      self.registerEvent("STREAM", "DEBUG -> ID: %s STATUS: %s CIRC_ID: %s TARGET: %s:%s REASON: %s REMOTE_REASON: %s SOURCE: %s SOURCE_ADDR: %s PURPOSE: %s" % (type(event.strm_id), type(event.status), type(event.circ_id), type(event.target_host), type(event.target_port), type(event.reason), type(event.remote_reason), type(event.source), type(event.source_addr), type(event.purpose)), "white")
+  
+  def or_conn_status_event(self, event):
+    optionalParams = ""
+    if event.age: optionalParams += " AGE: %-3s" % event.age
+    if event.read_bytes: optionalParams += " READ: %-4i" % event.read_bytes
+    if event.wrote_bytes: optionalParams += " WRITTEN: %-4i" % event.wrote_bytes
+    if event.reason: optionalParams += " REASON: %-6s" % event.reason
+    if event.ncircs: optionalParams += " NCIRCS: %i" % event.ncircs
+    self.registerEvent("ORCONN", "STATUS: %-10s ENDPOINT: %-20s%s" % (event.status, event.endpoint, optionalParams), "white")
+  
+  def stream_bw_event(self, event):
+    # TODO: not sure how to stimulate event - needs sanity check
+    try:
+      self.registerEvent("STREAM_BW", "ID: %s READ: %i WRITTEN: %i" % (event.strm_id, event.bytes_read, event.bytes_written), "white")
+    except TypeError:
+      self.registerEvent("STREAM_BW", "DEBUG -> ID: %s READ: %i WRITTEN: %i" % (type(event.strm_id), type(event.bytes_read), type(event.bytes_written)), "white")
+  
+  def bandwidth_event(self, event):
+    self.lastHeartbeat = time.time()
+    if "BW" in self.loggedEvents: self.registerEvent("BW", "READ: %i, WRITTEN: %i" % (event.read, event.written), "cyan")
+  
+  def msg_event(self, event):
+    self.registerEvent(event.level, event.msg, RUNLEVEL_EVENT_COLOR[event.level])
+  
+  def new_desc_event(self, event):
+    idlistStr = [str(item) for item in event.idlist]
+    self.registerEvent("NEWDESC", ", ".join(idlistStr), "white")
+  
+  def address_mapped_event(self, event):
+    self.registerEvent("ADDRMAP", "%s, %s -> %s" % (event.when, event.from_addr, event.to_addr), "white")
+  
+  def ns_event(self, event):
+    # NetworkStatus params: nickname, idhash, orhash, ip, orport (int), dirport (int), flags, idhex, bandwidth, updated (datetime)
+    msg = ""
+    for ns in event.nslist:
+      msg += ", %s (%s:%i)" % (ns.nickname, ns.ip, ns.orport)
+    if len(msg) > 1: msg = msg[2:]
+    self.registerEvent("NS", "Listed (%i): %s" % (len(event.nslist), msg), "blue")
+  
+  def new_consensus_event(self, event):
+    msg = ""
+    for ns in event.nslist:
+      msg += ", %s (%s:%i)" % (ns.nickname, ns.ip, ns.orport)
+    self.registerEvent("NEWCONSENSUS", "Listed (%i): %s" % (len(event.nslist), msg), "magenta")
+  
+  def unknown_event(self, event):
+    if "UNKNOWN" in self.loggedEvents: self.registerEvent("UNKNOWN", event.event_string, "red")
+  
+  def monitor_event(self, level, msg):
+    # events provided by the arm monitor - types use the same as runlevel
+    self.registerEvent("ARM-%s" % level, msg, RUNLEVEL_EVENT_COLOR[level])
+  
+  def registerEvent(self, type, msg, color):
     """
-    Tor event listener, noting messages, the time, and their type in a panel.
+    Notes event and redraws log. If paused it's held in a temporary buffer.
     """
     
-    def __init__(self, lock, loggedEvents):
-      TorCtl.PostEventListener.__init__(self)
-      util.Panel.__init__(self, lock, -1)
-      self.msgLog = []                      # tuples of (logText, color)
-      self.isPaused = False
-      self.pauseBuffer = []                 # location where messages are buffered if paused
-      self.loggedEvents = loggedEvents      # events we're listening to
-      self.lastHeartbeat = time.time()      # time of last BW event
+    # strips control characters to avoid screwing up the terminal
+    msg = "".join([char for char in msg if isprint(char)])
     
-    # Listens for all event types and redirects to registerEvent
-    def circ_status_event(self, event):
-      optionalParams = ""
-      if event.purpose: optionalParams += " PURPOSE: %s" % event.purpose
-      if event.reason: optionalParams += " REASON: %s" % event.reason
-      if event.remote_reason: optionalParams += " REMOTE_REASON: %s" % event.remote_reason
-      self.registerEvent("CIRC", "ID: %-3s STATUS: %-10s PATH: %s%s" % (event.circ_id, event.status, ", ".join(event.path), optionalParams), "yellow")
+    eventTime = time.localtime()
+    msgLine = "%02i:%02i:%02i [%s] %s" % (eventTime[3], eventTime[4], eventTime[5], type, msg)
     
-    def stream_status_event(self, event):
-      # TODO: not sure how to stimulate event - needs sanity check
-      try:
-        self.registerEvent("STREAM", "ID: %s STATUS: %s CIRC_ID: %s TARGET: %s:%s REASON: %s REMOTE_REASON: %s SOURCE: %s SOURCE_ADDR: %s PURPOSE: %s" % (event.strm_id, event.status, event.circ_id, event.target_host, event.target_port, event.reason, event.remote_reason, event.source, event.source_addr, event.purpose), "white")
-      except TypeError:
-        self.registerEvent("STREAM", "DEBUG -> ID: %s STATUS: %s CIRC_ID: %s TARGET: %s:%s REASON: %s REMOTE_REASON: %s SOURCE: %s SOURCE_ADDR: %s PURPOSE: %s" % (type(event.strm_id), type(event.status), type(event.circ_id), type(event.target_host), type(event.target_port), type(event.reason), type(event.remote_reason), type(event.source), type(event.source_addr), type(event.purpose)), "white")
+    if self.isPaused:
+      self.pauseBuffer.insert(0, (msgLine, color))
+      if len(self.pauseBuffer) > MAX_LOG_ENTRIES: del self.pauseBuffer[MAX_LOG_ENTRIES:]
+    else:
+      self.msgLog.insert(0, (msgLine, color))
+      if len(self.msgLog) > MAX_LOG_ENTRIES: del self.msgLog[MAX_LOG_ENTRIES:]
+      self.redraw()
+  
+  def redraw(self):
+    """
+    Redraws message log. Entries stretch to use available space and may
+    contain up to two lines. Starts with newest entries.
+    """
     
-    def or_conn_status_event(self, event):
-      optionalParams = ""
-      if event.age: optionalParams += " AGE: %-3s" % event.age
-      if event.read_bytes: optionalParams += " READ: %-4i" % event.read_bytes
-      if event.wrote_bytes: optionalParams += " WRITTEN: %-4i" % event.wrote_bytes
-      if event.reason: optionalParams += " REASON: %-6s" % event.reason
-      if event.ncircs: optionalParams += " NCIRCS: %i" % event.ncircs
-      self.registerEvent("ORCONN", "STATUS: %-10s ENDPOINT: %-20s%s" % (event.status, event.endpoint, optionalParams), "white")
-    
-    def stream_bw_event(self, event):
-      # TODO: not sure how to stimulate event - needs sanity check
+    if self.win:
+      if not self.lock.acquire(False): return
       try:
-        self.registerEvent("STREAM_BW", "ID: %s READ: %i WRITTEN: %i" % (event.strm_id, event.bytes_read, event.bytes_written), "white")
-      except TypeError:
-        self.registerEvent("STREAM_BW", "DEBUG -> ID: %s READ: %i WRITTEN: %i" % (type(event.strm_id), type(event.bytes_read), type(event.bytes_written)), "white")
+        self.clear()
+        
+        # draws label - uses ellipsis if too long, for instance:
+        # Events (DEBUG, INFO, NOTICE, WARN...):
+        eventsLabel = "Events"
+        eventsListing = ", ".join(self.loggedEvents)
+        
+        firstLabelLen = eventsListing.find(", ")
+        if firstLabelLen == -1: firstLabelLen = len(eventsListing)
+        else: firstLabelLen += 3
+        
+        if self.maxX > 10 + firstLabelLen:
+          eventsLabel += " ("
+          if len(eventsListing) > self.maxX - 11:
+            labelBreak = eventsListing[:self.maxX - 12].rfind(", ")
+            eventsLabel += "%s..." % eventsListing[:labelBreak]
+          else: eventsLabel += eventsListing
+          eventsLabel += ")"
+        eventsLabel += ":"
+        
+        self.addstr(0, 0, eventsLabel, util.LABEL_ATTR)
+        
+        # log entries
+        lineCount = 1
+        
+        for (line, color) in self.msgLog:
+          # splits over too lines if too long
+          if len(line) < self.maxX:
+            self.addstr(lineCount, 0, line, util.getColor(color))
+            lineCount += 1
+          else:
+            (line1, line2) = self._splitLine(line, self.maxX)
+            self.addstr(lineCount, 0, line1, util.getColor(color))
+            self.addstr(lineCount + 1, 0, line2, util.getColor(color))
+            lineCount += 2
+          
+          if lineCount >= self.maxY: break # further log messages wouldn't fit
+        self.refresh()
+      finally:
+        self.lock.release()
+  
+  def setPaused(self, isPause):
+    """
+    If true, prevents message log from being updated with new events.
+    """
     
-    def bandwidth_event(self, event):
-      self.lastHeartbeat = time.time()
-      if "BW" in self.loggedEvents: self.registerEvent("BW", "READ: %i, WRITTEN: %i" % (event.read, event.written), "cyan")
+    if isPause == self.isPaused: return
     
-    def msg_event(self, event):
-      self.registerEvent(event.level, event.msg, RUNLEVEL_EVENT_COLOR[event.level])
+    self.isPaused = isPause
+    if self.isPaused: self.pauseBuffer = []
+    else:
+      self.msgLog = (self.pauseBuffer + self.msgLog)[:MAX_LOG_ENTRIES]
+      self.redraw()
+  
+  def getHeartbeat(self):
+    """
+    Provides the number of seconds since the last BW event.
+    """
     
-    def new_desc_event(self, event):
-      idlistStr = [str(item) for item in event.idlist]
-      self.registerEvent("NEWDESC", ", ".join(idlistStr), "white")
+    return time.time() - self.lastHeartbeat
+  
+  # divides long message to cover two lines
+  def _splitLine(self, message, x):
+    # divides message into two lines, attempting to do it on a wordbreak
+    lastWordbreak = message[:x].rfind(" ")
+    if x - lastWordbreak < 10:
+      line1 = message[:lastWordbreak]
+      line2 = "  %s" % message[lastWordbreak:].strip()
+    else:
+      # over ten characters until the last word - dividing
+      line1 = "%s-" % message[:x - 2]
+      line2 = "  %s" % message[x - 2:].strip()
     
-    def address_mapped_event(self, event):
-      self.registerEvent("ADDRMAP", "%s, %s -> %s" % (event.when, event.from_addr, event.to_addr), "white")
-    
-    def ns_event(self, event):
-      # NetworkStatus params: nickname, idhash, orhash, ip, orport (int), dirport (int), flags, idhex, bandwidth, updated (datetime)
-      msg = ""
-      for ns in event.nslist:
-        msg += ", %s (%s:%i)" % (ns.nickname, ns.ip, ns.orport)
-      if len(msg) > 1: msg = msg[2:]
-      self.registerEvent("NS", "Listed (%i): %s" % (len(event.nslist), msg), "blue")
-    
-    def new_consensus_event(self, event):
-      msg = ""
-      for ns in event.nslist:
-        msg += ", %s (%s:%i)" % (ns.nickname, ns.ip, ns.orport)
-      self.registerEvent("NEWCONSENSUS", "Listed (%i): %s" % (len(event.nslist), msg), "magenta")
-    
-    def unknown_event(self, event):
-      if "UNKNOWN" in self.loggedEvents: self.registerEvent("UNKNOWN", event.event_string, "red")
-    
-    def monitor_event(self, level, msg):
-      # events provided by the arm monitor - types use the same as runlevel
-      self.registerEvent("ARM-%s" % level, msg, RUNLEVEL_EVENT_COLOR[level])
-    
-    def registerEvent(self, type, msg, color):
-      """
-      Notes event and redraws log. If paused it's held in a temporary buffer.
-      """
+    # ends line with ellipsis if too long
+    if len(line2) > x:
+      lastWordbreak = line2[:x - 4].rfind(" ")
       
-      # strips control characters to avoid screwing up the terminal
-      msg = "".join([char for char in msg if isprint(char)])
-      
-      eventTime = time.localtime()
-      msgLine = "%02i:%02i:%02i [%s] %s" % (eventTime[3], eventTime[4], eventTime[5], type, msg)
-      
-      if self.isPaused:
-        self.pauseBuffer.insert(0, (msgLine, color))
-        if len(self.pauseBuffer) > MAX_LOG_ENTRIES: del self.pauseBuffer[MAX_LOG_ENTRIES:]
-      else:
-        self.msgLog.insert(0, (msgLine, color))
-        if len(self.msgLog) > MAX_LOG_ENTRIES: del self.msgLog[MAX_LOG_ENTRIES:]
-        self.redraw()
+      # doesn't use wordbreak if it's a long word or the whole line is one 
+      # word (picking up on two space indent to have index 1)
+      if x - lastWordbreak > 10 or lastWordbreak == 1: lastWordbreak = x - 4
+      line2 = "%s..." % line2[:lastWordbreak]
     
-    def redraw(self):
-      """
-      Redraws message log. Entries stretch to use available space and may
-      contain up to two lines. Starts with newest entries.
-      """
-      
-      if self.win:
-        if not self.lock.acquire(False): return
-        try:
-          self.clear()
-          
-          # draws label - uses ellipsis if too long, for instance:
-          # Events (DEBUG, INFO, NOTICE, WARN...):
-          eventsLabel = "Events"
-          eventsListing = ", ".join(self.loggedEvents)
-          
-          firstLabelLen = eventsListing.find(", ")
-          if firstLabelLen == -1: firstLabelLen = len(eventsListing)
-          else: firstLabelLen += 3
-          
-          if self.maxX > 10 + firstLabelLen:
-            eventsLabel += " ("
-            if len(eventsListing) > self.maxX - 11:
-              labelBreak = eventsListing[:self.maxX - 12].rfind(", ")
-              eventsLabel += "%s..." % eventsListing[:labelBreak]
-            else: eventsLabel += eventsListing
-            eventsLabel += ")"
-          eventsLabel += ":"
-          
-          self.addstr(0, 0, eventsLabel, util.LABEL_ATTR)
-          
-          # log entries
-          lineCount = 1
-          
-          for (line, color) in self.msgLog:
-            # splits over too lines if too long
-            if len(line) < self.maxX:
-              self.addstr(lineCount, 0, line, util.getColor(color))
-              lineCount += 1
-            else:
-              (line1, line2) = self._splitLine(line, self.maxX)
-              self.addstr(lineCount, 0, line1, util.getColor(color))
-              self.addstr(lineCount + 1, 0, line2, util.getColor(color))
-              lineCount += 2
-            
-            if lineCount >= self.maxY: break # further log messages wouldn't fit
-          self.refresh()
-        finally:
-          self.lock.release()
-    
-    def setPaused(self, isPause):
-      """
-      If true, prevents message log from being updated with new events.
-      """
-      
-      if isPause == self.isPaused: return
-      
-      self.isPaused = isPause
-      if self.isPaused: self.pauseBuffer = []
-      else:
-        self.msgLog = (self.pauseBuffer + self.msgLog)[:MAX_LOG_ENTRIES]
-        self.redraw()
-    
-    def getHeartbeat(self):
-      """
-      Provides the number of seconds since the last BW event.
-      """
-      
-      return time.time() - self.lastHeartbeat
-    
-    # divides long message to cover two lines
-    def _splitLine(self, message, x):
-      # divides message into two lines, attempting to do it on a wordbreak
-      lastWordbreak = message[:x].rfind(" ")
-      if x - lastWordbreak < 10:
-        line1 = message[:lastWordbreak]
-        line2 = "  %s" % message[lastWordbreak:].strip()
-      else:
-        # over ten characters until the last word - dividing
-        line1 = "%s-" % message[:x - 2]
-        line2 = "  %s" % message[x - 2:].strip()
-      
-      # ends line with ellipsis if too long
-      if len(line2) > x:
-        lastWordbreak = line2[:x - 4].rfind(" ")
-        
-        # doesn't use wordbreak if it's a long word or the whole line is one 
-        # word (picking up on two space indent to have index 1)
-        if x - lastWordbreak > 10 or lastWordbreak == 1: lastWordbreak = x - 4
-        line2 = "%s..." % line2[:lastWordbreak]
-      
-      return (line1, line2)
-except ImportError:
-  pass # allows starter to import w/o TorCtl
+    return (line1, line2)