summaryrefslogtreecommitdiffstats
path: root/installer/opengnsys_import.sh
diff options
context:
space:
mode:
authoririna <irinagomez@us.es>2018-02-14 10:09:06 +0000
committeririna <irinagomez@us.es>2018-02-14 10:09:06 +0000
commit49a0502a339b661550436c52115318db0586d48c (patch)
tree4e94746ea6fda1c0d6edf4d685f62d92cae2f69f /installer/opengnsys_import.sh
parent4ec8744d9c6d48d32aded71fc150f71e2c217c3a (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-xinstaller/opengnsys_import.sh270
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"