#!/bin/bash

. /usr/lib/eole/diagnose.sh
. /usr/lib/eole/utils.sh

function test_corosync()
{
  output=$(crm_mon -1 -n 2>&1)
  return ${?}
}

declare -a ARR_HA_VIP_NAMES=('')
declare -a ARR_HA_VIP_IPS=('')
declare -a ARR_HA_VIP_MSK=('')
declare -a ARR_HA_VIP_INT=('')
declare -a ARR_HA_SCE_NAMES=('')
declare -a ARR_HA_SCE_SCRIPTS=('')
declare -a ARR_HA_SCE_INTERVAL=('')
declare -a ARR_HA_SCE_TIMEOUT=('')
declare -a ARR_HA_SCE_STARTDELAY=('')
declare -a ARR_HA_PINGD_ADRESSEIP=('')

CRM="/usr/sbin/crm"
CIBADMIN="/usr/sbin/cibadmin"
SCRIPT=$(mktemp)
CURRENT_SCRIPT="/etc/eole/crm_script.current"
APPLI_PERSO='/usr/share/eole/appliquer_hautedispo_perso'
RSC_LIST="/etc/ha.d/.rsc_list"
>$RSC_LIST

touch ${SCRIPT}
chmod 600 ${SCRIPT}

if [ "$(CreoleGet activer_haute_dispo)" != "maitre" ]
then
    EchoRouge "Cette commande doit être lancée sur le maitre"
    exit 0
  fi

# Test if corosync is running
test_corosync
if [[ ${?} -ne 0 ]]
then
  EchoRouge "Le démon Corosync ne fonctionne pas !"
  exit 10
fi

> ${SCRIPT}
active_configuration=$(${CRM} configure show)

# Disable Stonith and ignore quorum policy
echo "property stonith-enabled=\"false\" no-quorum-policy=\"ignore\"" >> ${SCRIPT}

#IP's resources
ARR_HA_VIP_NAMES=($(echo $(CreoleGet vip_resource_name)|sed -e "s/\n/ /g"))
ARR_HA_VIP_INT=($(echo $(CreoleGet vip_resource_if)|sed -e "s/\n/ /g"))
ARR_HA_VIP_IPS=($(echo $(CreoleGet vip_resource_adresseip)|sed -e "s/\n/ /g"))
ARR_HA_VIP_MSK=($(echo $(CreoleGet vip_resource_netmask)|sed -e "s/\n/ /g"))
ARR_HA_VIP_GW=($(echo $(CreoleGet vip_resource_gw)|sed -e "s/\n/ /g"))
ARR_HA_VIP_LOCATIONS=($(echo $(CreoleGet vip_resource_location)|sed -e "s/\n/ /g"))
nb_vip=${#ARR_HA_VIP_NAMES[*]}

#service's resources
ARR_HA_SCE_NAMES=($(echo $(CreoleGet service_resource_name '')|sed -e "s/\n/ /g"))
ARR_HA_SCE_SCRIPTS=($(echo $(CreoleGet service_resource_script '')|sed -e "s/\n/ /g"))
ARR_HA_SCE_LOCATIONS=($(echo $(CreoleGet service_resource_location '')|sed -e "s/\n/ /g"))
ARR_HA_SCE_INTERVAL=($(echo $(CreoleGet service_resource_interval '')|sed -e "s/\n/ /g"))
ARR_HA_SCE_TIMEOUT=($(echo $(CreoleGet service_resource_timeout '')|sed -e "s/\n/ /g"))
ARR_HA_SCE_STARTDELAY=($(echo $(CreoleGet service_resource_startdelay '')|sed -e "s/\n/ /g"))
nb_sce=${#ARR_HA_SCE_NAMES[*]}

#ping's resources
ARR_HA_PINGD_ADRESSEIP=($(echo $(CreoleGet pingd_resource_adresseip)|sed -e "s/\n/ /g"))
nb_ping_hosts=${#ARR_HA_PINGD_ADRESSEIP[*]}
pingd_resource_name=$(CreoleGet pingd_resource_name)
nom_machine=$(CreoleGet nom_machine)
nom_machine_esclave=$(CreoleGet nom_machine_esclave)

activer_mail_ha=$(CreoleGet activer_mail_ha)

primitive_master=""
primitive_slave=""
primitive_LB=""
#add all VIPS in primitive
for ((i = 0; i < $nb_vip; i +=1))
do
    if [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'maitre' ]
    then
        primitive_master="$primitive_master ${ARR_HA_VIP_NAMES[i]}"
    elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'esclave' ]
    then
        primitive_slave="$primitive_slave ${ARR_HA_VIP_NAMES[i]}"
    elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'LB' ]
    then
        primitive_LB="$primitive_LB ${ARR_HA_VIP_NAMES[i]}"
        if [ "${ARR_HA_VIP_INT[$i]}" = "0" ]
        then
            primitive_LB="$primitive_LB VIP_src_addr"
        fi
    fi
done

for ((i = 0; i < $nb_vip; i +=1))
do
    ETH_VARNAME="nom_zone_eth${ARR_HA_VIP_INT[$i]}"
    NIC_NAME="$(CreoleGet $ETH_VARNAME)"
    echo "primitive ${ARR_HA_VIP_NAMES[$i]} ocf:heartbeat:IPaddr2 params ip=\"${ARR_HA_VIP_IPS[$i]}\" cidr_netmask=\"${ARR_HA_VIP_MSK[$i]}\" nic=\"${NIC_NAME}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT}

### FIXME la route n'est pas utilisable telle quelle
### Cela n'empêche pas le fonctionnement du VPN
### Supprimée pour traiter #16062
#    if [ ! "${ARR_HA_VIP_GW[$i]}" = "255.255.255.255" ]
#    then
#        VIP_SRC_NAME="VIP_src_addr"
#        if [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'maitre' ]
#        then
#            VIP_SRC_NAME=${VIP_SRC_NAME}"_master_22${i}"
#            primitive_master="${primitive_master} ${VIP_SRC_NAME}"
#        elif [ "${ARR_HA_VIP_LOCATIONS[i]}" = 'esclave' ]
#        then
#            VIP_SRC_NAME=${VIP_SRC_NAME}"_slave_22${i}"
#            primitive_slave="${primitive_slave} ${VIP_SRC_NAME}"
#        fi
#        echo "primitive ${VIP_SRC_NAME} ocf:heartbeat:Route params destination=\"default\" gateway=\"${ARR_HA_VIP_GW[$i]}\" source=\"${ARR_HA_VIP_IPS[$i]}\" table=\"22${i}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT}
#    fi
done

#add all services in primitive
for ((i = 0; i < $nb_sce; i +=1))
do
    if [ ${ARR_HA_SCE_LOCATIONS[i]} = 'maitre' ]
    then
        primitive_master="$primitive_master ${ARR_HA_SCE_NAMES[i]}"
    elif [ ${ARR_HA_SCE_LOCATIONS[i]} = 'esclave' ]
    then
        primitive_slave="$primitive_slave ${ARR_HA_SCE_NAMES[i]}"
    elif [ ${ARR_HA_SCE_LOCATIONS[i]} = 'LB' ]
    then
        primitive_LB="$primitive_LB ${ARR_HA_SCE_NAMES[i]}"
    fi
    echo "sce_rsc ${ARR_HA_SCE_NAMES[i]} ${ARR_HA_SCE_SCRIPTS[i]} ${ARR_HA_SCE_LOCATIONS[i]}" >> $RSC_LIST
done

if [ "${activer_mail_ha}" = "oui" ]
then
    to_mail_ha=$(CreoleGet to_mail_ha)
    subject_mail_ha=$(CreoleGet subject_mail_ha)
    mail_ha_resource_name=$(CreoleGet mail_ha_resource_name)
    primitive_master=$primitive_master" "$mail_ha_resource_name
fi

for ((i = 0; i < $nb_sce; i +=1))
do
    timeout=${ARR_HA_SCE_TIMEOUT[$i]}
    interval=${ARR_HA_SCE_INTERVAL[$i]}
    startdelay=${ARR_HA_SCE_STARTDELAY[$i]}
    echo "primitive ${ARR_HA_SCE_NAMES[$i]} service::${ARR_HA_SCE_SCRIPTS[$i]} op start timeout=\"240s\" op monitor interval=\"${interval}s\" timeout=\"${timeout}s\" start-delay=\"${startdelay}s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT}
done

if [[ "${activer_mail_ha}" == "oui" ]]
then
    echo "primitive ${mail_ha_resource_name} ocf:heartbeat:MailTo params email=\"${to_mail_ha}\" subject=\"${subject_mail_ha}\" op monitor interval=\"10s\" disabled=\"true\" meta target-role=\"started\"" >> ${SCRIPT}
fi

[ -f "$APPLI_PERSO" ] && . $APPLI_PERSO

# VIPCluster group prefers master node
if [[ -n ${primitive_master} ]]
then
    echo "group VIPCluster ${primitive_master} meta target-role=\"started\"">> ${SCRIPT}
    echo "location VIPCluster_prefers_master VIPCluster rule 50: #uname eq ${nom_machine}" >> ${SCRIPT}
    echo "location VIPCluster_on_slave VIPCluster rule 40: #uname eq ${nom_machine_esclave}" >> ${SCRIPT}
fi
# VIPSlave group prefers slave node
if [[ -n ${primitive_slave} ]]
then
    echo "group VIPSlave ${primitive_slave} meta target-role=\"started\"">> ${SCRIPT}
    echo "location VIPSlave_prefers_slave VIPSlave rule 50: #uname eq ${nom_machine_esclave}" >> ${SCRIPT}
    echo "location VIPSlave_on_master VIPSlave rule 40: #uname eq ${nom_machine}" >> ${SCRIPT}
fi
# Clone VIPLB for Load Balancing
if [[ -n ${primitive_LB} ]]
then
    echo "group VIPLB ${primitive_LB} meta target-role=\"started\"">> ${SCRIPT}
    echo "clone VIPLB_clone VIPLB meta globally-unique=false" >> ${SCRIPT}
fi

# *** Primitive pingd ***
if [ $nb_ping_hosts -gt 0 ]
then
    echo "primitive ${pingd_resource_name} ocf:pacemaker:ping params host_list=\"${ARR_HA_PINGD_ADRESSEIP[@]}\" multiplier=100 op monitor interval=15s timeout=5s" >> ${SCRIPT}
    echo "clone ${pingd_resource_name}_clone ${pingd_resource_name} meta globally-unique=false" >> ${SCRIPT}

    echo "location VIPClusterping VIPCluster rule -inf: not_defined pingd or pingd lte 0"  >> ${SCRIPT}
    if [ ! "${primitive_slave}" = "" ]
    then
        echo "location VIPSlaveping VIPSlave rule -inf: not_defined pingd or pingd lte 0"  >> ${SCRIPT}
    fi
fi
# *** Fin primitive pingd ***
if [[ -f ${SCRIPT} ]]
then
    # On lance corosync si il n'est pas lancé
    service corosync status > /dev/null 2>&1
    if [[ $? -ne 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 [[ $? -ne 0 ]]
    then
        service pacemaker start
        wait_true_retcode "Attente démarrage pacemaker" "service pacemaker status > /dev/null 2>&1"
    fi
    # On vérifie que le noeud est bien Online
    crm node online ${nom_machine} > /dev/null 2>&1
    wait_true_retcode "Attente noeud Online" "crm_mon -1|grep -qsE \"Online: \[.* ${nom_machine} .*\]\""

    # Activation du mode automatique pour la gestion des groupes de resources
    crm options manage-children always

    # Stopping resources
    clone_resources=$(${CRM} configure show|grep -e "clone"|awk -F" " '{print $2}')
    for clone_resource in $clone_resources
    do
        ${CRM} resource stop $clone_resource
        wait_true_retcode "Arrêt ressource $clone_resource" "crm resource status ${clone_resource} 2>&1|grep -qsE \"is NOT running\""
    done

    actives_resources_groups=$(${CRM} configure show|grep -e "group"|awk -F" " '{print $2}')
    for active_resource_group in $actives_resources_groups
    do
        ${CRM} resource stop $active_resource_group
        wait_true_retcode "Arrêt ressource $active_resource_group" "crm resource status ${active_resource_group} 2>&1|grep -qsE \"is NOT running\""
    done

    actives_primitives=$(${CRM} configure show|grep -e "primitive"|awk -F" " '{print $2}')
    for active_primitive in $actives_primitives
    do
        ${CRM} resource stop $active_primitive
        wait_true_retcode "Arrêt ressource $active_primitive" "crm resource status ${active_primitive} 2>&1|grep -qsE \"is NOT running\""
    done
    # End of stopping resources

    crm_mon -1
    # FIXME #31165 : 2>&1| grep......
    ${CRM} configure load replace ${SCRIPT} 2>&1| grep -v 'warning: Blind faith: not fencing unseen nodes'
    rm -f ${SCRIPT}
fi
