From 9015780eb769dcc4d875a6969018d43a0efa2ebb Mon Sep 17 00:00:00 2001 From: Jean-Marie Place Date: Wed, 6 Oct 2021 13:53:09 +0200 Subject: [PATCH] complement sauvegarde/restauration --- scodoc.py | 17 +++++++ tools/restore_scodoc9_data.sh | 86 ++++++++++++++++++++++++----------- tools/save_scodoc9_data.sh | 10 ++++ 3 files changed, 86 insertions(+), 27 deletions(-) diff --git a/scodoc.py b/scodoc.py index f2c2b3d92..818867989 100755 --- a/scodoc.py +++ b/scodoc.py @@ -274,6 +274,23 @@ def list_depts(depts=""): # list-dept print(f"{dept.id}\t{dept.acronym}") +@app.cli.command() +@click.option( + "-n", + "--name", + is_flag=True, + help="show database name instead of connexion string (required for " + "dropdb/createddb commands)", +) +def scodoc_database(name): # list-dept + """print the database connexion string""" + uri = app.config["SQLALCHEMY_DATABASE_URI"] + if name: + print(uri.split("/")[-1]) + else: + print(uri) + + @app.cli.command() @with_appcontext def import_scodoc7_users(): # import-scodoc7-users diff --git a/tools/restore_scodoc9_data.sh b/tools/restore_scodoc9_data.sh index 12e09b191..43624ba8a 100755 --- a/tools/restore_scodoc9_data.sh +++ b/tools/restore_scodoc9_data.sh @@ -15,29 +15,47 @@ source "$SCRIPT_DIR/utils.sh" # Ce script doit tourner comme "root" check_uid_root "$0" - # Usage -if [ ! $# -eq 2 ] -then - echo "Usage: $0 archive dbname" - echo "Exemple: $0 /tmp/mon-scodoc.tgz SCODOC" +usage() { + echo "Usage: $0 [ --keep-env ] archive" + echo "Exemple: $0 /tmp/mon-scodoc.tgz" + echo "OPTION" + echo "--keep_env garde la configuration courante" exit 1 +} + +if (($# < 1 || $# > 2)) +then + usage +elif [ $# -eq 2 -a $1 != '--keep-env' -a $2 != '--keep-env' ] ; then + usage +elif [ $# -eq 1 ] ; then + echo "restauration des données et de la configuration originale (production)" + SRC=$1 + DB_DEST="SCODOC" +else + echo "restauration des données dans la configuration actuelle" + DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)") + DB_DEST="$DB_CURRENT" + KEEP=1 + if [ $1 = '--keep-env' ]; then + SRC=$2 + else + SRC=$1 + fi fi - -SRC=$1 -DBNAME=$2 - +DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump # Safety check echo "Ce script va remplacer les donnees de votre installation ScoDoc par celles" -echo "enregistrees dans le fichier fourni." +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 "La base SQL $DB_CURRENT 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' ] @@ -47,8 +65,13 @@ then fi # -- Stop ScoDoc -echo "Arrêt de scodoc9..." -systemctl stop scodoc9 +if [ $KEEP -ne 1 ]; then + echo "Arrêt de scodoc9..." + systemctl stop scodoc9 +else + echo -n "Assurez-vous d'avoir arrété le serveur scodoc (validez pour continuer)" + read ans +fi # Clear caches echo "Purge des caches..." @@ -70,22 +93,31 @@ 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 -e '^'"$DBNAME"'$') -if [ "$nb" -gt 0 ] +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 $DBNAME..." - su -c "dropdb $DBNAME" "$SCODOC_USER" || die "Erreur destruction db" + echo "Suppression de la base $DB_DEST..." + su -c "dropdb $DB_DEST" "$SCODOC_USER" || die "Erreur destruction db" fi -su -c "createdb $DBNAME" "$SCODOC_USER" || die "Erreur création db" +su -c "createdb $DB_DEST" "$SCODOC_USER" || die "Erreur création db" -echo "Chargement de la base SQL..." -su -c "pg_restore -d $DBNAME ${SCODOC_VAR_DIR}/SCODOC.dump" "$SCODOC_USER" || die "Erreur chargement de la base SQL" +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 "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 +fi -# -- Apply migrations if needed (only on "production" databse, = SCODOC sauf config particulière) -export FLASK_ENV="production" -su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER" - -# -- Start ScoDoc -systemctl start scodoc9 echo "Terminé." diff --git a/tools/save_scodoc9_data.sh b/tools/save_scodoc9_data.sh index faaa75e0b..6bcf22934 100755 --- a/tools/save_scodoc9_data.sh +++ b/tools/save_scodoc9_data.sh @@ -20,6 +20,14 @@ then exit 1 fi +echo "vérification de la configuration..." +DB_CURRENT=$(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n) +if [ $DB_CURRENT != 'SCODOC' ]; then + echo "Ce script ne peut transférer les données que depuis une base nommée SCODOC (c'est normalement le cas pour un serveur en production)" + echo "Annulation" + exit 1 +fi + echo "Ce script est utile pour transférer toutes les données d'un serveur ScoDoc 9" echo "à un autre ScoDoc 9." echo "Il est vivement recommandé de mettre à jour votre ScoDoc avant." @@ -44,8 +52,10 @@ DEST=$1 db_name="$SCODOC_DB_PROD" # SCODOC # dump dans /opt/scodoc-data/SCODOC.dump +echo "sauvegarde de la base de données" pg_dump --format=custom --file="$SCODOC_VAR_DIR/$db_name.dump" "$db_name" || die "Error dumping database" +echo "création du fichier d'archivage..." # tar scodoc-data vers le fichier indiqué ou stdout (cd $(dirname "$SCODOC_VAR_DIR"); tar cfz "$DEST" $(basename "$SCODOC_VAR_DIR")) || die "Error archiving data"