175 lines
8.5 KiB
Bash
175 lines
8.5 KiB
Bash
#!/bin/bash
|
|
|
|
#/**
|
|
#@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.
|
|
#@usage setclientmode Plantilla Ambito Modo
|
|
#@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 Plantilla nombre de plantilla PXE
|
|
#@param Ambito nombre de ordenador o nombre de aula
|
|
#@param Modo "TEMP" (temporal) o "PERM" (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
|
|
#@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
|
|
#*/ ##
|
|
|
|
# Variables y funciones globales.
|
|
PROG="$(basename "$0")"
|
|
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
|
|
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
|
|
PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
|
|
PXEDIR[1]=$OPENGNSYS/tftpboot/grub
|
|
|
|
source $OPENGNSYS/lib/ogfunctions.sh || exit 1
|
|
|
|
# Mostrar ayuda.
|
|
[ "$*" == "help" ] && help
|
|
[ "$*" == "version" ] && version
|
|
# Control básico de errores.
|
|
[ $# -ne 3 ] && raiseError usage
|
|
# 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" != "ogAdmServerAux" ] && raiseError access "Need to be root (or webserver user)"
|
|
# El acceso a mysql por las variables pasadas o por el fichero de configuarción.
|
|
if [ -z "$USUARIO" ] || [ -z "$PASSWORD" ] || [ -z "$CATALOG" ]; then
|
|
source $SERVERCONF 2>/dev/null || raiseError access "Server configuration file"
|
|
fi
|
|
TEMPLATE[0]=$(grep -l "^#.* $1 *$" ${PXEDIR[0]}/templates/* 2>/dev/null)
|
|
TEMPLATE[1]=$(grep -l "^#.* $1 *$" ${PXEDIR[1]}/templates/* 2>/dev/null)
|
|
[ -z "${TEMPLATE[0]}${TEMPLATE[1]}" ] && raiseError notfound "PXE template file \"$1\""
|
|
|
|
case "${3^^}" in
|
|
0|TEMP) MODE="TEMP" ;;
|
|
1|PERM) MODE="PERM" ;;
|
|
*) raiseError notfound "Unknown mode \"$3\"" ;;
|
|
esac
|
|
|
|
# Sustituir caracteres ' por \' para evitar inyección SQL.
|
|
BOOTMODE="${1//\'/\\\'}"
|
|
RESOURCE="${2//\'/\\\'}"
|
|
# Buscar ordenador individual o todos los de una aula.
|
|
ETHERNET=$(dbexec "
|
|
SELECT mac FROM ordenadores
|
|
JOIN aulas USING (idaula)
|
|
WHERE aulas.nombreaula ='$RESOURCE'
|
|
OR nombreordenador = '$RESOURCE';")
|
|
if [ -z "$ETHERNET" ]; then
|
|
echolog "No existe aula o equipo con el nombre \"$2\""
|
|
raiseError notfound "Client or lab name \"$2\""
|
|
fi
|
|
|
|
# Copiar fichero de configuración y actualizar base de datos.
|
|
echolog "Configurando \"$1\" en \"$2\" en modo \"$MODE\""
|
|
NPC=0
|
|
for MAC in $ETHERNET; do
|
|
echolog "Detectada ethernet \"$MAC\" en \"$2\""
|
|
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
|
|
|
|
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=$(dbexec "
|
|
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,
|
|
' ogprof=', IF(ordenadores.idordenador=aulas.idordprofesor, 'true', 'false'),
|
|
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}')
|
|
|
|
# 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]}
|
|
|
|
dbexec "UPDATE ordenadores SET arranque='$(basename ${TEMPLATE[0]})' WHERE mac='$MAC';"
|
|
fi
|
|
fi
|
|
let NPC=NPC+1
|
|
done
|
|
echolog "$NPC equipo(s) configurado(s)"
|
|
|