#!/bin/sh 
#
# VBoxHeadless rc.d startup script for FreeBSD
#
# based on rc.d/jail script
#
# example usage:
# --------------
#
# vbox_enable="YES"
# vbox_list="virtual1 virtual2 virtual3"
#
# vbox_virtual2_vnc_enable="YES"
# vbox_virtual2_vnc_port="5901"
# vbox_virtual2_vnc_pass="secret"
#
# vbox_virtual3_vnc_enable="YES"
# vbox_virtual3_vnc_port="5902"
# vbox_virtual3_vnc_pass="password"
# vbox_virtual3_vnc_host="127.0.0.1"
#

# PROVIDE: vbox
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="vbox"
rcvar=`set_rcvar`
start_cmd="vbox_start"
stop_cmd="vbox_stop"

vbox_user=${vbox_user-"vbox"}
vbox_log_dir=${vbox_log_dir-"/var/log/vbox"}
vbox_shutdown_wait=${vbox_shutdown_wait-"30"}
vbox_startup_delay=${vbox_startup_delay-"10"}

init_variables()
{
	_v="$1"

	if [ -z "$_v" ]; then
		warn "init_variables: you must specify a vbox"
		return
	fi

        eval _vnc=\"\${vbox_${_v}_vnc_enable:-${vbox_vnc_enable}}\"
        [ -z "${_vnc}" ] && _vnc="NO"

	eval _vnc_port=\"\$vbox_${_v}_vnc_port\"
	eval _vnc_pass=\"\$vbox_${_v}_vnc_pass\"
	eval _vnc_host=\"\$vbox_${_v}_vnc_host\"

	if [ "x${_vnc}" = "xYES" ] && [ -z "${_vnc_port}" ]; then
		err 3 "$name: VNC port not defined"
	fi
	if [ "x${_vnc}" = "xYES" ] && [ -z "${_vnc_pass}" ]; then
		err 3 "$name: VNC password not defined"
	fi
}

vbox_running() {
	su $vbox_user -c "VBoxManage vmstatistics '$1'" > /dev/null 2>&1
}

vbox_start()
{
	echo -n 'Starting VirtualBox:'

	mkdir -p $vbox_log_dir
	chown $vbox_user:$vbox_user $vbox_log_dir
	chmod o= $vbox_log_dir

	for _vbox in ${vbox_list}
	do
		init_variables $_vbox
		if vbox_running $_vbox; then
			echo -n " [${_vbox} already running]"
			continue;
		fi
		if checkyesno _vnc; then
			_flags=" --vnc "
		fi
		if [ ! -z "$_vnc_pass" ]; then
			_flags="$_flags --vncpass '$_vnc_pass' "
		fi
		if [ ! -z "$_vnc_host" ]; then
			_flags="$_flags --vnchost '$_vnc_host' "
		fi
		if [ ! -z "$_vnc_port" ]; then
			_flags="$_flags --vncport '$_vnc_port' "
		fi

		su $vbox_user -c "sh -c 'nohup VBoxHeadless --startvm $_vbox $_flags > $vbox_log_dir/$_vbox.log 2>&1 &'" 
		sleep $vbox_startup_delay
		echo -n '.'
	done
	echo ''
}

vbox_stop()
{
	echo -n 'Stopping VirtualBox:'
	for _vbox in ${vbox_list}
	do
		su $vbox_user -c "VBoxManage controlvm '$_vbox' acpipowerbutton" > /dev/null 2>&1
		i=0
		while $(vbox_running $_vbox) && [ "$i" -lt "$vbox_shutdown_wait" ]; do
			sleep 1
			i=$(($i + 1))
		done
		su $vbox_user -c "VBoxManage controlvm '$_vbox' poweroff" > /dev/null 2>&1
		echo -n '.'
	done
	echo ''
}

load_rc_config $name
cmd="$1"
if [ $# -gt 0 ]; then
	shift
fi
if [ -n "$*" ]; then
	vbox_list="$*"
fi
run_rc_command "${cmd}"
