source: installer/opengnsys_import.sh @ 560358b

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 560358b was d661fb5, checked in by Irina Gómez <irinagomez@…>, 6 years ago

#802 #888 PXE templates support EFI partition in whichever partition. Example template for boot with grub.

  • Property mode set to 100755
File size: 14.3 KB
Line 
1#!/bin/bash
2#         importclient str_backupfile
3#@file    importclient
4#@brief   Importa los datos de OpenGnsys de un archivo de backup: dhcp, pxe, páginas de inicio y configuración de la consola.
5#@param 1 str_backupfile fichero de backup (creado con exportclient)
6#@exception 1 Error de formato
7#@exception 2 Sólo ejecutable por usuario root
8#@exception 3 Sin acceso al fichero de backup
9#@exception 4 Sin acceso a la configuración de OpenGnsys
10#@exception 5 Errores al importar o exportar de la bd auxiliar
11#@exception 6 Errores al importar los archivos de actualización de la BD desde opengnsys.es
12#@exception 7 El archivo de backup ha sido crearo con una versión incompatible de opengnsys_export. Usar 1.1.0-5594 o posterior.
13#@note En las versiones de desarrollo (pre) no se modifica la estructura de la base de datos.
14#@version 1.1.0 - Versión inicial.
15#@author  Irina Gómez - ETSII Univ. Sevilla
16#@date    2016-10-18
17#@version 1.1.0 - Permite importar de versiones de OpenGnsys anteriores. Cambia la importación de la base de datos.
18#@note    Incompatible con versiones de opengnsys_export.sh anteriores a esta fecha.
19#@date    2018-02-14
20#@version 1.1.1 - Importamos scripts Custom, PXE para UEFI y /etc/default/opengnsys.
21#@date    2019-07-18
22#*/ ##
23
24# Variables globales.
25PROG="$(basename $0)"
26
27DATE=$(date +%Y%m%d)
28BACKUPFILE=$1
29TMPDIR=/tmp/opengnsys_export
30OPENGNSYS="/opt/opengnsys"
31MYCNF=$(mktemp /tmp/.my.cnf.XXXXX)
32CATALOG="ogAdmBD"
33AUXCATALOG="og_import"
34MYSQLFILE="$TMPDIR/$CATALOG.sql"
35MYSQLBCK="$OPENGNSYS/doc/$CATALOG.sql-$DATE"
36
37LOG_FILE=$OPENGNSYS/log/${PROG%.sh}.log
38BRANCH="branches/devel"
39SVN_URL="https://github.com/opengnsys/OpenGnsys/$BRANCH/admin/Database"
40DEFAULT_MYSQL_ROOT_PASSWORD="passwordroot"      # Clave por defecto root de MySQL
41
42# Si se solicita, mostrar ayuda.
43if [ "$*" == "help" ]; then
44    echo -e "$PROG: Importa los datos de OpenGnsys desde un archivo de backup:" \
45           " dhcp, pxe, páginas de inicio y configuración de la consola.\n" \
46           "    Formato: $PROG backup_file\n" \
47           "    Ejemplo: $PROG backup.tgz"
48    exit
49fi
50
51# Comprobamos número de parámetros
52if [ $# -ne 1 ]; then
53    echo "$PROG: ERROR: Error de formato: $PROG backup_file"
54    exit 1
55fi
56
57# Comprobar parámetros.
58if [ "$USER" != "root" ]; then
59        echo "$PROG: Error: solo ejecutable por root." >&2
60        exit 2
61fi
62
63# Comprobamos acceso al fichero de backup
64if ! [ -r $BACKUPFILE ]; then
65    echo "$PROG: ERROR: Sin acceso al fichero de backup." | tee -a $FILESAL
66    exit 3
67fi
68
69# Comprobamos  acceso a ficheros de configuración
70if ! [ -r $OPENGNSYS/etc/ogAdmServer.cfg ]; then
71    echo "$PROG: ERROR: Sin acceso a la configuración de OpenGnsys." | tee -a $FILESAL
72    exit 4
73fi
74
75# Si existe el directorio auxiliar lo borramos
76[ -d $TMPDIR ] && rm -rf $TMPDIR
77
78####### Funciones ##############################################
79# Al salir elimina archivos y base de datos temporal
80function clean()
81{
82        mysql --defaults-extra-file=$MYCNF  -e "DROP DATABASE IF EXISTS $AUXCATALOG"
83        rm -f $MYCNF
84}
85
86function getDateTime()
87{
88        date "+%Y%m%d-%H%M%S"
89}
90
91# Escribe a fichero y muestra por pantalla
92function echoAndLog()
93{
94        echo "      $1"
95        DATETIME=`getDateTime`
96        echo "$DATETIME;$SSH_CLIENT;$1" >> $LOG_FILE
97}
98
99function errorAndLog()
100{
101        echo "      ERROR: $1"
102        DATETIME=`getDateTime`
103        echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE
104}
105
106function mysqlPassword()
107{
108    # Clave root de MySQL
109    while : ; do
110        echo -n -e "\\nEnter root password for MySQL (${DEFAULT_MYSQL_ROOT_PASSWORD}): ";
111        read -r MYSQL_ROOT_PASSWORD
112        if [ -n "${MYSQL_ROOT_PASSWORD//[a-zA-Z0-9]/}" ]; then # Comprobamos que sea un valor alfanumerico
113                echo -e "\\aERROR: Must be alphanumeric, try again..."
114        else
115                # Si esta vacio ponemos el valor por defecto
116                MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-$DEFAULT_MYSQL_ROOT_PASSWORD}"
117                break
118        fi
119    done
120    cat << EOT > $MYCNF
121[client]
122user=root
123password=$MYSQL_ROOT_PASSWORD
124EOT
125}
126
127# Actualización incremental de la BD (versión actual a actual+1, hasta final-1 a final).
128function updateSqlFile()
129{
130        local DBDIR="$TMPDIR/Database"
131        local file FILES=""
132
133        echoAndLog "${FUNCNAME}(): looking for database updates"
134        pushd $DBDIR >/dev/null
135        # Bucle de actualización incremental desde versión actual a la final.
136        for file in $CATALOG-*-*.sql; do
137                case "$file" in
138                        $CATALOG-$OLDVERSION-$NEWVERSION.sql)
139                                # Actualización única de versión inicial y final.
140                                FILES="$FILES $file"
141                                break
142                                ;;
143                        $CATALOG-*-postinst.sql)
144                                # Ignorar fichero específico de post-instalación.
145                                ;;
146                        $CATALOG-$OLDVERSION-*.sql)
147                                # Actualización de versión n a n+1.
148                                FILES="$FILES $file"
149                                OLDVERSION="$(echo $file | cut -f3 -d-)"
150                                ;;
151                        $CATALOG-*-$NEWVERSION.sql)
152                                # Última actualización de versión final-1 a final.
153                                if [ -n "$FILES" ]; then
154                                        FILES="$FILES $file"
155                                        break
156                                fi
157                                ;;
158                esac
159        done
160        # Aplicar posible actualización propia para la versión final.
161        file=$CATALOG-$NEWVERSION.sql
162        if [ -n "$FILES" -o "$OLDVERSION" = "$NEWVERSION" ] && [ -r $file ]; then
163                FILES="$FILES $file"
164        fi
165
166        popd >/dev/null
167        if [ -n "$FILES" ]; then
168                mysql --defaults-extra-file=$MYCNF  -e "CREATE DATABASE $AUXCATALOG"
169                [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't create database $AUXCATALOG" && exit 5
170                mysql --defaults-extra-file=$MYCNF -D "$AUXCATALOG" < $MYSQLFILE &>/dev/null
171                [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't import $MYSQLFILE in  $AUXCATALOG" && exit 5
172
173                for file in $FILES; do
174                        importSqlFile $DBDIR/$file
175                done
176
177                cp $MYSQLFILE $MYSQLFILE.backup
178                mysqldump --defaults-extra-file=$MYCNF --opt $AUXCATALOG > $MYSQLFILE
179                [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't export  $AUXCATALOG in  $MYSQLFILE" && exit 5
180
181                mysql --defaults-extra-file=$MYCNF  -e "DROP DATABASE $AUXCATALOG"
182                echoAndLog "${FUNCNAME}(): sqlfile update"
183        else
184                echoAndLog "${FUNCNAME}(): sqlfile unchanged"
185        fi
186}
187
188
189# Actualizar la base datos
190function importSqlFile()
191{
192        local sqlfile="$1"
193
194        if [ ! -r $sqlfile ]; then
195                errorAndLog "${FUNCNAME}(): Unable to read $sqlfile!!"
196                exit 5
197        fi
198
199        echoAndLog "${FUNCNAME}(): importing SQL file..."
200        # Ejecutar actualización y borrar fichero de credenciales.
201        mysql --defaults-extra-file=$MYCNF --default-character-set=utf8 -D "$AUXCATALOG" < $sqlfile
202        if [ $? -ne 0 ]; then
203                errorAndLog "${FUNCNAME}(): error importing ${sqlfile##*/} in temporal database"
204                exit 5
205        fi
206        echoAndLog "${FUNCNAME}(): file ${sqlfile##*/} imported to temporal database"
207        return 0
208}
209
210##################################################################
211# Al salir borramos MYCNF y la db tamporal
212trap "clean" 1 2 3 6 9 14 15 EXIT
213
214# Descomprimimos backup
215tar -xvzf $BACKUPFILE --directory /tmp &>/dev/null
216
217# Comprueba que opengnsys_export sea compatible
218grep "CREATE TABLE.*usuarios" $MYSQLFILE &>/dev/null
219if [ $? -ne 0 ]; then
220    errorAndLog "Backup file created with old version opengnsys_export. Use version 1.1.0-5594 or later."
221    exit 7
222fi
223
224# Comprobamos si es la misma versión
225[ -f $TMPDIR/VERSION.txt ] && OLDVERSION=$(awk '{print $2}' $TMPDIR/VERSION.txt)
226[ -f $TMPDIR/VERSION.json ] && OLDVERSION=$(jq -r '.version' $TMPDIR/VERSION.json)
227NEWVERSION=$(jq -r '.version' $OPENGNSYS/doc/VERSION.json)
228# FALTA: Comprobar que la versión OLD es menor que la NEW
229if [ $OLDVERSION != $NEWVERSION ] ; then
230    echo "La versión del servidor no coincide con la del backup."
231    jq -r '[.project, .version, .codename] | join(" ")' $OPENGNSYS/doc/VERSION.json $TMPDIR/VERSION.json 2>/dev/null \
232            || cat $TMPDIR/VERSION.txt
233    read -p "¿Quiere continuar? (y/n): " ANSWER
234    if [ "${ANSWER^^}" != "Y" ]; then
235        echo "Operación cancelada."
236        exit 0
237    fi
238    # Nos bajamos los archivos de actualización de la base de datos
239    svn checkout "$SVN_URL" $TMPDIR/Database
240    [ $? -ne 0 ] && errorAndLog "$PROG: Error getting code from $SVN_URL" && exit 6
241   
242    # Solicitamos la clave de mysql.
243    mysqlPassword
244    DIFFVERSION=TRUE
245fi
246
247# MYSQL
248echo "   * Importamos informacion mysql."
249source $OPENGNSYS/etc/ogAdmServer.cfg
250# Crear fichero temporal de acceso a la BD
251if [ ! -r $MYCNF ]; then
252    chmod 600 $MYCNF
253    trap "rm -f $MYCNF" 1 2 3 6 9 15
254    cat << EOT > $MYCNF
255[client]
256user=$USUARIO
257password=$PASSWORD
258EOT
259fi
260
261# Si la BD tiene no definido el trigger necesitamos permisos de root
262mysql --defaults-extra-file=$MYCNF -e "SHOW TRIGGERS FROM $CATALOG;" |grep "Trigger" &>/dev/null
263if [ $? -eq 0 ]; then
264    # Existe el trigger: eliminamos líneas del trigger en $CATALOG.sql
265    read -d\n INI END <<< $(grep -n -e TRIGGER -e "END.*;;" $MYSQLFILE |cut -d: -f1)
266    [ -n "$INI" ] && sed -i "$INI,${END}d" $MYSQLFILE
267else
268    # No existe: necesitamos privilegios de root
269    grep "user=root" $MYCNF &>/dev/null || mysqlPassword
270fi
271
272# Si la versión es diferente usamos una tabla auxiliar para actualizar el .sql
273[ "$DIFFVERSION" == TRUE ] &&  updateSqlFile
274
275# Eliminamos las tablas que no importamos: repositorios, entorno
276#     y añadimos los usuarios, sólo si no existen.
277sed -i -e '/Table structure.* `repositorios`/,/Table structure/d' \
278       -e '/Table structure.* `entornos`/,/Table structure/d' \
279       -e '/Table structure.*`usuarios`/,/CHARSET/d' \
280       -e '/usuarios/s/IGNORE//g' \
281       -e '/usuarios/s/^INSERT /\nALTER TABLE usuarios ADD UNIQUE (usuario);\n\nINSERT IGNORE /g' $MYSQLFILE
282
283# Copia de seguridad del estado de la base de datos
284mysqldump --defaults-extra-file=$MYCNF --opt $CATALOG > $MYSQLBCK
285chmod 400 $MYSQLBCK
286# Importamos los datos nuevos
287mysql --defaults-extra-file=$MYCNF -D "$CATALOG" < $MYSQLFILE &>/dev/null
288[ $? -ne 0 ] && echo "ERROR: Error al importar la información de la base de datos."
289
290# Copiamos los archivos a su sitio correcto
291# default/opengnsys
292echo "   * Guardamos la configuración de /etc/default."
293mv /etc/default/opengnsys /etc/default/opengnsys-$DATE
294cp $TMPDIR/default/opengnsys /etc/default/opengnsys
295
296# DHCP
297echo "   * Componemos la configuración del dhcp."
298for DHCPCFGDIR in /etc/dhcp /etc/dhcp3; do
299    if [ -r $DHCPCFGDIR/dhcpd.conf ]; then
300        # Tomamos las variables globales de la configuración actual y las declaraciones host del backup
301        # Inicio declaraciones host
302        OLDHOSTINI=$(grep -n -m1 -e "^[[:blank:]]*host" -e "^#[[:blank:]]*host" $TMPDIR/dhcpd.conf|cut -d: -f1)
303        let BEFOREHOST=$(grep -n -m1 -e "^[[:blank:]]*host" -e "^#[[:blank:]]*host" $DHCPCFGDIR/dhcpd.conf| cut -d: -f1)-1
304        # Copia de seguridad de la configuración anterior
305        cp $DHCPCFGDIR/dhcpd.conf $DHCPCFGDIR/dhcpd.conf-LAST
306        mv $DHCPCFGDIR/dhcpd.conf $DHCPCFGDIR/dhcpd.conf-$DATE
307        # Nuevo fichero
308        sed ${BEFOREHOST}q $DHCPCFGDIR/dhcpd.conf-LAST > $DHCPCFGDIR/dhcpd.conf
309        sed -n -e "$OLDHOSTINI,\$p" $TMPDIR/dhcpd.conf >> $DHCPCFGDIR/dhcpd.conf
310        break
311    fi
312done
313
314# TFTP
315echo "   * Guardamos los ficheros PXE de los clientes."
316for BOOTLOADER in menu.lst grub; do
317    if [ -d $TMPDIR/$BOOTLOADER ]; then
318        mkdir $OPENGNSYS/tftpboot/$BOOTLOADER-$DATE
319        mv $OPENGNSYS/tftpboot/$BOOTLOADER/{01-*,templates,examples} $OPENGNSYS/tftpboot/$BOOTLOADER-$DATE 2>/dev/null
320        cp -r $TMPDIR/$BOOTLOADER/{01-*,templates,examples}  $OPENGNSYS/tftpboot/$BOOTLOADER 2>/dev/null
321        chown -R www-data:www-data $OPENGNSYS/tftpboot/$BOOTLOADER
322    fi
323done
324
325if [ -f $OPENGNSYS/tftpboot/menu.lst/templates/01 ]; then
326    echo "   * Cambio del nombre de las plantillas PXE para compatibilidad con UEFI."
327    BIOSPXEDIR="$OPENGNSYS/tftpboot/menu.lst/templates"
328    mv $BIOSPXEDIR/01 $BIOSPXEDIR/10
329    sed -i "s/\bMBR\b/1hd/" $BIOSPXEDIR/10
330
331    # Cambiamos el valor en la base de datos. Si no lo hacemos desaparecen de las columnas del NetBootAvanzado.
332    mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e "update ordenadores set arranque='10' where arranque='01';" &>/dev/null
333    [ $? -ne 0 ] && echo "ERROR: Error al modificar nombre de las plantilla '10' en la base de datos."
334fi
335
336# Configuración de los clientes
337echo "   * Guardamos la configuración de los clientes."
338mv $OPENGNSYS/client/etc/engine.cfg $OPENGNSYS/client/etc/engine.cfg-$DATE
339cp $TMPDIR/engine.cfg $OPENGNSYS/client/etc/engine.cfg
340
341# Páginas de inicio
342echo "   * Guardamos las páginas de inicio."
343mv $OPENGNSYS/www/menus $OPENGNSYS/www/menus-$DATE
344cp -r $TMPDIR/menus $OPENGNSYS/www
345
346# Script personalizados
347echo "   * Guardamos los scripts personalizados."
348if ls $OPENGNSYS/client/scripts/*Custom &>/dev/null; then
349    mkdir $OPENGNSYS/client/scripts/Custom-$DATE
350    mv $OPENGNSYS/client/scripts/*Custom $OPENGNSYS/client/scripts/Custom-$DATE
351fi
352cp -r $TMPDIR/*Custom $OPENGNSYS/client/scripts
353
354echo -e "Se ha terminado de importar los datos del backup. \n\nSe han realizado copias de seguridad de los archivos antiguos:"
355echo    "  - /etc/default/opengnsys-$DATE"
356echo    "  - $DHCPCFGDIR/dhcpd.conf-$DATE"
357echo    "  - $OPENGNSYS/tftpboot/menu.lst-$DATE"
358echo    "  - $OPENGNSYS/tftpboot/grub-$DATE"
359echo    "  - $OPENGNSYS/client/etc/engine.cfg-$DATE"
360echo    "  - $OPENGNSYS/client/scripts/Custom-$DATE"
361echo    "  - $OPENGNSYS/www/menus-$DATE"
362echo -e "  - $MYSQLBCK \n"
363
364echo "Hay que revisar la configuración del dhcp. En la consola es necesario configurar los valores de las ips de repositorios, servidores ntp, etc y lanzar el \"netBoot Avanzado\" a todas las aulas"
365
366echo "Es necesario probar todos los procedimientos y en caso de error borrarlos y generarlos de nuevo."
Note: See TracBrowser for help on using the repository browser.