source: server/bin/setclientmode @ e371a87

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 e371a87 was e371a87, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#802 #888 setclientmode: fix web user detection.

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