Files
xen/tools/misc/xend
T
iap10@tetris.cl.cam.ac.uk 227aeb4d79 bitkeeper revision 1.1717 (42b3442b7kXKhXN5lvR9spIGT5LsYQ)
When xend starts, it fires off xcs.  If you're running on a slow
machine its possible that xcs started but xend didnt wait long 
enough to notice.  The attached patch loops several times while 
waiting for xcs to come up.  It seems to be working here while the 
original is not (slow machine here).

From: Tim Newsham [newsham@lava.net]
Signed-off-by: ian@xensource.com
2005-06-17 21:44:11 +00:00

152 lines
3.9 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
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 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()
return daemon.start()
elif sys.argv[1] == 'trace_start':
start_xcs()
return daemon.start(trace=1)
elif sys.argv[1] == 'stop':
stop_xcs()
return daemon.stop()
elif sys.argv[1] == 'restart':
stop_xcs()
start_xcs()
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())