#!/bin/ksh93

# Erfordert chmod 4755 /usr/bin/virsh

DOMS="win2003sbs win2008ss"
typeset -A HOSTS
HOSTS=( [win2003sbs]=sbs [win2008ss]=ts )
typeset -A ACTIONS
ACTIONS=( [destroy]="Stecker ziehen" [start]=Starten [suspend]=Anhalten [resume]="Aufwachen" )

print "Content-type: text/html; charset=iso-8859-1\n"

getStatus() {
	STATE=`virsh domstate $1 | head -1`
	case $STATE in
		"shut off"|"crashed")	STATUS="ausgeschaltet" ;;
		"running"|"blocked")	STATUS="läuft"
			if [ -n "${HOSTS[$DOM]}" ]; then
				ping ${HOSTS[$DOM]} 1 >/dev/null 2>&1
				if [ $? -ne 0 ]; then
					STATUS="reagiert [noch] nicht"
				fi
			fi
			;;
		"paused")				STATUS="angehalten" ;;
		"in shutdown")			STATUS="wird heruntergefahren" ;;
		"no state")				STATUS="aktueller Befehl wird noch ausgeführt" ;;
		*)						STATUS="unbekannt" ;;
	esac
}

getActionURLs() {
	if [ -z "$1"  ]; then
		return
	fi
	DST="$1"
	for a in "destroy" "start"; do
		printf '<a href=/cgi-bin/status?dom=%s&action=%s>%s</a></br>' "$DST" "$a" "${ACTIONS[$a]}"
	done
}

status() {
	print '<table><thead><tr><th>Server</th><th>Status</th><th>Host</th><th>Aktionen</th></tr></thead></tbody>'
	for DOM in $DOMS ; do
		getStatus "$DOM"
		URLS=`getActionURLs $DOM`
		printf '<tr><th>%s</th><td>%s</td><td>%s</td><td>%s</td></tr>\n' "$DOM" "$STATUS" "${HOSTS[$DOM]}" "$URLS"
	done
	print '</tbody></table>'
}

if [ -n "$QUERY_STRING" ]; then
	TODO=${QUERY_STRING##*action=}
	DOM=${QUERY_STRING##*dom=}
	DOM=${DOM%%\&*}
fi

doAction() {
	if [ -z "${ACTIONS[$TODO]}" ]; then
		printf '<p style="color: red">Unbekannte Aktion "%s" ignoriert.</p>' "$TODO"
		return
	fi
	if [ -z "${HOSTS[$DOM]}" ]; then
		printf '<p style="color: red">Unbekannte Domain "%s" ignoriert.</p>' "$DOM"
		return
	fi
	getStatus "$DOM"
	if [ "$TODO" = "destroy" -a "$STATUS" = "ausgeschaltet" ]; then
		printf '<p>%s ist bereits ausgeschaltet.</p>' "$DOM"
		return
	fi
	if [ "$TODO" = "start" ]; then
		if [ "$STATUS" = "läuft" ]; then
			printf '<p>%s läuft schon. Ggf. etwas warten, bis das Teil per "Remote Desktop" erreichbar ist.</p>' "$DOM"
			return
		elif [ "$STATUS" = "reagiert [noch] nicht" ]; then
			printf '<p>%s reagiert nicht. Du mußt erst den Stecker ziehen, bevor das Teil wieder gestartet werden kann.</p>'
			return
		fi
	fi
	printf "<p>Domain: %s</br>Aktion: %s (%s) wird ausgeführt.</p>" "$DOM" "${ACTIONS[$TODO]}" "$TODO" 
	virsh "$TODO" "$DOM"
	print '<p>Befehl wurde abgesetzt - kann u.U. 2-3 Minuten dauern, bis '
	if [ "$TODO" = "destroy" ]; then
		printf '%s wirklich runtergefahren ist und man das Teil wieder starten kann!</p>' "$DOM"
	elif [ "$TODO" = "start" ]; then
		printf '%s vollständig hochgefahren und per "Remote Desktop" erreichbar ist.<p>' "$DOM"
	else
		printf 'der Befehl für %s wirksam geworden ist.</p>' "$DOM"
	fi
}

if [ -n "$TODO" -o -n "$DOM" ]; then
	REFRESH=120
else
	REFRESH=60
fi

printf '<html><head><title>Windows Server Status</title><meta http-equiv="refresh" content="%s; URL=/cgi-bin/status"/></head><body>' $REFRESH
if [ -n "$TODO" -o -n "$DOM" ]; then
	doAction
fi
status
#print '<pre>'
#env
#print '</pre>'
print '</body></html>
'
