#!/bin/bash
#
# Safe Power-down VM and wait until VM is powered down
# If ACPI is not on, can do a hard powerdown as well
#
# Run user check
if [ "$UID" -eq 0 ]
then echo "This script should NOT be run as root."
exit 1
fi
#
if [[ ! ("$#" == 1) ]]; then
echo "Usage for $0 : VM Name required as argument."
exit 1
fi
VB_VM_NAME=$1
# The ITERA and SLEEP parameters determine polling duration and interval
# to check if the VM has been powered down
VM_POWER_DOWN_ITERA=30
VM_POWER_DOWN_SLEEP=2
# Setting Force to 1 will Shutdown VM through Hard powerdown if ACPI is off
VM_FORCE_POWER_DOWN=0
#
# Power-off VM if running
VM_POWERED_ON=`VBoxManage list runningvms|grep -c '^"'${VB_VM_NAME}'"'`
if [ $VM_POWERED_ON -eq 1 ]; then
echo "VM $VB_VM_NAME is up. Powering down VM."
VM_ACPI_SW=`VBoxManage showvminfo ${VB_VM_NAME}|grep ACPI|grep -c on`
if [ $VM_ACPI_SW -eq 1 ]; then
VBoxManage controlvm ${VB_VM_NAME} acpipowerbutton
else
if [ $VM_FORCE_POWER_DOWN -eq 0 ]; then
echo "ACPI is off on VM. Unable to safely powerdown from Host"
exit 1
else
echo "ACPI is off on VM. Hard powerdown of VM!"
VBoxManage controlvm ${VB_VM_NAME} poweroff
fi
fi
else
echo "VM $VB_VM_NAME is already Powered down or does not exist"
exit 0
fi
COUNTER=1
until [ $VM_POWERED_ON -lt 1 ]; do
sleep $VM_POWER_DOWN_SLEEP
VM_POWERED_ON=`VBoxManage list runningvms|grep -c '^"'${VB_VM_NAME}'"'`
echo "Waiting $VM_POWER_DOWN_SLEEP additional seconds for VM to power down."
echo " - Iteration ${COUNTER}/${VM_POWER_DOWN_ITERA} ..."
let COUNTER+=1
if [ $COUNTER -gt $VM_POWER_DOWN_ITERA ]; then
echo "VM does not seem to be powering down!"
echo "Exiting ..."
exit 1
fi
done
if [ $COUNTER -gt 1 ]; then
echo "VM Powered down in approximately $(echo "${VM_POWER_DOWN_SLEEP}*${COUNTER}" | bc) seconds."
fi
#
exit