aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormwilli2@equilibrium.research <mwilli2@equilibrium.research>2004-11-04 00:32:58 +0000
committermwilli2@equilibrium.research <mwilli2@equilibrium.research>2004-11-04 00:32:58 +0000
commit3f96a090369a4203291bfc901011c4e7a2c015d8 (patch)
treeb1159da13f7216de3eae8d4b2450b5f0997982bb
parentb64644981d735183544ebf5f5ff53722cd949500 (diff)
downloadxen-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.py4
-rw-r--r--tools/python/xen/util/ip.py4
-rw-r--r--tools/python/xen/xend/server/SrvDaemon.py4
-rwxr-xr-xtools/python/xen/xend/server/blkif.py2
-rw-r--r--tools/python/xen/xend/util.py41
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()