#!/sbin/openrc-run
# Copyright 2018 Hyperbola Project
# Distributed under the terms of the GNU General Public License v2

. /etc/xen/scripts/hotplugpath.sh

BACKEND_MODULES="xen-evtchn xen-gntdev xen-gntalloc xen-blkback xen-netback xen-pciback evtchn gntdev netbk blkbk xen-scsibk usbbk pciback xen-acpi-processor blktap2"
XENCONSOLED_PIDFILE=$XEN_RUN_DIR/xenconsoled.pid
QEMU_PIDFILE=$XEN_RUN_DIR/qemu-dom0.pid

description="Xencommons - start and stop xenstored and xenconsoled"

depend() {
	after net
	before libvirtd libvirt-guests
}

start_pre() {
	shopt -s extglob

	# not running in Xen dom0 or domU
	if ! test -d /proc/xen ; then
		exit 0
	fi

	# mount xenfs in dom0 or domU with a pv_ops kernel
	if ! test -f /proc/xen/capabilities; then
		mount -t xenfs xenfs /proc/xen
	fi

	# run this script only in dom0:
	# no capabilities file in xenlinux domU kernel
	# empty capabilities file in pv_ops domU kernel
	if test -f /proc/xen/capabilities && \
		! grep -q "control_d" /proc/xen/capabilities ; then
		exit 0
	fi

	local mod

	for mod in $BACKEND_MODULES; do
		modprobe "$mod" &>/dev/null
	done

	mkdir -p $XEN_RUN_DIR
	mkdir -p $XEN_LOCK_DIR

	/etc/xen/scripts/launch-xenstore || exit 1

	ebegin "Setting domain 0 name, domid and JSON config..."
	$LIBEXEC_BIN/xen-init-dom0 &
	eend $?
}

start() {
	ebegin "Starting xenconsoled..."
	test -z "$XENCONSOLED_TRACE" || XENCONSOLED_ARGS=" --log=$XENCONSOLED_TRACE"
	$sbindir/xenconsoled --pid-file=$XENCONSOLED_PIDFILE $XENCONSOLED_ARGS &
	eend $?

	ebegin "Starting QEMU as disk backend for dom0"
	test -z "$QEMU_XEN" && QEMU_XEN="$LIBEXEC_BIN/qemu-system-i386"
	$QEMU_XEN -xen-domid 0 -xen-attach -name dom0 -nographic -M xenpv -daemonize \
		-monitor /dev/null -serial /dev/null -parallel /dev/null \
		-pidfile $QEMU_PIDFILE &
	eend $?
}

stop() {
	ebegin "Stopping xenconsoled"
	if read 2>/dev/null <$XENCONSOLED_PIDFILE pid; then
		kill $pid
		while kill -9 $pid >/dev/null 2>&1; do sleep 1; done
		rm -f $XENCONSOLED_PIDFILE
	fi
	eend $?

	ebegin "Stopping QEMU"
	if read 2>/dev/null <$QEMU_PIDFILE pid; then
		kill $pid
		while kill -9 $pid >/dev/null 2>&1; do sleep 1; done
		rm -f $QEMU_PIDFILE
	fi
	eend $?

	ebegin "WARNING: Not stopping xenstored, as it cannot be restarted"
	eend $?
}
