#!/bin/bash

. /usr/lib/eole/utils.sh

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_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
    exit 0
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_lines|grep -q "stonith-enabled"
if [ ! $? -eq 0 ]
then
    echo "property stonith-enabled=\"false\"" >> ${SCRIPT}
fi
echo $property_lines|grep -q "no-quorum-policy"
if [ ! $? -eq 0 ]
then
    echo "property no-quorum-policy=\"ignore\"" >> ${SCRIPT}
fi
echo "rsc_defaults resource-stickiness=100" >> ${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"))
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[*]}
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
    primitive_order="$primitive_order ${ARR_HA_VIP_NAMES[i]}"
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"
primitive_order="$primitive_order 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
    primitive_order="$primitive_order ${ARR_HA_SCE_NAMES[i]}"
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_order=$primitive_order" "$mail_ha_resource_name
    primitive_master=$primitive_master" "$mail_ha_resource_name
fi
#all primitive are "co"located
colocated_primitives=""
for primitive in $primitive_order
do
    colocated_primitives=$primitive" "$colocated_primitives
done

location_constraints=$(${CRM} configure show|grep -e "^location"|awk -F" " '{print $2}')
for location in $location_constraints
do
    ${CRM} configure delete $location
done

clone_resources=$(${CRM} configure show|grep -e "clone"|awk -F" " '{print $2}')
for clone_resource in $clone_resources
do
    ${CRM} resource stop $clone_resource
    ${CRM} resource cleanup $clone_resource
    ${CRM} configure delete $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 unmanage $active_resource_group
    ${CRM} resource stop $active_resource_group
    present_group=0
    for group in ${new_groups}
    do
        if [ "$group" = "$active_resource_group" ]
        then
            present_group=1
            break
        fi
    done
    ${CRM} resource cleanup $active_resource_group
    if [ $present_group = 0 ]
    then
        echo "Suppression du groupe $active_resource_group ..."
        ${CRM} configure delete $active_resource_group
    fi
done

actives_primitives=$(${CRM} configure show|grep -e "primitive"|awk -F" " '{print $2}')
new_primitives=${primitive_order}
for active_primitive in $actives_primitives
do
    ${CRM} resource stop $active_primitive
    ${CRM} resource failcount $active_primitive delete ${nom_machine}
    present_primitive=0
    for primitive in ${new_primitives}
    do
        if [ "$primitive" = "$active_primitive" ]
        then
            present_primitive=1
            break
        fi
    done
    if [ $present_primitive = 0 ]
    then
        echo "Suppression de la ressource $active_primitive ..."
        ${CRM} resource cleanup $active_primitive
        ${CRM} configure delete $active_primitive
    fi
done

actives_resources_constraints=$(${CRM} configure show|grep -e "colocation" -e "order"|awk -F" " '{print $2}')
new_resources_constraints="link-resources rsc_start_order"
for active_resource_constraint in $actives_resources_constraints
do
    present_resource_constraint=0
    for resource_contraint in $new_resources_constraints
    do
        if [ "$resource_contraint" = "$active_resource_constraint" ]
        then
            present_resource_constraint=1
            break
        fi
    done
    if [ $present_resource_constraint = 0 ]
    then
        echo "Suppression de la contrainte $active_resource_constraint"
        ${CRM} configure delete $active_resource_constraint
    fi
done
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
    echo "primitive ${ARR_HA_SCE_NAMES[$i]} lsb::${ARR_HA_SCE_SCRIPTS[$i]} op monitor interval=\"10s\" timeout=\"30s\" 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
echo "colocation link-resources inf: ${colocated_primitives}" >> ${SCRIPT}
echo "order rsc_start_order INFINITY: ${primitive_order}" >> ${SCRIPT}

# On a une préférence pour le node maitre
if [ ! "${primitive_master}" = "" ]
then
    echo "location cli-prefer-VIPCluster VIPCluster rule inf: #uname eq ${nom_machine}" >> ${SCRIPT}
fi
if [ ! "${primitive_slave}" = "" ]
then
    echo "location cli-prefer-VIPSlave VIPSlave rule inf: #uname eq ${nom_machine_esclave}" >> ${SCRIPT}
fi

# *** Primitive pingd ***
# !!! FIXME #4162 !!!
#if [ $nb_ping_hosts -gt 0 ]
#then
#    echo "primitive ${pingd_resource_name} ocf:pacemaker:pingd params host_list=\"${pingd_resource_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}
#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 update ${SCRIPT}
    rm -f ${SCRIPT}
fi
#${CRM} resource unmigrate VIPCluster
${CRM} node show|grep -q -s "${nom_machine}" && \
    ${CRM} resource failcount VIPCluster delete ${nom_machine}
${CRM} node show|grep -q -s "${nom_machine_esclave}" && \
    ${CRM} resource failcount VIPSlave delete ${nom_machine_esclave}
if [ ! "${primitive_master}" = "" ]
then
    ${CRM} resource manage VIPCluster
fi
if [ ! "${primitive_slave}" = "" ]
then
    ${CRM} resource manage VIPSlave
fi
#if [ $nb_ping_hosts -gt 0 ]
#then
#    ${CRM} resource start ${pingd_resource_name}_clone
#fi
