#!/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_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)
property_lines=$(echo "${active_configuration}"|grep property -A100|sed 's/ \\//g'|grep -v "\$id="|awk -F"=" '{print $1}')

echo "property stonith-enabled=\"false\"" >> ${SCRIPT}
echo "property 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_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"))
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)

vip_resource_name=$(echo $(CreoleGet vip_resource_name)|sed -e "s/\n/ /g")
service_resource_name=$(echo $(CreoleGet service_resource_name)|sed -e "s/\n/ /g")

activer_mail_ha=$(CreoleGet activer_mail_ha)

netmask=""
for ((i = 0; i < $nb_vip; i +=1))
do
    mask=$(CreoleGet adresse_netmask_${ARR_HA_VIP_INT[i]})
    netmask=$netmask"${mask} "
done
ARR_HA_VIP_MSK=($netmask)

#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]}"
    else
        primitive_slave="$primitive_slave ${ARR_HA_VIP_NAMES[i]}"
    fi
done

#FIXME equivalent VIP_src_addr pour la slave ?
#add VIP_src_addr to force adresse in eth0
primitive_master="$primitive_master VIP_src_addr"

#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]}"
    else
        primitive_slave="$primitive_slave ${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

# 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
done

if [ ! "${primitive_master}" = "" ]
then
    new_groups="VIPCluster "
fi
if [ ! "${primitive_slave}" = "" ]
then
    new_groups="${new_groups}VIPSlave "
fi
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
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
done
# End of stopping resources

sleep 5

for ((i = 0; i < $nb_vip; i +=1))
do
    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=\"${ARR_HA_VIP_INT[$i]}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT}

    if [ "${ARR_HA_VIP_INT[$i]}" = "eth0" ]
    then
        echo "primitive VIP_src_addr ocf:heartbeat:IPsrcaddr params ipaddress=\"${ARR_HA_VIP_IPS[$i]}\" op monitor interval=\"10s\" disabled=\"false\" meta target-role=\"started\"" >> ${SCRIPT}
    fi
done

for ((i = 0; i < $nb_sce; i +=1))
do
    timeout=${ARR_HA_SCE_TIMEOUT[$i]}
    interval=${ARR_HA_SCE_INTERVAL[$i]}
    echo "primitive ${ARR_HA_SCE_NAMES[$i]} lsb::${ARR_HA_SCE_SCRIPTS[$i]} op start timeout=\"240s\" op monitor interval=\"${interval}s\" timeout=\"${timeout}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

if [ ! "${primitive_master}" = "" ]
then
    echo "group VIPCluster ${primitive_master} meta target-role=\"started\"">> ${SCRIPT}
fi
if [ ! "${primitive_slave}" = "" ]
then
    echo "group VIPSlave ${primitive_slave} meta target-role=\"started\"">> ${SCRIPT}
fi

# VIPCluster group prefers master node
if [ ! "${primitive_master}" = "" ]
then
    echo "location VIPCluster_prefers_master VIPCluster rule inf: #uname eq ${nom_machine}" >> ${SCRIPT}
fi
# VIPSlave group prefers slave node
if [ ! "${primitive_slave}" = "" ]
then
    echo "location VIPSlave_prefers_slave VIPSlave rule inf: #uname eq ${nom_machine_esclave}" >> ${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é
    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
    # 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 -s Online|grep -q -s ${nom_machine}"
    ${CRM} configure load replace ${SCRIPT}
    rm -f ${SCRIPT}
fi
