mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
1) make xenconsoled exit gracefully if xcs dies 2) daemonize xenstored before binding to xenstored socket 3) wait to close stdio in xenstored until we're ready to accept connections (so that PID=`xenstored --output-pid` doesn't return until it's ready to accept connections) 4) updates tools/misc/xend for these changes Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Rusty Russell <rusty@rustycorp.com.au> Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
166 lines
4.3 KiB
Python
166 lines
4.3 KiB
Python
#!/usr/bin/env python
|
|
# -*- mode: python; -*-
|
|
#============================================================================
|
|
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
|
|
#============================================================================
|
|
|
|
"""Xen management daemon. Lives in /usr/sbin.
|
|
Provides console server and HTTP management api.
|
|
|
|
Run:
|
|
xend start
|
|
|
|
Restart:
|
|
xend restart
|
|
|
|
The daemon is stopped with:
|
|
xend stop
|
|
|
|
The daemon should reconnect to device control interfaces
|
|
and recover its state when restarted.
|
|
"""
|
|
import os
|
|
import sys
|
|
import socket
|
|
import signal
|
|
import time
|
|
import commands
|
|
|
|
XCS_PATH = "/var/lib/xen/xcs_socket"
|
|
XCS_EXEC = "/usr/sbin/xcs"
|
|
XCS_PIDFILE = "/var/run/xcs.pid"
|
|
XCS_ARGS = (XCS_EXEC, "-p", XCS_PIDFILE)
|
|
|
|
# add fallback path for non-native python path installs if needed
|
|
sys.path.append('/usr/lib/python')
|
|
sys.path.append('/usr/lib64/python')
|
|
from xen.xend.server import SrvDaemon
|
|
|
|
class CheckError(ValueError):
|
|
pass
|
|
|
|
def hline():
|
|
print >>sys.stderr, "*" * 70
|
|
|
|
def msg(message):
|
|
print >>sys.stderr, "*" * 3, message
|
|
|
|
def check_logging():
|
|
"""Check python logging is installed and raise an error if not.
|
|
Logging is standard from Python 2.3 on.
|
|
"""
|
|
try:
|
|
import logging
|
|
except ImportError:
|
|
hline()
|
|
msg("Python logging is not installed.")
|
|
msg("Use 'make install-logging' at the xen root to install.")
|
|
msg("")
|
|
msg("Alternatively download and install from")
|
|
msg("http://www.red-dove.com/python_logging.html")
|
|
hline()
|
|
raise CheckError("logging is not installed")
|
|
|
|
def check_user():
|
|
"""Check that the effective user id is 0 (root).
|
|
"""
|
|
if os.geteuid() != 0:
|
|
hline()
|
|
msg("Xend must be run as root.")
|
|
hline()
|
|
raise CheckError("invalid user")
|
|
|
|
def xcs_running():
|
|
""" See if the control switch is running.
|
|
"""
|
|
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
try:
|
|
s.connect( (XCS_PATH) )
|
|
s.close()
|
|
except:
|
|
try:
|
|
os.remove(XCS_PIDFILE)
|
|
except:
|
|
pass
|
|
return 0
|
|
return 1
|
|
|
|
def start_xcs():
|
|
if (not xcs_running()):
|
|
if os.fork() == 0 :
|
|
if not os.path.isdir(os.path.dirname(XCS_PATH)):
|
|
os.makedirs(os.path.dirname(XCS_PATH))
|
|
try:
|
|
os.execvp(XCS_EXEC, XCS_ARGS)
|
|
except:
|
|
hline()
|
|
msg("Tried to start xcs, but failed. Is it installed?")
|
|
hline()
|
|
raise CheckError("couldn't start xcs")
|
|
for n in range(10) :
|
|
if (xcs_running()):
|
|
break
|
|
time.sleep(0.1)
|
|
else :
|
|
hline()
|
|
msg("Failed to start the control interface switch.")
|
|
hline()
|
|
raise CheckError("xcs not running")
|
|
|
|
def stop_xcs():
|
|
try:
|
|
xcs_pidfile = open(XCS_PIDFILE)
|
|
xcs_pid = int(xcs_pidfile.read().strip())
|
|
os.kill(xcs_pid, signal.SIGTERM)
|
|
xcs_pidfile.close()
|
|
except:
|
|
return
|
|
|
|
def start_xenstored():
|
|
s,o = commands.getstatusoutput("/usr/sbin/xenstored --pid-file=/var/run/xenstore.pid");
|
|
|
|
def start_consoled():
|
|
if os.fork() == 0:
|
|
os.execvp('/usr/sbin/xenconsoled', ['/usr/sbin/xenconsoled']);
|
|
|
|
def main():
|
|
try:
|
|
check_logging()
|
|
check_user()
|
|
except CheckError:
|
|
sys.exit(1)
|
|
|
|
daemon = SrvDaemon.instance()
|
|
if not sys.argv[1:]:
|
|
print 'usage: %s {start|stop|restart}' % sys.argv[0]
|
|
elif os.fork():
|
|
pid, status = os.wait()
|
|
return status >> 8
|
|
elif sys.argv[1] == 'start':
|
|
start_xcs()
|
|
start_xenstored()
|
|
start_consoled()
|
|
return daemon.start()
|
|
elif sys.argv[1] == 'trace_start':
|
|
start_xcs()
|
|
start_xenstored()
|
|
start_consoled()
|
|
return daemon.start(trace=1)
|
|
elif sys.argv[1] == 'stop':
|
|
stop_xcs()
|
|
return daemon.stop()
|
|
elif sys.argv[1] == 'restart':
|
|
stop_xcs()
|
|
start_xcs()
|
|
start_xenstored()
|
|
start_consoled()
|
|
return daemon.stop() or daemon.start()
|
|
elif sys.argv[1] == 'status':
|
|
return daemon.status()
|
|
else:
|
|
print 'not an option:', sys.argv[1]
|
|
return 1
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|