#!/bin/bash

MODE="mount"

if [ $# -eq 1 ]; then
	MODE="mount"
elif [ $# -eq 2 ]; then
	if [ "$1" == "-u" -o "$1" == "u" -o "$1" == "umount" -o "$1" == "unmount" ]; then
		MODE="unmount"
		shift
	elif [ "$2" == "-m" -o "$1" == "m" -o "$1" == "mount" ]; then
		MODE="mount"
		shift
	else
		echo "Usage: $0 [-u] vmname"
		exit 9
	fi
else
	echo "Usage: $0 [-u] vmname"
	exit 9
fi

domuname=$1

binaries_needed="jq pvesh kpartx"

for nbin in $binaries_needed; do
	nbinloc=`which $nbin 2>/dev/null`
	if [ -z "$nbinloc" ]; then
		echo "ERROR: $nbin binary not found"
		exit 9
	fi
done

vmtmp=/mnt/vmtmp
[ -d $vmtmp ] || mkdir $vmtmp

hypervisor=`hostname`

domuid=`pvesh get /nodes/${hypervisor}/qemu --output-format json 2>/dev/null | jq -r '.[] |select(.status == "stopped") |select(.name == "'$domuname'") | [.vmid] |@csv'`

if [ -z "$domuid" ]; then
	echo "ERROR: $domuname is RUNNING! (or doesn't exist)"
	exit 10
fi

if [ "$MODE" == "mount" ]; then
	echo "Mounting $domuname (vm-$domuid) to $vmtmp:"
elif [ "$MODE" == "unmount" ]; then
	echo "Unmounting $domuname (vm-$domuid) from $vmtmp:"
fi

hv_storages=`pvesh get /nodes/${hypervisor}/storage/ -content=images --output-format json 2>/dev/null |jq -r '.[] .storage'`

for hv_storage in $hv_storages; do
	domu_volids=`pvesh get /nodes/${hypervisor}/storage/${hv_storage}/content -vmid=${domuid} --output-format json 2>/dev/null |jq -r '.[] .volid'`

	for volid in $domu_volids; do

		disk_path=`pvesh get /nodes/${hypervisor}/storage/${hv_storage}/content/${volid} --output-format json 2>/dev/null |jq -r '.path'`

		diskparts=`kpartx -l $disk_path 2>/dev/null |awk '{print $1}'`

		if [ "$MODE" == "mount" ]; then

			kpartx -a $disk_path
			sleep 1

			for diskpart in $diskparts; do
				[ -d ${vmtmp}/$diskpart ] || mkdir ${vmtmp}/$diskpart
				echo " - Mounting $diskpart"
				mount /dev/mapper/${diskpart} ${vmtmp}/${diskpart}
			done

		elif [ "$MODE" == "unmount" ]; then

			for diskpart in $diskparts; do
				if [ -d $vmtmp/$diskpart ]; then
					echo "- Unmounting $diskpart"
					umount ${vmtmp}/${diskpart}
					sleep 1
					rmdir ${vmtmp}/${diskpart}
				else
					echo "- Not mounted: $diskpart"
				fi
			done

			kpartx -d $disk_path

		fi
	done
done

echo "Done."
