source: server/bin/setclientmode @ 9815cac

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-instalacionwebconsole3
Last change on this file since 9815cac was 2211576, checked in by ramon <ramongomez@…>, 7 years ago

#768 #828: Corregir erratas al crear plantillas PXE, evitando duplicado de directorio de ogLive y cadena NULL si no existe perfil de hardware.

git-svn-id: https://opengnsys.es/svn/branches/version1.1@5599 a21b9725-9963-47de-94b9-378ad31fedc9

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