83eb2c3700
literal name_enable wherever possible, and ${name}_enable when it's not, to prepare for the demise of set_rcvar(). In cases where I had to hand-edit unusual instances also modify formatting slightly to be more uniform (and in some cases, correct). This includes adding some $FreeBSD$ tags, and most importantly moving rcvar= to right after name= so it's clear that one is derived from the other.
138 lines
4.2 KiB
Bash
138 lines
4.2 KiB
Bash
#!/bin/sh
|
|
|
|
# $FreeBSD$
|
|
#
|
|
# 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_<machine>_name (str): Virtualbox machine name or UUID.
|
|
# vboxheadless_<machine>_user (str): User account to run with.
|
|
# vboxheadless_<machine>_flags (str): Additional flags for VBoxHeadless.
|
|
# vboxheadless_<machine>_stop (str): Stop command for VBoxManage controlvm.
|
|
# vboxheadless_<machine>_delay (int): Startup and shutdown delay in seconds.
|
|
|
|
. /etc/rc.subr
|
|
|
|
name="vboxheadless"
|
|
rcvar=vboxheadless_enable
|
|
|
|
command="%%PREFIX%%/bin/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 "%%PREFIX%%/bin/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 wheel -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 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
|
|
/bin/sleep ${vmdelay}
|
|
/usr/bin/su ${vmuser} -c "%%PREFIX%%/bin/VBoxManage controlvm '${vmname}' ${vmstop} >/dev/null" 2>/dev/null
|
|
wait_for_pids $pid >/dev/null
|
|
echo "Stopped"
|
|
else
|
|
echo "Not running?"
|
|
fi
|
|
done
|
|
}
|
|
|
|
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 "/usr/local/bin/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}"
|