diff options
author | mwilli2@equilibrium.research <mwilli2@equilibrium.research> | 2004-11-04 00:32:58 +0000 |
---|---|---|
committer | mwilli2@equilibrium.research <mwilli2@equilibrium.research> | 2004-11-04 00:32:58 +0000 |
commit | 3f96a090369a4203291bfc901011c4e7a2c015d8 (patch) | |
tree | b1159da13f7216de3eae8d4b2450b5f0997982bb | |
parent | b64644981d735183544ebf5f5ff53722cd949500 (diff) | |
download | xen-3f96a090369a4203291bfc901011c4e7a2c015d8.tar.gz xen-3f96a090369a4203291bfc901011c4e7a2c015d8.tar.bz2 xen-3f96a090369a4203291bfc901011c4e7a2c015d8.zip |
bitkeeper revision 1.1159.1.358 (418978baFzv03HdTaa43BJsoKTl3dA)
Better fix for popen. Also makes it easier to log stderr output
from popen'd commands, which we previously threw away. For now,
I'm also throwing it away.
-rw-r--r-- | tools/python/xen/sv/Daemon.py | 4 | ||||
-rw-r--r-- | tools/python/xen/util/ip.py | 4 | ||||
-rw-r--r-- | tools/python/xen/xend/server/SrvDaemon.py | 4 | ||||
-rwxr-xr-x | tools/python/xen/xend/server/blkif.py | 2 | ||||
-rw-r--r-- | tools/python/xen/xend/util.py | 41 |
5 files changed, 33 insertions, 22 deletions
diff --git a/tools/python/xen/sv/Daemon.py b/tools/python/xen/sv/Daemon.py index 8aeb58720e..164a0b1656 100644 --- a/tools/python/xen/sv/Daemon.py +++ b/tools/python/xen/sv/Daemon.py @@ -30,7 +30,7 @@ class Daemon: cmdex = '(?P<cmd>.*)' procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$') xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$') - procs = util.popen('ps -e -o pid,args 2>/dev/null') + procs = util.popen('ps -e -o pid,args') for proc in procs: pm = procre.match(proc) if not pm: continue @@ -58,7 +58,7 @@ class Daemon: return 0 # Read the pid of the previous invocation and search active process list. pid = open(PID_FILE, 'r').read() - lines = util.popen('ps ' + pid + ' 2>/dev/null').readlines() + lines = util.popen('ps ' + pid).readlines() for line in lines: if re.search('^ *' + pid + '.+xensv', line): if not kill: diff --git a/tools/python/xen/util/ip.py b/tools/python/xen/util/ip.py index d130f19421..855a517f50 100644 --- a/tools/python/xen/util/ip.py +++ b/tools/python/xen/util/ip.py @@ -51,7 +51,7 @@ def get_current_ipaddr(dev='eth0'): returns interface address as a string """ - fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) + fd = util.popen( '/sbin/ifconfig ' + dev ) lines = _readlines(fd) for line in lines: m = re.search( '^\s+inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*', @@ -69,7 +69,7 @@ def get_current_ipmask(dev='eth0'): returns interface netmask as a string """ - fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) + fd = util.popen( '/sbin/ifconfig ' + dev ) lines = _readlines(fd) for line in lines: m = re.search( '^.+Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*', diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index ea813965ce..34a24ea6b7 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -337,7 +337,7 @@ class Daemon: cmdex = '(?P<cmd>.*)' procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$') xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$') - procs = util.popen('ps -e -o pid,args 2>/dev/null') + procs = util.popen('ps -e -o pid,args') for proc in procs: pm = procre.match(proc) if not pm: continue @@ -383,7 +383,7 @@ class Daemon: """ running = 0 if pid: - lines = util.popen('ps %d 2>/dev/null' % pid).readlines() + lines = util.popen('ps %d' % pid).readlines() exp = '^ *%d.+%s' % (pid, name) for line in lines: if re.search(exp, line): diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index df32613470..c8d7032fce 100755 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -26,7 +26,7 @@ def expand_dev_name(name): def check_mounted(self, name): mode = None name = expand_dev_name(name) - lines = util.popen('mount 2>/dev/null').readlines() + lines = util.popen('mount').readlines() exp = re.compile('^' + name + ' .*[\(,]r(?P<mode>[ow])[,\)]') for line in lines: pm = exp.match(line) diff --git a/tools/python/xen/xend/util.py b/tools/python/xen/xend/util.py index 111d8cd011..fcce7bc1fa 100644 --- a/tools/python/xen/xend/util.py +++ b/tools/python/xen/xend/util.py @@ -3,9 +3,12 @@ from twisted.internet import utils from twisted.internet import reactor +from twisted.internet import protocol from XendLogging import log from StringIO import StringIO +import os + # This is rather distasteful. Twisted doesn't play nicely with Python's # standard os.popen, so here's an implementation of a synchronous popen that # should work reliably. - MAW @@ -14,22 +17,30 @@ def popen(cmd): done_flag = False result = '' - - def done(output): - global done_flag, result - done_flag = True - result = output - - def err(output): - global done_flag -# For normal use, suppress debug output here. It grumbles about stderr if the -# program exits with $? != 0, even if stderr is redirected. Grrr! -# log.debug("util.popen(\'%s\'): %s" % (cmd, output)) - done_flag = True - - d = utils.getProcessOutput(cmd) - d.addCallbacks(done, err) + class PopenProtocol(protocol.ProcessProtocol): + def connectionMade(self): + self.transport.closeStdin() # we don't want stdin + def outReceived(self, data): + global result + result = result + data +# def errReceived(self, errdata): +# log.debug("popen: %s" % errdata) + def processEnded(self,status_obj): + code = status_obj.value.exitCode + if code: + # todo: Should consider throwing an exception here. + log.debug("popen: process exit with code %d" % code) + global done_flag + done_flag = True + + # using cmd.split is quick and dirty. OK as long as people don't try anything + # tricky with quotes, etc. + args = cmd.split(' ') + reactor.spawnProcess(PopenProtocol(), args[0], args, os.environ) + + # Ick! Sit and ask the reactor to do IO, until the process finishes. + # Can't just do "pass" here because then the reactor won't run at all :-( while not done_flag: reactor.iterate() |