source: server/bin/setclientmode @ e378505

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacion
Last change on this file since e378505 was 25d4404, checked in by Irina Gómez <irinagomez@…>, 6 years ago

#802 Advanced Boot Management sends to 'sendclientmode' script access data to the database as environment variables.

  • Property mode set to 100755
File size: 8.5 KB
Line 
1#!/bin/bash
2
3#/**
4#         setclientmode NombrePlatilla { NombrePC | NombreAula } Modo_trabajo
5#@file    setclientmode
6#@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.
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.
8#@param   $1 NombrePlatilla
9#@param   $2 Ámbito { NombrePC | NombreAula }
10#@param   $3 Modo_trabajo = { 0, TEMP, 1, PERM } - 0 si es temporal y 1 si es permanente.
11#@version 1.0 - Versión inicial.
12#@author  Irina Gomez y Ramon Gomez - Univ. Sevilla, noviembre 2010
13#@version 1.0.1 - Identificacion de la plantilla por nombre en consola = en primera linea de la plantilla
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
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
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).
23#@author  Antonio J. Doblas Viso, Universidad de Malaga
24#@date    2018-07-11
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)
26#@author  Irina Gomez, ETSII Universidad de Sevilla
27#@date    2019-02-13
28#*/ ##
29
30# Variables.
31PROG=$(basename $0)
32OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
33SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
34PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
35PXEDIR[1]=$OPENGNSYS/tftpboot/grub
36LOGFILE=$OPENGNSYS/log/opengnsys.log
37MYCNF=/tmp/.my.cnf.$$
38
39
40# Control básico de errores.
41if [ $# -ne 3 -a $# -ne 4 ]; then
42        echo "$PROG: Error de ejecución"
43        echo "Formato: $PROG PLANTILLA [NOMBRE_PC|NOMBRE_AULA] MODO [ BD_CONF ]"
44        exit 1
45fi
46# El acceso a mysql por las variables pasadas o por el fichero de configuarción.
47if  [ -z "$USUARIO" ] || [ -z "$PASSWORD" ] || [ -z "$CATALOG" ]; then
48        if [ -r "$SERVERCONF" ]; then
49            source $SERVERCONF
50        else
51            echo "$PROG: Sin acceso a fichero de configuración"
52            exit 2
53        fi
54fi
55TEMPLATE[0]=$(grep -l "^#.* $1 *$" ${PXEDIR[0]}/templates/*)
56TEMPLATE[1]=$(grep -l "^#.* $1 *$" ${PXEDIR[1]}/templates/*)
57if [ -z "${TEMPLATE[0]}" -a -z "${TEMPLATE[1]}" ]; then
58        echo "No existe archivo platilla: $1"
59        exit
60fi
61
62case "$3" in
63        0|TEMP) MODE="TEMP" ;;
64        1|PERM) MODE="PERM" ;;
65        *)      echo "$PROG: Modo desconodido: 0, TEMP (temporal), 1, PERM (permanente)"
66                exit 1 ;;
67esac
68
69# Sustituir caracteres ' por \' para evitar inyección SQL.
70BOOTMODE="${1//\'/\'}"
71RESOURCE="${2//\'/\'}"
72# Componer fichero con credenciales de conexión.
73touch $MYCNF
74chmod 600 $MYCNF
75cat << EOT > $MYCNF
76[client]
77user=$USUARIO
78password=$PASSWORD
79EOT
80# Borrar el fichero temporal si termina el proceso.
81trap "rm -f $MYCNF" 0 1 2 3 6 9 15
82# Buscar ordenador individual o todos los de una aula.
83ETHERNET=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
84                "SELECT mac FROM ordenadores
85                   JOIN aulas USING (idaula)
86                  WHERE aulas.nombreaula='$RESOURCE'
87                     OR nombreordenador='$RESOURCE';")
88if [ -z "$ETHERNET" ]; then
89        date +"%b %d %T $PROG: No existe aula o equipo con el nombre \"$2\"" | tee -a $LOGFILE
90        exit 1
91fi
92
93# Copiar fichero de configuración y actualizar base de datos.
94date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
95NPC=0
96for MAC in $ETHERNET; do
97        date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
98        MACFILE="${MAC^^}"
99        PXEFILE[0]=01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
100        MACFILE="${MAC,,}"
101        PXEFILE[1]=01-${MACFILE:0:2}:${MACFILE:2:2}:${MACFILE:4:2}:${MACFILE:6:2}:${MACFILE:8:2}:${MACFILE:10:2}
102        if [ "$1" != "default" ]; then
103                # Si no está definida la variable LANG, usar idioma inglés por defecto.
104                [ -z "$LANG" -o "$LANG" == "C" ] && LANG="en"
105                # Obtener de la BD los parámetros de arranque asociados (separador es TAB).
106                DATOS=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
107                        "SELECT ' LANG=$LANG',
108                                ' ip=', CONCAT_WS(':', ordenadores.ip,
109                                (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
110                                aulas.router, aulas.netmask,
111                                ordenadores.nombreordenador, ordenadores.netiface, 'none'),
112                                ' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
113                                ' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
114                                ' oglive=', @serverip,
115                                ' oglog=', @serverip,
116                                ' ogshare=', @serverip,
117                                ' oglivedir=', ordenadores.oglivedir,
118                                IF(perfileshard.descripcion<>'', CONCAT(' hardprofile=', REPLACE(TRIM(perfileshard.descripcion), ' ', '_')), ''),
119                                IF(aulas.ntp<>'', CONCAT(' ogntp=', aulas.ntp), ''),
120                                IF(aulas.dns<>'', CONCAT(' ogdns=', aulas.dns), ''),
121                                IF(aulas.proxy<>'', CONCAT(' ogproxy=', aulas.proxy), ''),
122                                IF(entidades.ogunit=1 AND NOT centros.directorio='', CONCAT(' ogunit=', centros.directorio), ''),
123                                CASE
124                                    WHEN menus.resolucion IS NULL THEN ''
125                                    WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
126                                    WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
127                                    ELSE menus.resolucion
128                                END
129                                FROM ordenadores
130                                JOIN aulas USING(idaula)
131                                JOIN centros USING(idcentro)
132                                JOIN entidades USING(identidad)
133                                LEFT JOIN repositorios USING(idrepositorio)
134                                LEFT JOIN perfileshard USING(idperfilhard)
135                                LEFT JOIN menus USING(idmenu)
136                                WHERE ordenadores.mac='$MAC';")
137                # Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
138                DATOS=$(echo ${DATOS//  /} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
139                [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
140                # Obtener directorio ogLive a partir de los datos.
141                OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
142
143                # Pondremos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
144                PERMS=$(ps axho user,group,comm|awk '!/root/ && /httpd|apache/ {u=$1; g=$2} END {if (g) printf "%s:%s",u,g}')
145
146                for BOOTTYPE in 0 1; do
147                        # Si no existe la plantilla borramos el archivo PXE anterior continuamos
148                        if [ -z "${TEMPLATE[$BOOTTYPE]}" ]; then
149                                rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
150                                continue
151                        fi
152                        # Comprobar si existe "oglivedir" en la plantilla para evitar duplicados.
153                        if grep -q "oglivedir=" ${TEMPLATE[$BOOTTYPE]} 2>/dev/null; then
154                                DATOSAUX="${DATOS/oglivedir=$OGLIVEDIR/}"
155                        fi
156                        # Renombra el fichero PXE original
157                        [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot
158
159                        # Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
160                        sed -e "s,vga=[0-9]*,,g; s,INFOHOST,${DATOSAUX//,/\\,},g; s,set ISODIR=.*,set ISODIR=$OGLIVEDIR,g" ${TEMPLATE[$BOOTTYPE]} >${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
161                        [ -n "$PERMS" ] && chown $PERMS ${PXEDIR[$BOOTTYPE]}/${PXEFILEE[$BOOTTYPE]}
162                done
163
164
165                # 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
166                if [ "$MODE" == "TEMP" ]; then
167                        sleep 60
168                        for BOOTTYPE in 0 1; do
169                                [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
170                                [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
171                        done
172                fi
173
174
175                # Si el modo de trabajo es permanente (1)  borra el fichero PXE.netboot si existe y graba los datos en la base de datos
176                if [ "$MODE" == "PERM" ]; then
177                        [ -e ${PXEDIR[0]}/${PXEFILE[0]}.netboot ] && rm ${PXEDIR[0]}/${PXEFILE[0]}.netboot
178                        [ -e ${PXEDIR[1]}/${PXEFILE[1]}.netboot ] && rm ${PXEDIR[1]}/${PXEFILE[1]}.netboot
179                        # Si no existe la plantilla de tipo BIOS tomo el nombre de la UEFI
180                        [ -z "${TEMPLATE[0]}" ] && TEMPLATE[0]=${TEMPLATE[1]}
181
182                        mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
183                                "UPDATE ordenadores SET arranque='$(basename ${TEMPLATE[0]})' WHERE mac='$MAC';"
184                fi
185        fi
186        let NPC=NPC+1
187done
188date +"%b %d %T $PROG: $NPC equipo(s) configurado(s)" | tee -a $LOGFILE
Note: See TracBrowser for help on using the repository browser.