ScoDoc/tools/restore_scodoc9_data.sh
2021-10-06 08:59:13 +02:00

117 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
#
# ScoDoc: restore data (saved by save_scodoc9_data) into current install
#
# Utile pour migrer ScoDoc 9 d'un serveur a un autre
# A executer en tant que root sur le nouveau serveur
#
# E. Viennet, Sept 2021
#
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/config.sh"
source "$SCRIPT_DIR/utils.sh"
# Ce script doit tourner comme "root"
check_uid_root "$0"
# Usage
if (($# < 1 || $# > 2)) || [ ! -z "$2" ] && [ ! "$2" == "--keep-env" ]
then
echo "Usage: $0 archive [--keep-env]"
echo "Exemple: $0 /tmp/mon-scodoc.tgz"
echo "sans --keep_env restaure la sauvegarde complète (données et configuration)"
echo "avec --keep_env restaure les données sauvegardées dans la base en conservant la configuration courante"
exit 1
elif $# -eq 1 ; then
echo "restauration des données et de la configuration originale (production)"
else
echo "restauration des données dans la configuration actuelle"
fi
# Hypothèse: la base sauvegardée s'appelle SCODOC (dans SCODOC.dump)
SRC=$1
KEEP_ENV="$2"
DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump
DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)")
# computes target database name (SCODOC if production else current database)
if [ -z "$2" ] ; then # pas d'option --keepenv
DB_DEST="SCODOC"
elif [ "$2" == "--keep_env" ] ; then
DB_DEST="$DB_DB_CURRENT"
else
echo
fi
# Safety check
echo "Ce script va remplacer les donnees de votre installation ScoDoc par celles"
echo "enregistrées dans le fichier fourni."
echo "Ce fichier doit avoir ete cree par le script save_scodoc9_data.sh."
echo
echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !"
echo "Notamment, tous les utilisateurs et departements existants seront effaces !"
echo
echo "La base SQL $DBNAME sera effacée et remplacée !!!"
echo
echo -n "Voulez vous poursuivre cette operation ? (y/n) [n]"
read -r ans
if [ ! "$(norm_ans "$ans")" = 'Y' ]
then
echo "Annulation"
exit 1
fi
# -- Stop ScoDoc
echo "Arrêt de scodoc9..."
systemctl stop scodoc9
# Clear caches
echo "Purge des caches..."
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask clear-cache)" "$SCODOC_USER" || die "Erreur purge cache scodoc9"
# Déplace scodoc-data s'il existe
if [ -e "$SCODOC_VAR_DIR" ]
then
echo "$SCODOC_VAR_DIR existe: le renomme en .old"
mv "$SCODOC_VAR_DIR" "$SCODOC_VAR_DIR".old || die "Erreur renommage scodoc-data"
fi
# -- Ouverture archive
echo "Ouverture archive $SRC..."
(cd $(dirname "$SCODOC_VAR_DIR"); tar xfz "$SRC") || die "Error opening archive"
# -- Ckeck/fix owner
echo "Vérification du propriétaire..."
chown -R "${SCODOC_USER}:${SCODOC_GROUP}" "${SCODOC_VAR_DIR}" || die "Error chowning ${SCODOC_VAR_DIR}"
# --- La base SQL: nommée $(db_name).dump
nb=$(su -c "psql -l" "$SCODOC_USER" | awk '{print $1}' | grep -c -x "$DB_DEST")
if [ "$nb" -gt 0 ]
then
echo "Suppression de la base $DB_DEST..."
su -c "dropdb $DB_DEST" "$SCODOC_USER" || die "Erreur destruction db"
fi
su -c "createdb $DB_DEST" "$SCODOC_USER" || die "Erreur création db"
if [ ! -z $KEEP_ENV ] ; then
echo "conservation de la configuration actuelle"
cp "$SCODOC_VAR_DIR".old/.env "$SCODOC_VAR_DIR"/.env
echo "récupération des données..."
su -c "pg_restore -f - $DB_DUMP | psql -q $DB_DEST" "$SCODOC_USER" >/dev/null || die "Erreur chargement/renommage de la base SQL"
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
echo "redémarrez scodoc selon votre configuration"
else
# -- Apply migrations if needed (only on "production" database, = SCODOC sauf config particulière)
echo "restauratioin environnement de production"
echo "Chargement de la base SQL..."
su -c "pg_restore -d $DB_DEST $DB_DUMP" "$SCODOC_USER" || die "Erreur chargement de la base SQL"
export FLASK_ENV="production" # peut-être pas utile? : .env a été recopié
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
# -- Start ScoDoc
systemctl start scodoc9
fi
echo "Terminé."