#!/bin/sh

### BEGIN INIT INFO
# Provides: xenner
# Short-Description: xenner
# Description: xenner
### END INIT INFO

# the following is chkconfig init header
#
# xenner: xenner
# chkconfig: - 97 03
# description: xenner
#

evtchnd=/usr/sbin/evtchnd
blkbackd=/usr/sbin/blkbackd
netbackd=/usr/sbin/netbackd
xenstored=/usr/sbin/xenstored
xenconsoled=/usr/sbin/xenconsoled

if test -x "$(dirname $0)/evtchnd"; then
	# called from build dir
	evtchnd="$(dirname $0)/evtchnd"
	blkbackd="$(dirname $0)/blkbackd"
	netbackd="$(dirname $0)/netbackd"
	LD_LIBRARY_PATH="$(dirname $0)"
else
	LD_LIBRARY_PATH="$(echo /usr/lib*/xenner)"
fi
export LD_LIBRARY_PATH
export LD_BIND_NOW=1

# Sanity checks.
[ -x $evtchnd     ]  ||  exit 0
[ -x $xenstored   ]  ||  exit 0
[ -x $xenconsoled ]  ||  exit 0

# Source function library.
. /etc/rc.d/init.d/functions

function load_kvm_modules() {
    if grep -q kvm /proc/misc; then
	return # kvm already present
    fi
    if grep -q " vmx " /proc/cpuinfo; then
	modprobe kvm-intel
	return
    fi
    if grep -q " svm " /proc/cpuinfo; then
	modprobe kvm-amd
	return
    fi
}

start() {
    echo $"Starting xenner daemons"

    echo -n "  "
    mkdir -p /var/run/xenner
    action "mount -t tmpfs vmcore /var/run/xenner" \
	mount -t tmpfs vmcore /var/run/xenner

    echo -n "  evtchnd"
    daemon --check evtchnd \
	$evtchnd -p /var/run/evtchnd.pid -l /var/log/evtchnd.log -d
    echo

    echo -n "  xenstored"
    rm -f /var/log/xenstored.trace
    rm -f /var/lib/xenstored/tdb
    daemon --check xenstored \
	$xenstored --pid-file /var/run/xenstored.pid \
		--trace-file /var/log/xenstored.trace
    echo

    sleep 1
    echo -n "  "
    action "chmod 666 /var/run/xenstored/socket*" \
	chmod 666 /var/run/xenstored/socket*

    echo -n "  xenconsoled"
    daemon --check xenconsoled $xenconsoled
    echo

    echo -n "  blkbackd"
    daemon --check blkbackd \
	$blkbackd -p /var/run/blkbackd.pid -l /var/log/blkbackd.log -d -a
    echo

    echo -n "  netbackd"
    daemon --check netbackd \
	$netbackd -p /var/run/netbackd.pid -l /var/log/netbackd.log -d
    echo

    touch /var/lock/subsys/xenner
}

stop() {
    echo $"Stopping xenner daemons"

    echo -n "  netbackd"
    killproc -p /var/run/netbackd.pid netbackd
    echo

    echo -n "  blkbackd"
    killproc -p /var/run/blkbackd.pid blkbackd
    echo

    echo -n "  xenconsoled"
    killproc xenconsoled
    echo

    echo -n "  xenstored"
    killproc -p /var/run/xenstored.pid xenstored
    echo

    echo -n "  evtchnd"
    killproc -p /var/run/evtchnd.pid evtchnd
    echo

    echo -n "  "
    action "umount /var/run/xenner" \
	umount /var/run/xenner

    rm -f \
	/var/log/netbackd.log \
	/var/log/blkbackd.log \
	/var/log/evtchnd.log \
	/var/log/xenstore.trace \

    rm -f /var/lock/subsys/xenner
}

restart() {
    stop
    start
}

# See how we were called.
case "$1" in
    start)
	load_kvm_modules
	start
	;;
    stop)
        stop
        ;;
    restart|reload)
	restart
	;;
    status)
        status $evtchnd
        status $xenstored
        status $xenconsoled
        status $blkbackd
        status $netbackd
        ;;
    condrestart|try-restart)
        [ -f /var/lock/subsys/xenner ] && restart || :
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart}"
	exit 1
        ;;
esac
exit $RETVAL
