ScoDoc/tools/migrate_from_scodoc7.sh

178 lines
6.1 KiB
Bash
Executable File

#!/bin/bash
# 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
#
# Fichiers de données et config locale:
# archives, photos: /opt/scodoc/var/ => /opt/scodoc-data
#
#
# 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"
cd "$SCODOC_DIR" || die "ScoDoc 9 non installe"
# Ce script doit tourner comme "root"
check_uid_root "$0"
# ScoDoc 9 doit être bien installé
[ -e .env ] || die "ScoDoc 9 mal configuré: manque .env"
# Usage
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
echo "Usage: $0 archive"
echo " ou $0 -m"
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
exit 1
}
if [ ! $# -eq 1 ]
then
usage
fi
if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
usage
fi
if [ "$1" == "-m" ]
then
echo "migration en place"
INPLACE=1
SCODOC7_HOME=/opt/scodoc7
else
echo "Migration depuis archive $1"
INPLACE=0
SCODOC7_HOME="$1" # racine de l'archive importée
fi
# --- 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)
#
migrate_database_ownership() {
echo "Changing databases ownerships"
SCO7_BASES=$(su -c "psql -l -t | grep www-data" "$POSTGRES_SUPERUSER" | awk -F '|' '{print $1}')
if [ -z "$SCO7_BASES" ]
then
echo "Aucune base ScoDoc 7 appartenant à www-data. OK."
else
for base in $SCO7_BASES
do
echo modifying $base owner
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
}
# --- 3. Fichiers locaux: /opt/scodoc7/var => /opt/scodoc-data
# note mémo: $SCODOC_DIR ets /opt/scodoc, et $SCODOC_VAR_DIR /opt/scodoc-data
#
# Migration en place: /opt/scodoc7/var == SCODOC7_HOME/var => /opt/scodoc-data
# Migration via archive: SCODOC7_HOME/var => /opt/scodoc-data
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" ]
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"
mv "${SCODOC7_HOME}"/var/scodoc/* "$SCODOC_VAR_DIR" || die "migrate_local_files failed"
# mais récupère notre .env !
cp "$SCODOC_VAR_DIR_BACKUP"/.env "$SCODOC_VAR_DIR" || die "fichier .env manquant dans l'ancien $SCODOC_VAR_DIR !"
# 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"
mv "${SCODOC7_HOME}"/log/* "$old_logs_dest" || die "erreur mv"
# Templates locaux poursuites etudes
if [ -e "${SCODOC7_HOME}"/config/doc_poursuites_etudes/local ]
then
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"
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}"
}
# ------ MAIN
change_scodoc_file_ownership
if [ "$INPLACE" == 1 ]
then
migrate_database_ownership
fi
migrate_local_files
set_scodoc_var_dir
echo
echo "Les fichiers locaux de ScoDoc: configuration, photos, procès-verbaux..."
echo "sont maintenant stockées dans $SCODOC_VAR_DIR"
echo
# ----- Migration base utilisateurs
echo
echo "-------------------------------------------------------------"
echo "Importation des utilisateurs de ScoDoc 7 dans ScoDoc 9 "
echo "(la base SCOUSERS de ScoDoc 7 sera laissée inchangée)"
echo "(les utilisateurs ScoDoc 9 existants seront laissés inchangés)"
echo "-------------------------------------------------------------"
echo
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask import-scodoc7-users)" "$SCODOC_USER"
# ----- Migration bases départements
# les départements ScoDoc7 ont été déplacés dans /opt/scodoc-data/config/dept
# (ils ne sont d'ailleurs plus utilisés par ScoDoc 9)
for f in "$SCODOC_VAR_DIR"/config/depts/*.cfg
do
dept=$(basename "${f%.*}")
db_name=$(echo "SCO$dept" | tr "[:lower:]" "[:upper:]")
echo
echo "----------------------------------------------"
echo "| MIGRATION DU DEPARTEMENT $dept"
echo "----------------------------------------------"
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask import-scodoc7-dept $dept $db_name)" "$SCODOC_USER"
echo "restarting postgresql server..."
systemctl restart postgresql
done
# Précaution a priori inutile (import-scodoc7-dept efface les caches)
systemctl restart redis
# 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);}')