#!/usr/bin/env bash
# By Michael Blaschek
# Date 18.01.2021
# CC BY 4.0 International
# University of Vienna, Austria

# Description:
# Connect to Jet via a gateway server

help() {
	cat <<EOF
$0 -g [gateway] -p [port] -r [remote-port] user@remote
Options:
  -h				Help
  -g [gateway]      gateway server, e.g. user@login.univie.ac.at
  -p [port]         port to forward from jet to local, e.g. VNC port
  -r [port]         remote port if not the same as port
  -d				debug

Example:
   $0 -g [U:Account-Username]@login.univie.ac.at [Jet-Username]@jet01.img.univie.ac.at

EOF
}

debug=''
while getopts "g:p:r:hd" flag; do
	case "${flag}" in
	g) gateway=${OPTARG} ;;
	p) port=${OPTARG} ;;
	r) rport=${OPTARG} ;;
	d) debug='-v';;
	h | *)
		help
		exit 0
		;;
	esac
done
shift $((OPTIND - 1))
command=""
remote=$1
script=$(basename $0)

if [ "${remote}" == "" ]; then
	echo "Remote host required: [user]@[server]"
	help
	exit 1
fi

if [ -n "${port}" ]; then
	# -L local_port:destination_server_ip:remote_port
	if [ -n "${rport}" ]; then
		echo "Forwarding Port: $rport to $port"
		command="-L ${port}:localhost:${rport} "
	else
		echo "Forwarding Port: $port to $port"
		command="-L ${port}:localhost:${port} "
		rport=$port # make sure we use this
	fi

fi
# Override Term information to make sure we use the ones on the servers
# export TERM=xterm-256color
# Check if names are in .ssh/config
remote_status=false
gateway_status=false
if [ -e $HOME/.ssh/config ]; then
	# check if hosts are there
	cat $HOME/.ssh/config | grep -i 'Host ${remote}' >/dev/null
	if [ $? -eq 0 ]; then
		remote_status=true
	fi
	if [ -n ${gateway} ]; then
		cat $HOME/.ssh/config | grep -i 'Host ${gateway}' >/dev/null
		if [ $? -eq 0 ]; then
			gateway_status=true
		fi
	fi
fi

if [ -n "${gateway}" ]; then
	echo "$gateway" | grep '@' >/dev/null
	if [ $? -eq 1 ] && [ ! $gateway_status ]; then
		echo "Could fail if not: [user]@[server], trying: $gateway"
	fi
	if [ -n "${port}" ]; then
		echo "Using gateway: $gateway to $remote "
		midport=$(($RANDOM % 1000 + 20000))  # 20000 - 21000
		echo "Port Forwarding via the gateway: $port : $midport : $rport"
		ssh $debug -L ${port}:localhost:${midport} -t $gateway ssh -L ${midport}:localhost:${rport} ${remote}
		echo "$(date) | ssh -L ${port}:localhost:${midport} -t $gateway 'ssh -L ${midport}:localhost:${rport} ${remote}'" >>.${script}.log
	else
		echo "Using gateway: $gateway to $remote "
		ssh $debug $command -t $gateway ssh ${command} ${remote}
		echo "$(date) | ssh $command -t $gateway 'ssh ${command} ${remote}'" >>.${script}.log
	fi
else
	if [ ! $remote_status ]; then
		echo "Could fail if not: [user]@[server]"
	fi
	echo "Direct connection to: ${remote}"
	ssh $debug ${command} ${remote}
	echo "$(date) | ssh ${command} ${remote}" >>.${script}.log
fi
echo "Command Log in  .${script}.log"
