#!/bin/bash
. /etc/default/vx-dga-variables/vx-dga-variables-general.conf
USER=$(whoami)
PDI=""
SB480=""
ARCHSO=$(getconf LONG_BIT)
SERVERDOWNLOAD="migasfree.educa.aragon.es"

function close_yad() {
	kill -s SIGUSR1 "$YAD_PID"
}
export -f close_yad

function log_xsession() {
	#
	# Funcion que loguea el proceso. Si no se pasa como parámetro el nombre del fichero, dejará un log en /tmp
	# Si se quiere loguera en /var/log/vitalinux se llamará como log_xsession -o nombre_fichero
	#
	while getopts 'o:' OPT; do
		case $OPT in
		o) LOGFILE=$OPTARG ;;
		esac
	done

	if [ "$LOGFILE" ]; then
		if [ ! -d /var/log/vitalinux ]; then
			mkdir -p /var/log/vitalinux
		fi
		LOGFILE="/var/log/vitalinux/$LOGFILE"
	else
		LOGFILE="/tmp/logfile"
	fi
	export fpipe=$(mktemp -u --tmpdir yadlog.XXXXXXXX)
	mkfifo "$fpipe"
	exec 3<>"$fpipe"
	exec 2>&1
	exec > >(tee -i "$fpipe" >>"$LOGFILE")
	# Borramos la pipe cuando salgamos
	trap "rm -f $fpipe" EXIT
	yad --title "Ventana de Log" --text-info --tail \
		--window-icon vitalinux \
		--center --width="720" --height="520" \
		--no-escape --no-focus --tail --button="Ocultar:bash -c close_yad" <"$fpipe" &

	YAD_LOG=$!
	export YAD_LOG
}

function close_exit() {
	echo "Se cancela el proceso por parte del usuario antes de tiempo"
	if [ -n "$YAD_LOG" ] && ps -p "$YAD_LOG" >/dev/null; then
		kill -s SIGUSR1 "$YAD_LOG"
	fi
	if [ -n "$YAD_PID" ] && ps -p "$YAD_PID" >/dev/null; then
		kill -s SIGUSR1 "$YAD_PID"
	fi
	# Salimos del programa
	exit 1

}
export -f close_exit

function esperando() {
	# Función que permite mostrar algo en pantalla mientras se espera la ejcución de un comando "largo"
	# Para llamarlo, lanzar el proceso largo con & y así se captura aquí...
	pid=$!                             # Get PID of background command
	while kill -0 $pid 2>/dev/null; do # Signal 0 just tests whether the process exists
		echo -n "."
		sleep 1.5
	done
	echo ""
}

function seleccionar-modelo-pdi {

	PDI=$(
		yad --center --width 300 --title "Seleccionar PDI" \
			--window-icon vitalinux \
			--image pdi \
			--entry \
			--text "Selecciona tu PDI:" \
			--entry-text \
			"Sin Driver - Solo OpenBoard" "eBeam" "Hitachi" "Interwrite" "IQBoard" "Multiclass" "Promethean" "Smartboard" "Calibrador - General" \
			--button="Continuar":0 \
			--button="Cancelar":1
	)
	if [ "$?" != "0" ]; then
		return 69
	fi
}

function comprobar-md5 {
	ARCHIVO=$1
	cd /opt/pkgs/pdis || return 1
	echo ""
	if test -f ./"${ARCHIVO}" -a -f ./"${ARCHIVO}".md5; then
		echo "Ya están descargados los archivos ${ARCHIVO} y ${ARCHIVO}.md5 ..."
		echo "----------------------------"
		md5sum "${ARCHIVO}"
		cat ./"${ARCHIVO}".md5
		if test "$(md5sum ${ARCHIVO})" == "$(cat ./${ARCHIVO}.md5)"; then
			echo "--> Ok!! Coinciden el MD5 de ${ARCHIVO} con ${ARCHIVO}.md5 ..."
			echo "----------------------------"
			echo ""
			return 0
		else
			echo "--> Error!! No coinciden el MD5 de ${ARCHIVO} con ${ARCHIVO}.md5 ..."
			echo "--> Se va a intentar volver a descargar los archivos ..."
			echo "----------------------------"
			echo ""
			rm -Rf ./${ARCHIVO}* &>/dev/null
			return 1
		fi
	else
		echo "--> El archivo ${ARCHIVO} o su MD5 no existen.  Se descargarán de nuevo ..."
		rm -Rf ./${ARCHIVO}* &>/dev/null
		return 1
	fi
}

function descargar-archivos {
	YADBARS=""
	CONTADOR=1
	for ruta in $@; do
		# Obtenemos el nombre del archivo a descargar de la URL proporcionada
		NOMBREARCHIVO=$(echo "$ruta" | awk -F "/" {'print $NF'})
		YADBARS="$YADBARS --bar=Descargando->$NOMBREARCHIVO:NORM"
		CONTADOR=$((CONTADOR + 1))
	done

	(
		CONTADOR=1
		for ruta in $@; do
			NOMBREARCHIVO=$(echo "$ruta" | awk -F "/" {'print $NF'})
			# Para cada barra de progreso: El primer parametro es la barra de progreso afectada y el segundo el texto que mostrará
			wget "$ruta" 2>&1 | sed -u \
				"s/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/$CONTADOR:\1\n$CONTADOR:# Descargando a \2\/s, T. Restante: \3/"
			# Obtenemos el resultado de la descarga proporcionado por wget
			RET_WGET="${PIPESTATUS[0]}"
			if [[ "$RET_WGET" = 0 ]]; then
				echo "$CONTADOR:100%"
				echo "$CONTADOR:#Descarga de $NOMBREARCHIVO Completada ..."
			else
				echo "$CONTADOR:#Error en la Descarga de $NOMBREARCHIVO ..."
			fi
			CONTADOR=$((CONTADOR + 1))
		done
	) | yad --center --width 700 \
		--title "Descarga de Drivers PDIs" \
		--window-icon vitalinux \
		--justify="center" --text-align="center" \
		--text "  Descargando el Software necesario ... <b>¡¡paciencia!!</b> ... \n  Puede tardar <b>Varios Minutos</b>  \n   Modelo PDI: <b>$PDI</b>   " \
		--multi-progress \
		$YADBARS \
		--auto-close --button="Cancelar":1
	##
	## Si el usuario cancela la descarga o bien hay un error (no hay red por ejemplo)
	if [ "$?" = "1" ]; then
		if yad --center --title "Drivers PDIs" --question \
			--window-icon vitalinux \
			--image pdi \
			--text "   Hubo un problema a la hora de descargar el software o ha sido cancelada la operación por el usuario...deseas reintentar la descarga?   " \
			--width="350" --center \
			--justify="center" --text-align="center" \
			--button="Continuar":0 --button="Cancelar":1; then
			descargar-archivos $@
			return $?
		else

			return 69
		fi
	fi
	return 0

}

function comprobar-archivos {
	LISTADESCARGAS=""

	for RUTA in $@; do
		ARCHIVO=$(echo "$RUTA" | awk -F "/" {'print $NF'})
		if ! comprobar-md5 $ARCHIVO; then
			echo "--> El archivo $ARCHIVO NO se encentra de manera integra en /opt/pkgs/pdis ..."
			echo "--> ... por lo tanto, $ARCHIVO se descargará a continuación ..."
			LISTADESCARGAS="$LISTADESCARGAS http://${SERVERDOWNLOAD}${RUTA} http://${SERVERDOWNLOAD}${RUTA}.md5"
		else
			echo "--> El archivo $ARCHIVO ya existe de manera integra en /opt/pkgs/pdis ..."
			echo "--> ... por lo tanto, $ARCHIVO no se descargará de nuevo ..."
		fi
	done
	if test "$LISTADESCARGAS" = ""; then
		return 0
	else
		descargar-archivos "$LISTADESCARGAS"
	fi
}

# Los archivos a descargar y posteriormente a instalar no se pueden pasar por parámetro ya que luego es importante el orden o acciones posteriores...
function descargar-software-pdi {

	if ! test -d /opt/pkgs/pdis; then
		mkdir -p /opt/pkgs/pdis
	fi
	cd /opt/pkgs/pdis

	case $PDI in

	"eBeam")
		## Test
		if [ "$ARCHSO" = "32" ]; then
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " Lo sentimos pero de momento eBeam NO facilita controladores para 32 bits " \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" --button="gtk-ok":0
			return 1
		fi
		FILESPDI="/pdis/eBeam/eBeam-Interact_3.6.0-5_bionic_amd64.deb"
		;;

	"Hitachi")
		if lsusb | grep "1477:0008" >/dev/null 2>&1; then
			HITACHITRIO="1"
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " La pizarra conectada parece que es un modelo <b>HITACHI TRIO</b>.\n\n No hay solución funcional ya que no se proporciona el driver necesario por el fabricante.\n\n Deberías usar Vitalnux 2.x" \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" \
				--button="Continuar":0 \
				--button="Salir":1
			if [ "$?" != "0" ]; then
				return 69
			fi
		else
			HITACHITRIO="0"
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " La pizarra conectada parece que NO es un modelo <b>HITACHI TRIO</b>.\n\n Puede ser una <b>HITACHI DUO</b> o la nueva <b>FX79</b>\n\n Si no es así, cancela la operación, conecta la pizarra y vuelve a arrancar el instalador " \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" \
				--button="Continuar":0 \
				--button="Salir":1
			if [ "$?" != "0" ]; then
				return 69
			fi
		fi
		;;

	"Interwrite")
		yad --title "Instalación de Software de la PDI $PDI" \
			--text " Las pizarras Interwrite requieren dockerizar la aplicación para que funcionen. Ésto implica un proceso de descarga que es <b>costoso en tiempo</b>:\n\n Se recomienda tener conexión a <b>red por cable</b> antes de continuar... " \
			--window-icon vitalinux \
			--image pdi \
			--width="400" --height="100" \
			--center --justify="center" --text-align="center" \
			--button="Continuar ":0 \
			--button="Salir":1
		if [ "$?" != "0" ]; then
			return 69
		fi
		;;

	"IQBoard")
		# Selecccionar el modelo de iqboard...sino se seleccionará el de infrarrojos 6 o 10 puntos
		MODELOIQ=$(
			yad --center --width 300 --title "Seleccionar PDI" \
				--window-icon vitalinux \
				--image pdi \
				--button="Continuar":0 --button="Canelar":1 \
				--entry \
				--text "Selecciona Modelo de pizarra IQ :" \
				--entry-text \
				"Resistiva_S080_S082" "Electromagnetica_AP080_AP082_APD080_APD082" "Infrarrojos_RPD082" \
				"Infrarrojos_6_10_toques_RPS082_RPT082" "Optica_T084_T082" "Optica_4_10_TQ082_TQ084_TN082_TN084"
		)
		[ "$MODELOIQ" = "" ] && return 1

		FILESPDI="/pdis/IQBoard/iqboard_${ARCHSO}_soft_bionic/iqboard.deb /pdis/IQBoard/iqboard_driver_bionic/${MODELOIQ}/x${ARCHSO}/rsboardep.deb"

		;;

	"Multiclass")
		if lsusb | grep -i "10c4:ea60" >/dev/null 2>&1; then
			# Ésta pizarra es puerto serie, y funcionará con la solución de lliurex mrpdi
			MULTICLASSOLD="1"
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " Éste modelo de pizarra puede funcionar con una solución genérica basada en un software desarrollado para <b>Lliurex</b>\n\n Multiclass no proporciona aplicación en ningún caso para sistema modernos, así que <b>deberás usar openboard por ejemplo </b>(el asistente te permitirá instalarlo después si lo deseas).\n\n Al terminar ésta instalación se inciará la <b>calibración</b> de la pizarra. Si no se lleva a cabo, se intentará en próximos reinicios" \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" \
				--button="Continuar ":0 \
				--button="Cancelar":1
			if [ "$?" != "0" ]; then
				return 69
			fi
		else
			MULTICLASSOLD="0"
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " El driver de las pizarras multiclass generan conflictos con los drivers de impresión. Primero comprueba si la pizarra responde sin instalar ningún software específico.\n\n ¿RESPONDE?: <b> cancela ésta instalación e instala mejor el calibrador genérico </b>.\n\n ¿NO RESPONDE?: <b>continúa</b> y se instalará una solución que hemos preparado para éstas pizarras y tras reiniciar puedes <b>calibrar</b> la pizarra usando la aplicación llamada <b>iwbdriver</b>." \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" \
				--button="Continuar ":0 \
				--button="Cancelar":1
			if [ "$?" != "0" ]; then
				return 69
			fi
			#FILESPDI="/pdis/multiCLASS/multiCLASS_Book_Ubuntu_$ARCHSO.deb"
		fi

		;;

	"Promethean")
		# Software disponible en Migasfree completamente...nada que descargar
		#:
		yad --title "Instalación de Software de la PDI $PDI" \
			--text " La pizarra Prometehean requiere de un driver no compatible con sistemas modernos y no se proporciona el driver necesario por parte del fabricante.\n\n Si la pizarra responde de forma táctil (driver genérico), pero no está calibrada, podrás hacerlo instalando el calibrador General que encontrarás en la selección de modelos de PDI. \n\n Si no hay función táctil, deberías usar Vitalnux 2.x" \
			--window-icon vitalinux \
			--image pdi \
			--width="400" --height="100" \
			--center --justify="center" --text-align="center" \
			--button="Continuar":0 \
			--button="Salir":1
		if [ "$?" != "0" ]; then
			return 69
		fi
		;;

	"Smartboard")
		# La solución ahora se basa en aplicación dockerizada por Lliurex
		# Ojo, SOLO 64 bits.
		if lsusb | grep "0b8c:0090" >/dev/null 2>&1; then
			SB480="1"
		else
			SB480="0"
		fi
		if [ "$SB480" = "0" ]; then
			yad --title "Instalación de Software de la PDI $PDI" \
				--text " Las pizarras SmartBoard requieren dockerizar la aplicación para que funcionen. Ésto implica un proceso de descarga que es <b>costoso en tiempo</b>:\n\n Se recomienda tener conexión a <b>red por cable</b> antes de continuar...  " \
				--window-icon vitalinux \
				--image pdi \
				--width="400" --height="100" \
				--center --justify="center" --text-align="center" \
				--button="Continuar ":0 \
				--button="Cancelar":1
			if [ "$?" != "0" ]; then
				return 69
			fi
		fi
		;;

	esac
	# Configuramos el servidor de donde se realizarán las descargas:
	echo "Comprobando servidor de descargas...por favor, espere"
	if nc -z "${IPCACHE}" 80 -w3 >/dev/null 2>&1 && wget --spider -q "http://${IPCACHE}/pdis"; then
		SERVERDOWNLOAD="$IPCACHE"
		echo "Se usuará el servidor caché del centro"
	else
		SERVERDOWNLOAD="migasfree.educa.aragon.es"
		echo "Se usuará el servidor migasfree"
	fi

	comprobar-archivos "$FILESPDI"
}

function instalar-software-pdi {

	cd /opt/pkgs/pdis || return 1
	case $PDI in

	"eBeam")
		apt-get --assume-yes --force-yes install libusb-dev yasm libvpx. libx264. kazam onboard libboost-all-dev libboost-thread-dev
		dpkg -i eBeam-Interact_3.6.0-5_bionic_amd64.deb
		apt-get -f --assume-yes --force-yes install
		;;

	"Hitachi")
		if [ "$HITACHITRIO" = "1" ]; then
			# NO ES FUNCIONAL!
			true
		else
			apt-get --assume-yes --force-yes install starboardsoftware
			# Instalamos los drivers necesarios
			# Para que el servicio que se encarga de hablar con la pizarra (driver) DGBoard se pueda ejecutar en 64 bits
			apt-get --assume-yes --force-yes install libusb-0.1-4 libxtst6 libusb-0.1-4:i386 libxtst6:i386
			# Por último, debemos activar el servicio de starboard (no lo hace por defecto) al arranque.
			# Al estar mal construido el paquete
			sed -i 's/# chkconfig/### BEGIN INIT INFO\n# Default-Start: 2 3 4 5\n### END INIT INFO/g' /etc/init.d/starboardservice
			systemctl enable starboardservice
			# Modificamos el lanzador de calibrado que no se ejecuta correctamente desde entorno grafico
			if [ -f /usr/share/applications/hitachi-starboard-calibrate.desktop ]; then
				sed -i 's/^Terminal=[Tt]rue/Terminal=false/g' /usr/share/applications/hitachi-starboard-calibrate.desktop
			fi
		fi
		;;

	"Interwrite")
		apt-get --assume-yes install vx-dga-l-pdi-interwrite
		# Precarga de la imagen...
		echo "Descargando la imagen docker de la aplicación...PACIENCIA y ESPERA A QUE SE INDIQUE"
		sudo /usr/bin/vx-interwrite -download &
		esperando
		;;

	"IQBoard")
		# Cosultar en /var/lib/dpkg/info/iqboard.deb.postinst que hay acciones que no se pueden realizar
		if test -f ./iqboard.deb -a -f ./rsboardep.deb; then
			# Borramos cualquier instalacion previa de drivers o software
			if dpkg -l | grep iqboard.deb >/dev/null 2>/dev/null; then
				echo "Borrando software instalado..."
				dpkg -P iqboard.deb
			fi
			if dpkg -l | grep rsboard >/dev/null 2>/dev/null; then
				echo "Borrando driver instalado..."
				# Puede llamarse una vez instalado de varias formas...
				dpkg -P rsboarddvt rsboarddvtq rsboardep rsboardetp rsboardirq rsboardirx
			fi
			dpkg -i /opt/pkgs/pdis/rsboardep.deb
			dpkg -i /opt/pkgs/pdis/iqboard.deb
			# El service también podría ser RSBoardEP_Server.desktop
			[ -f /usr/share/gnome/autostart/RSBoardEPStart.desktop ] &&
				cp /usr/share/gnome/autostart/RSBoardEPStart.desktop /etc/xdg/autostart/

		fi
		;;

	"Multiclass")
		if [ "${MULTICLASSOLD}" = "1" ]; then
			# Elminamos posibles instalaciones antiguas
			dpkg --purge multiclass 2>/dev/null
			apt-get --assume-yes --force-yes install vx-dga-l-pdi-multiclass-mrpdi
		else
			# Elminamos posibles instalaciones antiguas
			dpkg --purge multiclass 2>/dev/null
			apt-get --assume-yes --force-yes install vx-dga-l-pdi-multiclass
			# Precarga de la imagen...
			echo "Descargando la imagen docker de la aplicación...PACIENCIA y ESPERA A QUE SE INDIQUE"
			sudo /usr/bin/vx-multiclass -download &
			esperando
		fi

		# La versión actual 7.0 parece romper en algunos equipos el acceso a udev
		# Por confirmar (de todas formas, 7.0 NO es funcional)
		#apt-get --assume-yes install libudev0

		;;

	# Upgrade: Actualizado para focal y adaptado a jammy dependencia activinspire
	"Promethean")

		# # Primero instalamos los complementos de drivers gráficos necesarios para que no haga downgrade
		# apt-get --assume-yes install xserver-xorg-input-evdev-hwe-18.04
		# apt-get --assume-yes install activdriver activtools activ-meta-es

		# NO ES FUNCIONAL!
		true
		;;

	"Smartboard")
		if [ "$SB480" = "1" ]; then
			apt-get --assume-yes install vx-dga-l-pdi-smartboard-480
		else
			# Install nwfermi daemon y module
			apt-get --assume-yes install nwfermi-module nwfermi-daemon
			# Install vx-dga-l-pdi-smartboard
			apt-get --assume-yes install vx-dga-l-pdi-smartboard
			# Precarga de la imagen...
			echo "Descargando la imagen docker de la aplicación...PACIENCIA y ESPERA A QUE SE INDIQUE"
			sudo /usr/bin/lliurex-smart -download &
			esperando
		fi
		;;

	"Calibrador - General")
		# Instalamos el calibrador de pizarras
		apt-get --assume-yes install touchscreen-calibrator
		;;

	esac

	# Por último instalamos el openboard si se quiere...
	if yad --center --title "Drivers PDIs" --question \
		--window-icon vitalinux \
		--image pdi \
		--text "   ¿Deseas instalar <b>Open-Board</b>? Se recomienda si    " \
		--width="350" --center \
		--justify="center" --text-align="center" \
		--button="Continuar":0 --button="Cancelar":69; then

		cd /opt/pkgs/pdis || return 1

		if [ "$ARCHSO" = "64" ]; then
			apt-get --assume-yes install openboard
		fi

	fi

}

if test "$USER" != "root"; then
	yad --title "Instalación del Software de PDIs" \
		--center --justify="center" --text-align="center" \
		--width="400" --height="100" \
		--window-icon vitalinux \
		--text "No tiene permiso para ejecutar el programa" \
		--button="Continuar":1
	exit 1
fi

if [ "$ARCHSO" != "32" ] && [ "$ARCHSO" != "64" ]; then
	yad --title "Instalación del Software de PDIs" \
		--center --justify="center" --text-align="center" \
		--width="400" --height="100" \
		--window-icon vitalinux \
		--text "Error a la hora de conocer arquitectura del sistema. No se puede continuar..." \
		--button="Continuar":1
	exit 1
fi

log_xsession -o drivers-pdis.log

yad --center --title "Drivers PDIs" --question \
	--window-icon vitalinux \
	--image pdi \
	--on-top \
	--text "   ¿Desea continuar con la Instalación de <b>Drivers para las PDIs</b>?   \n   Para no demorar la instalación es aconsejable contar con un servidor caché, pero es posible realizar la descarga directamente desde Internet   " \
	--width="350" --height="50" --center \
	--justify="center" --text-align="center" \
	--button="gtk-ok":0 \
	--button="Salir":1
if [ "$?" != "0" ]; then
	close_exit
fi

seleccionar-modelo-pdi && descargar-software-pdi && instalar-software-pdi
RESUL="$?"
## RESUL 69 es cancelación...pero no lo informamos....
if [ "${RESUL}" != "0" ] && [ "${RESUL}" != "69" ]; then
	yad --title "Instalación de Software de la PDI $PDI" \
		--text "   Algo ha podido salir mal   \n   Revise la ventana de logs para poder detectar el problema. \n\n Puede solicitar ayuda mandano un mail a soporte.vitalinux@educa.aragon.es adjuntando el texto de la traza  " \
		--window-icon vitalinux \
		--image pdi \
		--width="400" --height="100" \
		--center --justify="center" --text-align="center" --button="gtk-ok":0
else
	yad --title "Instalación de Software de la PDI $PDI" \
		--text "   Ya se han realizado todas las tareas solicitadas   \n   Según lo realizado es posible que sea necesario un <b>reinicio del sistema</b> " \
		--window-icon vitalinux \
		--image pdi \
		--width="400" --height="100" \
		--center --justify="center" --text-align="center" --button="gtk-ok":0
fi

if [ -n "$YAD_LOG" ] && ps -p "$YAD_LOG" >/dev/null; then
	kill -s SIGUSR1 "$YAD_LOG"
fi
exit 0
