#!/bin/bash
#
# SAPHanaSR-alert-fencing
# Author:       Lars Pinne, Fabian Herschel, June 2024
# Support:      linux@sap.com
# License:      GNU General Public License (GPL)
# Copyright:    (c) 2024-2026 SUSE LLC
# Version:	    2026-01-05-12:40
#
# crm configure alert fencing-1 "/usr/bin/SAPHanaSR-alert-fencing" select fencing attributes alert_uptime_threshold=300
#

logger_tag="SAPHanaSR-alert-fencing"
logger="/usr/bin/logger"

# ON_FAIL_ACTION="${OCF_RESKEY_ON_FAIL_ACTION:-proceed}"
CRM_alert_recipient="${CRM_alert_recipient:-/dev/null}"
crm_alert_kind="${CRM_alert_kind:-manual call}"
crm_alert_node="${CRM_alert_node:-$HOSTNAME}"
crm_alert_desc="${CRM_alert_desc:-no description provided}"

cache_file="/run/crm/SAPHanaSR_site_cache"

alert_uptime_threshold="${alert_uptime_threshold:-300}"

IFS=. read -r sys_uptime REST </proc/uptime
$logger -t "$logger_tag" "AH: begin event '$crm_alert_kind' (uptime=$sys_uptime, alert_uptime_threshold=$alert_uptime_threshold)"

function process_fencing()
{
	# SAPHanaSR_site_cache has format (each line) host:site_name
	# figure out fenced site

    if [[ "$sys_uptime" -ge "$alert_uptime_threshold" ]]; then
        if [[ -e "$cache_file" ]]; then
            fenced_site_name=$(awk -F: '$1 == host { print $2 }' host="${crm_alert_node}" "$cache_file")
            local_site_name=$(awk -F: '$1 == host { print $2 }' host="${HOSTNAME}" "$cache_file")
            $logger -t "$logger_tag" "INFO: cache_file=$cache_file, crm_alert_node=$crm_alert_node"
            $logger -t "$logger_tag" "INFO: fenced_site_name=$fenced_site_name, local_site_name=$local_site_name"
            if [[ "$local_site_name" != "" && "$fenced_site_name" == "$local_site_name" ]]; then
                $logger -t "$logger_tag" "DEC: FENCE ($fenced_site_name == $local_site_name)"
                sleep 10
                sudo /usr/bin/SAPHanaSR-hookHelper --sid=ANY --case=echoBe; rc=$? # --sid=ANY, because sid is irrelevant here
                if [[ "$rc" != "0" ]]; then
                    nodeName=$(/usr/sbin/crm_node -n)
                    $logger -t "$logger_tag" "ACT: sudo /usr/bin/SAPHanaSR-hookHelper --sid=ANY --case=echoBe rc=$rc"
                    $logger -t "$logger_tag" "ACT: fall back to /usr/sbin/crm_attribute -t status -n terminate -v true -N $nodeName"
                    /usr/sbin/crm_attribute -t status -n terminate -v true -N "$nodeName" 
                fi
            else
                $logger -t "$logger_tag" "DEC: NO FENCE ($fenced_site_name != $local_site_name)"
            fi
        else
            $logger -t "$logger_tag" "DEC: NO FENCE (no cache)"
        fi
    else
        $logger -t "$logger_tag" "DEC: NO FENCE (uptime < alert_uptime_threshold)"
    fi
}

function check_fencing()
{
	# SAPHanaSR_site_cache has format (each line) host:site_name
	# figure out fenced site

	if [[ -e "$cache_file" ]]; then
		fenced_site_name=$(awk -F: '$1 == host { print $2 }' host="${crm_alert_node}" "$cache_file")
		local_site_name=$(awk -F: '$1 == host { print $2 }' host="${HOSTNAME}" "$cache_file")
        	$logger -t "$logger_tag" "INFO: cache_file=$cache_file"
        	$logger -t "$logger_tag" "INFO: fenced_site_name=$fenced_site_name, local_site_name=$local_site_name"
		if [[ "$local_site_name" != "" && "$fenced_site_name" == "$local_site_name" ]]; then
			$logger -t "$logger_tag" "DEC: FENCE ($fenced_site_name == $local_site_name)"
		else
			$logger -t "$logger_tag" "DEC: NO FENCE ($fenced_site_name != $local_site_name)"
		fi
	else
		$logger -t "$logger_tag" "DEC: NO FENCE (no cache)"
	fi
}

case "$crm_alert_kind" in
    node|nodes)
        msg="Node '${crm_alert_node}' is now '${crm_alert_desc}'"
        $logger -t "$logger_tag" "INFO: $msg"
        ;;
    fencing)
        msg="Fencing for '${crm_alert_node}': ${crm_alert_desc}"
        $logger -t "$logger_tag" "INFO: $msg"
        process_fencing
        ;;
    check)
        msg="Checking for '${crm_alert_node}': ${crm_alert_desc}"
        $logger -t "$logger_tag" "INFO: $msg"
        check_fencing
        ;;
    *)
	msg="Unhandled '$crm_alert_kind' alert (${crm_alert_desc})"
        $logger -t "$logger_tag" "INFO: $msg"
        ;;
esac
$logger -t "$logger_tag" "AH: end event '$crm_alert_kind'"
#
