mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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.
This commit is contained in:
1 parent
b64644981d
commit
3f96a09036
5 files changed
+31
-20
No files matched your search
@@ -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:
|
||||
|
||||
@@ -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]+).*',
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
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
|
||||
|
||||
d = utils.getProcessOutput(cmd)
|
||||
d.addCallbacks(done, err)
|
||||
# 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()
|
||||
|
||||
|
||||