[tor-commits] [arm/release] Moving event logging selection to the log panel

atagar at torproject.org atagar at torproject.org
Sun Jul 17 06:08:19 UTC 2011


commit 4986780baff0740a7c55eaf7717697f54e305a5d
Author: Damian Johnson <atagar at torproject.org>
Date:   Thu May 12 20:45:55 2011 -0700

    Moving event logging selection to the log panel
---
 src/cli/controller.py |   77 -------------------------------------------------
 src/cli/logPanel.py   |   56 ++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 79 deletions(-)

diff --git a/src/cli/controller.py b/src/cli/controller.py
index 035ef07..84205cb 100644
--- a/src/cli/controller.py
+++ b/src/cli/controller.py
@@ -277,32 +277,6 @@ def setPauseState(panels, monitorIsPaused, currentPage, overwrite=False):
   
   for key in allPanels: panels[key].setPaused(overwrite or monitorIsPaused or (key not in PAGES[currentPage] and key not in PAGE_S))
 
-def setEventListening(selectedEvents, isBlindMode):
-  # creates a local copy, note that a suspected python bug causes *very*
-  # puzzling results otherwise when trying to discard entries (silently
-  # returning out of this function!)
-  events = set(selectedEvents)
-  isLoggingUnknown = "UNKNOWN" in events
-  
-  # removes special types only used in arm (UNKNOWN, TORCTL, ARM_DEBUG, etc)
-  toDiscard = []
-  for eventType in events:
-    if eventType not in logPanel.TOR_EVENT_TYPES.values(): toDiscard += [eventType]
-  
-  for eventType in list(toDiscard): events.discard(eventType)
-  
-  # adds events unrecognized by arm if we're listening to the 'UNKNOWN' type
-  if isLoggingUnknown:
-    events.update(set(logPanel.getMissingEventTypes()))
-  
-  setEvents = torTools.getConn().setControllerEvents(list(events))
-  
-  # temporary hack for providing user selected events minus those that failed
-  # (wouldn't be a problem if I wasn't storing tor and non-tor events together...)
-  returnVal = list(selectedEvents.difference(torTools.FAILED_EVENTS))
-  returnVal.sort() # alphabetizes
-  return returnVal
-
 def connResetListener(conn, eventType):
   """
   Pauses connection resolution when tor's shut down, and resumes if started
@@ -507,7 +481,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode):
     if isSuccessful: panels["graph"].updateInterval = 4
   
   # tells Tor to listen to the events we're interested
-  loggedEvents = setEventListening(loggedEvents, isBlindMode)
   #panels["log"].loggedEvents = loggedEvents # strips any that couldn't be set
   panels["log"].setLoggedEvents(loggedEvents) # strips any that couldn't be set
   
@@ -869,56 +842,6 @@ def drawTorMonitor(stdscr, startTime, loggedEvents, isBlindMode):
         panel.CURSES_LOCK.release()
       
       panels["graph"].redraw(True)
-    elif page == 0 and (key == ord('e') or key == ord('E')):
-      # allow user to enter new types of events to log - unchanged if left blank
-      panel.CURSES_LOCK.acquire()
-      try:
-        setPauseState(panels, isPaused, page, True)
-        
-        # provides prompt
-        panels["control"].setMsg("Events to log: ")
-        panels["control"].redraw(True)
-        
-        # lists event types
-        popup = panels["popup"]
-        popup.height = 11
-        popup.recreate(stdscr, 80)
-        
-        popup.clear()
-        popup.win.box()
-        popup.addstr(0, 0, "Event Types:", curses.A_STANDOUT)
-        lineNum = 1
-        for line in logPanel.EVENT_LISTING.split("\n"):
-          line = line[6:]
-          popup.addstr(lineNum, 1, line)
-          lineNum += 1
-        popup.refresh()
-        
-        # gets user input (this blocks monitor updates)
-        eventsInput = panels["control"].getstr(0, 15)
-        if eventsInput: eventsInput = eventsInput.replace(' ', '') # strips spaces
-        
-        # it would be nice to quit on esc, but looks like this might not be possible...
-        if eventsInput:
-          try:
-            expandedEvents = logPanel.expandEvents(eventsInput)
-            loggedEvents = setEventListening(expandedEvents, isBlindMode)
-            panels["log"].setLoggedEvents(loggedEvents)
-          except ValueError, exc:
-            panels["control"].setMsg("Invalid flags: %s" % str(exc), curses.A_STANDOUT)
-            panels["control"].redraw(True)
-            time.sleep(2)
-        
-        # reverts popup dimensions
-        popup.height = 9
-        popup.recreate(stdscr, 80)
-        
-        panels["control"].setMsg(CTL_PAUSED if isPaused else CTL_HELP)
-        setPauseState(panels, isPaused, page)
-      finally:
-        panel.CURSES_LOCK.release()
-      
-      panels["graph"].redraw(True)
     else:
       for pagePanel in getPanels(page + 1):
         isKeystrokeConsumed = pagePanel.handleKey(key)
diff --git a/src/cli/logPanel.py b/src/cli/logPanel.py
index 745cb57..75cdab5 100644
--- a/src/cli/logPanel.py
+++ b/src/cli/logPanel.py
@@ -163,6 +163,28 @@ def getMissingEventTypes():
     return [event for event in torEventTypes if not event in armEventTypes]
   else: return None # GETINFO call failed
 
+def setEventListening(events):
+  """
+  Configures the events Tor listens for, filtering non-tor events from what we
+  request from the controller. This returns a sorted list of the events we
+  successfully set.
+  
+  Arguments:
+    events - event types to attempt to set
+  """
+  
+  events = set(events) # drops duplicates
+  torEvents = events.intersection(set(TOR_EVENT_TYPES.values()))
+  
+  # adds events unrecognized by arm if we're listening to the 'UNKNOWN' type
+  if "UNKNOWN" in events:
+    torEvents.update(set(getMissingEventTypes()))
+  
+  setEvents = torTools.getConn().setControllerEvents(list(torEvents))
+  
+  # provides back the input set minus events we failed to set
+  return sorted(events.difference(torTools.FAILED_EVENTS))
+
 def loadLogMessages():
   """
   Fetches a mapping of common log messages to their runlevels from the config.
@@ -552,6 +574,10 @@ class LogPanel(panel.Panel, threading.Thread):
     # collapses duplicate log entries if false, showing only the most recent
     self.showDuplicates = self._config["features.log.showDuplicateEntries"]
     
+    # restricts the input to the set of events we can listen to, and
+    # configures the controller to liten to them
+    loggedEvents = setEventListening(loggedEvents)
+    
     self.setPauseAttr("msgLog")         # tracks the message log when we're paused
     self.msgLog = []                    # log entries, sorted by the timestamp
     self.loggedEvents = loggedEvents    # events we're listening to
@@ -693,9 +719,12 @@ class LogPanel(panel.Panel, threading.Thread):
     """
     
     if eventTypes == self.loggedEvents: return
-    
     self.valsLock.acquire()
-    self.loggedEvents = eventTypes
+    
+    # configures the controller to listen for these tor events, and provides
+    # back a subset without anything we're failing to listen to
+    setTypes = setEventListening(eventTypes)
+    self.loggedEvents = setTypes
     self.redraw(True)
     self.valsLock.release()
   
@@ -815,6 +844,29 @@ class LogPanel(panel.Panel, threading.Thread):
         panel.CURSES_LOCK.release()
       
       if len(self.filterOptions) > MAX_REGEX_FILTERS: del self.filterOptions[MAX_REGEX_FILTERS:]
+    elif key == ord('e') or key == ord('E'):
+      # allow user to enter new types of events to log - unchanged if left blank
+      popup, width, height = popups.init(11, 80)
+      
+      if popup:
+        try:
+          # displays the available flags
+          popup.win.box()
+          popup.addstr(0, 0, "Event Types:", curses.A_STANDOUT)
+          eventLines = EVENT_LISTING.split("\n")
+          
+          for i in range(len(eventLines)):
+            popup.addstr(i + 1, 1, eventLines[i][6:])
+          
+          popup.win.refresh()
+          
+          userInput = popups.inputPrompt("Events to log: ")
+          if userInput:
+            userInput = userInput.replace(' ', '') # strips spaces
+            try: self.setLoggedEvents(expandEvents(userInput))
+            except ValueError, exc:
+              popups.showMsg("Invalid flags: %s" % str(exc), 2)
+        finally: popups.finalize()
     else: isKeystrokeConsumed = False
     
     return isKeystrokeConsumed





More information about the tor-commits mailing list