source: server/bin/setclientmode @ 12e1eef

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

#872: Code cleaning.

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