2021-07-23 08:35:20 +02:00
#!/bin/bash
2021-08-18 18:53:45 +02:00
# Migre une install ScoDoc 7 vers ScoDoc 9
# Les données ScoDoc7 sauvegardées par save_scodoc7_data.sh
# sont copiés au bon endroit
# puis les bases SQL ScoDoc 7 sont traduites dans la base ScoDoc 9
2021-07-23 08:35:20 +02:00
#
2021-08-18 18:53:45 +02:00
# Fichiers de données et config locale:
2021-07-25 09:51:09 +02:00
# archives, photos: /opt/scodoc/var/ => /opt/scodoc-data
2021-07-23 08:35:20 +02:00
#
#
2021-07-27 16:07:03 +02:00
# Le répertoire de ce script:
SCRIPT_DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " & > /dev/null && pwd ) "
source " $SCRIPT_DIR /config.sh "
source " $SCRIPT_DIR /utils.sh "
2021-08-18 18:53:45 +02:00
cd " $SCODOC_DIR " || die "ScoDoc 9 non installe"
2021-07-23 08:35:20 +02:00
2021-08-18 18:53:45 +02:00
# Ce script doit tourner comme "root"
check_uid_root " $0 "
2021-08-26 14:24:25 +02:00
# ScoDoc 9 doit être bien installé
2021-08-26 15:35:08 +02:00
[ -e .env ] || die "ScoDoc 9 mal configuré: manque .env"
2021-08-18 18:53:45 +02:00
# Usage
2021-08-26 14:24:25 +02:00
usage( ) {
echo "Script de migration: import des données de ScoDoc 7 dans ScoDoc 9"
echo "Ce script doit être lancé en tant que root sur le nouveau"
echo "serveur ScoDoc 9 / Debian 11."
echo
2021-11-22 22:39:05 +01:00
echo " Usage: $0 [-h] [-m] [-z] archive "
2021-08-26 14:24:25 +02:00
echo
echo " archive doit être un répertoire exporté via save_scodoc7_data.sh"
echo " sur le serveur ScoDoc 7"
2021-11-22 22:39:05 +01:00
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."
2021-08-26 14:24:25 +02:00
exit 1
}
2021-11-22 22:39:05 +01:00
INPLACE = 0
RESTART = 0
while getopts "hmz" opt; do
case " $opt " in
h)
2021-08-26 14:24:25 +02:00
usage
2021-11-22 22:39:05 +01:00
; ;
m)
2021-09-04 11:37:46 +02:00
echo "Migration en place"
2021-08-26 14:24:25 +02:00
INPLACE = 1
SCODOC7_HOME = /opt/scodoc7
2021-09-03 18:37:05 +02:00
# vérifie que ScoDoc7 est bien arrêté:
2021-11-22 22:39:05 +01:00
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
2021-08-26 14:24:25 +02:00
echo " Migration depuis archive $1 "
SCODOC7_HOME = " $1 " # racine de l'archive importée
2021-08-18 18:53:45 +02:00
fi
2021-07-23 08:35:20 +02:00
2021-11-22 22:39:05 +01:00
# --- 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
2021-09-17 09:15:12 +02:00
# --- 1. Vérifie qu'aucun des départements à importer n'existe déjà
check_existing_depts( ) {
sco7_depts = ""
for f in " ${ SCODOC7_HOME } /var/scodoc/ " /config/depts/*.cfg
do
dept = $( basename " ${ f %.* } " ) # le nom du dept peut-être en minuscules
sco9_name = $( echo " $dept " | tr "[:lower:]" "[:upper:]" ) # acronym ScoDoc 9 toujours en majuscule
sco7_depts = " $sco7_depts $sco9_name "
done
nb_existing = $( echo " $sco7_depts " | su -c " cd $SCODOC_DIR && source venv/bin/activate && xargs flask list-depts " " $SCODOC_USER " | wc -l)
if [ " $nb_existing " -gt 0 ]
then
echo " Attention: il existe déjà $nb_existing départements de même nom que celles "
echo "que vous souhaitez importer !"
echo " Département qui allaient être importées: $sco7_depts "
echo "=> arrêt."
exit 2
fi
}
2021-08-26 14:24:25 +02:00
# --- 2. Propriétaire des bases de données pour import "en place"
# Bases appartenant à www-data: les attribue à "scodoc" pour le script de migration SQL
# qui tourne en tant que "scodoc"
# Inutile si on importe via pg_restore (voir restore-scodoc7_data.sh)
#
2021-07-23 09:32:20 +02:00
migrate_database_ownership( ) {
2021-08-26 15:35:08 +02:00
echo "Changing databases ownerships"
2021-07-23 08:35:20 +02:00
SCO7_BASES = $( su -c "psql -l -t | grep www-data" " $POSTGRES_SUPERUSER " | awk -F '|' '{print $1}' )
2021-08-26 15:35:08 +02:00
if [ -z " $SCO7_BASES " ]
then
echo "Aucune base ScoDoc 7 appartenant à www-data. OK."
else
for base in $SCO7_BASES
do
2021-09-04 11:37:46 +02:00
echo " modifying $base owner "
2021-08-26 15:35:08 +02:00
su -c " psql -c 'REASSIGN OWNED BY \"www-data\" TO scodoc;' $base " " $POSTGRES_SUPERUSER "
done
su -c "psql -c 'REASSIGN OWNED BY \"www-data\" TO scodoc;'" " $POSTGRES_SUPERUSER "
fi
2021-07-23 08:35:20 +02:00
}
2021-08-26 14:24:25 +02:00
# --- 3. Fichiers locaux: /opt/scodoc7/var => /opt/scodoc-data
2021-09-04 11:37:46 +02:00
# note mémo: $SCODOC_DIR est /opt/scodoc, et $SCODOC_VAR_DIR /opt/scodoc-data
2021-08-26 14:24:25 +02:00
#
# Migration en place: /opt/scodoc7/var == SCODOC7_HOME/var => /opt/scodoc-data
# Migration via archive: SCODOC7_HOME/var => /opt/scodoc-data
2021-07-23 08:35:20 +02:00
migrate_local_files( ) {
2021-08-18 18:53:45 +02:00
echo "Déplacement des fichiers de configuration et des archives"
2021-11-23 12:31:03 +01:00
SCODOC_VAR_DIR_BACKUP = " $SCODOC_VAR_DIR " .bak
2021-11-22 22:39:05 +01:00
if [ " $RESTART " = "0" ] # ne le fait pas en mode "reprise"
2021-07-23 08:35:20 +02:00
then
2021-11-22 22:39:05 +01:00
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"
2021-07-23 08:35:20 +02:00
fi
2021-11-22 22:39:05 +01:00
if [ $( ls " ${ SCODOC7_HOME } /var/scodoc " | wc -l) -ne 0 ]
2021-07-23 08:35:20 +02:00
then
2021-11-22 22:39:05 +01:00
echo " déplace ${ SCODOC7_HOME } /var/scodoc/ dans $SCODOC_VAR_DIR ... "
mv " ${ SCODOC7_HOME } " /var/scodoc/* " $SCODOC_VAR_DIR " || die "migrate_local_files failed"
2021-07-23 08:35:20 +02:00
fi
2021-09-04 11:37:46 +02:00
# Récupère le .env: normalement ./opt/scodoc/.env est un lien vers
# /opt/scodoc-data/.env
2021-11-22 22:39:05 +01:00
# sauf si installation non standard (developeurs) avec .env réellement dans /opt/scodoc
2021-11-23 12:31:03 +01:00
if [ -L " $SCODOC_DIR " /.env ] && [ ! -e " $SCODOC_VAR_DIR " /.env ]
2021-09-04 11:37:46 +02:00
then
cp -p " $SCODOC_VAR_DIR_BACKUP " /.env " $SCODOC_VAR_DIR " || die " fichier .env manquant dans l'ancien $SCODOC_VAR_DIR ! "
fi
2021-08-27 12:11:04 +02:00
# et les certificats
2021-11-23 12:31:03 +01:00
if [ -d " $SCODOC_VAR_DIR_BACKUP " /certs ] && [ ! -d " $SCODOC_VAR_DIR " /certs ]
2021-08-27 12:11:04 +02:00
then
cp -rp " $SCODOC_VAR_DIR_BACKUP " /certs " $SCODOC_VAR_DIR " || die "erreur copie certs"
fi
2021-08-18 18:53:45 +02:00
# Anciens logs ScoDoc7
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 "
2021-11-22 22:39:05 +01:00
if [ $( ls " ${ SCODOC7_HOME } /log " | wc -l) -ne 0 ]
then
mv " ${ SCODOC7_HOME } " /log/* " $old_logs_dest " || die "erreur mv"
fi
2021-09-05 12:30:11 +02:00
# 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
# (si migration, copié dans SCODOC7_HOME/config/scodoc_config.py)
# en principe ScoDoc 9 est encore compatible avec cet ancien fichier.
# donc:
if [ ! -e " $SCODOC_VAR_DIR " /scodoc_local.py ]
then
2021-09-05 13:41:26 +02:00
echo "note: pas de fichier scodoc_local.py (ok)."
2021-09-05 12:30:11 +02:00
# if [ "$INPLACE" == 1 ]
# then
# scodoc_config_filename = "${SCODOC7_HOME}"/Products/ScoDoc/config/scodoc_config.py
# else
# scodoc_config_filename = "${SCODOC7_HOME}"/config/scodoc_config.py
# fi
# # Le fichier distribué avait-il été modifié ?
# if [ $(md5sum "$scodoc_config_filename" | cut -f1 -d ' ') == "378caca5cb2e3b2753f5989c0762b8cc" ]
# then
# echo "copying $scodoc_config_filename to $SCODOC_VAR_DIR/scodoc_local.py"
# cp "$scodoc_config_filename" "$SCODOC_VAR_DIR"/scodoc_local.py || die "erreur cp"
# fi
fi
2021-07-25 09:51:09 +02:00
# Templates locaux poursuites etudes
2021-08-18 18:53:45 +02:00
if [ -e " ${ SCODOC7_HOME } " /config/doc_poursuites_etudes/local ]
2021-07-25 09:51:09 +02:00
then
2021-08-18 18:53:45 +02:00
mv " ${ SCODOC7_HOME } " /config/doc_poursuites_etudes/local " $SCODOC_VAR_DIR " /config/doc_poursuites_etudes || die "migrate_local_files failed to migrate doc_poursuites_etudes/local"
2021-07-25 09:51:09 +02:00
fi
# S'assure que le propriétaire est "scodoc":
chown -R " ${ SCODOC_USER } : ${ SCODOC_GROUP } " " ${ SCODOC_VAR_DIR } " || die " change_scodoc_file_ownership failed on ${ SCODOC_VAR_DIR } "
2021-07-23 08:35:20 +02:00
}
# ------ MAIN
2021-09-17 09:15:12 +02:00
check_existing_depts
2021-08-18 18:53:45 +02:00
change_scodoc_file_ownership
2021-07-23 08:35:20 +02:00
2021-08-26 14:24:25 +02:00
if [ " $INPLACE " = = 1 ]
then
migrate_database_ownership
fi
2021-08-18 18:53:45 +02:00
migrate_local_files
set_scodoc_var_dir
2021-07-23 08:35:20 +02:00
2021-07-23 09:32:20 +02:00
echo
2021-08-18 18:53:45 +02:00
echo "Les fichiers locaux de ScoDoc: configuration, photos, procès-verbaux..."
2021-07-23 08:35:20 +02:00
echo " sont maintenant stockées dans $SCODOC_VAR_DIR "
2021-08-18 18:53:45 +02:00
echo
2021-07-23 08:35:20 +02:00
2021-08-14 18:54:32 +02:00
# ----- Migration base utilisateurs
2021-07-27 16:07:03 +02:00
echo
2021-08-14 18:54:32 +02:00
echo "-------------------------------------------------------------"
2021-08-26 14:24:25 +02:00
echo "Importation des utilisateurs de ScoDoc 7 dans ScoDoc 9 "
echo "(la base SCOUSERS de ScoDoc 7 sera laissée inchangée)"
2021-08-18 18:53:45 +02:00
echo "(les utilisateurs ScoDoc 9 existants seront laissés inchangés)"
2021-08-14 18:54:32 +02:00
echo "-------------------------------------------------------------"
echo
2021-09-04 11:37:46 +02:00
su -c " (cd $SCODOC_DIR && source venv/bin/activate && flask import-scodoc7-users) " " $SCODOC_USER " || die "Erreur de l'importation des utilisateurs ScoDoc7"
2021-08-14 18:54:32 +02:00
2021-08-18 18:53:45 +02:00
2021-08-14 18:54:32 +02:00
# ----- Migration bases départements
# les départements ScoDoc7 ont été déplacés dans /opt/scodoc-data/config/dept
2021-09-17 09:15:12 +02:00
# (ils ne sont plus utilisés par ScoDoc 9)
# Le nom du dept peut-être en minuscules et/ou majuscules (Geii, GEII...)
# Le nom de BD ScoDoc7 est toujours en majuscules (SCOGEII)
# Rappel: les archives ScoDoc7 étaient .../archives/<dept_name>/... donc minuscules/majuscules
# alors qu'en ScoDoc9 elles seront .../archives/<dept_id>/ : le numéro interne du département,
# puisque l'acronyme peut changer.
2021-08-14 18:54:32 +02:00
for f in " $SCODOC_VAR_DIR " /config/depts/*.cfg
do
2021-09-17 09:15:12 +02:00
dept = $( basename " ${ f %.* } " ) # le nom du dept peut-être en minuscules
2021-09-05 14:21:55 +02:00
db_name = $( echo " SCO $dept " | tr "[:lower:]" "[:upper:]" ) # nom de BD toujours en majuscule
2021-08-15 16:43:53 +02:00
echo
echo "----------------------------------------------"
echo " | MIGRATION DU DEPARTEMENT $dept "
echo "----------------------------------------------"
2021-09-04 11:37:46 +02:00
su -c " (cd $SCODOC_DIR && source venv/bin/activate && flask import-scodoc7-dept $dept $db_name ) " " $SCODOC_USER " || die " Erreur au cours de la migration de $dept . "
2021-08-15 16:43:53 +02:00
echo "restarting postgresql server..."
systemctl restart postgresql
done
2021-09-16 21:42:45 +02:00
# ----- Post-Migration: renomme archives en fonction des nouveaux ids
2021-11-01 15:21:38 +01:00
su -c " (cd $SCODOC_DIR && source venv/bin/activate && flask migrate-scodoc7-dept-archives) " " $SCODOC_USER " || die "Erreur de la post-migration des archives"
2021-09-16 21:42:45 +02:00
2021-11-14 10:33:37 +01:00
# ----- Post-Migration: renomme logos en fonction des nouveaux ids
2021-12-15 23:03:03 +01:00
su -c " (cd $SCODOC_DIR && source venv/bin/activate && flask migrate-scodoc7-dept-logos) " " $SCODOC_USER " || die "Erreur de la post-migration des logos"
2021-11-14 10:33:37 +01:00
2021-09-03 18:37:05 +02:00
# --- Si migration "en place", désactive ScoDoc 7
if [ " $INPLACE " = = 1 ]
then
systemctl disable scodoc
fi
2021-08-15 16:43:53 +02:00
# Précaution a priori inutile (import-scodoc7-dept efface les caches)
systemctl restart redis
2021-09-05 13:41:26 +02:00
# --- THE END
echo
echo "Migration terminée."
echo "Vérifiez le fichier de log /opt/scodoc-data/log/migration79.log"
echo "et:"
echo "- prévenez les utilisateurs dont le login aurait changé."
echo "- dans ScodoC, en tant qu'admin, vérifier la configuration et"
echo " notamment la fonction de calcul du bonus sport, dont le réglage"
echo " est différent en ScoDoc 9 (plus de fichier de configuration python,"
echo " passer par le formulaire de configuration.)"
echo
2021-08-15 16:43:53 +02:00
# Commande listant les nom des departement en DB:
# Liste des bases de données de département:
# dept_db=$(psql -l | awk '{print $1;}' | grep ^SCO | grep -v SCOUSERS | grep -v SCO8USERS | awk '{print substr($1,4);}')