[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r22320: {arm} change: moving tor pid resolution to its own util function (in arm/trunk: init interface util)
Author: atagar
Date: 2010-05-12 15:54:45 +0000 (Wed, 12 May 2010)
New Revision: 22320
Modified:
arm/trunk/init/starter.py
arm/trunk/interface/controller.py
arm/trunk/util/torTools.py
Log:
change: moving tor pid resolution to its own util function
Modified: arm/trunk/init/starter.py
===================================================================
--- arm/trunk/init/starter.py 2010-05-12 14:58:18 UTC (rev 22319)
+++ arm/trunk/init/starter.py 2010-05-12 15:54:45 UTC (rev 22320)
@@ -136,7 +136,7 @@
TorCtl.TorUtil.loglevel = "NONE"
# sets up TorCtl connection, prompting for the passphrase if necessary and
- # printing a notice if they arise
+ # sending problems to stdout if they arise
util.torTools.INCORRECT_PASSWORD_MSG = "Controller password found in '%s' was incorrect" % configPath
authPassword = config.get(AUTH_CFG, None)
conn = util.torTools.getConn(controlAddr, controlPort, authPassword)
Modified: arm/trunk/interface/controller.py
===================================================================
--- arm/trunk/interface/controller.py 2010-05-12 14:58:18 UTC (rev 22319)
+++ arm/trunk/interface/controller.py 2010-05-12 15:54:45 UTC (rev 22320)
@@ -22,7 +22,7 @@
import descriptorPopup
import fileDescriptorPopup
-from util import log, connections, hostnames, panel, sysTools, uiTools
+from util import log, connections, hostnames, panel, sysTools, torTools, uiTools
import bandwidthMonitor
import cpuMemMonitor
import connCountMonitor
@@ -320,34 +320,13 @@
try: curses.curs_set(0)
except curses.error: pass
- # gets pid of tor instance with control port open
- torPid = None # None if couldn't be resolved (provides error later)
+ # attempts to determine tor's current pid (left as None if unresolveable, logging an error later)
+ controlPort = None
+ try: controlPort = int(conn.get_option("ControlPort")[0][1])
+ except (socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass
+ torPid = torTools.getPid(controlPort)
try:
- # gets pid if there's only one possability
- results = sysTools.call("pidof tor")
- if len(results) == 1 and len(results[0].split()) == 1: torPid = results[0].strip()
- except IOError: pass # pid call failed
-
- if not torPid:
- try:
- # uses netstat to identify process with open control port (might not
- # work if tor's being run as a different user due to permissions)
- results = sysTools.call("netstat -npl | grep 127.0.0.1:%s" % conn.get_option("ControlPort")[0][1])
-
- if len(results) == 1:
- results = results[0].split()[6] # process field (ex. "7184/tor")
- torPid = results[:results.find("/")]
- except (IOError, socket.error, TorCtl.ErrorReply, TorCtl.TorCtlClosed): pass # netstat or control port calls failed
-
- if not torPid:
- try:
- # third try, use ps if there's only one possability
- results = sysTools.call("ps -o pid -C tor")
- if len(results) == 2 and len(results[0].split()) == 1: torPid = results[1].strip()
- except IOError: pass # ps call failed
-
- try:
confLocation = conn.get_info("config-file")["config-file"]
if confLocation[0] != "/":
# relative path - attempt to add process pwd
Modified: arm/trunk/util/torTools.py
===================================================================
--- arm/trunk/util/torTools.py 2010-05-12 14:58:18 UTC (rev 22319)
+++ arm/trunk/util/torTools.py 2010-05-12 15:54:45 UTC (rev 22320)
@@ -8,6 +8,8 @@
from TorCtl import TorCtl
+import sysTools
+
INCORRECT_PASSWORD_MSG = "Provided passphrase was incorrect"
def makeCtlConn(controlAddr="127.0.0.1", controlPort=9051):
@@ -150,3 +152,53 @@
print exc
return None
+def getPid(controlPort=9051):
+ """
+ Attempts to determine the process id for a running tor process, using the
+ following:
+ 1. "pidof tor"
+ 2. "netstat -npl | grep 127.0.0.1:%s" % <tor control port>
+ 3. "ps -o pid -C tor"
+
+ If pidof or ps promide multiple tor instances then their results are discared
+ (since only netstat differentiates using the control port). This provdes None
+ if either no running process exists or it can't be determined.
+
+ Arguments:
+ controlPort - control port of the tor process if multiple exist
+ """
+
+ # attempts to resolve using pidof, failing if:
+ # - tor's running under a different name
+ # - there's multiple instances of tor
+ try:
+ results = sysTools.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 (identifying process via the open control
+ # port), failing if:
+ # - tor's being run as a different user due to permissions
+ try:
+ results = sysTools.call("netstat -npl | grep 127.0.0.1:%i" % controlPort)
+
+ 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 = sysTools.call("ps -o pid -C tor")
+ if len(results) == 2:
+ pid = results[1].strip()
+ if pid.isdigit(): return pid
+ except IOError: pass
+
+ return None
+