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

[or-cvs] r24022: {arm} fix: Connection resolution wasn't finding results if tor was (in arm/trunk/src: interface util)



Author: atagar
Date: 2011-01-02 21:48:04 +0000 (Sun, 02 Jan 2011)
New Revision: 24022

Modified:
   arm/trunk/src/interface/controller.py
   arm/trunk/src/util/connections.py
   arm/trunk/src/util/sysTools.py
Log:
fix: Connection resolution wasn't finding results if tor was running under a different name.



Modified: arm/trunk/src/interface/controller.py
===================================================================
--- arm/trunk/src/interface/controller.py	2011-01-02 16:44:07 UTC (rev 24021)
+++ arm/trunk/src/interface/controller.py	2011-01-02 21:48:04 UTC (rev 24022)
@@ -530,7 +530,8 @@
   if not isBlindMode:
     if torPid:
       # use the tor pid to help narrow connection results
-      resolver = connections.getResolver("tor", torPid)
+      torCmdName = sysTools.getProcessName(torPid, "tor")
+      resolver = connections.getResolver(torCmdName, torPid, "tor")
     else:
       resolver = connections.getResolver("tor")
   

Modified: arm/trunk/src/util/connections.py
===================================================================
--- arm/trunk/src/util/connections.py	2011-01-02 16:44:07 UTC (rev 24021)
+++ arm/trunk/src/util/connections.py	2011-01-02 21:48:04 UTC (rev 24022)
@@ -199,7 +199,7 @@
   
   return False
 
-def getResolver(processName, processPid = ""):
+def getResolver(processName, processPid = "", alias=None):
   """
   Singleton constructor for resolver instances. If a resolver already exists
   for the process then it's returned. Otherwise one is created and started.
@@ -208,18 +208,20 @@
     processName - name of the process being resolved
     processPid  - pid of the process being resolved, if undefined this matches
                   against any resolver with the process name
+    alias       - alternative handle under which the resolver can be requested
   """
   
   # check if one's already been created
+  requestHandle = alias if alias else processName
   haltedIndex = -1 # old instance of this resolver with the _halt flag set
   for i in range(len(RESOLVERS)):
     resolver = RESOLVERS[i]
-    if resolver.processName == processName and (not processPid or resolver.processPid == processPid):
+    if resolver.handle == requestHandle and (not processPid or resolver.processPid == processPid):
       if resolver._halt and RECREATE_HALTED_RESOLVERS: haltedIndex = i
       else: return resolver
   
   # make a new resolver
-  r = ConnectionResolver(processName, processPid)
+  r = ConnectionResolver(processName, processPid, handle = requestHandle)
   r.start()
   
   # overwrites halted instance of this resolver if it exists, otherwise append
@@ -291,7 +293,7 @@
     * read-only
   """
   
-  def __init__(self, processName, processPid = "", resolveRate = None):
+  def __init__(self, processName, processPid = "", resolveRate = None, handle = None):
     """
     Initializes a new resolver daemon. When no longer needed it's suggested
     that this is stopped.
@@ -301,6 +303,8 @@
       processPid  - pid of the process being resolved
       resolveRate - time between resolving connections (in seconds, None if
                     chosen dynamically)
+      handle      - name used to query this resolver, this is the processName
+                    if undefined
     """
     
     threading.Thread.__init__(self)
@@ -309,6 +313,7 @@
     self.processName = processName
     self.processPid = processPid
     self.resolveRate = resolveRate
+    self.handle = handle if handle else processName
     self.defaultRate = CONFIG["queries.connections.minRate"]
     self.lastLookup = -1
     self.overwriteResolver = None

Modified: arm/trunk/src/util/sysTools.py
===================================================================
--- arm/trunk/src/util/sysTools.py	2011-01-02 16:44:07 UTC (rev 24021)
+++ arm/trunk/src/util/sysTools.py	2011-01-02 21:48:04 UTC (rev 24022)
@@ -122,12 +122,26 @@
     return PROCESS_NAME_CACHE[pid]
   
   processName, raisedExc = "", None
+  
+  # fetch it from proc contents if available
   if procTools.isProcAvailable():
     try:
       processName = procTools.getStats(pid, procTools.STAT_COMMAND)[0]
     except IOError, exc:
       raisedExc = exc
   
+  # fall back to querying via ps
+  if not processName:
+    # the ps call formats results as:
+    # COMMAND
+    # tor
+    psCall = call("ps -p %s -o command" % pid)
+    
+    if psCall and len(psCall) >= 2 and not " " in psCall[1]:
+      processName, raisedExc = psCall[1].strip(), None
+    else:
+      raisedExc = ValueError("Unexpected output from ps: %s" % psCall)
+  
   if raisedExc:
     if default == None: raise raisedExc
     else: