#!/bin/sh # PROVIDE: vboxheadless # REQUIRE: LOGIN vboxnet # KEYWORD: shutdown # # Add the following line to /etc/rc.conf[.local] to enable vboxheadless # # vboxheadless_enable (bool): Set to "NO" by default. # Set it to "YES" to enable vboxheadless. # vboxheadless_machines (str): Space separated list of machines # vboxheadless_user (str): Default user account to run with. # (default: %%VBOXUSER%%) # vboxheadless_stop (str): Default stop cmd for VBoxManage controlvm. # (default: savestate) # vboxheadless_delay (int): Default startup/shutdown delay in seconds. # (default: 0) # vboxheadless__name (str): Virtualbox machine name or UUID. # vboxheadless__user (str): User account to run with. # vboxheadless__flags (str): Additional flags for VBoxHeadless. # vboxheadless__stop (str): Stop command for VBoxManage controlvm. # vboxheadless__delay (int): Startup and shutdown delay in seconds. . /etc/rc.subr name="vboxheadless" rcvar=vboxheadless_enable rc_fast="YES" command="%%VBOXDIR%%/VBoxHeadless" pidbase="/var/run/${name}" start_cmd="${name}_start" stop_cmd="${name}_stop" status_cmd="${name}_status" vboxheadless_start() { local machine mpidfile pid vmname vmuser vmflags vmdelay echo "Starting Virtual Machines:" for machine in ${vboxheadless_machines}; do mpidfile="${pidbase}_${machine}.pid" pid=$(check_pidfile $mpidfile $command) eval vmname="\${vboxheadless_${machine}_name:-${machine}}" eval vmuser="\${vboxheadless_${machine}_user:-${vboxheadless_user}}" eval vmflags="\${vboxheadless_${machine}_flags:-}" eval vmdelay="\${vboxheadless_${machine}_delay:-${vboxheadless_delay}}" HOME=$(/usr/sbin/pw usershow -7 -n "${vmuser}" | /usr/bin/cut -d: -f6) /usr/bin/printf "%25s " "${vmname}" /usr/bin/su ${vmuser} -c "%%VBOXDIR%%/VBoxManage showvminfo '${vmname}' >/dev/null" 2>/dev/null if [ $? != 0 ]; then echo "Unknown machine" continue fi if [ -n "${pid}" ]; then echo "Already running? (pid=${pid})" continue fi /bin/sleep ${vmdelay} /usr/bin/install -o ${vmuser} -g %%VBOXGROUP%% -m 644 /dev/null ${mpidfile} /usr/sbin/daemon -f -p ${mpidfile} -u ${vmuser} ${command} --startvm "${vmname}" ${vmflags} echo "Started" done } vboxheadless_stop() { local machine mpidfile pid pids vmname vmuser vmstop vmdelay echo "Saving states for Virtual Machines:" for machine in ${vboxheadless_machines}; do mpidfile="${pidbase}_${machine}.pid" pid=$(check_pidfile $mpidfile $command) eval vmname="\${vboxheadless_${machine}_name:-${machine}}" eval vmuser="\${vboxheadless_${machine}_user:-${vboxheadless_user}}" eval vmstop="\${vboxheadless_${machine}_stop:-${vboxheadless_stop}}" eval vmdelay="\${vboxheadless_${machine}_delay:-${vboxheadless_delay}}" /usr/bin/printf "%25s " "${vmname}" if [ -n "${pid}" ]; then pids="${pids} ${pid}" /bin/sleep ${vmdelay} /usr/bin/su ${vmuser} -c "%%VBOXDIR%%/VBoxManage controlvm '${vmname}' ${vmstop} >/dev/null &" 2>/dev/null fi done if [ -n "${pids}" ]; then wait_for_pids $pids >/dev/null echo "Stopped" else echo "Not running?" fi } vboxheadless_status() { local machine mpidfile pid vmname vmuser /usr/bin/printf "%25s %s\n" "Machine" "Status" /usr/bin/printf "%25s %s\n" "-------------------------" "------------" for machine in ${vboxheadless_machines}; do mpidfile="${pidbase}_${machine}.pid" pid=$(check_pidfile $mpidfile $command) eval vmname="\${vboxheadless_${machine}_name:-${machine}}" eval vmuser="\${vboxheadless_${machine}_user:-${vboxheadless_user}}" /usr/bin/su ${vmuser} -c "%%VBOXDIR%%/VBoxManage showvminfo '${vmname}' >/dev/null" 2>/dev/null if [ $? != 0 ]; then /usr/bin/printf "%20s %s\n" "${vmname}" "Unknown Machine" elif [ -n "${pid}" ]; then /usr/bin/printf "%25s %s\n" "${vmname}" "Running" else /usr/bin/printf "%25s %s\n" "${vmname}" "Powered Off" fi done } load_rc_config $name : ${vboxheadless_enable="NO"} : ${vboxheadless_user="%%VBOXUSER%%"} : ${vboxheadless_stop="savestate"} : ${vboxheadless_delay="0"} cmd_arg="$1" ; shift if [ -n "$*" ]; then vboxheadless_machines="$*" fi run_rc_command "${cmd_arg}"