#!/bin/sh

libvirt_uris='qemu:///system lxc:/// xen:///'
libvirtd_shutdown_timeout=30

[ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin

run_virsh()
{
    # We parse the output for things like domain state;
    # make sure the output is in the language we expect.
    LANG=C virsh "$@" 2>/dev/null
}

log_msg()
{
    logf="/var/log/libvirt/shutdownlog.log"
    logger -p daemon.debug -s -t libvirt -- "$@" >> $logf 2>&1
}

wait_on_vms() {
	log_msg "libvirt-bin: starting wait_on_vms at $(date)"
	for uri in $libvirt_uris; do
		for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
			log_msg "libvirt-bin: attempting clean shutdown of $uri:$domain at $(date)"
			run_virsh -c "$uri" shutdown "$domain" >/dev/null
		done
	done

	delay=$libvirtd_shutdown_timeout
	while [ $delay -gt 0 ]; do
		for uri in $libvirt_uris; do
			if ! run_virsh -c "$uri" list | awk '$3 == "running" {exit 1}'; then
				# VMs at this URI are still running. Wait, then
				# start at the beginning looking for running VMs.
				sleep 1
				delay=$(($delay - 1))
				continue 2
			fi
		done
		break
	done

	for uri in $libvirt_uris; do
		for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do
			log_msg "destroying $uri:$domain"
			run_virsh -c "$uri" destroy "$domain" >/dev/null
		done
	done
	log_msg "libvirt-bin: done with wait_on_vms at $(date)"
}

wait_on_vms
