#!/bin/bash
#
# __copy1__
# __copy2__
#
CMD=$(basename $0)
CMDVER="1.2"
CMDSTR="$CMD v$CMDVER (2023-04-04)"

set -e -u

usage()
{
	echo "
== $CMDSTR == print/retrieve libvirt vm vncport ==

usage:	$CMD [vmname [server]]
	$CMD --server server

notes:
 - 'server' option requires ssh access to remote machine
 - 'vmname' option prints the vnc url needed to connect

remote user:
   the remote user needs read permission on qemu directory
   $qemu_dir, so the remote ssh will be launched using 'sudo'

   you can override this setting SSH_USER env, so ssh will
   run using 'ssh user@server' syntax instead of 'sudo ssh'
" >&2
	[ $# != 0 ] && echo -e "\n$*\n" >&2
	exit 127
}

retrieve_vminfos()
{
	local files=

	if [ "X$server" = "X" ]
	then
		files=$(ls $qemu_dir/*.xml 2>/dev/null || :)
	else
		files=$($sudo ssh $server ls $qemu_dir/*.xml 2>/dev/null || :)
	fi
	[ "X$files" = "X" ] && {
		echo "$CMD: no xml files in dir $qemu_dir" >&2
		return 1
	}
	if [ "X$server" = "X" ]
	then
		grep -H "type='vnc'" $files
	else
		$sudo ssh $server grep -H "type=.vnc" $files
	fi
	return 0
}

# (MAIN)

qemu_dir="/etc/libvirt/qemu"
vmname=
server=
SSH_USER=${SSH_USER:-}	# overrided by env
sudo="sudo"

case $# in
 0)	;; # ok
 1)	vmname=$1 ;;
 2)
	if [ "X$1" = "X--server" ]
	then
		vmname=
		server=$2
	else
		vmname=$1
		server=$2
	fi
	case $server in
	  *@*)	sudo= ;;
	  *)	[ "X$SSH_USER" != "X" ] && { sudo=; server="$SSH_USER@$server"; } ;;
	esac
	;;
 *)	usage ;;
esac

busy=

out=$(retrieve_vminfos | sed \
	-e 's#/>##' \
	-e 's#.*/##' \
	-e 's/\.xml://' \
	-e "s/ .* port='/ /" \
	-e "s/'.*//"
) || exit $?

[ "X$out" = "X" ] && {
	echo -e "\n$CMD: no vm using vnc\n" >&2
	exit 1
}


if [ "X$vmname" = "X" ]
then
	# list all
	#
	echo "$out" | while read domain port
	do
		note=
		echo -e "$busy" | grep -q "^$port " && {
			note="WARN: DUPLICATE"
		}
		port=${port/59/}
		printf "%s %-20s %s\n" $port $domain "$note"
		busy="$busy\n$port $domain"
	done | sort
else
	# print single vm port only; wipe out username from server name, if any
	#
	out=$(echo "$out" | grep "^$vmname " | sed -e 's/.* //')
	[ "X$out" = "X" ] && {
		echo -e "\n$CMD: no vm named '$vmname'\n" >&2
		exit 1
	}
	if [ "X$server" = "X" ]
	then
		server="localhost"
	else
		server=$(echo "$server" | sed -e 's/.*@//')
	fi
	out=${out/59/}
	echo "$server:$out"
fi

exit 0
