#!/bin/bash

. /usr/lib/eole/ihm.sh
. /usr/lib/eole/utils.sh

activer_haute_dispo=$(CreoleGet activer_haute_dispo)
nom_machine=$(CreoleGet nom_machine)
option="$1"

if [ "${activer_haute_dispo}" == "non" ]
then
# Si haute dispo désactivée, on stoppe corosync
    /etc/init.d/corosync stop
    /usr/bin/pgrep corosync >/dev/null
    if [ $? == 0 ]
    then
        killall corosync 2>&1 >/dev/null
        /usr/bin/pgrep corosync >/dev/null
        if [ $? == 0 ]
        then
            killall -9 corosync 2>&1 >/dev/null
        fi
    fi
    rm -f /var/lib/heartbeat/crm/*
else
    corosync_dial_if=$(CreoleGet corosync_dial_if)
    id eole &>/dev/null
    if [ $? -eq 0 ]
    then
        groups eole |grep haclient >/dev/null
        if [ $? -ne 0 ]
        then
            usermod -G haclient -a eole
        fi
    fi
    # On genere un bi-clef rsa sur chaque machine si il n'existe pas
    if [ ! -e /root/.ssh/id_rsa.pub ] &&
            [ ! -e /root/.ssh/id_rsa ]
        then
            ssh-keygen -t rsa -b 2048 -f /root/.ssh/id_rsa -N "" -q
    fi

    # on renseigne le noeud distant
    if [ "${activer_haute_dispo}" == "maitre" ]
    then
        remote_node=$(CreoleGet nom_machine_esclave)
    elif [ "${activer_haute_dispo}" == "esclave" ]
    then
        remote_node=$(CreoleGet nom_machine_maitre)
    fi

    if [ "$option" = "instance" ]
    then
        ## Suppression de l'ancienne conf pacemaker
        if [ -e /var/lib/heartbeat/crm/cib.xml ]
        then
            /etc/init.d/corosync stop
            /usr/bin/pgrep corosync >/dev/null
            if [ $? == 0 ]
            then
                killall corosync 2>&1 >/dev/null
                /usr/bin/pgrep corosync >/dev/null
                if [ $? == 0 ]
                then
                    killall -9 corosync 2>&1 >/dev/null
                fi
            fi
            rm -f /var/lib/heartbeat/crm/*
        fi
    fi

    # On lance corosync si il n'est pas lancé
    crm status > /dev/null 2>&1
    if [ ! $? -eq 0 ]
    then
        /etc/init.d/corosync start
        wait_true_retcode "Attente démarrage corosync" "crm status > /dev/null 2>&1"
    fi

    /usr/share/eole/sbin/haute_dispo_maintenance manage

    if [ $activer_haute_dispo = "maitre" ]
    then
        if [ ! "$option" = "reconfigure" ]; then
            Question_ouinon "Voulez-vous (re)configurer la haute disponibilité ?" 'True' "non"
            rep=$?
        else
            rep=1
        fi
        if [ $rep -eq 0 ]
        then
            /usr/share/eole/sbin/appliquer_hautedispo
            # On attend que les ressources soient montées
            wait_true_retcode "Attente ressources montées" "crm resource show VIP_src_addr 2>&1|grep -s -q 'is running'"
        fi
    fi

    # État des ressources
    result=$(crm resource show VIPCluster 2>&1)
    vipcluster=0
    running=0
    echo $result|grep -s -q -E "NOT running"
    if [ $? -eq 0 ]
    then
        vipcluster=1
        running=0
    else
        echo $result|grep -s -q -E "running on: ${nom_machine}$"
        if [ $? -eq 0 ]
        then
            vipcluster=1
            running=1
        else
            echo $result|grep -s -q -E "running on: ${remote_node}$"
            if [ $? -eq 0 ]
            then
                vipcluster=1
                running=2
            else
                echo $result|grep -s -q -E "not found"
                if [ $? -eq 0 ]
                then
                    vipcluster=0
                    running=0
                fi
            fi
        fi
    fi

    # Si VIPCluster existe
    if [ ! $vipcluster -eq 0 ]
    then
        if [ $running -eq 0 ] &&  [ "${activer_haute_dispo}" = "maitre" ]
        # Si les resources ne sont pas lancées
        # on réapplique le script pour les lancer
        then
            /usr/share/eole/sbin/appliquer_hautedispo
            # On laisse éventuellement le temps aux ressources de monter
            sleep 2
        elif [ $running -eq 2 ]
        # Si les ressources sont sur le node distant
        # on propose de les migrer sur le node local
        then
            if [ ! "$option" = "reconfigure" ]; then
                Question_ouinon "Voulez-vous migrer les ressources sur ${nom_machine} ?" 'True' "non"
                rep=$?
            else
                rep=1
            fi
            if [ $rep -eq 0 ]
            then
                # On vérifie que le noeud est bien Online
                crm node online ${nom_machine} > /dev/null 2>&1
                cmd="crm_mon -1|grep -s Online|grep -q -s -E \" ${nom_machine} \""
                wait_true_retcode "Attente noeud Online" "${cmd}"
                # On laisse éventuellement le temps aux ressources de basculer
                sleep 2
                crm resource show VIP_src_addr 2>&1|grep -s -q "is running on: ${remote_node}"
                local_node=$?
                # Si les ressources n'ont pas basculé automatiquement, on force la migration
                if [ $local_node -eq 0 ]
                then
                    crm resource unmigrate VIPCluster
                    crm resource cleanup VIPCluster
                    crm resource migrate VIPCluster $nom_machine
                fi
            fi
        fi
    else
        if [ "${activer_haute_dispo}" == "maitre" ]
        then
            EchoOrange "Vous pouvez générer la configuration de haute disponibilité en lançant manuellement le script 'appliquer_hautedispo'"
        fi
    fi

    if [ ! "$option" = "reconfigure" ]; then
        EchoOrange "Les serveurs maître et esclave doivent pouvoir dialoguer en ssh sur l'interface $corosync_dial_if"
        Question_ouinon "Voulez-vous synchroniser les noeuds ?" 'True' "non"
        rep=$?
    else
        rep=1
    fi
    if [ $rep -eq 0 ]
    then
        # on attend que les 2 noeuds soient Online
        crm node online ${nom_machine} > /dev/null 2>&1
        cmd="crm_mon -1|grep -s Online|grep -q -s -E \" ${nom_machine} \""
        wait_true_retcode "Attente noeud $nom_machine Online" "${cmd}"
        if [ $vipcluster -eq 1 ]
        then
            # On attend que les ressources soient montées si elles sont déclarées
            wait_true_retcode "Attente ressources montées" "crm resource show VIP_src_addr 2>&1|grep -s -q 'is running'"
        fi
        /usr/share/eole/sbin/synchro-nodes.sh
    else
        if [ ! "$option" = "reconfigure" ]; then
            EchoOrange "Pour forcer la synchronisation, vous pouvez lancer le script 'synchro-nodes.sh' manuellement une fois les deux noeuds 'Online'"
            EchoOrange "Vous pouvez vérifier leur status à l'aide de la commande 'crm_mon -1'"
        fi
    fi
fi
