source: installer/opengnsys_import.sh @ 9215580

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

#843: Web interface uses new version file and correcting some errata.

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