source: server/bin/setclientmode @ 0b856b4d

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 0b856b4d was 292982d, checked in by Irina Gómez <irinagomez@…>, 6 years ago

For UEFI the format of PXE filename is '01-'. Where is written in lowercase and split up with colon.

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