#!/bin/bash
###########################################################################
# Eole NG - 2007
# Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon)
# Licence CeCill  cf /root/LicenceEole.txt
# eole@ac-dijon.fr
#
# zephir.sh
#
# script d'instanciation du module Zephir NG
#
###########################################################################

# Appel Bibliothèque
if [ -f /usr/lib/eole/ihm.sh ]
then
. /usr/lib/eole/ihm.sh
else
    echo 'Erreur : /usr/lib/eole/ihm.sh non trouvé'
exit 1
fi

ACTION=$1

PG_VERSION=12
PG_CONF_DIR=/etc/postgresql/$PG_VERSION/main
PG_CONF_FILE=$PG_CONF_DIR/pg_hba.conf
PG_SERVICE=postgresql
MAJ_MD5_FILE=/usr/share/zephir/sql/sql_maj.md5
PG_DATA=/var/lib/postgresql/$PG_VERSION/main

# 1. se mettre en mode sans mot de passe
mv $PG_CONF_FILE $PG_CONF_FILE.savezephir
echo -e "local\tall\tall\ttrust" > $PG_CONF_FILE
chown postgres.postgres $PG_CONF_FILE
chmod 600 $PG_CONF_FILE
CreoleService $PG_SERVICE start
echo -e "\n## Regénération des mots de passe ##"
# to avoid X11 warnings
unset DISPLAY

if [ "$ACTION" = "instance" ]; then
    # 2. changer/créer le mot de passe postgres (exemple eole)
    if ! su - postgres -c "psql -d template1 -c \"ALTER USER postgres WITH PASSWORD 'eole'\"" >/dev/null; then
        echo "Impossible de modifier le mot de passe dans la base de donnée, vérifier que $PG_SERVICE soit bien démarré"
        CreoleRun "COLUMNS=1000 systemctl --no-pager status $PG_SERVICE@*.service" postgresql
        exit 1
    fi

    # 3. créer un utilisateur pour l'application (exemple zephir)
    Reponse="oui"
    # on vérifie que la base zephir est présente
    su - postgres -c "psql -l zephir --no-password" > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
        Question_ouinon "Voulez-vous re-créer les utilisateurs et données de base (attention toutes les données actuelles seront perdues) ?" "True" "non" "warn"
        [ $? -eq 1 ] && Reponse="non"
    fi

    if [ "$Reponse" == "oui" ]
    then
        # on supprime les anciennes données
        rm -rf /etc/uucp/serveurs/*
        rm -rf /var/lib/zephir/conf/*
        rm -rf /var/lib/zephir/modules/*
        cp /usr/share/zephir/uucp_zephir/passwd_zephir /etc/uucp/
        # créer les bases et les tables au nom de cet utilisateur (exemple à partir du fichier tables.sql)
        su - postgres <<EOF
dropdb zephir &>/dev/null
psql -c "CREATE USER \"zephir\" WITH  PASSWORD 'eole' CREATEDB NOCREATEROLE" -d template1 &> /dev/null

createdb zephir -Uzephir &>/dev/null
psql -d zephir -f /usr/share/zephir/sql/zephir.sql -Uzephir &>/dev/null

EOF

    fi
fi
## Changement des mots de passe pour ldap et postgres (generation automatique)
/usr/share/eole/gen_pwd.py >/dev/null

# mise à jour de la base si le fichier maj.sql a changé
[ "$ACTION" = "instance" ] && LanceMaj="non" || LanceMaj="oui"
if [ -f $MAJ_MD5_FILE ]
then
    #Remet oui si necessaire dans le cas de l'instance
    /usr/bin/md5sum -c $MAJ_MD5_FILE >/dev/null 2>&1
    [ $? -eq 0 ] && LanceMaj="non" || LanceMaj="oui"
fi
if [ "$LanceMaj" == "oui" ]
then
    # on met à jour le schéma de la base
    echo -e "\n## Mise à jour de la base de données ##"
    su postgres <<EOF
psql -d zephir -Uzephir -f /usr/share/zephir/sql/maj.sql >/dev/null 2>&1
EOF
    sleep 1
fi
if [ ! -f $MAJ_MD5_FILE ] || [ "$LanceMaj" == "oui" ]; then
    /usr/bin/md5sum /usr/share/zephir/sql/maj.sql > $MAJ_MD5_FILE
fi

# 4. se remettre en mode mot de passe
rm -f $PG_CONF_FILE
mv -f $PG_CONF_FILE.savezephir $PG_CONF_FILE
chown postgres.postgres $PG_CONF_FILE
chmod 600 $PG_CONF_FILE
CreoleService $PG_SERVICE restart

if [ "$ACTION" = "instance" ]; then
    # 5. initialisation des données Zephir de base si demandé
    # demarrage des services ldap et Zephir (mode minimum)
    CreoleService slapd restart
    sleep 2
    systemctl stop zephir
    # désactivation temporaire de la boucle de scan des serveurs
    systemctl set-environment ZEPHIR_SCAN=0
    systemctl start zephir

    adminok=0
    admin_zephir=$(CreoleGet admin_zephir)
    adresse_ip_ldap=$(CreoleGet adresse_ip_ldap)
    ldap_base_dn=$(CreoleGet ldap_base_dn)
    activer_client_ldap=$(CreoleGet activer_client_ldap)
    # On vérifie si l'administrateur principal est présent dans l'annuaire
    # la regénération de l'annuaire local est gérée par le paquet eole-annuaire
    ldapsearch -x -h $adresse_ip_ldap -b "$ldap_base_dn" "uid=$admin_zephir" | grep "dn:" >/dev/null && adminok=1

    export PYTHONPATH=/usr/share/:$PYTHONPATH

    if [ "$Reponse" == "oui" ] || [ $adminok -eq 0 ]
    then
        # si le serveur ldap est local, initialisation des utilisateurs de base
        if [ "$activer_client_ldap" == "local" ]
        then
            if [ "$Reponse" == "non" ]
            then
                EchoOrange "L'utilisateur $admin_zephir n'est pas présent dans l'annuaire, renseignez son mot de passe ci-dessous"
            fi
            # saisie du mot de passe de l'administrateur de base Zephir (dans ldap)
            echo
            MSG="# Initialisation du mot de passe de l'administrateur de base ($admin_zephir) #"
            LEN=`echo $MSG|wc -c`
            for i in `seq 2 $LEN`; do printf "#"; done
            echo
            echo $MSG
            for i in `seq 2 $LEN`; do printf "#"; done
            echo
            stty -echo
            read -p "Mot de passe : " pass_zeph
            echo
            read -p "Confirmation du mot de passe : " pass_zeph2
            echo
            while [ "$pass_zeph" != "$pass_zeph2" -o "$pass_zeph" == "" ]
            do
                if [ "$pass_zeph" == "" ]
                then
                    EchoOrange "Erreur : le mot de passe ne doit pas être vide"
                else
                    EchoOrange "Erreur : les mots de passe ne correspondent pas"
                fi
                read -p "Mot de passe : " pass_zeph
                echo
                read -p "Confirmation du mot de passe : " pass_zeph2
                echo
            done
            stty echo
            echo
            python3 -u /usr/share/zephir/utils/init_ldap.py $pass_zeph
        else
            if [ $adminok -eq 0 ]
            then
                EchoRouge "Erreur : l'utilisateur $admin_zephir n'est pas présent dans l'annuaire $adresse_ip_ldap"
                exit 1
            fi
            pass_zeph="toto"
            pass_ok=0
            stty -echo
            while [ $pass_ok -ne 1 ]
            do
                read -p "Mot de passe actuel de $admin_zephir (annuaire distant) : " pass_zeph
                if [ -z "${pass_zeph}" ]
                then
                    EchoRouge "Mot de passe vide, abandon..."
                    stty echo
                    exit 1
                fi
                # test de bind ldap
                DN=$(ldapsearch -LLL -x -h $adresse_ip_ldap -b "$ldap_base_dn" "uid=$admin_zephir" dn | perl -00lne '($dn = $_) =~ s/(?:^dn:\s+)|(?:\r?\n\s)//g; print $dn') &>/dev/null
                ldapsearch -x -h $adresse_ip_ldap -b "$ldap_base_dn" -D "${DN}" -w "${pass_zeph}" "uid=$admin_zephir" &> /dev/null
                if [ $? -eq 0 ]
                then
                    pass_ok=1
                else
                    EchoOrange "Erreur d'authentification LDAP"
                fi
            done
            stty echo
            echo
        fi
       # seulement si regénération des données de base
       if [ "$Reponse" == "oui" ]
       then
               # insertion des données de base
               echo -e "\n## Insertion des données minimum dans la base ##"
               cd /usr/share/zephir/utils
               python3 -u init_base.py "${pass_zeph}"
               if [ $? -ne 0 ]
               then
                       EchoOrange "Erreur de mise en place des données de base"
                       exit 1
               fi
       fi
    else
        # cas de changement d'administrateur (ex : passage sur ldap externe)
        # sans écrasement de la base de données.
        python3 -u /usr/share/zephir/utils/init_base.py --verify
    fi

    ## 6. Creer le repertoire .ssh pour uucp
    if [ ! -d /var/spool/uucp/.ssh ]
    then
        mkdir /var/spool/uucp/.ssh
        chown uucp.uucp /var/spool/uucp/.ssh
        chmod 700 /var/spool/uucp/.ssh
    fi

    # zephir peut empêcher l'arrêt de Postgresql
    systemctl stop zephir > /dev/null 2>&1
    # réactivation de la boucle de scan des serveurs
    systemctl set-environment ZEPHIR_SCAN=1

fi

if [ -f /var/lib/zephir/.restored ]
then
    # Nettoyage des serveurs et modules non supportés
    echo -e "\n## Suppression des serveurs et modules non supportés ##"
    python3 -u /usr/share/zephir/utils/cleanup_import.py
fi

if [ "$ACTION" = "instance" ]; then
    CreoleService $PG_SERVICE stop
    CreoleService slapd stop
    echo
fi

# suppression du fichier postgresql-common dans cron.d
if [ -f /etc/cron.d/postgresql-common ]; then
    rm -f /etc/cron.d/postgresql-common
fi

echo -e "\n## Vérification des paquets disponibles sur les serveurs de mise à jour des clients ##"
# Lancement du script de récupération des information des serveurs
# de mise à jour. Lancé après arrêt du backend Zéphir pour
# limiter les risques de blocage de celui-ci
python3 -u /usr/share/eole/check_maj_eole.py $ACTION
# exit 0, check_maj_eole ne doit pas bloquer l'instanciation
exit 0
