ScoDoc/tools/restore_scodoc9_data.sh

144 lines
4.6 KiB
Bash
Raw Permalink Normal View History

2021-09-25 09:13:39 +02:00
#!/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
2021-10-06 13:53:09 +02:00
usage() {
echo "Usage: $0 [ --keep-env ] archive"
echo "Exemple: $0 /tmp/mon-scodoc.tgz"
echo "OPTION"
echo "--keep_env garde la configuration courante"
2021-09-25 09:13:39 +02:00
exit 1
2021-10-06 13:53:09 +02:00
}
2021-09-25 09:13:39 +02:00
# analyse de la ligne de commande
# calcule:
# SRC = fichier source de la restauration
# DB_DEST = base de données destination
# KEEP_ENV = vide si restauration à l'identique (i.e. production)
2021-10-06 13:53:09 +02:00
if (($# < 1 || $# > 2))
then
usage
2022-01-05 16:45:55 +01:00
elif [ $# -eq 2 ] && [ "$1" != "--keep-env" ] && [ "$2" != "--keep-env" ]
then
2021-10-06 13:53:09 +02:00
usage
2022-01-05 16:45:55 +01:00
elif [ $# -eq 1 ]
then
2021-10-06 13:53:09 +02:00
echo "restauration des données et de la configuration originale (production)"
2022-01-05 16:45:55 +01:00
SRC="$1"
2021-10-06 13:53:09 +02:00
DB_DEST="SCODOC"
else
echo "restauration des données dans la configuration actuelle"
2023-04-14 14:18:08 +02:00
DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)" "$SCODOC_USER")
2021-10-06 13:53:09 +02:00
DB_DEST="$DB_CURRENT"
2022-01-05 16:45:55 +01:00
KEEP_ENV="Y"
if [ "$1" = "--keep-env" ]
then
SRC="$2"
2021-10-06 13:53:09 +02:00
else
2022-01-05 16:45:55 +01:00
SRC="$1"
2021-10-06 13:53:09 +02:00
fi
fi
DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump
2021-09-25 09:13:39 +02:00
# Safety check
2022-01-05 16:45:55 +01:00
echo "Ce script va remplacer les données de votre installation ScoDoc par celles"
2021-10-06 13:53:09 +02:00
echo "enregistrées dans le fichier fourni."
2022-01-05 16:45:55 +01:00
echo "Ce fichier doit avoir été créé par le script save_scodoc9_data.sh."
2021-09-25 09:13:39 +02:00
echo
echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !"
2022-01-05 16:45:55 +01:00
echo "Notamment, tous les utilisateurs et départements existants seront effacés !"
2021-09-25 09:13:39 +02:00
echo
2021-10-06 13:53:09 +02:00
echo "La base SQL $DB_CURRENT sera effacée et remplacée !!!"
echo
# Préparation si une copie 'antique' doit être effacée, demander confirmation, puis effacer
SCODOC_VAR_OLD=${SCODOC_VAR_DIR}.old
if [ -e "$SCODOC_VAR_DIR" ] && [ -e "$SCODOC_VAR_OLD" ]
then
2022-01-05 16:45:55 +01:00
echo "Une ancienne sauvegarde (\"$SCODOC_VAR_OLD\" en date du $(stat -c %w "$SCODOC_VAR_OLD") ) va être effacée."
echo
fi
2022-01-05 16:45:55 +01:00
if [ -n "$KEEP_ENV" ]
then
2022-01-05 16:45:55 +01:00
echo -n "Restauration des données sans changement de configuration: Assurez-vous d'avoir arrêté le serveur scodoc."
echo
fi
2022-01-05 16:45:55 +01:00
echo -n "Voulez-vous poursuivre la restauration ? (y/n) [n]"
2021-09-25 09:13:39 +02:00
read -r ans
2022-01-05 16:45:55 +01:00
if [ ! "$(norm_ans "$ans")" = "Y" ]
2021-09-25 09:13:39 +02:00
then
echo "Annulation de la restauration par l\'utilisateur"
2021-09-25 09:13:39 +02:00
exit 1
fi
2022-01-05 16:45:55 +01:00
rm -rf "$SCODOC_VAR_OLD" || die "Erreur suppression $SCODOC_VAR_OLD"
2021-09-25 09:13:39 +02:00
# -- Stop ScoDoc
2022-01-05 16:45:55 +01:00
if [ -z "$KEEP_ENV" ]
then
2021-10-06 13:53:09 +02:00
echo "Arrêt de scodoc9..."
systemctl stop scodoc9
fi
2021-09-25 09:13:39 +02:00
# 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..."
2022-01-05 16:45:55 +01:00
(cd "$(dirname "$SCODOC_VAR_DIR")"; tar xfz "$SRC") || die "Error opening archive"
2021-09-25 09:13:39 +02:00
# -- 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
2021-10-06 13:53:09 +02:00
nb=$(su -c "psql -l" "$SCODOC_USER" | awk '{print $1}' | grep -c -x "$DB_DEST")
if [ "$nb" -gt 0 ]
2021-09-25 09:13:39 +02:00
then
2021-10-06 13:53:09 +02:00
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"
2022-01-05 16:45:55 +01:00
cp -p "$SCODOC_VAR_OLD"/.env "$SCODOC_VAR_DIR"/.env
2021-10-06 13:53:09 +02:00
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 "restauration 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
2021-09-25 09:13:39 +02:00
fi
2021-09-25 09:13:39 +02:00
echo "Terminé."