#!/bin/bash

. /usr/lib/eole/utils.sh

IFS=" "
declare -a RESOURCE_MASTER=("VIPCluster")
declare -a RESOURCE_SLAVE=("VIPSlave")
declare -a RESOURCE_MS=("${RESOURCE_MASTER[@]} ${RESOURCE_SLAVE[@]}")
LOCAL_NODE=$(CreoleGet nom_machine)
activer_haute_dispo=$(CreoleGet activer_haute_dispo)
if [ "${activer_haute_dispo}" == "maitre" ]
then
    REMOTE_NODE=$(CreoleGet nom_machine_esclave)
else
    REMOTE_NODE=$(CreoleGet nom_machine_maitre)
fi

if [ ! "$1" = "manage" ] && [ ! "$1" = "unmanage" ] && \
   [ ! "$1" = "migrate" ] && [ ! "$1" = "unmigrate" ] && \
   [ ! "$1" = "deactivate" ] && [ ! "$1" = "activate" ] && \
   [ ! "$1" = "beginlogrotate" ] && [ ! "$1" = "endlogrotate" ]
then
    echo "Option inconnue"
    echo "Doit être :"
    echo "    manage : remise en monitoring des ressources"
    echo "    unmanage : ne monitore plus les ressources locales"
    echo "    migrate : migration des ressources sur le noeud distant"
    echo "    unmigrate : rapatriement des ressources préférant le noeud local"
    echo "    activate : arrête corosync/pacemaker"
    echo "    deactivate : relance corosync/pacemaker"
    echo "    beginlogrotate : met les ressources en unmanage si pas de lock logrotate distant"
    echo "    endlogrotate : met les ressources en manage si pas de lock logrotate distant"
    exit 1
fi

function SetRsc() {
    crm status >> /dev/null 2>&1
    if [ $? -eq 0 ]; then
        [ "$1" == "manage" ] && maintenance="false"
        [ "$1" == "unmanage" ] && maintenance="true"
        # FIXME #31165 : 2>&1 | grep......
        crm configure property maintenance-mode=${maintenance} 2>&1| grep -v 'warning: Blind faith: not fencing unseen nodes'
    fi
    return 0
}

function migrate() {
    crm status >> /dev/null 2>&1
    if [ $? -eq 0 ]; then
        if [ "$1" == "migrate" ]; then
            # migration de toutes les ressources sur le noeud distant
            for rsc_grp in $RESOURCE_MS; do
                crm resource show $rsc_grp >> /dev/null 2>&1
                [ $? -ne 0 ] && continue
                crm resource unmigrate $rsc_grp >> /dev/null 2>&1
                crm resource migrate $rsc_grp $REMOTE_NODE >> /dev/null 2>&1
                wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${REMOTE_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${REMOTE_NODE} $\""
                sleep 1
            done
        elif [ "$1" == "unmigrate" ]; then
            if [ "${activer_haute_dispo}" == "maitre" ]; then
                # Rapatriement des ressources préférées sur le noeud maître
                for rsc_grp in $RESOURCE_MASTER; do
                    crm resource show $rsc_grp >> /dev/null 2>&1
                    [ $? -ne 0 ] && continue
                    crm resource unmigrate $rsc_grp >> /dev/null 2>&1
                    crm resource migrate $rsc_grp $LOCAL_NODE >> /dev/null 2>&1
                    wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${LOCAL_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${LOCAL_NODE} $\""
                done
            elif [ "${activer_haute_dispo}" == "esclave" ]; then
                # Rapatriement des ressources préférées sur le noeud esclave
                for rsc_grp in $RESOURCE_SLAVE; do
                    crm resource show $rsc_grp >> /dev/null 2>&1
                    [ $? -ne 0 ] && continue
                    crm resource unmigrate $rsc_grp >> /dev/null 2>&1
                    crm resource migrate $rsc_grp $LOCAL_NODE >> /dev/null 2>&1
                    wait_true_retcode "Migration de la ressource ${rsc_grp} sur ${LOCAL_NODE}" "crm resource show ${rsc_grp} 2>>/dev/null| grep -sqE \"${rsc_grp} is running on: ${LOCAL_NODE} $\""
                done
            fi
        fi
    fi
}

function activate() {
    if [ "$1" == "deactivate" ]; then
        # On lance corosync si il n'est pas lancé
        service corosync status > /dev/null 2>&1
        if [ ! $? -eq 0 ]
        then
            service corosync start
            wait_true_retcode "Attente démarrage corosync" "service corosync status >> /dev/null 2>&1"
        fi
        # On lance pacemaker si il n'est pas lancé
        service pacemaker status > /dev/null 2>&1
        if [ ! $? -eq 0 ]
        then
            service pacemaker start
            wait_true_retcode "Attente démarrage pacemaker" "service pacemaker status >> /dev/null 2>&1"
        fi
    elif [ "$1" == "activate" ]; then
        service pacemaker stop
        pgrep -f pacemaker  > /dev/null 2>&1 && pkill -f pacemaker > /dev/null 2>&1
        pgrep -f pacemaker > /dev/null 2>&1 &&  pkill -9 pacamaker 2>&1 >/dev/null
        service corosync stop
        pgrep -f corosync > /dev/null 2>&1 && pkill -f corosync > /dev/null 2>&1
        pgrep -f corosync > /dev/null 2>&1 &&  pkill -9 corosync 2>&1 >/dev/null
    fi
    return 0
}

function MngLock()
{
    local lockname=${1}
    local action=${2}
    local host=${3}
    local sshcmd="ssh -q -o LogLevel=ERROR -o StrictHostKeyChecking=no "
    local cmd="CreoleLock"
    local cmdOpt="${action} --name ${lockname}"
    [[ ${action} == "release"   ]] && cmdOpt="$cmdOpt --force"

    if [[ ${action} == "acquire"   ]] || \
       [[ ${action} == "is_locked" ]] || \
       [[ ${action} == "release"   ]]
    then
        if [[ -z ${host} ]]
        then
            $($cmd $cmdOpt)
            return ${?}
        else
            $(${sshcmd} root@${host} "$cmd $cmdOpt")
            return ${?}
        fi
    else
        return 127
    fi
}

function logRotate() {
    if [ "$1" == "beginlogrotate"  ]; then
        MngLock logrotate acquire
        MngLock logrotate is_locked $REMOTE_NODE
        if [ $? -ne 0 ]; then
            SetRsc unmanage
        fi
    elif [ "$1" == "endlogrotate" ]; then
        MngLock logrotate release
        MngLock logrotate is_locked $REMOTE_NODE
        if [ $? -ne 0 ]; then
            SetRsc manage
        fi
    else
        return 127
    fi
}

if [ "$1" == "manage" ] || [ "$1" == "unmanage" ]; then
    SetRsc $1
    exit $?
fi

if [ "$1" == "migrate" ] || [ "$1" == "unmigrate" ]; then
    migrate $1
    exit $?
fi

if [ "$1" == "activate" ] || [ "$1" == "deactivate" ]; then
    activate $1
    exit $?
fi

if [ "$1" == "beginlogrotate" ] || [ "$1" == "endlogrotate" ]; then
    logRotate $1
    exit $?
fi
