Files
xen/tools/python/xen/util/process.py
T
cl349@firebug.cl.cam.ac.uk b93e7f7e8b bitkeeper revision 1.1426.1.1 (4289cc8cPUM98bLJs4TV93NHY9LOKg)
Many files:
  Make interface to network/block scripts consistent:
  - output on stdout is returned to the script caller
  - output on stderr is logged at the error level, messages with a '-' prefix
    are logged at the debug level and messages with a '*' prefix are logged
    at the info level.
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
2005-05-17 10:50:52 +00:00

38 lines
1.2 KiB
Python

# Copyright (C) 2005 Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
# os.system() replacement which outputs through the logger
import popen2
import select
import string
from xen.xend.XendLogging import log
def runscript(cmd):
# split after first space, then grab last component of path
cmdname = "[%s] " % cmd.split()[0].split('/')[-1]
# run command and grab stdin, stdout and stderr
cout, cin, cerr = popen2.popen3(cmd)
# close stdin to get command to terminate if it waits for input
cin.close()
# wait for output and process
p = select.poll()
p.register(cout)
p.register(cerr)
stdout = ""
while True:
r = p.poll()
for (fd, event) in r:
if event == select.POLLHUP:
return stdout
if fd == cout.fileno():
stdout = stdout + cout.readline()
if fd == cerr.fileno():
l = cerr.readline()
if l[0] == '-':
log.debug(cmdname + l[1:].rstrip())
elif l[0] == '*':
log.info(cmdname + l[1:].rstrip())
else:
log.error(cmdname + l.rstrip())