#!/bin/bash

#####

NOVNC=/opt/noVNC/utils/launch.sh
VNCSERVER=/usr/bin/tigervncserver
VNCPASSWD=/usr/bin/vncpasswd
PWGEN=/usr/bin/pwgen
KILL=/bin/kill
KILLALL=/usr/bin/killall
SCREEN=/usr/bin/screen 
NC=/usr/bin/nc
RM=/bin/rm
CAT=/bin/cat
CHMOD=/bin/chmod
MKDIR=/bin/mkdir
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/games:/usr/lib/go/bin:./

#####

##
LABS_WEBSITE=labs.etsit.urjc.es
##

## FUNCIONES

function killVncServers {
	USER=$1
	pkill -U $USER -f gnome-session
	pkill -U $USER -f xfce4-session
	pkill -U $USER -f SCREEN
	pkill -U $USER -f vncserver
	pkill -U $USER -f screen 
	pkill -U $USER -f Xtigervnc
}

function launchVncServer {
	tmpfile=`mktemp`
	$VNCSERVER -interface `hostname -f` -localhost no 1> $tmpfile 2> $tmpfile 
	HOST=`cat $tmpfile | grep ^New | cut -d' ' -f4 | sed s/\'/''/g | cut -d: -f1`
	VNCPORT=`cat $tmpfile | grep ^New | cut -d' ' -f4 | sed s/\'/''/g | cut -d: -f2`
	PORT=`echo $VNCPORT+5901-1|bc`
	echo $HOST:$PORT
}

function findFreePort {
	
	for port in `seq 8000 8100`; do
		#$NC -z `hostname` $port
		r=$(bash -c 'exec 3<> /dev/tcp/'$HOSTNAME'/'$port';echo $?' 2>/dev/null)
		if [ "$r" == "0" ]; then
			continue
		else
			break
		fi
	done
	echo $port 

}

function launchnoVncServer {

	# Cerramos servidores previos
	for process in `ps aux | grep ^$LOGNAME | grep -v grep | grep '/usr/bin/websockify --web /opt/noVNC/utils/' | awk '{print $2}'`; do
		$KILL -9 $process 1> /dev/null 2> /dev/null
	done

	sleep 2

	NOVNCPORT=`findFreePort`
	if [ "$NOVNCPORT" == "8100" ]; then
		echo "Lo sentimos, no hay puertos libres. Habla con los Tecnicos de Laboratorio: soporte-lab@gsyc.urjc.es"
		echo ""
		exit 2
	fi
	$SCREEN -d -m $NOVNC --listen $NOVNCPORT --vnc $1:$2
	echo $NOVNCPORT

}

function apacheConfig {
	SHORT=$3
	CONF="/tmp/novnc-$HOSTNAME-$LOGNAME-$2.conf"
	echo "RewriteEngine On" >> $CONF
	echo "Redirect permanent /$SHORT /novnc/$LOGNAME/$HOSTNAME/$2/vnc.html?host=labs.etsit.urjc.es&port=443&path=ws-$LOGNAME-$HOSTNAME-$2" >> $CONF
	echo "ProxyPass /novnc/$LOGNAME/$HOSTNAME/$2/ http://$1:$2/" >> $CONF
	echo "ProxyPassReverse /novnc/$LOGNAME/$HOSTNAME/$2/ http://$1:$2/" >> $CONF
	echo "ProxyPass /ws-$LOGNAME-$HOSTNAME-$2 ws://$HOSTNAME:$2 retry=3" >> $CONF
	echo "ProxyPassReverse /ws-$LOGNAME-$HOSTNAME-$2 ws://$HOSTNAME:$2 retry=3" >> $CONF
	echo "RedirectMatch permanent /novnc/$LOGNAME/$HOSTNAME/$2$ /novnc/$LOGNAME/$HOSTNAME/$2" >> $CONF
	echo $CONF
}

## FIN FUNCIONES

###

echo ""
echo "Creando escritorio. Espera un momentín..."
echo ""

###

if [ ! -f $HOME/.vnc/passwd ];
then
	PW=`pwgen -N 1`
	echo $PW | $VNCPASSWD -f > $HOME/.vnc/passwd
	$CHMOD 600 $HOME/.vnc/passwd
else
	$CHMOD 600 $HOME/.vnc/passwd
fi

# Comprobamos si existiera algun proceso Xtighvncserver en la maquina a nombre del usuario.
killVncServers $LOGNAME

# Lanzamos primero un servidor vncserver. Si hubiera alguno corriendo, lo cerramos
SERVER=`launchVncServer $GEOMETRY $xstartup`

VSERVER=`echo $SERVER | cut -d: -f1`
VPORT=`echo $SERVER | cut -d: -f2`

PORT=`launchnoVncServer $VSERVER $VPORT`

SHORT=`$PWGEN -N 1 -C 12`

conf_file=`apacheConfig $VSERVER $PORT $SHORT`

# Subimos configuracion a servidor labs.etsit.urjc.es
file=`basename $conf_file`
cd /tmp/ && echo put $file | /usr/bin/tftp $LABS_WEBSITE 1> /dev/null 2> /dev/null

if [ "$?" == "0" ];
then
	echo "Tu escritorio remoto vncWeb se ha creado correctamente. Copia y pega en el navegador esta URL:"
	echo "https://$LABS_WEBSITE/$SHORT"
	echo ""
	echo "Recuerda que la sesión permanecerá abierta mientras que no se reinicie este PC."
	echo ""
	echo "Ante cualquier duda, escríbenos en soporte-lab@gsyc.urjc.es. ¡Saludos!"
	echo ""
else
	echo "Parece que se produjo un problema creando tu escritorio :-("
	echo ""
	echo "Si este problema persiste, por favor, escribe a los técnicos de laboratorio: soporte-lab@gsyc.urjc.es."
	echo ""
fi

# Borramos fichero temporal
$RM $conf_file
