source: server/bin/setclientmode @ d3cea20

918-git-images-111dconfigure-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 d3cea20 was 541ddee, checked in by Irina Gómez <irinagomez@…>, 5 years ago

#914 #811 setclientmode: Fix error for temporary change of PXE file. Adds permission to be call from console, for example with 'Ejecutar script' .

  • Property mode set to 100755
File size: 9.0 KB
RevLine 
[61dbabb]1#!/bin/bash
[ccbb493]2
3#/**
[940b1c7f]4#@file    setclientmode
[ccbb493]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.
[940b1c7f]6#@usage   setclientmode Plantilla Ambito Modo
[ccbb493]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.
[940b1c7f]8#@param   Plantilla: nombre de plantilla PXE
9#@param   Ambito: nombre de cliente o aula
10#@param   Modo: "TEMP" (temporal) o "PERM" (permanente)
[ccbb493]11#@version 1.0 - Versión inicial.
12#@author  Irina Gomez y Ramon Gomez - Univ. Sevilla, noviembre 2010
[3dd7b5d]13#@version 1.0.1 - Identificacion de la plantilla por nombre en consola = en primera linea de la plantilla
[ccbb493]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
[0c86fb7]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
[e528cb6]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).
[38fb4a8]23#@author  Antonio J. Doblas Viso, Universidad de Malaga
24#@date    2018-07-11
[25d4404]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)
[178c3f6]26#@author  Irina Gomez, ETSII Universidad de Sevilla
27#@date    2019-02-13
[ccbb493]28#*/ ##
[61dbabb]29
30# Variables.
31PROG=$(basename $0)
32OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
[25d4404]33SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
[178c3f6]34PXEDIR[0]=$OPENGNSYS/tftpboot/menu.lst
35PXEDIR[1]=$OPENGNSYS/tftpboot/grub
[61dbabb]36LOGFILE=$OPENGNSYS/log/opengnsys.log
[4ea07d1]37MYCNF=/tmp/.my.cnf.$$
[61dbabb]38
[940b1c7f]39source $OPENGNSYS/lib/ogfunctions.sh
[292982d]40
[940b1c7f]41# Mostrar ayuda.
42[ "$*" == "help" ] && help
[61dbabb]43# Control básico de errores.
[940b1c7f]44[ $# -ne 3 ] && raiseError usage
[e371a87]45# Comprobar si el usuario es "root" o el del servicio web.
46WEBUSER=$(ps axho user,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
[541ddee]47CALLER=$(getCaller)
48[ "$USER" != "root" -a "$USER" != "$WEBUSER" -a "$CALLER" != "ogAdmServerAux" ] && raiseError access "Need to be root (or webserver user)"
[25d4404]49# El acceso a mysql por las variables pasadas o por el fichero de configuarción.
50if  [ -z "$USUARIO" ] || [ -z "$PASSWORD" ] || [ -z "$CATALOG" ]; then
[940b1c7f]51        [ ! -r "$SERVERCONF" ] && raiseError access "Cannot read access configuration file"
52        source $SERVERCONF
[61dbabb]53fi
[940b1c7f]54TEMPLATE[0]=$(grep -l "^#.* $1 *$" ${PXEDIR[0]}/templates/* 2>/dev/null)
55TEMPLATE[1]=$(grep -l "^#.* $1 *$" ${PXEDIR[1]}/templates/* 2>/dev/null)
56[ -z "${TEMPLATE[0]}${TEMPLATE[1]}" ] && raiseError notfound "PXE template file \"$1\""
[178c3f6]57
[4d5cafd]58case "${3^^}" in
[2da1991]59        0|TEMP) MODE="TEMP" ;;
60        1|PERM) MODE="PERM" ;;
[940b1c7f]61        *)      raiseError notfound "Unknown mode \"$3\"" ;;
[2da1991]62esac
[ccbb493]63
[75f9c01]64# Sustituir caracteres ' por \' para evitar inyección SQL.
65BOOTMODE="${1//\'/\'}"
66RESOURCE="${2//\'/\'}"
[4ea07d1]67# Componer fichero con credenciales de conexión.
68touch $MYCNF
69chmod 600 $MYCNF
70cat << EOT > $MYCNF
71[client]
72user=$USUARIO
73password=$PASSWORD
74EOT
75# Borrar el fichero temporal si termina el proceso.
76trap "rm -f $MYCNF" 0 1 2 3 6 9 15
77# Buscar ordenador individual o todos los de una aula.
[9d380ec]78ETHERNET=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[4ea07d1]79                "SELECT mac FROM ordenadores
80                   JOIN aulas USING (idaula)
81                  WHERE aulas.nombreaula='$RESOURCE'
82                     OR nombreordenador='$RESOURCE';")
[61dbabb]83if [ -z "$ETHERNET" ]; then
[940b1c7f]84        date +"%b %d %T $PROG: No existe aula o equipo con el nombre \"$2\"" >> $LOGFILE
85        raiseError notfound "Client or lab name \"$2\""
[61dbabb]86fi
87
[75a296b]88# Copiar fichero de configuración y actualizar base de datos.
[2da1991]89date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
[61dbabb]90NPC=0
[4ea07d1]91for MAC in $ETHERNET; do
92        date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
[7b3dc7a]93        MACFILE="${MAC^^}"
[292982d]94        PXEFILE[0]=01-${MACFILE:0:2}-${MACFILE:2:2}-${MACFILE:4:2}-${MACFILE:6:2}-${MACFILE:8:2}-${MACFILE:10:2}
95        MACFILE="${MAC,,}"
96        PXEFILE[1]=01-${MACFILE:0:2}:${MACFILE:2:2}:${MACFILE:4:2}:${MACFILE:6:2}:${MACFILE:8:2}:${MACFILE:10:2}
[541ddee]97        # Renombra el fichero PXE original
98        [ -e ${PXEDIR[0]}/${PXEFILE[0]} ] && mv ${PXEDIR[0]}/${PXEFILE[0]} ${PXEDIR[0]}/${PXEFILE[0]}.netboot
99        [ -e ${PXEDIR[1]}/${PXEFILE[1]} ] && mv ${PXEDIR[1]}/${PXEFILE[1]} ${PXEDIR[1]}/${PXEFILE[1]}.netboot
100
[f80f839]101        if [ "$1" != "default" ]; then
[7fc01b9]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).
[9d380ec]105                DATOS=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[7fc01b9]106                        "SELECT ' LANG=$LANG',
[f7f7a21]107                                ' ip=', CONCAT_WS(':', ordenadores.ip,
[25bb3d1]108                                    (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
109                                    aulas.router, aulas.netmask,
110                                    ordenadores.nombreordenador, ordenadores.netiface, 'none'),
[f7f7a21]111                                ' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
[6449e04]112                                ' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
[38fb4a8]113                                ' oglive=', @serverip,
114                                ' oglog=', @serverip,
[d92da89]115                                ' ogshare=', @serverip,
[ccda415]116                                ' oglivedir=', ordenadores.oglivedir,
[25bb3d1]117                                ' ogprof=', IF(ordenadores.idordenador=aulas.idordprofesor, 'true', 'false'),
[2211576]118                                IF(perfileshard.descripcion<>'', CONCAT(' hardprofile=', REPLACE(TRIM(perfileshard.descripcion), ' ', '_')), ''),
119                                IF(aulas.ntp<>'', CONCAT(' ogntp=', aulas.ntp), ''),
120                                IF(aulas.dns<>'', CONCAT(' ogdns=', aulas.dns), ''),
121                                IF(aulas.proxy<>'', CONCAT(' ogproxy=', aulas.proxy), ''),
122                                IF(entidades.ogunit=1 AND NOT centros.directorio='', CONCAT(' ogunit=', centros.directorio), ''),
[97f6020]123                                CASE
124                                    WHEN menus.resolucion IS NULL THEN ''
[f7f7a21]125                                    WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
126                                    WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
[97f6020]127                                    ELSE menus.resolucion
128                                END
[d16b7cf]129                                FROM ordenadores
[f7f7a21]130                                JOIN aulas USING(idaula)
131                                JOIN centros USING(idcentro)
132                                JOIN entidades USING(identidad)
[6449e04]133                                LEFT JOIN repositorios USING(idrepositorio)
[f7f7a21]134                                LEFT JOIN perfileshard USING(idperfilhard)
135                                LEFT JOIN menus USING(idmenu)
[4ea07d1]136                                WHERE ordenadores.mac='$MAC';")
[9052b52]137                # Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
[f7f7a21]138                DATOS=$(echo ${DATOS//  /} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
[9052b52]139                [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
[ccda415]140                # Obtener directorio ogLive a partir de los datos.
141                OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
[178c3f6]142
143                # Pondremos como propietario al usuario y grupo de Apache para que se pueda cambiar desde la consola web.
[e371a87]144                WEBGROUP=$(ps axho group,comm|awk '!/root/ && /httpd|apache/ {print $1; exit;}')
[178c3f6]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
[292982d]148                                rm ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}
[178c3f6]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
[292982d]156                        [ -e ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ] && mv ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]} ${PXEDIR[$BOOTTYPE]}/${PXEFILE[$BOOTTYPE]}.netboot
[178c3f6]157
158                        # Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
[292982d]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]}
[e371a87]160                        [ -n "$WEBUSER" ] && chown $WEBUSER:$WEBGROUP ${PXEDIR[$BOOTTYPE]}/${PXEFILEE[$BOOTTYPE]}
[178c3f6]161                done
162
163
[ccbb493]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
[2da1991]165                if [ "$MODE" == "TEMP" ]; then
[ccbb493]166                        sleep 60
[178c3f6]167                        for BOOTTYPE in 0 1; do
[292982d]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]}
[178c3f6]170                        done
[ccbb493]171                fi
172
[178c3f6]173
[ccbb493]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
[2da1991]175                if [ "$MODE" == "PERM" ]; then
[292982d]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
[178c3f6]178                        # Si no existe la plantilla de tipo BIOS tomo el nombre de la UEFI
179                        [ -z "${TEMPLATE[0]}" ] && TEMPLATE[0]=${TEMPLATE[1]}
180
[ccbb493]181                        mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
[178c3f6]182                                "UPDATE ordenadores SET arranque='$(basename ${TEMPLATE[0]})' WHERE mac='$MAC';"
[ccbb493]183                fi
[61dbabb]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.