#!/bin/bash

#/**
# 	  setclientmode NombrePlatilla { NombrePC | NombreAula } Modo_trabajo
#@file	  setclientmode
#@brief   Configura el archivo de arranque de PXE para los clientes, ya sea un equipo o un aula, generando enlaces a archivos usados como plantilla. 
#@warning El archivo PXE por defecto "default" se deja en modo de ejecución "user" y se eliminan los enlaces para equipos con la plantilla por defecto.
#@param   $1 NombrePlatilla
#@param   $2 Ámbito { NombrePC | NombreAula }
#@param   $3 Modo_trabajo = { 0, TEMP, 1, PERM } - 0 si es temporal y 1 si es permanente. 
#@version 1.0 - Versión inicial.
#@author  Irina Gomez y Ramon Gomez - Univ. Sevilla, noviembre 2010
#@version 1.0.1 - Identificacion de la plantilla por nombre en consola = en primera linea de la plantilla
#@author  Irina Gomez - Univ. Sevilla
#@date    2013-05-31
#@version 1.0.2 - Cambio en la funcionalidad del script: el cambio del archivo de arranque PXE puede hacerse de manera temporal (codigo 0) modificando solo el fichero de arranque PXE durante 60 sg. y sin tocar la base de datos o permanente (codigo 1), actualizando tanto el fichero PXE como la base de datos.
#@author  Juan Carlos Garcia - Univ. Zaragoza
#@date    2015-11-17
#@version 1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
#@author  Irina Gomez, ETSII Universidad de Sevilla
#@date    2015-12-16
#@version 1.1.0a - El server siempre es el servidor PXE. El segundo parámetro de la IP es el SERVER. La asignación del ogLive siempre es el server. (ticket #859).
#@author  Antonio J. Doblas Viso, Universidad de Malaga
#@date    2018-07-11
#*/ ##


# Variables.
PROG=$(basename $0)
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
PXEDIR=$OPENGNSYS/tftpboot/menu.lst
LOGFILE=$OPENGNSYS/log/opengnsys.log
MYCNF=/tmp/.my.cnf.$$

# Control básico de errores.
if [ $# -ne 3 ]; then
	echo "$PROG: Error de ejecución"
	echo "Formato: $PROG PLANTILLA [NOMBRE_PC|NOMBRE_AULA] MODO"
	exit 1
fi
if [ ! -r $SERVERCONF ]; then
	echo "$PROG: Sin acceso a fichero de configuración"
	exit 2
fi
TEMPLATE=$(grep -l "^#.* $1 *$" $PXEDIR/templates/*)
if [ -z "$TEMPLATE" ]; then
	echo "No existe archivo platilla: $1"
	exit
fi
case "$3" in
	0|TEMP)	MODE="TEMP" ;;
	1|PERM)	MODE="PERM" ;;
	*)	echo "$PROG: Modo desconodido: 0, TEMP (temporal), 1, PERM (permanente)"
		exit 1 ;;
esac

# Obtener datos de acceso a la Base de datos.
source $SERVERCONF
# Sustituir caracteres ' por \' para evitar inyección SQL.
BOOTMODE="${1//\'/\'}"
RESOURCE="${2//\'/\'}"
# Componer fichero con credenciales de conexión. 
touch $MYCNF 
chmod 600 $MYCNF 
cat << EOT > $MYCNF 
[client] 
user=$USUARIO 
password=$PASSWORD 
EOT
# Borrar el fichero temporal si termina el proceso. 
trap "rm -f $MYCNF" 0 1 2 3 6 9 15 
# Buscar ordenador individual o todos los de una aula.
ETHERNET=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
		"SELECT mac FROM ordenadores 
 		   JOIN aulas USING (idaula) 
 		  WHERE aulas.nombreaula='$RESOURCE' 
 		     OR nombreordenador='$RESOURCE';")
if [ -z "$ETHERNET" ]; then
	date +"%b %d %T $PROG: No existe aula o equipo con el nombre \"$2\"" | tee -a $LOGFILE
	exit 1
fi

# Copiar fichero de configuración y actualizar base de datos.
date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
NPC=0
for MAC in $ETHERNET; do
	date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
	MACFILE="${MAC^^}"
	PXEFILE=$PXEDIR/01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
	# Renombra el fichero PXE original
	[ -e $PXEFILE ] && mv $PXEFILE $PXEFILE.netboot
	if [ "$1" != "default" ]; then
		# Si no está definida la variable LANG, usar idioma inglés por defecto.
		[ -z "$LANG" -o "$LANG" == "C" ] && LANG="en"
		# Obtener de la BD los parámetros de arranque asociados (separador es TAB).
		DATOS=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
			"SELECT ' LANG=$LANG',
				' ip=', CONCAT_WS(':', ordenadores.ip,
				(SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
				aulas.router, aulas.netmask,
				ordenadores.nombreordenador, ordenadores.netiface, 'none'),
				' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
				' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
				' oglive=', @serverip,
				' oglog=', @serverip,
				' ogshare=', @serverip,
				' oglivedir=', ordenadores.oglivedir,
				IF(perfileshard.descripcion<>'', CONCAT(' hardprofile=', REPLACE(TRIM(perfileshard.descripcion), ' ', '_')), ''),
				IF(aulas.ntp<>'', CONCAT(' ogntp=', aulas.ntp), ''),
				IF(aulas.dns<>'', CONCAT(' ogdns=', aulas.dns), ''),
				IF(aulas.proxy<>'', CONCAT(' ogproxy=', aulas.proxy), ''),
				IF(entidades.ogunit=1 AND NOT centros.directorio='', CONCAT(' ogunit=', centros.directorio), ''),
				CASE
				    WHEN menus.resolucion IS NULL THEN ''
				    WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
				    WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
				    ELSE menus.resolucion
				END
				FROM ordenadores 
				JOIN aulas USING(idaula)
				JOIN centros USING(idcentro)
				JOIN entidades USING(identidad)
				LEFT JOIN repositorios USING(idrepositorio)
				LEFT JOIN perfileshard USING(idperfilhard)
				LEFT JOIN menus USING(idmenu)
				WHERE ordenadores.mac='$MAC';")
		# Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
		DATOS=$(echo ${DATOS//	/} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
		[[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
		# Obtener directorio ogLive a partir de los datos.
		OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
		# Comprobar si existe "oglivedir" en la plantilla para evitar duplicados.
		if grep -q "oglivedir=" $TEMPLATE 2>/dev/null; then
			DATOS="${DATOS/oglivedir=$OGLIVEDIR/}"
		fi
		# Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
		sed -e "s,vga=[0-9]*,,g; s,INFOHOST,${DATOS//,/\\,},g; s,set ISODIR=.*,set ISODIR=$OGLIVEDIR,g" $TEMPLATE >$PXEFILE
		# Ponemos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
		PERMS=$(ps axho user,group,comm|awk '!/root/ && /httpd|apache/ {u=$1; g=$2} END {if (g) printf "%s:%s",u,g}')
		[ -n "$PERMS" ] && chown $PERMS $PXEFILE
		# Si el modo de trabajo es temporal (0) mete un retardo, restaura el fichero PXE a su estado original y no toca la base de datos
		if [ "$MODE" == "TEMP" ]; then
			sleep 60
			rm $PXEFILE	
			[ -e $PXEFILE.netboot ] && mv $PXEFILE.netboot $PXEFILE
		fi

		# Si el modo de trabajo es permanente (1)  borra el fichero PXE.netboot si existe y graba los datos en la base de datos
		if [ "$MODE" == "PERM" ]; then
			[ -e $PXEFILE.netboot ] && rm $PXEFILE.netboot
			mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
				"UPDATE ordenadores SET arranque='$(basename $TEMPLATE)' WHERE mac='$MAC';"
		fi
	fi
	let NPC=NPC+1
done
date +"%b %d %T $PROG: $NPC equipo(s) configurado(s)" | tee -a $LOGFILE

