[tor-commits] [arm/master] Using stem's utils for resolving our pid

atagar at torproject.org atagar at torproject.org
Tue May 28 04:49:19 UTC 2013


commit 477959a0d30662d0d6c85000eeaac4cdda6d01ba
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon May 27 20:22:25 2013 -0700

    Using stem's utils for resolving our pid
    
    Our getPid() function does a lot of work, almost all of it redundant with its
    stem.util.system counterparts (which unlike arm, has tests!).
---
 src/util/torTools.py |  125 ++++----------------------------------------------
 1 file changed, 10 insertions(+), 115 deletions(-)

diff --git a/src/util/torTools.py b/src/util/torTools.py
index 31dace4..397a32a 100644
--- a/src/util/torTools.py
+++ b/src/util/torTools.py
@@ -14,6 +14,7 @@ import Queue
 import stem
 import stem.control
 import stem.descriptor
+import stem.util.system
 
 from util import connections
 
@@ -52,20 +53,9 @@ REQ_EVENTS = {"NEWDESC": "information related to descriptors will grow stale",
 
 def getPid(controlPort=9051, pidFilePath=None):
   """
-  Attempts to determine the process id for a running tor process, using the
-  following:
-  1. GETCONF PidFile
-  2. "pgrep -x tor"
-  3. "pidof tor"
-  4. "netstat -npl | grep 127.0.0.1:%s" % <tor control port>
-  5. "ps -o pid -C tor"
-  6. "sockstat -4l -P tcp -p %i | grep tor" % <tor control port>
-  7. "ps axc | egrep \" tor$\""
-  8. "lsof -wnPi | egrep \"^tor.*:%i\"" % <tor control port>
-  
-  If pidof or ps provide multiple tor instances then their results are
-  discarded (since only netstat can differentiate using the control port). This
-  provides None if either no running process exists or it can't be determined.
+  Attempts to determine the process id for a running tor process. This uses
+  the PidFile if it's available, otherwise trying to figure it out from our
+  process name and control port.
   
   Arguments:
     controlPort - control port of the tor process if multiple exist
@@ -85,107 +75,12 @@ def getPid(controlPort=9051, pidFilePath=None):
       if pidEntry.isdigit(): return pidEntry
     except: pass
   
-  # attempts to resolve using pgrep, failing if:
-  # - tor is running under a different name
-  # - there are multiple instances of tor
-  try:
-    results = system.call("pgrep -x tor")
-    if len(results) == 1 and len(results[0].split()) == 1:
-      pid = results[0].strip()
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve using pidof, failing if:
-  # - tor's running under a different name
-  # - there's multiple instances of tor
-  try:
-    results = system.call("pidof tor")
-    if len(results) == 1 and len(results[0].split()) == 1:
-      pid = results[0].strip()
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve using netstat, failing if:
-  # - tor's being run as a different user due to permissions
-  try:
-    results = system.call("netstat -npl")
-    results = filter(lambda line: "127.0.0.1:%i" % controlPort in line, results)
-    
-    if len(results) == 1:
-      results = results[0].split()[6] # process field (ex. "7184/tor")
-      pid = results[:results.find("/")]
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve using ps, failing if:
-  # - tor's running under a different name
-  # - there's multiple instances of tor
-  try:
-    results = system.call("ps -o pid -C tor")
-    if len(results) == 2:
-      pid = results[1].strip()
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve using sockstat, failing if:
-  # - sockstat doesn't accept the -4 flag (BSD only)
-  # - tor is running under a different name
-  # - there are multiple instances of Tor, using the
-  #   same control port on different addresses.
-  # 
-  # TODO: the later two issues could be solved by filtering for the control
-  # port IP address instead of the process name.
-  try:
-    results = system.call("sockstat -4l -P tcp -p %i" % controlPort)
-    results = filter(lambda line: "tor" in line, results)
-    
-    if len(results) == 1 and len(results[0].split()) == 7:
-      pid = results[0].split()[2]
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve via a ps command that works on the mac (this and lsof
-  # are the only resolvers to work on that platform). This fails if:
-  # - tor's running under a different name
-  # - there's multiple instances of tor
-  
-  try:
-    results = system.call("ps axc")
-    results = filter(lambda line: line.endswith(" tor"), results)
-    
-    if len(results) == 1 and len(results[0].split()) > 0:
-      pid = results[0].split()[0]
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  # attempts to resolve via lsof - this should work on linux, mac, and bsd -
-  # this fails if:
-  # - tor's running under a different name
-  # - tor's being run as a different user due to permissions
-  # - there are multiple instances of Tor, using the
-  #   same control port on different addresses.
-  
-  try:
-    results = system.call("lsof -wnPi")
-    results = filter(lambda line: line.startswith("tor.*:%i" % controlPort), results)
-    
-    # This can result in multiple entries with the same pid (from the query
-    # itself). Checking all lines to see if they're in agreement about the pid.
-    
-    if results:
-      pid = ""
-      
-      for line in results:
-        lineComp = line.split()
-        
-        if len(lineComp) >= 2 and (not pid or lineComp[1] == pid):
-          pid = lineComp[1]
-        else: raise IOError
-      
-      if pid.isdigit(): return pid
-  except IOError: pass
-  
-  return None
+  pid = stem.util.system.get_pid_by_name('tor')
+
+  if pid is None:
+    pid = stem.util.system.get_pid_by_port(controlPort)
+
+  return pid
 
 def isTorRunning():
   """





More information about the tor-commits mailing list