From 502f6a927711906f728c912a5bdefb64d00ca88b Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Mon, 22 Nov 2021 22:39:05 +0100 Subject: [PATCH] Modif script migration pour facilier reprise sur erreur --- sco_version.py | 2 +- scodoc.py | 5 +- tools/migrate_from_scodoc7.sh | 105 +++++++++++++++++++++++----------- 3 files changed, 76 insertions(+), 36 deletions(-) diff --git a/sco_version.py b/sco_version.py index eab57f78ef..0832a781d9 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.0.65" +SCOVERSION = "9.0.66" SCONAME = "ScoDoc" diff --git a/scodoc.py b/scodoc.py index d15c3f7dba..5d1fbf469c 100755 --- a/scodoc.py +++ b/scodoc.py @@ -66,7 +66,8 @@ def make_shell_context(): @app.cli.command() -def sco_db_init(): # sco-db-init +@click.option("--erase/--no-erase", default=False) +def sco_db_init(erase=False): # sco-db-init """Initialize the database. Starts from an existing database and create all the necessary SQL tables and functions. @@ -76,7 +77,7 @@ def sco_db_init(): # sco-db-init """La variable SCODOC_ADMIN_MAIL n'est pas positionnée: vérifier votre .env""" ) return 100 - initialize_scodoc_database() + initialize_scodoc_database(erase=erase) @app.cli.command() diff --git a/tools/migrate_from_scodoc7.sh b/tools/migrate_from_scodoc7.sh index b213abf22a..d6cc5fdf46 100755 --- a/tools/migrate_from_scodoc7.sh +++ b/tools/migrate_from_scodoc7.sh @@ -30,41 +30,72 @@ usage() { echo "Ce script doit être lancé en tant que root sur le nouveau" echo "serveur ScoDoc 9 / Debian 11." echo - echo "Usage: $0 archive" - echo " ou $0 -m" + echo "Usage: $0 [-h] [-m] [-z] archive" echo echo " archive doit être un répertoire exporté via save_scodoc7_data.sh" echo " sur le serveur ScoDoc 7" - echo " Avec l'option -m, effectue une migration \"en place\"" - echo " avec import des données ScoDoc 7 qui étaient sur cette même" - echo " machine." - echo " Dans ce cas, le répertoire /opt/scodoc DOIT avoir été renommé" - echo " /opt/scodoc7" - echo " AVANT l'installation de ScoDoc 9." - echo + echo " Options:" + echo " -m" + echo " effectue une migration \"en place\"" + echo " avec import des données ScoDoc 7 qui étaient sur cette même" + echo " machine." + echo " Dans ce cas, le répertoire /opt/scodoc DOIT avoir été renommé" + echo " /opt/scodoc7" + echo " AVANT l'installation de ScoDoc 9." + echo + echo " -z" + echo " efface la base existante, utilise le scodoc-data existant sans" + echo " l'effacer et tolère les fichiers manquants dans la source." + echo " Utilisée pour reprendre une migration interrompue." exit 1 } -if [ ! $# -eq 1 ] -then + +INPLACE=0 +RESTART=0 +while getopts "hmz" opt; do + case "$opt" in + h) usage -fi -if [ "$1" == "-h" ] || [ "$1" == "--help" ] -then - usage -fi -if [ "$1" == "-m" ] -then + ;; + m) echo "Migration en place" INPLACE=1 SCODOC7_HOME=/opt/scodoc7 # vérifie que ScoDoc7 est bien arrêté: - systemctl is-active scodoc >& /dev/null && systemctl stop scodoc -else + systemctl is-active scodoc >& /dev/null && systemctl stop scodoc + ;; + z) + echo "Mode reprise sur erreur" + RESTART=1 + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + exit 1 + ;; + esac +done + +shift "$((OPTIND - 1))" + +if [ "$INPLACE" = "0" ] +then echo "Migration depuis archive $1" - INPLACE=0 SCODOC7_HOME="$1" # racine de l'archive importée fi +# --- 0. En mode reprise, efface la base de données. En effet, les base d'origine ne sont pas +# effacées par le script de migration, et en cas d'erreur en cours d'import, il est plus +# sûr de repartir de zéro. +if [ "$RESTART" = "1" ] +then + echo "Efface la base existante" + su -c "(cd /opt/scodoc && source venv/bin/activate && flask sco-db-init --erase)" "$SCODOC_USER" || die "Erreur: sco-db-init" +fi + # --- 1. Vérifie qu'aucun des départements à importer n'existe déjà check_existing_depts() { sco7_depts="" @@ -115,22 +146,28 @@ migrate_database_ownership() { migrate_local_files() { echo "Déplacement des fichiers de configuration et des archives" - SCODOC_VAR_DIR_BACKUP="$SCODOC_VAR_DIR".bak - if [ -e "$SCODOC_VAR_DIR_BACKUP" ] + if [ "$RESTART" = "0" ] # ne le fait pas en mode "reprise" then - die "supprimer ou déplacer $SCODOC_VAR_DIR_BACKUP avant de continuer" + SCODOC_VAR_DIR_BACKUP="$SCODOC_VAR_DIR".bak + if [ -e "$SCODOC_VAR_DIR_BACKUP" ] + then + die "supprimer ou déplacer $SCODOC_VAR_DIR_BACKUP avant de continuer" + fi + if [ -e "$SCODOC_VAR_DIR" ] + then + echo " renomme $SCODOC_VAR_DIR en $SCODOC_VAR_DIR_BACKUP" + mv "$SCODOC_VAR_DIR" "$SCODOC_VAR_DIR_BACKUP" + fi + mkdir "$SCODOC_VAR_DIR" || die "erreur creation repertoire" fi - if [ -e "$SCODOC_VAR_DIR" ] + if [ $(ls "${SCODOC7_HOME}/var/scodoc" | wc -l) -ne 0 ] then - echo " renomme $SCODOC_VAR_DIR en $SCODOC_VAR_DIR_BACKUP" - mv "$SCODOC_VAR_DIR" "$SCODOC_VAR_DIR_BACKUP" + echo " déplace ${SCODOC7_HOME}/var/scodoc/ dans $SCODOC_VAR_DIR..." + mv "${SCODOC7_HOME}"/var/scodoc/* "$SCODOC_VAR_DIR" || die "migrate_local_files failed" fi - mkdir "$SCODOC_VAR_DIR" || die "erreur creation repertoire" - echo " déplace ${SCODOC7_HOME}/var/scodoc/ dans $SCODOC_VAR_DIR..." - mv "${SCODOC7_HOME}"/var/scodoc/* "$SCODOC_VAR_DIR" || die "migrate_local_files failed" # Récupère le .env: normalement ./opt/scodoc/.env est un lien vers # /opt/scodoc-data/.env - # sauf si installation non standard (developeurs) avec .env réelement dans /opt/scodoc + # sauf si installation non standard (developeurs) avec .env réellement dans /opt/scodoc if [ -L "$SCODOC_DIR"/.env ] then cp -p "$SCODOC_VAR_DIR_BACKUP"/.env "$SCODOC_VAR_DIR" || die "fichier .env manquant dans l'ancien $SCODOC_VAR_DIR !" @@ -144,8 +181,10 @@ migrate_local_files() { old_logs_dest="$SCODOC_VAR_DIR/log/scodoc7" echo "Copie des anciens logs ScoDoc 7 dans $old_logs_dest" mkdir -p "$old_logs_dest" || die "erreur creation $old_logs_dest" - mv "${SCODOC7_HOME}"/log/* "$old_logs_dest" || die "erreur mv" - + if [ $(ls "${SCODOC7_HOME}/log" | wc -l) -ne 0 ] + then + mv "${SCODOC7_HOME}"/log/* "$old_logs_dest" || die "erreur mv" + fi # Le fichier de customization local: # peut être dans .../var/config/scodoc_local.py # ou bien, sur les très anciennes installs, dans Products/ScoDoc/config/scodoc_config.py