#!/bin/bash

### BEGIN INIT INFO
# Provides:		xenner
# Required-Start:	$local_fs
# Required-Stop:	$local_fs
# Default-Start:	2 3 4 5 6
# Default-Stop		S 0 1 6
# Short-Description: xenner
# Description: xenner
### END INIT INFO

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.
. /lib/lsb/init-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() {
    log_daemon_msg "Starting xenner" "xenner"

    mkdir -p /var/run/xenner
    mount -t tmpfs vmcore /var/run/xenner 
    mount -t tmpfs vmcore /var/run/xenner

    log_daemon_msg "Starting evtchnd" "evtchnd"
    if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/evtchnd.pid --exec $evtchnd -- -p /var/run/evtchnd.pid -l /var/log/evtchnd.log ; then
	log_end_msg 0 
    else
	 log_end_msg 1
    fi

    rm -f /var/log/xenstored.trace
    rm -f /var/lib/xenstored/tdb

     log_daemon_msg "Starting xensored" "xenstored"
    if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/xenstored.pid --exec $xenstored -- --no-domain-init --pid-file /var/run/xenstored.pid --trace-file /var/log/xenstored.trace; then
        log_end_msg 0 
    else 
	log_end_msg 1
    fi

    sleep 1
    chmod 666 /var/run/xenstored/socket*
    chmod 666 /var/run/xenstored/socket*

    log_daemon_msg "Starting xenconsoled" "xenconsoled"
    if start-stop-daemon --start --quiet --oknodo --exec $xenconsoled; then
	log_end_msg 0
    else
	log_end_msg 1
    fi

   log_daemon_msg "Starting xen block devices" "xenblkbackd"
   if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/blkbackd.pid --exec  $blkbackd -- -p /var/run/blkbackd.pid -l /var/log/blkbackd.log -d -a; then
	log_end_msg 0
   else
	log_end_msg 1
   fi
 
  log_daemon_msg "Starting xen netblock" "netbackd"
  if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/netbackd.pid --exec $netbackd -- -p  /var/run/netbackd.pid -l /var/log/netbackd.log -d; then
	log_end_msg 0
  else
	log_end_msg 1
  fi

    touch /var/lock/xenner
}

stop() {
   log_daemon_msg "Stopping xenner" "xenner"

   for i in /var/run/netback.pid /var/run/blkbackd.pid /var/run/xenstored.pid /var/run/evtchnd.pid ; do
	start-stop-daemon --stop --quiet --pidfile $i 
   done

    if start-stop-daemon --stop --quiet --exec $xenconsoled; then
	log_end_msg 0
    else
	log_end_msg 1
    fi

   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/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
