source: server/bin/setclientmode @ 062ea34

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 062ea34 was 940b1c7f, checked in by Ramón M. Gómez <ramongomez@…>, 5 years ago

#816 856: Scripts setserveraddr and etclientmode` use common Shell function file.

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