#!/bin/sh
: "${LIBVIRT_DEFAULT_URI:=qemu:///system}"
export LIBVIRT_DEFAULT_URI


usage() {
    cat >/dev/stderr <<EOF
usage: $0 <srcdomain> <targetdomain>
EOF
    args="$*"

    if [ -n "${args}" ]; then
    cat >/dev/stderr <<EOF

    $args

EOF
    exit 1
    fi
    exit 0
}

get_disks() {
    virsh domblklist "$1" | grep "\s/.*qcow2$" | while read -r dev path; do
	test ! -f "${path}" || echo "$dev $path"
    done
}

src="$1"
dst="$2"


test -n "${src}" || usage "empty source domain"
test -n "${dst}" || usage "empty target domain"

virsh domstate "${src}" > /dev/null 2>&1 || usage "source domain '${src}' does not exist"
virsh domstate "${dst}" > /dev/null 2>&1 && usage "target domain '${dst}' already exists"

tmpdir=$(mktemp -d)
_cleanup_tmpdir() {
    test ! -d "${tmpdir}" || rm -rfv "${tmpdir}"
}
trap '_cleanup_tmpdir' EXIT INT TERM


diskargs=""
get_disks "${src}" | tee "${tmpdir}/srcdisks.txt" | while read -r dev infile; do
    basename=${infile%.*}
    ext=.${infile##*.}
    touch "${tmpdir}/img"
    infix=0
    outfile=""
    while true; do
	infix=$((infix+1))
	outfile="${basename}-shallow${infix}${ext}"
	mv -n "${tmpdir}/img" "${outfile}"  || continue
	break
    done
    qemu-img create \
	     -F qcow2 -b "${infile}" \
	     -f qcow2 "${outfile}"
    echo "${dev} ${outfile}" >> "${tmpdir}/dstdisks.txt"
    diskargs="${diskargs} --skip-copy ${dev} --file ${outfile}"
done


virt-clone -o "${src}" -n "${dst}" $(cat "${tmpdir}/dstdisks.txt" | while read -r dev file; do echo --skip-copy ${dev} --file ${file}; done)

cat "${tmpdir}/dstdisks.txt" | while read -r dev file; do
    virsh detach-disk --domain "${dst}" --current --target "${dev}"
    virsh attach-disk --domain "${dst}" --current --target "${dev}" --targetbus virtio  --subdriver qcow2 --source "${file}"
done
