#!/bin/sh

_me=$(basename $0)

if [ -z "$STY" ]; then
	echo "${_me}: this script should only be started in \"screen\" session."
	echo "Invoke 'man screen' for details of screen terminal multiplexor."
	exit -1
fi

usage() {
	echo "${_me}: switching from oldvm to newvm, waiting for oldvm to stop."
	echo "Usage: ${_me} <oldvm> <newvm> [timeout]"
	echo "where oldvm is VM to stop, newvm is vm to start, optional timeout is time"
	echo "(in seconds, default is 60) to wait for oldvm to stop. If timeout is reached,"
	echo "no more actions will be taken."
	exit -1
}

[ $# -lt 2 -o $# -gt 3 ] && usage

oldvm=$1
newvm=$2
[ $# -eq 3 ] && timeout=$3 || timeout=60

vm_get_state() {
	if [ $(virsh list | head -n 1 | awk '{print $2}') != "Name" -o \
		$(virsh list | head -n 1 | awk '{print $3}') != "State" ]; then
		echo "Error: virsh list format unknown, fix ${_me}!"
		exit -1
	fi
	_vm=$1
	_state=$(virsh list --all | grep "^.*[ \t]${_vm}[ \t].*$" | awk '{print $3}')
	[ -z "${_state}" ] && _state="undefined"
	echo ${_state}
}

state_old=$(vm_get_state $oldvm)
state_new=$(vm_get_state $newvm)

if [ "$state_old" != "running" ]; then
	echo "Error: VM \"$oldvm\" must be in \"running\" state"
	exit -1
fi

if [ "$oldvm" != "$newvm" -a "$state_new" != "shut" ]; then
	echo "Error: VM \"$newvm\" must be in \"shut off\" state"
	exit -1
fi

echo "Shutting down VM \"$oldvm\"..."

virsh shutdown $oldvm

wait_for_shut() {
	_timeout=$timeout
	_vm=$1
	while [ $(vm_get_state ${_vm}) != "shut" ]; do
		sleep 1
		_timeout=$((${_timeout}-1))
		printf "Waiting VM \"${_vm}\" for shut down, %s seconds left...\n" ${_timeout}
		if [ ${_timeout} -le 0 ]; then
			echo "Error shutting down VM \"${_vm}\""
			return -1
		fi
	done
	return 0
}

if ! wait_for_shut $oldvm; then
	echo "Killing \"$oldvm\"!"
	virsh destroy $oldvm
	wait_for_shut $oldvm
fi

echo "Starting VM \"$newvm\"..."

if ! virsh start $newvm; then
	echo "Error starting VM \"$newvm\", starting previous VM \"$oldvm\"."
	virsh start $oldvm
fi
