source: server/bin/setclientmode

qndtest
Last change on this file was 995b512, checked in by Ramón M. Gómez <ramongomez@…>, 4 years ago

#957: setserveraddr uses the new global functions.

  • Property mode set to 100755
File size: 8.7 KB
RevLine 
[61dbabb]1#!/bin/bash
[ccbb493]2
3#/**
[940b1c7f]4#@file    setclientmode
[81b2ea1]5#@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.
[940b1c7f]6#@usage   setclientmode Plantilla Ambito Modo
[ccbb493]7#@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.
[81b2ea1]8#@param   Plantilla  nombre de plantilla PXE
9#@param   Ambito     nombre de ordenador o nombre de aula
10#@param   Modo       "TEMP" (temporal) o "PERM" (permanente)
[ccbb493]11#@version 1.0 - Versión inicial.
12#@author  Irina Gomez y Ramon Gomez - Univ. Sevilla, noviembre 2010
[3dd7b5d]13#@version 1.0.1 - Identificacion de la plantilla por nombre en consola = en primera linea de la plantilla
[ccbb493]14#@author  Irina Gomez - Univ. Sevilla
15#@date    2013-05-31
16#@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.
17#@author  Juan Carlos Garcia - Univ. Zaragoza
18#@date    2015-11-17
[0c86fb7]19#@version 1.1.0 - Se incluye la unidad organizativa como parametro del kernel: ogunit=directorio_unidad (ticket #678).
20#@author  Irina Gomez, ETSII Universidad de Sevilla
21#@date    2015-12-16
[e528cb6]22#@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).
[38fb4a8]23#@author  Antonio J. Doblas Viso, Universidad de Malaga
24#@date    2018-07-11
[25d4404]25#@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)
[178c3f6]26#@author  Irina Gomez, ETSII Universidad de Sevilla
27#@date    2019-02-13
[ccbb493]28#*/ ##
[61dbabb]29
[81b2ea1]30# Variables y funciones globales.
31PROG="$(basename "$0")"
[61dbabb]32OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
[25d4404]33SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
[178c3f6]34PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
35PXEDIR[1]=$OPENGNSYS/tftpboot/grub
[61dbabb]36LOGFILE=$OPENGNSYS/log/opengnsys.log
37
[995b512]38source $OPENGNSYS/lib/ogfunctions.sh || exit 1
[292982d]39
[940b1c7f]40# Mostrar ayuda.
41[ "$*" == "help" ] && help
[81b2ea1]42[ "$*" == "version" ] && version
[61dbabb]43# Control básico de errores.
[940b1c7f]44[ $# -ne 3 ] && raiseError usage
[e371a87]45# Comprobar si el usuario es "root" o el del servicio web.
46WEBUSER=$(ps axho user,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
[1a76afa]47CALLER=$(getcaller)
[541ddee]48[ "$USER" != "root" -a "$USER" != "$WEBUSER" -a "$CALLER" != "ogAdmServerAux" ] && raiseError access "Need to be root (or webserver user)"
[25d4404]49# El acceso a mysql por las variables pasadas o por el fichero de configuarción.
50if  [ -z "$USUARIO" ] || [ -z "$PASSWORD" ] || [ -z "$CATALOG" ]; then
[81b2ea1]51        source $SERVERCONF 2>/dev/null || raiseError access "Server configuration file"
[61dbabb]52fi
[940b1c7f]53TEMPLATE[0]=$(grep -l "^#.* $1 *$" ${PXEDIR[0]}/templates/* 2>/dev/null)
54TEMPLATE[1]=$(grep -l "^#.* $1 *$" ${PXEDIR[1]}/templates/* 2>/dev/null)
55[ -z "${TEMPLATE[0]}${TEMPLATE[1]}" ] && raiseError notfound "PXE template file \"$1\""
[178c3f6]56
[4d5cafd]57case "${3^^}" in
[2da1991]58        0|TEMP) MODE="TEMP" ;;
59        1|PERM) MODE="PERM" ;;
[940b1c7f]60        *)      raiseError notfound "Unknown mode \"$3\"" ;;
[2da1991]61esac
[ccbb493]62
[75f9c01]63# Sustituir caracteres ' por \' para evitar inyección SQL.
[81b2ea1]64BOOTMODE="${1//\'/\\\'}"
65RESOURCE="${2//\'/\\\'}"
[4ea07d1]66# Buscar ordenador individual o todos los de una aula.
[81b2ea1]67ETHERNET=$(dbexec "
68                 SELECT mac FROM ordenadores
69                   JOIN aulas USING (idaula)
70                  WHERE aulas.nombreaula ='$RESOURCE'
71                     OR nombreordenador = '$RESOURCE';")
[61dbabb]72if [ -z "$ETHERNET" ]; then
[940b1c7f]73        date +"%b %d %T $PROG: No existe aula o equipo con el nombre \"$2\"" >> $LOGFILE
74        raiseError notfound "Client or lab name \"$2\""
[61dbabb]75fi
76
[75a296b]77# Copiar fichero de configuración y actualizar base de datos.
[2da1991]78date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
[61dbabb]79NPC=0
[4ea07d1]80for MAC in $ETHERNET; do
81        date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
[7b3dc7a]82        MACFILE="${MAC^^}"
[292982d]83        PXEFILE[0]=01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
84        MACFILE="${MAC,,}"
85        PXEFILE[1]=01-${MACFILE:0:2}:${MACFILE:2:2}:${MACFILE:4:2}:${MACFILE:6:2}:${MACFILE:8:2}:${MACFILE:10:2}
[541ddee]86        # Renombra el fichero PXE original
87        [ -e ${PXEDIR[0]}/${PXEFILE[0]} ] && mv ${PXEDIR[0]}/${PXEFILE[0]} ${PXEDIR[0]}/${PXEFILE[0]}.netboot
88        [ -e ${PXEDIR[1]}/${PXEFILE[1]} ] && mv ${PXEDIR[1]}/${PXEFILE[1]} ${PXEDIR[1]}/${PXEFILE[1]}.netboot
89
[f80f839]90        if [ "$1" != "default" ]; then
[7fc01b9]91                # Si no está definida la variable LANG, usar idioma inglés por defecto.
92                [ -z "$LANG" -o "$LANG" == "C" ] && LANG="en"
93                # Obtener de la BD los parámetros de arranque asociados (separador es TAB).
[81b2ea1]94                DATOS=$(dbexec "
95SELECT ' LANG=$LANG',
96       ' ip=', CONCAT_WS(':', ordenadores.ip,
97           (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
98           aulas.router, aulas.netmask,
99           ordenadores.nombreordenador, ordenadores.netiface, 'none'),
100       ' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
101       ' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
102       ' oglive=', @serverip,
103       ' oglog=', @serverip,
104       ' ogshare=', @serverip,
105       ' oglivedir=', ordenadores.oglivedir,
106       ' ogprof=', IF(ordenadores.idordenador=aulas.idordprofesor, 'true', 'false'),
107       IF(perfileshard.descripcion<>'', CONCAT(' hardprofile=', REPLACE(TRIM(perfileshard.descripcion), ' ', '_')), ''),
108       IF(aulas.ntp<>'', CONCAT(' ogntp=', aulas.ntp), ''),
109       IF(aulas.dns<>'', CONCAT(' ogdns=', aulas.dns), ''),
110       IF(aulas.proxy<>'', CONCAT(' ogproxy=', aulas.proxy), ''),
111       IF(entidades.ogunit=1 AND NOT centros.directorio='', CONCAT(' ogunit=', centros.directorio), ''),
112       CASE
113           WHEN menus.resolucion IS NULL THEN ''
114           WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
115           WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
116           ELSE menus.resolucion
117       END
118  FROM ordenadores
119  JOIN aulas USING(idaula)
120  JOIN centros USING(idcentro)
121  JOIN entidades USING(identidad)
122  LEFT JOIN repositorios USING(idrepositorio)
123  LEFT JOIN perfileshard USING(idperfilhard)
124  LEFT JOIN menus USING(idmenu)
125 WHERE ordenadores.mac='$MAC';")
[9052b52]126                # Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
[f7f7a21]127                DATOS=$(echo ${DATOS//  /} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
[9052b52]128                [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
[ccda415]129                # Obtener directorio ogLive a partir de los datos.
130                OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
[178c3f6]131
132                # Pondremos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
[e371a87]133                WEBGROUP=$(ps axho group,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
[178c3f6]134                for BOOTTYPE in 0 1; do
135                        # Si no existe la plantilla borramos el archivo PXE anterior continuamos
136                        if [ -z "${TEMPLATE[$BOOTTYPE]}" ]; then
[292982d]137                                rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
[178c3f6]138                                continue
139                        fi
140                        # Comprobar si existe "oglivedir" en la plantilla para evitar duplicados.
141                        if grep -q "oglivedir=" ${TEMPLATE[$BOOTTYPE]} 2>/dev/null; then
142                                DATOSAUX="${DATOS/oglivedir=$OGLIVEDIR/}"
143                        fi
144                        # Renombra el fichero PXE original
[292982d]145                        [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot
[178c3f6]146
147                        # Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
[292982d]148                        sed -e "s,vga=[0-9]*,,g; s,INFOHOST,${DATOSAUX//,/\\,},g; s,set ISODIR=.*,set ISODIR=$OGLIVEDIR,g" ${TEMPLATE[$BOOTTYPE]} >${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
[e371a87]149                        [ -n "$WEBUSER" ] && chown $WEBUSER:$WEBGROUP ${PXEDIR[$BOOTTYPE]}/${PXEFILEE[$BOOTTYPE]}
[178c3f6]150                done
151
[ccbb493]152                # 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
[2da1991]153                if [ "$MODE" == "TEMP" ]; then
[ccbb493]154                        sleep 60
[178c3f6]155                        for BOOTTYPE in 0 1; do
[292982d]156                                [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
157                                [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
[178c3f6]158                        done
[ccbb493]159                fi
160
[178c3f6]161
[ccbb493]162                # Si el modo de trabajo es permanente (1)  borra el fichero PXE.netboot si existe y graba los datos en la base de datos
[2da1991]163                if [ "$MODE" == "PERM" ]; then
[292982d]164                        [ -e ${PXEDIR[0]}/${PXEFILE[0]}.netboot ] && rm ${PXEDIR[0]}/${PXEFILE[0]}.netboot
165                        [ -e ${PXEDIR[1]}/${PXEFILE[1]}.netboot ] && rm ${PXEDIR[1]}/${PXEFILE[1]}.netboot
[178c3f6]166                        # Si no existe la plantilla de tipo BIOS tomo el nombre de la UEFI
167                        [ -z "${TEMPLATE[0]}" ] && TEMPLATE[0]=${TEMPLATE[1]}
168
[81b2ea1]169                        dbexec "UPDATE ordenadores SET arranque='$(basename ${TEMPLATE[0]})' WHERE mac='$MAC';"
[ccbb493]170                fi
[61dbabb]171        fi
172        let NPC=NPC+1
173done
174date +"%b %d %T $PROG: $NPC equipo(s) configurado(s)" | tee -a $LOGFILE
[81b2ea1]175
Note: See TracBrowser for help on using the repository browser.