#!/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, 1 } - 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 #*/ ## # 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 if [ $3 != "0" ] && [ $3 != "1" ]; then echo "$PROG: Error de ejecución" echo "el modo debe ser 0 o 1 (temporal o permanente)" exit 1 fi # 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 \"$3\"" | 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, (@repoip:=repositorios.ip), aulas.router, aulas.netmask, ordenadores.nombreordenador, ordenadores.netiface, 'none'), ' group=', REPLACE (aulas.nombreaula, ' ', '_'), ' ogrepo=', @repoip, ' oglive=', @repoip, ' oglog=', (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1), ' ogshare=', @serverip, ' winboot=', IFNULL (perfileshard.winboot, 'reboot'), 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) 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 'áéíóúñÁÉÍÓÚÑ' 'aeiounAEIOUN') [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788" # 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" $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 [ "$3" == "0" ]; 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 [ "$3" == "1" ]; 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