mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
Reintroduce the changes made by changeset 7455:021324804fbd, which were
disabled by workaround 7468:17a9f111fa93. We additionally need to set the FD_CLOEXEC flag on the status fd given to SrvServer when spawning the network script, as at least on some platforms this causes xend to fail to start properly. Signed-off-by: Ewan Mellor <ewan@xensource.com>
This commit is contained in:
1 parent
55179ce8a5
commit
bacb111591
3 files changed
+8
-43
No files matched your search
@@ -1,39 +0,0 @@
|
||||
# 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:
|
||||
cout.close()
|
||||
cerr.close()
|
||||
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())
|
||||
@@ -20,9 +20,9 @@
|
||||
"""
|
||||
import os
|
||||
|
||||
import xen.util.process
|
||||
import XendRoot
|
||||
|
||||
|
||||
def network(op):
|
||||
"""Call a network control script.
|
||||
|
||||
@@ -32,6 +32,4 @@ def network(op):
|
||||
raise ValueError('Invalid operation: ' + op)
|
||||
script = XendRoot.instance().get_network_script()
|
||||
if script:
|
||||
xen.util.process.runscript(script + " " + op)
|
||||
#os.spawnl(os.P_WAIT, script, script, op)
|
||||
|
||||
os.spawnl(os.P_WAIT, script, script, op)
|
||||
@@ -39,6 +39,7 @@
|
||||
# todo Support security settings etc. in the config file.
|
||||
# todo Support command-line args.
|
||||
|
||||
import fcntl
|
||||
from threading import Thread
|
||||
|
||||
from xen.web.httpserver import HttpServer, UnixHttpServer
|
||||
@@ -64,6 +65,11 @@ class XendServers:
|
||||
self.servers.append(server)
|
||||
|
||||
def start(self, status):
|
||||
# Running the network script will spawn another process, which takes
|
||||
# the status fd with it unless we set FD_CLOEXEC. Failing to do this
|
||||
# causes the read in SrvDaemon to hang even when we have written here.
|
||||
fcntl.fcntl(status, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
|
||||
|
||||
Vifctl.network('start')
|
||||
threads = []
|
||||
for server in self.servers:
|
||||
|
||||