Modif script migration pour facilier reprise sur erreur

This commit is contained in:
Emmanuel Viennet 2021-11-22 22:39:05 +01:00
parent 5e2e36cfab
commit 502f6a9277
3 changed files with 76 additions and 36 deletions

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.0.65" SCOVERSION = "9.0.66"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"

View File

@ -66,7 +66,8 @@ def make_shell_context():
@app.cli.command() @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. """Initialize the database.
Starts from an existing database and create all Starts from an existing database and create all
the necessary SQL tables and functions. 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""" """La variable SCODOC_ADMIN_MAIL n'est pas positionnée: vérifier votre .env"""
) )
return 100 return 100
initialize_scodoc_database() initialize_scodoc_database(erase=erase)
@app.cli.command() @app.cli.command()

View File

@ -30,41 +30,72 @@ usage() {
echo "Ce script doit être lancé en tant que root sur le nouveau" echo "Ce script doit être lancé en tant que root sur le nouveau"
echo "serveur ScoDoc 9 / Debian 11." echo "serveur ScoDoc 9 / Debian 11."
echo echo
echo "Usage: $0 archive" echo "Usage: $0 [-h] [-m] [-z] archive"
echo " ou $0 -m"
echo echo
echo " archive doit être un répertoire exporté via save_scodoc7_data.sh" echo " archive doit être un répertoire exporté via save_scodoc7_data.sh"
echo " sur le serveur ScoDoc 7" echo " sur le serveur ScoDoc 7"
echo " Avec l'option -m, effectue une migration \"en place\"" 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 " avec import des données ScoDoc 7 qui étaient sur cette même"
echo " machine." echo " machine."
echo " Dans ce cas, le répertoire /opt/scodoc DOIT avoir été renommé" echo " Dans ce cas, le répertoire /opt/scodoc DOIT avoir été renommé"
echo " /opt/scodoc7" echo " /opt/scodoc7"
echo " AVANT l'installation de ScoDoc 9." echo " AVANT l'installation de ScoDoc 9."
echo 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 exit 1
} }
if [ ! $# -eq 1 ]
then INPLACE=0
RESTART=0
while getopts "hmz" opt; do
case "$opt" in
h)
usage usage
fi ;;
if [ "$1" == "-h" ] || [ "$1" == "--help" ] m)
then
usage
fi
if [ "$1" == "-m" ]
then
echo "Migration en place" echo "Migration en place"
INPLACE=1 INPLACE=1
SCODOC7_HOME=/opt/scodoc7 SCODOC7_HOME=/opt/scodoc7
# vérifie que ScoDoc7 est bien arrêté: # vérifie que ScoDoc7 est bien arrêté:
systemctl is-active scodoc >& /dev/null && systemctl stop scodoc systemctl is-active scodoc >& /dev/null && systemctl stop scodoc
else ;;
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" echo "Migration depuis archive $1"
INPLACE=0
SCODOC7_HOME="$1" # racine de l'archive importée SCODOC7_HOME="$1" # racine de l'archive importée
fi 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à # --- 1. Vérifie qu'aucun des départements à importer n'existe déjà
check_existing_depts() { check_existing_depts() {
sco7_depts="" sco7_depts=""
@ -115,6 +146,8 @@ migrate_database_ownership() {
migrate_local_files() { migrate_local_files() {
echo "Déplacement des fichiers de configuration et des archives" echo "Déplacement des fichiers de configuration et des archives"
if [ "$RESTART" = "0" ] # ne le fait pas en mode "reprise"
then
SCODOC_VAR_DIR_BACKUP="$SCODOC_VAR_DIR".bak SCODOC_VAR_DIR_BACKUP="$SCODOC_VAR_DIR".bak
if [ -e "$SCODOC_VAR_DIR_BACKUP" ] if [ -e "$SCODOC_VAR_DIR_BACKUP" ]
then then
@ -126,11 +159,15 @@ migrate_local_files() {
mv "$SCODOC_VAR_DIR" "$SCODOC_VAR_DIR_BACKUP" mv "$SCODOC_VAR_DIR" "$SCODOC_VAR_DIR_BACKUP"
fi fi
mkdir "$SCODOC_VAR_DIR" || die "erreur creation repertoire" mkdir "$SCODOC_VAR_DIR" || die "erreur creation repertoire"
fi
if [ $(ls "${SCODOC7_HOME}/var/scodoc" | wc -l) -ne 0 ]
then
echo " déplace ${SCODOC7_HOME}/var/scodoc/ dans $SCODOC_VAR_DIR..." echo " déplace ${SCODOC7_HOME}/var/scodoc/ dans $SCODOC_VAR_DIR..."
mv "${SCODOC7_HOME}"/var/scodoc/* "$SCODOC_VAR_DIR" || die "migrate_local_files failed" mv "${SCODOC7_HOME}"/var/scodoc/* "$SCODOC_VAR_DIR" || die "migrate_local_files failed"
fi
# Récupère le .env: normalement ./opt/scodoc/.env est un lien vers # Récupère le .env: normalement ./opt/scodoc/.env est un lien vers
# /opt/scodoc-data/.env # /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 ] if [ -L "$SCODOC_DIR"/.env ]
then then
cp -p "$SCODOC_VAR_DIR_BACKUP"/.env "$SCODOC_VAR_DIR" || die "fichier .env manquant dans l'ancien $SCODOC_VAR_DIR !" 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" old_logs_dest="$SCODOC_VAR_DIR/log/scodoc7"
echo "Copie des anciens logs ScoDoc 7 dans $old_logs_dest" echo "Copie des anciens logs ScoDoc 7 dans $old_logs_dest"
mkdir -p "$old_logs_dest" || die "erreur creation $old_logs_dest" mkdir -p "$old_logs_dest" || die "erreur creation $old_logs_dest"
if [ $(ls "${SCODOC7_HOME}/log" | wc -l) -ne 0 ]
then
mv "${SCODOC7_HOME}"/log/* "$old_logs_dest" || die "erreur mv" mv "${SCODOC7_HOME}"/log/* "$old_logs_dest" || die "erreur mv"
fi
# Le fichier de customization local: # Le fichier de customization local:
# peut être dans .../var/config/scodoc_local.py # peut être dans .../var/config/scodoc_local.py
# ou bien, sur les très anciennes installs, dans Products/ScoDoc/config/scodoc_config.py # ou bien, sur les très anciennes installs, dans Products/ScoDoc/config/scodoc_config.py