source: server/bin/setclientmode @ b485805

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 b485805 was 178c3f6, checked in by Irina Gómez <irinagomez@…>, 6 years ago

#802 setclientmode: Crea configuración PXE para BIOS y UEFI. Permite pasar la información de acceso a la base de datos en un fichero.

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