#!/bin/sh

URL="$1"
DOM="${2-testinstall}"
KS="http://172.31.6.1/ks/testinstall.cfg"
AY="http://172.31.6.1/ks/testinstall.xml"

ARGS=""
#ARGS="$ARGS initcall_debug"

###################################################################################

function msg() {
	local txt="$1"

	echo
	echo "###"
	echo "### $txt"
	echo "###"
}

###################################################################################

# workdir
WORK="${TMPDIR-/var/tmp}/${0##*/}-$$"
mkdir "$WORK" || exit 1
trap 'rm -rf "$WORK"' EXIT

case "$URL" in
	http:* | ftp:*)
		;;
	*)
		echo "usage: $0 <url>"
		exit 1
		;;
esac

# running?
if virsh dominfo "$DOM" | grep -q "running"; then
	msg "$DOM: guest already running."
	exit 1
fi

msg "prepare install ($URL)"

name=""
if wget -nv -O "$WORK/.discinfo" "$URL/.discinfo"; then
	# Fedora / RHEL
	kernel="$URL/images/xen/vmlinuz"
	initrd="$URL/images/xen/initrd.img"
	name="$(head -2 "$WORK/.discinfo" | tail -1)"
	ARGS="$ARGS method=$URL ks=$KS"
elif wget -nv -O "$WORK/content" "$URL/content"; then
	# openSUSE
	for arch in i386 x86_64; do
		wget -nv -O /dev/null "$URL/boot/$arch/directory.yast" || continue
		kernel="$URL/boot/$arch/vmlinuz-xen"
		initrd="$URL/boot/$arch/initrd-xen"
		name="$(awk '/DISTPRODUCT/ { print $2 }' "$WORK/content")"
		ARGS="$ARGS install=$URL autoyast=$AY"
#		ARGS="$ARGS install=$URL"
		break
	done
fi
if test "$name" = ""; then
	msg "unknown distro"
	exit 1
fi

# fetch kernel + initrd
msg "fetch install images ($name)"
wget -nv -O "$WORK/vmlinuz"    "$kernel"    || exit 1
wget -nv -O "$WORK/initrd.img" "$initrd"    || exit 1

# running (again, download might have taken a while ...)?
if virsh dominfo "$DOM" | grep -q "running"; then
	msg "$DOM: guest already running."
	exit 1
fi

# prepare
virsh dumpxml "$DOM" > "$WORK/dumped.xml"
egrep -v '<(kernel|initrd|cmdline)>' \
	< "$WORK/dumped.xml" > "$WORK/running.xml"
cp "$WORK/running.xml" "$WORK/install.xml"
ed <<EOF -s "$WORK/install.xml"
/<os>/a
    <kernel>$WORK/vmlinuz</kernel>
    <initrd>$WORK/initrd.img</initrd>
    <cmdline>$ARGS</cmdline>
.
w
EOF
diff -u "$WORK/dumped.xml" "$WORK/install.xml"
diff -u "$WORK/dumped.xml" "$WORK/running.xml"

# run install & wait
msg "installing guest, waiting for install finish"
virsh define "$WORK/install.xml"			|| exit 1
virsh start "$DOM"					|| exit 1
sleep 5
secs=5
virsh define "$WORK/running.xml"			|| exit 1
while true; do
	virsh dominfo "$DOM" | grep -q "running" || break;
	sleep 5
	secs=$(( $secs + 5 ))
done
if test "$secs" -lt 180; then
	msg "install time: $secs secs (Hmm, failed?)"
	exit 1
fi

# boot installed
itime=$(printf "%d:%02d" "$(( $secs / 60 ))" "$(( $secs % 60 ))")
msg "install time: $itime min, booting guest now"
virsh start $DOM

