diff options
author | irina <irinagomez@us.es> | 2018-02-14 10:09:06 +0000 |
---|---|---|
committer | irina <irinagomez@us.es> | 2018-02-14 10:09:06 +0000 |
commit | 49a0502a339b661550436c52115318db0586d48c (patch) | |
tree | 4e94746ea6fda1c0d6edf4d685f62d92cae2f69f /installer/opengnsys_import.sh | |
parent | 4ec8744d9c6d48d32aded71fc150f71e2c217c3a (diff) |
#755 opengnsys_import.sh y opengnsys_export.sh. Permite importar backup de versiones de OpenGnsys anteriores a la del servidor de destino. Necesario que los script de importar y exportar sean de igual release
git-svn-id: https://opengnsys.es/svn/branches/version1.1@5594 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'installer/opengnsys_import.sh')
-rwxr-xr-x | installer/opengnsys_import.sh | 270 |
1 files changed, 212 insertions, 58 deletions
diff --git a/installer/opengnsys_import.sh b/installer/opengnsys_import.sh index 6b497ec4..a4e70343 100755 --- a/installer/opengnsys_import.sh +++ b/installer/opengnsys_import.sh @@ -7,9 +7,16 @@ #@exception 2 Sólo ejecutable por usuario root #@exception 3 Sin acceso al fichero de backup #@exception 4 Sin acceso a la configuración de OpenGnsys +#@exception 5 Errores al importar o exportar de la bd auxiliar +#@exception 6 Errores al importar los archivos de actualización de la BD desde opengnsys.es +#@exception 7 El archivo de backup ha sido crearo con una versión incompatible de opengnsys_export. Usar 1.1.0-5594 o posterior. +#@note En las versiones de desarrollo (pre) no se modifica la estructura de la base de datos. #@version 1.1.0 - Versión inicial. #@author Irina Gómez - ETSII Univ. Sevilla #@date 2016-10-18 +#@version 1.1.0 - Permite importar de versiones de OpenGnsys anteriores. Cambia la importación de la base de datos. +#@note Incompatible con versiones de opengnsys_export.sh anteriores a esta fecha. +#@date 2018-02-14 #*/ ## # Variables globales. @@ -19,11 +26,14 @@ DATE=$(date +%Y%m%d) BACKUPFILE=$1 TMPDIR=/tmp/opengnsys_export OPENGNSYS="/opt/opengnsys" -MYSQLFILE="$TMPDIR/ogAdmBD.sql" -MYSQLFILE2="$TMPDIR/usuarios.sql" -MYSQLBCK="$OPENGNSYS/doc/ogAdmBD.sql-$DATE" +MYCNF=$(mktemp /tmp/.my.cnf.XXXXX) CATALOG="ogAdmBD" +AUXCATALOG="og_import" +MYSQLFILE="$TMPDIR/$CATALOG.sql" +MYSQLBCK="$OPENGNSYS/doc/$CATALOG.sql-$DATE" +LOG_FILE=$OPENGNSYS/log/${PROG%.sh}.log +OPENGNSYS_SERVER="opengnsys.es" DEFAULT_MYSQL_ROOT_PASSWORD="passwordroot" # Clave por defecto root de MySQL # Si se solicita, mostrar ayuda. @@ -62,11 +72,157 @@ fi # Si existe el directorio auxiliar lo borramos [ -d $TMPDIR ] && rm -rf $TMPDIR +####### Funciones ############################################## +# Al salir elimina archivos y base de datos temporal +function clean() +{ + mysql --defaults-extra-file=$MYCNF -e "DROP DATABASE IF EXISTS $AUXCATALOG" + rm -f $MYCNF +} + +function getDateTime() +{ + date "+%Y%m%d-%H%M%S" +} + +# Escribe a fichero y muestra por pantalla +function echoAndLog() +{ + echo " $1" + DATETIME=`getDateTime` + echo "$DATETIME;$SSH_CLIENT;$1" >> $LOG_FILE +} + +function errorAndLog() +{ + echo " ERROR: $1" + DATETIME=`getDateTime` + echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE +} + +function mysqlPassword() +{ + # Clave root de MySQL + while : ; do + echo -n -e "\\nEnter root password for MySQL (${DEFAULT_MYSQL_ROOT_PASSWORD}): "; + read -r MYSQL_ROOT_PASSWORD + if [ -n "${MYSQL_ROOT_PASSWORD//[a-zA-Z0-9]/}" ]; then # Comprobamos que sea un valor alfanumerico + echo -e "\\aERROR: Must be alphanumeric, try again..." + else + # Si esta vacio ponemos el valor por defecto + MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-$DEFAULT_MYSQL_ROOT_PASSWORD}" + break + fi + done + cat << EOT > $MYCNF +[client] +user=root +password=$MYSQL_ROOT_PASSWORD +EOT +} + +# Actualización incremental de la BD (versión actual a actual+1, hasta final-1 a final). +function updateSqlFile() +{ + local DBDIR="$TMPDIR/Database" + local file FILES="" + + echoAndLog "${FUNCNAME}(): looking for database updates" + pushd $DBDIR >/dev/null + # Bucle de actualización incremental desde versión actual a la final. + for file in $CATALOG-*-*.sql; do + case "$file" in + $CATALOG-$OLDVERSION-$NEWVERSION.sql) + # Actualización única de versión inicial y final. + FILES="$FILES $file" + break + ;; + $CATALOG-*-postinst.sql) + # Ignorar fichero específico de post-instalación. + ;; + $CATALOG-$OLDVERSION-*.sql) + # Actualización de versión n a n+1. + FILES="$FILES $file" + OLDVERSION="$(echo $file | cut -f3 -d-)" + ;; + $CATALOG-*-$NEWVERSION.sql) + # Última actualización de versión final-1 a final. + if [ -n "$FILES" ]; then + FILES="$FILES $file" + break + fi + ;; + esac + done + # Aplicar posible actualización propia para la versión final. + file=$CATALOG-$NEWVERSION.sql + if [ -n "$FILES" -o "$OLDVERSION" = "$NEWVERSION" -a -r $file ]; then + FILES="$FILES $file" + fi + + popd >/dev/null + if [ -n "$FILES" ]; then + mysql --defaults-extra-file=$MYCNF -e "CREATE DATABASE $AUXCATALOG" + [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't create database $AUXCATALOG" && exit 5 + mysql --defaults-extra-file=$MYCNF -D "$AUXCATALOG" < $MYSQLFILE &>/dev/null + [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't import $MYSQLFILE in $AUXCATALOG" && exit 5 + + for file in $FILES; do + importSqlFile $DBDIR/$file + done + + cp $MYSQLFILE $MYSQLFILE.backup + mysqldump --defaults-extra-file=$MYCNF --opt $AUXCATALOG > $MYSQLFILE + [ $? != 0 ] && errorAndLog "${FUNCNAME}: Can't export $AUXCATALOG in $MYSQLFILE" && exit 5 + + mysql --defaults-extra-file=$MYCNF -e "DROP DATABASE $AUXCATALOG" + echoAndLog "${FUNCNAME}(): sqlfile update" + else + echoAndLog "${FUNCNAME}(): sqlfile unchanged" + fi +} + + +# Actualizar la base datos +function importSqlFile() +{ + local sqlfile="$1" + + if [ ! -r $sqlfile ]; then + errorAndLog "${FUNCNAME}(): Unable to read $sqlfile!!" + exit 5 + fi + + echoAndLog "${FUNCNAME}(): importing SQL file..." + # Ejecutar actualización y borrar fichero de credenciales. + mysql --defaults-extra-file=$MYCNF --default-character-set=utf8 -D "$AUXCATALOG" < $sqlfile + if [ $? -ne 0 ]; then + errorAndLog "${FUNCNAME}(): error importing ${sqlfile##*/} in temporal database" + exit 5 + fi + echoAndLog "${FUNCNAME}(): file ${sqlfile##*/} imported to temporal database" + return 0 +} + +################################################################## +# Al salir borramos MYCNF y la db tamporal +trap "clean" 1 2 3 6 9 14 15 EXIT + # Descomprimimos backup tar -xvzf $BACKUPFILE --directory /tmp &>/dev/null +# Comprueba que opengnsys_export sea compatible +grep "CREATE TABLE.*usuarios" $MYSQLFILE &>/dev/null +if [ $? -ne 0 ]; then + errorAndLog "Backup file created with old version opengnsys_export. Use version 1.1.0-5594 or later." + exit 7 +fi + # Comprobamos si es la misma versión -if ! diff $OPENGNSYS/doc/VERSION.txt $TMPDIR/VERSION.txt > /dev/null ; then +OLDVERSION=$(awk '{print $2}' $TMPDIR/VERSION.txt) +NEWVERSION=$(awk '{print $2}' $OPENGNSYS/doc/VERSION.txt) +# FALTA: Comprobar que la versión OLD es menor que la NEW +if [ $OLDVERSION != $NEWVERSION ] ; then echo "La versión del servidor no coincide con la del backup." cat $OPENGNSYS/doc/VERSION.txt $TMPDIR/VERSION.txt read -p "¿Quiere continuar? (y/n): " ANSWER @@ -74,9 +230,60 @@ if ! diff $OPENGNSYS/doc/VERSION.txt $TMPDIR/VERSION.txt > /dev/null ; then echo "Operación cancelada." exit 0 fi + # Nos bajamos los archivos de actualización de la base de datos + SVN_URL="https://$OPENGNSYS_SERVER/svn/branches/version${NEWVERSION%.*}/admin/Database" + svn checkout "$SVN_URL" $TMPDIR/Database + [ $? -ne 0 ] && errorAndLog "$PROG: Error getting code from $SVN_URL" && exit 6 + + # Solicitamos la clave de mysql. + mysqlPassword + DIFFVERSION=TRUE +fi + +# MYSQL +echo " * Importamos informacion mysql." +source $OPENGNSYS/etc/ogAdmServer.cfg +# Crear fichero temporal de acceso a la BD +if [ ! -r $MYCNF ]; then + chmod 600 $MYCNF + trap "rm -f $MYCNF" 1 2 3 6 9 15 + cat << EOT > $MYCNF +[client] +user=$USUARIO +password=$PASSWORD +EOT +fi + +# Si la BD tiene no definido el trigger necesitamos permisos de root +mysql --defaults-extra-file=$MYCNF -e "SHOW TRIGGERS FROM $CATALOG;" |grep "Trigger" &>/dev/null +if [ $? -eq 0 ]; then + # Existe el trigger: eliminamos líneas del trigger en $CATALOG.sql + read INI END <<< $(grep -n -e TRIGGER -e "END.*;;" $MYSQLFILE |cut -d: -f1) + [ -n "$INI" ] && sed -i "$INI,${END}d" $MYSQLFILE +else + # No existe: necesitamos privilegios de root + grep "user=root" $MYCNF &>/dev/null || mysqlPassword fi -# Copiamos los archivo a su sitio correcto +# Si la versión es diferente usamos una tabla auxiliar para actualizar el .sql +[ "$DIFFVERSION" == TRUE ] && updateSqlFile + +# Eliminamos las tablas que no importamos: repositorios, entorno +# y añadimos los usuarios, sólo si no existen. +cp $MYSQLFILE $MYSQLFILE.prueba +sed -i -e '/Table structure.* `repositorios`/,/Table structure/d' \ + -e '/Table structure.* `entornos`/,/Table structure/d' \ + -e '/Table structure.*`usuarios`/,/CHARSET/d' \ + -e '/usuarios/s/IGNORE//g' \ + -e '/usuarios/s/^INSERT /\nALTER TABLE usuarios ADD UNIQUE (usuario);\n\nINSERT IGNORE /g' $MYSQLFILE + +# Copia de seguridad del estado de la base de datos +mysqldump --defaults-extra-file=$MYCNF --opt $CATALOG > $MYSQLBCK +# Importamos los datos nuevos +mysql --defaults-extra-file=$MYCNF -D "$CATALOG" < $MYSQLFILE &>/dev/null +[ $? -ne 0 ] && echo "ERROR: Error al importar la información de la base de datos." + +# Copiamos los archivos a su sitio correcto # DHCP echo " * Componemos la configuración del dhcp." for DHCPCFGDIR in /etc/dhcp /etc/dhcp3; do @@ -111,59 +318,6 @@ echo " * Guardamos las páginas de inicio." mv $OPENGNSYS/www/menus $OPENGNSYS/www/menus-$DATE cp -r $TMPDIR/menus $OPENGNSYS/www -# MYSQL -echo " * Importamos informacion mysql." -source $OPENGNSYS/etc/ogAdmServer.cfg -# Crear fichero temporal de acceso a la BD -MYCNF=$(mktemp /tmp/.my.cnf.XXXXX) -chmod 600 $MYCNF -trap "rm -f $MYCNF" 1 2 3 6 9 15 -cat << EOT > $MYCNF -[client] -user=$USUARIO -password=$PASSWORD -EOT - -# Si la BD tiene no definido el trigger necesitamos permisos de root -mysql --defaults-extra-file=$MYCNF -e "SHOW TRIGGERS FROM ogAdmBD;" |grep "Trigger" &>/dev/null -if [ $? -eq 0 ]; then - # Existe el trigger: eliminamos líneas del trigger en ogAdmBD.sql - read INI END <<< $(grep -n -e TRIGGER -e "END.*;;" $MYSQLFILE |cut -d: -f1) - sed -i "$INI,${END}d" $MYSQLFILE -else - # No existe: necesitamos privilegios de root - # Clave root de MySQL - while : ; do - echo -n -e "\\nEnter root password for MySQL (${DEFAULT_MYSQL_ROOT_PASSWORD}): "; - read -r MYSQL_ROOT_PASSWORD - if [ -n "${MYSQL_ROOT_PASSWORD//[a-zA-Z0-9]/}" ]; then # Comprobamos que sea un valor alfanumerico - echo -e "\\aERROR: Must be alphanumeric, try again..." - else - # Si esta vacio ponemos el valor por defecto - MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-$DEFAULT_MYSQL_ROOT_PASSWORD}" - break - fi - done - cat << EOT > $MYCNF -[client] -user=root -password=$MYSQL_ROOT_PASSWORD -EOT - -fi - -# Copia de seguridad del estado de la base de datos -mysqldump --defaults-extra-file=$MYCNF --opt $CATALOG > $MYSQLBCK -# Importamos los datos nuevos -mysql --defaults-extra-file=$MYCNF -D "$CATALOG" < $MYSQLFILE &>/dev/null -[ $? -ne 0 ] && echo "ERROR: Error al importar la información de la base de datos." -# Importamos datos tabla usuario, ignoramos los repetidos -sed -i -e s/IGNORE//g -e s/INSERT/"\nALTER TABLE usuarios ADD UNIQUE (usuario);\n\nINSERT IGNORE"/g $MYSQLFILE2 -mysql --defaults-extra-file=$MYCNF -D "$CATALOG" < $MYSQLFILE2 &>/dev/null -[ $? -ne 0 ] && echo "ERROR: Error al importar la información de los usuarios de la consola" -# Borrar fichero temporal -rm -f $MYCNF - echo -e "Se ha terminado de importar los datos del backup. \n\nSe han realizado copias de seguridad de los archivos antiguos:" echo " - $DHCPCFGDIR/dhcpd.conf-$DATE" echo " - $OPENGNSYS/tftpboot/menu.lst-$DATE" |