#!/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}"