From 6ab8abb18dcc34cd1d3539efd95cf7af743f8306 Mon Sep 17 00:00:00 2001 From: "mwilli2@equilibrium.research" Date: Wed, 3 Nov 2004 17:16:13 +0000 Subject: bitkeeper revision 1.1159.154.1 (4189125da-JXVx56I2Sl4SQmQFvGcA) Fix for os.popen problems on some systems. Not pretty. --- .rootkeys | 1 + tools/python/xen/sv/Daemon.py | 5 +++-- tools/python/xen/util/Brctl.py | 6 ++++-- tools/python/xen/util/ip.py | 8 ++++--- tools/python/xen/xend/Blkctl.py | 3 ++- tools/python/xen/xend/server/SrvDaemon.py | 5 +++-- tools/python/xen/xend/server/blkif.py | 3 ++- tools/python/xen/xend/util.py | 36 +++++++++++++++++++++++++++++++ 8 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 tools/python/xen/xend/util.py diff --git a/.rootkeys b/.rootkeys index acc4fb6c0d..4896a7d5e2 100644 --- a/.rootkeys +++ b/.rootkeys @@ -491,6 +491,7 @@ 40c9c46925x-Rjb0Cv2f1-l2jZrPYg tools/python/xen/xend/server/netif.py 40c9c469ZqILEQ8x6yWy0_51jopiCg tools/python/xen/xend/server/params.py 40c9c469LNxLVizOUpOjEaTKKCm8Aw tools/python/xen/xend/sxp.py +4189125cL90jKSOcBJ3Vx4nWGiXXvA tools/python/xen/xend/util.py 40d05079aFRp6NQdo5wIh5Ly31c0cg tools/python/xen/xm/__init__.py 40cf2937gKQcATgXKGtNeWb1PDH5nA tools/python/xen/xm/create.py 40f552eariuUSB9TWqCPnDLz5zvxMw tools/python/xen/xm/destroy.py diff --git a/tools/python/xen/sv/Daemon.py b/tools/python/xen/sv/Daemon.py index 510cfa9f04..8aeb58720e 100644 --- a/tools/python/xen/sv/Daemon.py +++ b/tools/python/xen/sv/Daemon.py @@ -11,6 +11,7 @@ import sys import re from xen.sv.params import * +from xen.xend import util from twisted.internet import reactor from twisted.web import static, server, script @@ -29,7 +30,7 @@ class Daemon: cmdex = '(?P.*)' procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$') xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$') - procs = os.popen('ps -e -o pid,args 2>/dev/null') + procs = util.popen('ps -e -o pid,args 2>/dev/null') for proc in procs: pm = procre.match(proc) if not pm: continue @@ -57,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 = os.popen('ps ' + pid + ' 2>/dev/null').readlines() + lines = util.popen('ps ' + pid + ' 2>/dev/null').readlines() for line in lines: if re.search('^ *' + pid + '.+xensv', line): if not kill: diff --git a/tools/python/xen/util/Brctl.py b/tools/python/xen/util/Brctl.py index 7a6f4871df..569d1b3357 100644 --- a/tools/python/xen/util/Brctl.py +++ b/tools/python/xen/util/Brctl.py @@ -5,6 +5,8 @@ import os.path import re import sys +from xen.xend import util + os.defpath = os.defpath + ':/sbin:/usr/sbin:/usr/local/sbin' CMD_IFCONFIG = 'ifconfig' CMD_ROUTE = 'route' @@ -81,7 +83,7 @@ def bridge_del(bridge): def routes(): """Return a list of the routes. """ - fin = os.popen(CMD_ROUTE + ' -n', 'r') + fin = util.popen(CMD_ROUTE + ' -n', 'r') routes = [] for x in fin: if x.startswith('Kernel'): continue @@ -102,7 +104,7 @@ def routes(): def ifconfig(interface): """Return the ip config for an interface, """ - fin = os.popen(CMD_IFCONFIG + ' %s' % interface, 'r') + fin = util.popen(CMD_IFCONFIG + ' %s' % interface, 'r') inetre = re.compile('\s*inet\s*addr:(?P
\S*)\s*Bcast:(?P\S*)\s*Mask:(?P\S*)') info = None for x in fin: diff --git a/tools/python/xen/util/ip.py b/tools/python/xen/util/ip.py index 9dd558a178..d130f19421 100644 --- a/tools/python/xen/util/ip.py +++ b/tools/python/xen/util/ip.py @@ -4,6 +4,8 @@ import socket import struct import errno +from xen.xend import util + def _readlines(fd): """Version of readlines safe against EINTR. """ @@ -49,7 +51,7 @@ def get_current_ipaddr(dev='eth0'): returns interface address as a string """ - fd = os.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) + fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) lines = _readlines(fd) for line in lines: m = re.search( '^\s+inet addr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*', @@ -67,7 +69,7 @@ def get_current_ipmask(dev='eth0'): returns interface netmask as a string """ - fd = os.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) + fd = util.popen( '/sbin/ifconfig ' + dev + ' 2>/dev/null' ) lines = _readlines(fd) for line in lines: m = re.search( '^.+Mask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*', @@ -85,7 +87,7 @@ def get_current_ipgw(dev='eth0'): returns gateway address as a string """ - fd = os.popen( '/sbin/route -n' ) + fd = util.popen( '/sbin/route -n' ) lines = _readlines(fd) for line in lines: m = re.search( '^\S+\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' + diff --git a/tools/python/xen/xend/Blkctl.py b/tools/python/xen/xend/Blkctl.py index a5bda19470..f912a42473 100644 --- a/tools/python/xen/xend/Blkctl.py +++ b/tools/python/xen/xend/Blkctl.py @@ -5,6 +5,7 @@ import os.path import sys import string +from xen.xend import util from xen.xend import XendRoot xroot = XendRoot.instance() @@ -35,7 +36,7 @@ def block(op, type, dets, script=None): script = os.path.join(SCRIPT_DIR, script) args = [op] + string.split(dets, ':') args = ' '.join(args) - out = os.popen(script + ' ' + args) + out = util.popen(script + ' ' + args) output = out.readline() out.close() diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index cc7da8ee43..ea813965ce 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -34,6 +34,7 @@ from xen.xend.XendError import XendError from xen.xend.server import SrvServer from xen.xend import XendRoot from xen.xend.XendLogging import log +from xen.xend import util import channel import blkif @@ -336,7 +337,7 @@ class Daemon: cmdex = '(?P.*)' procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$') xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$') - procs = os.popen('ps -e -o pid,args 2>/dev/null') + procs = util.popen('ps -e -o pid,args 2>/dev/null') for proc in procs: pm = procre.match(proc) if not pm: continue @@ -382,7 +383,7 @@ class Daemon: """ running = 0 if pid: - lines = os.popen('ps %d 2>/dev/null' % pid).readlines() + lines = util.popen('ps %d 2>/dev/null' % 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 9ca8eab5fe..df32613470 100755 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -8,6 +8,7 @@ from xen.xend import sxp from xen.xend import Blkctl from xen.xend.XendLogging import log from xen.xend.XendError import XendError, VmError +from xen.xend import util import os import re @@ -25,7 +26,7 @@ def expand_dev_name(name): def check_mounted(self, name): mode = None name = expand_dev_name(name) - lines = os.popen('mount 2>/dev/null').readlines() + lines = util.popen('mount 2>/dev/null').readlines() exp = re.compile('^' + name + ' .*[\(,]r(?P[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 new file mode 100644 index 0000000000..111d8cd011 --- /dev/null +++ b/tools/python/xen/xend/util.py @@ -0,0 +1,36 @@ +# Misc utility functions for Xend +# (c) 2004 Mark A. Williamson + +from twisted.internet import utils +from twisted.internet import reactor +from XendLogging import log +from StringIO import StringIO + +# 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 +def popen(cmd): + global done_flag, result + + 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) + + while not done_flag: + reactor.iterate() + + return StringIO(result) -- cgit v1.2.3