#!/bin/bash
#
# Copyright 2007-2008 Samuel Thibault <samuel.thibault@eu.citrix.net>
#
# dm script around stubdomains.
#

# To fit xterms nicely
height=339

# Parse arguments

domid=
domname=
vncviewer=0
vncpid=
extra=
sdl=0
opengl=1
vnc=0
vncunused=0
while [ "$#" -gt 0 ];
do
    if [ "$#" -ge 2 ];
    then
	case "$1" in
	    -d)
                domid=$2;
                extra="$extra -d $domid";
                shift
                ;;
	    -domain-name)
                domname=$2;
                shift
                ;;
	    -vnc)
                vnc=1
                op=${2%,*}
		ip=${op%:*};
		vnc_port=${op#*:};
		shift
		;;
            -vncunused)
                vncunused=1
                shift
                ;;
            -loadvm)
                extra="$extra -loadvm $2";
                shift
                ;;
            -k)
                keymap=$2
                shift
                ;;
	esac
    fi
    case "$1" in
	-vncviewer) vncviewer=1 ;;
        -sdl) sdl=1 ;;
        -disable-opengl) opengl=0 ;;
    esac
    shift
done

[ -z "$domid"   ] && { echo "couldn't find domain ID" ; exit 1; }
[ -z "$domname" ] && { echo "couldn't find domain name" ; exit 1; }

# Termination handler

term() {
    kill %1
    (
	[ -n "$vncpid" ] && kill -9 $vncpid
	rm /etc/xen/stubdoms/$domname-dm
	xm destroy $domname-dm
    ) &
    # We need to exit immediately so as to let xend do the commands above
    exit 0
}

trap term SIGHUP

############
# stubdomain
# Wait for any previous stubdom to terminate
while xm list | grep $domname-dm
do
	sleep 1
done

# Generate stubdom config file
mkdir -p /etc/xen/stubdoms &>/dev/null
echo "#This file is autogenerated, edit $domname instead!" > /etc/xen/stubdoms/$domname-dm
echo "kernel = '/usr/lib/xen/boot/ioemu-stubdom.gz'" >> /etc/xen/stubdoms/$domname-dm

vfb="sdl=$sdl, opengl=$opengl"
test "$DISPLAY" && vfb="$vfb, display=$DISPLAY"
test "$XAUTHORITY" && vfb="$vfb, xauthority=$XAUTHORITY"
test $vnc != 0 && vfb="$vfb, vnc=$vnc, vncdisplay=$vnc_port, vnclisten=$ip, vncunused=$vncunused"
vncpasswd=`xenstore-read /local/domain/0/backend/vfb/$domid/0/vncpasswd 2>/dev/null`
test "$vncpasswd" && vfb="$vfb, vncpasswd=$vncpasswd"
test "$keymap" && vfb="$vfb, keymap=$keymap"
echo "vfb = ['$vfb']" >> /etc/xen/stubdoms/$domname-dm

echo -n "disk = [ " >> /etc/xen/stubdoms/$domname-dm
j=0
for i in `xenstore-ls /local/domain/$domid/device/vbd | grep 'backend =' | awk '{print $3}'`
do
    i=${i%\"}
    i=${i#\"}
    vbd_mode=`xenstore-read $i/mode`
    vbd_disk=`xenstore-read $i/params`
    vbd_type=`xenstore-read $i/type`
    vbd_dev=`xenstore-read $i/dev`
    vbd_front=`xenstore-read $i/frontend`
    vbd_devtype=`xenstore-read $vbd_front/device-type`
    if [ $j -ne 0 ]
    then
        echo -n "," >> /etc/xen/stubdoms/$domname-dm
    fi
    echo -n "'$vbd_type:$vbd_disk,$vbd_dev:$vbd_devtype,$vbd_mode'" >> /etc/xen/stubdoms/$domname-dm
    j=$(( $j + 1 ))
done
echo " ] " >> /etc/xen/stubdoms/$domname-dm
echo -n "vif = [ " >> /etc/xen/stubdoms/$domname-dm
j=0
for i in `xenstore-ls /local/domain/$domid/device/vif | grep 'backend =' | awk '{print $3}'`
do
    i=${i%\"}
    i=${i#\"}
    vif_mac=`xenstore-read $i/mac`
    if [ $j -ne 0 ]
    then
        echo -n "," >> /etc/xen/stubdoms/$domname-dm
    fi
    echo -n "'mac=$vif_mac'" >> /etc/xen/stubdoms/$domname-dm
    j=$(( $j + 1 ))
done
echo " ] " >> /etc/xen/stubdoms/$domname-dm
creation="xm create -c /etc/xen/stubdoms/$domname-dm target=$domid memory=32 extra=\"$extra\""

(while true ; do sleep 60 ; done) | /bin/sh -c "$creation" &
#xterm -geometry +0+0 -e /bin/sh -c "$creation ; echo ; echo press ENTER to shut down ; read" &
consolepid=$!


###########
# vncviewer
if [ "$vncviewer" = 1 ]
then
    # Wait for vnc server to appear
    while ! vnc_port=`xenstore-read /local/domain/$domid/console/vnc-port`
    do
        # Check that the stubdom job is still alive
        kill -0 $consolepid || term
	sleep 1
    done

    vncviewer $ip:$vnc_port &
    vncpid=$!
fi

# wait for SIGHUP or stubdom termination
wait $consolepid

term
