source: server/bin/setclientmode @ 831de70

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 831de70 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
RevLine 
[61dbabb]1#!/bin/bash
[ccbb493]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.
[0c86fb7]8#@param   $1 NombrePlatilla
9#@param   $2 Ámbito { NombrePC | NombreAula }
[2da1991]10#@param   $3 Modo_trabajo = { 0, TEMP, 1, PERM } - 0 si es temporal y 1 si es permanente.
[178c3f6]11#@param   $4 Fichero con los datos de acceso a la base de datos (USUARIO, PASSWORD, datasource y CATALOG).
[ccbb493]12#@version 1.0 - Versión inicial.
13#@author  Irina Gomez y Ramon Gomez - Univ. Sevilla, noviembre 2010
[3dd7b5d]14#@version 1.0.1 - Identificacion de la plantilla por nombre en consola = en primera linea de la plantilla
[ccbb493]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
[0c86fb7]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
[e528cb6]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).
[38fb4a8]24#@author  Antonio J. Doblas Viso, Universidad de Malaga
25#@date    2018-07-11
[178c3f6]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
[ccbb493]29#*/ ##
[61dbabb]30
31# Variables.
32PROG=$(basename $0)
33OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
[178c3f6]34SERVERCONF="$4"
35SERVERCONF=${SERVERCONF:-$OPENGNSYS/etc/ogAdmServer.cfg}
36PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
37PXEDIR[1]=$OPENGNSYS/tftpboot/grub
[61dbabb]38LOGFILE=$OPENGNSYS/log/opengnsys.log
[4ea07d1]39MYCNF=/tmp/.my.cnf.$$
[61dbabb]40
41# Control básico de errores.
[178c3f6]42if [ $# -ne 3 -a $# -ne 4 ]; then
[61dbabb]43        echo "$PROG: Error de ejecución"
[178c3f6]44        echo "Formato: $PROG PLANTILLA [NOMBRE_PC|NOMBRE_AULA] MODO [ BD_CONF ]"
[61dbabb]45        exit 1
46fi
47if [ ! -r $SERVERCONF ]; then
48        echo "$PROG: Sin acceso a fichero de configuración"
49        exit 2
50fi
[178c3f6]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
[3dd7b5d]54        echo "No existe archivo platilla: $1"
[61dbabb]55        exit
56fi
[178c3f6]57
[2da1991]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
[ccbb493]64
[61dbabb]65# Obtener datos de acceso a la Base de datos.
66source $SERVERCONF
[75f9c01]67# Sustituir caracteres ' por \' para evitar inyección SQL.
68BOOTMODE="${1//\'/\'}"
69RESOURCE="${2//\'/\'}"
[4ea07d1]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.
[9d380ec]81ETHERNET=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[4ea07d1]82                "SELECT mac FROM ordenadores
83                   JOIN aulas USING (idaula)
84                  WHERE aulas.nombreaula='$RESOURCE'
85                     OR nombreordenador='$RESOURCE';")
[61dbabb]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
[75a296b]91# Copiar fichero de configuración y actualizar base de datos.
[2da1991]92date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
[61dbabb]93NPC=0
[4ea07d1]94for MAC in $ETHERNET; do
95        date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
[7b3dc7a]96        MACFILE="${MAC^^}"
[178c3f6]97        PXEFILE=01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
[f80f839]98        if [ "$1" != "default" ]; then
[7fc01b9]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).
[9d380ec]102                DATOS=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[7fc01b9]103                        "SELECT ' LANG=$LANG',
[f7f7a21]104                                ' ip=', CONCAT_WS(':', ordenadores.ip,
[e528cb6]105                                (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
106                                aulas.router, aulas.netmask,
[d92da89]107                                ordenadores.nombreordenador, ordenadores.netiface, 'none'),
[f7f7a21]108                                ' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
[6449e04]109                                ' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
[38fb4a8]110                                ' oglive=', @serverip,
111                                ' oglog=', @serverip,
[d92da89]112                                ' ogshare=', @serverip,
[ccda415]113                                ' oglivedir=', ordenadores.oglivedir,
[2211576]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), ''),
[97f6020]119                                CASE
120                                    WHEN menus.resolucion IS NULL THEN ''
[f7f7a21]121                                    WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
122                                    WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
[97f6020]123                                    ELSE menus.resolucion
124                                END
[d16b7cf]125                                FROM ordenadores
[f7f7a21]126                                JOIN aulas USING(idaula)
127                                JOIN centros USING(idcentro)
128                                JOIN entidades USING(identidad)
[6449e04]129                                LEFT JOIN repositorios USING(idrepositorio)
[f7f7a21]130                                LEFT JOIN perfileshard USING(idperfilhard)
131                                LEFT JOIN menus USING(idmenu)
[4ea07d1]132                                WHERE ordenadores.mac='$MAC';")
[9052b52]133                # Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
[f7f7a21]134                DATOS=$(echo ${DATOS//  /} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
[9052b52]135                [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
[ccda415]136                # Obtener directorio ogLive a partir de los datos.
137                OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
[178c3f6]138
139                # Pondremos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
[9ea18d37]140                PERMS=$(ps axho user,group,comm|awk '!/root/ && /httpd|apache/ {u=$1; g=$2} END {if (g) printf "%s:%s",u,g}')
[178c3f6]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
[ccbb493]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
[2da1991]162                if [ "$MODE" == "TEMP" ]; then
[ccbb493]163                        sleep 60
[178c3f6]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
[ccbb493]168                fi
169
[178c3f6]170
[ccbb493]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
[2da1991]172                if [ "$MODE" == "PERM" ]; then
[178c3f6]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
[ccbb493]178                        mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
[178c3f6]179                                "UPDATE ordenadores SET arranque='$(basename ${TEMPLATE[0]})' WHERE mac='$MAC';"
[ccbb493]180                fi
[61dbabb]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.