summaryrefslogtreecommitdiffstats
path: root/server/bin/setclientmode
blob: a4987081cbeefb236b1b12ce972988e227aefa3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash

#/**
#@file    setclientmode
#@brief   Configures the client's PXE boot file from a template file.
#@usage   setclientmode Config_file
#@param   Config_file  Path to the configuration file.
#@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
#@version 1.1.1 - Crea configuración PXE para BIOS y UEFI. Permite pasar los datos acceso a la base de datos por variables de entorno. (ticket #802)
#@author  Irina Gomez, ETSII Universidad de Sevilla
#@date    2019-02-13
#@version 1.2.0 - Using configuration file instead of input parameters; english messages.
#@author  Roberto Hueso Gómez
#@date    2020-10-16
#*/ ##

# Variables y funciones globales.
PROG="$(basename "$0")"
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
PXEDIR[1]=$OPENGNSYS/tftpboot/grub
LOGFILE=$OPENGNSYS/log/opengnsys.log

source $OPENGNSYS/lib/ogfunctions.sh || exit 1

# Mostrar ayuda.
[ "$*" == "help" ] && help
[ "$*" == "version" ] && version
# Checking errors.
[ $# -gt 1 ] && raiseError usage
source "$1" || exit 1
# Comprobar si el usuario es "root" o el del servicio web.
WEBUSER=$(ps axho user,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
CALLER=$(getcaller)
[ "$USER" != "root" -a "$USER" != "$WEBUSER" -a "$CALLER" != "ogserver" ] && raiseError access "Need to be root (or webserver user)"
TEMPLATE[0]="${PXEDIR[0]}/templates/${MODE_FILE}"
TEMPLATE[1]="${PXEDIR[1]}/templates/${MODE_FILE}"
[ -z "${TEMPLATE[0]}${TEMPLATE[1]}" ] && raiseError notfound "PXE template file \"$MODE_FILE\""

case "${MODE^^}" in
	0|TEMP)	MODE="TEMP" ;;
	1|PERM)	MODE="PERM" ;;
	*)	raiseError notfound "Unknown mode \"$MODE\"" ;;
esac

ETHERNET=$MAC

# Copiar fichero de configuración.
for MAC in $ETHERNET; do
	MACFILE="${MAC^^}"
	PXEFILE[0]=01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
	MACFILE="${MAC,,}"
	PXEFILE[1]=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 ${PXEDIR[0]}/${PXEFILE[0]} ] && mv ${PXEDIR[0]}/${PXEFILE[0]} ${PXEDIR[0]}/${PXEFILE[0]}.netboot
	[ -e ${PXEDIR[1]}/${PXEFILE[1]} ] && mv ${PXEDIR[1]}/${PXEFILE[1]} ${PXEDIR[1]}/${PXEFILE[1]}.netboot

	# Si no está definida la variable LANG, usar idioma inglés por defecto.
	[ -z "$LANG" -o "$LANG" == "C" ] && LANG="en"
	DATOS=$DATA
	# 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}')

	# Pondremos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
	WEBGROUP=$(ps axho group,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
	for BOOTTYPE in 0 1; do
		# Si no existe la plantilla borramos el archivo PXE anterior continuamos
		if [ -z "${TEMPLATE[$BOOTTYPE]}" ]; then
			rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
			continue
		fi
		# Comprobar si existe "oglivedir" en la plantilla para evitar duplicados.
		if grep -q "oglivedir=" ${TEMPLATE[$BOOTTYPE]} 2>/dev/null; then
			DATOSAUX="${DATOS/oglivedir=$OGLIVEDIR/}"
		fi
		# Renombra el fichero PXE original
		[ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot

		# Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
		sed -e "s,vga=[0-9]*,,g; s,INFOHOST,${DATOSAUX//,/\\,},g; s,set ISODIR=.*,set ISODIR=$OGLIVEDIR,g" ${TEMPLATE[$BOOTTYPE]} >${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
		[ -n "$WEBUSER" ] && chown $WEBUSER:$WEBGROUP ${PXEDIR[$BOOTTYPE]}/${PXEFILEE[$BOOTTYPE]}
	done

	# 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
		for BOOTTYPE in 0 1; do
			[ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
			[ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
		done
	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 ${PXEDIR[0]}/${PXEFILE[0]}.netboot ] && rm ${PXEDIR[0]}/${PXEFILE[0]}.netboot
		[ -e ${PXEDIR[1]}/${PXEFILE[1]}.netboot ] && rm ${PXEDIR[1]}/${PXEFILE[1]}.netboot
		# Si no existe la plantilla de tipo BIOS tomo el nombre de la UEFI
		[ -z "${TEMPLATE[0]}" ] && TEMPLATE[0]=${TEMPLATE[1]}
	fi
	date +"%b %d %T $PROG: Configured \"$MODE_FILE\" on \"$MAC\", \"$MODE\" mode" | tee -a $LOGFILE
done
exit 0