source: server/bin/setclientmode @ 8ca0cc9

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 8ca0cc9 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
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
[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
[ccbb493]25#*/ ##
[61dbabb]26
27
28# Variables.
29PROG=$(basename $0)
30OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
31SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg
[75a296b]32PXEDIR=$OPENGNSYS/tftpboot/menu.lst
[61dbabb]33LOGFILE=$OPENGNSYS/log/opengnsys.log
[4ea07d1]34MYCNF=/tmp/.my.cnf.$$
[61dbabb]35
36# Control básico de errores.
[ccbb493]37if [ $# -ne 3 ]; then
[61dbabb]38        echo "$PROG: Error de ejecución"
[ccbb493]39        echo "Formato: $PROG PLANTILLA [NOMBRE_PC|NOMBRE_AULA] MODO"
[61dbabb]40        exit 1
41fi
42if [ ! -r $SERVERCONF ]; then
43        echo "$PROG: Sin acceso a fichero de configuración"
44        exit 2
45fi
[7710a99]46TEMPLATE=$(grep -l "^#.* $1 *$" $PXEDIR/templates/*)
[3dd7b5d]47if [ -z "$TEMPLATE" ]; then
48        echo "No existe archivo platilla: $1"
[61dbabb]49        exit
50fi
[2da1991]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
[ccbb493]57
[61dbabb]58# Obtener datos de acceso a la Base de datos.
59source $SERVERCONF
[75f9c01]60# Sustituir caracteres ' por \' para evitar inyección SQL.
61BOOTMODE="${1//\'/\'}"
62RESOURCE="${2//\'/\'}"
[4ea07d1]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.
[9d380ec]74ETHERNET=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[4ea07d1]75                "SELECT mac FROM ordenadores
76                   JOIN aulas USING (idaula)
77                  WHERE aulas.nombreaula='$RESOURCE'
78                     OR nombreordenador='$RESOURCE';")
[61dbabb]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
[75a296b]84# Copiar fichero de configuración y actualizar base de datos.
[2da1991]85date +"%b %d %T $PROG: Configurando \"$1\" en \"$2\" en modo \"$MODE\"" | tee -a $LOGFILE
[61dbabb]86NPC=0
[4ea07d1]87for MAC in $ETHERNET; do
88        date +"%b %d %T $PROG: Detectada ethernet \"$MAC\" en \"$2\"" | tee -a $LOGFILE
[7b3dc7a]89        MACFILE="${MAC^^}"
[ccbb493]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
[f80f839]93        if [ "$1" != "default" ]; then
[7fc01b9]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).
[9d380ec]97                DATOS=$(mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
[7fc01b9]98                        "SELECT ' LANG=$LANG',
[f7f7a21]99                                ' ip=', CONCAT_WS(':', ordenadores.ip,
[e528cb6]100                                (SELECT (@serverip:=ipserveradm) FROM entornos LIMIT 1),
101                                aulas.router, aulas.netmask,
[d92da89]102                                ordenadores.nombreordenador, ordenadores.netiface, 'none'),
[f7f7a21]103                                ' group=', REPLACE(TRIM(aulas.nombreaula), ' ', '_'),
[6449e04]104                                ' ogrepo=', (@repoip:=IFNULL(repositorios.ip, '')),
[38fb4a8]105                                ' oglive=', @serverip,
106                                ' oglog=', @serverip,
[d92da89]107                                ' ogshare=', @serverip,
[ccda415]108                                ' oglivedir=', ordenadores.oglivedir,
[2211576]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), ''),
[97f6020]114                                CASE
115                                    WHEN menus.resolucion IS NULL THEN ''
[f7f7a21]116                                    WHEN menus.resolucion <= '999' THEN CONCAT(' vga=', menus.resolucion)
117                                    WHEN menus.resolucion LIKE '%:%' THEN CONCAT(' video=', menus.resolucion)
[97f6020]118                                    ELSE menus.resolucion
119                                END
[d16b7cf]120                                FROM ordenadores
[f7f7a21]121                                JOIN aulas USING(idaula)
122                                JOIN centros USING(idcentro)
123                                JOIN entidades USING(identidad)
[6449e04]124                                LEFT JOIN repositorios USING(idrepositorio)
[f7f7a21]125                                LEFT JOIN perfileshard USING(idperfilhard)
126                                LEFT JOIN menus USING(idmenu)
[4ea07d1]127                                WHERE ordenadores.mac='$MAC';")
[9052b52]128                # Quitar tabuladores, sustituir acentos y dejar resolución por defecto.
[f7f7a21]129                DATOS=$(echo ${DATOS//  /} | tr 'áéíóúñçÁÉÍÓÚÑÇ' 'aeiouncAEIOUNC')
[9052b52]130                [[ "$DATOS" =~ (vga|video) ]] || DATOS="$DATOS vga=788"
[ccda415]131                # Obtener directorio ogLive a partir de los datos.
132                OGLIVEDIR=$(echo "$DATOS" | awk -F= 'BEGIN {RS=" "} $1=="oglivedir" {print $2}')
[2211576]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
[7fc01b9]137                # Crear fichero PXE a partir de la plantilla con los datos obtenidos en la BD.
[ccda415]138                sed -e "s,vga=[0-9]*,,g; s,INFOHOST,${DATOS//,/\\,},g; s,set ISODIR=.*,set ISODIR=$OGLIVEDIR,g" $TEMPLATE >$PXEFILE
[9ea18d37]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}')
[ccbb493]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
[2da1991]143                if [ "$MODE" == "TEMP" ]; then
[ccbb493]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
[2da1991]150                if [ "$MODE" == "PERM" ]; then
[ccbb493]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
[61dbabb]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.