#!/bin/ksh93
#  ALTRAN_PROLOG_BEGIN_TAG                                                    
#  This is an automatically generated prolog.                                  
#                                                                              
#  Copyright (C) Altran ACT S.A.S. 2017,2020,2021.  All rights reserved.  
#                                                                              
#  ALTRAN_PROLOG_END_TAG                                                      
#                                                                              
# @(#)  7d4c34b 43haes/usr/sbin/cluster/events/utils/cl_scsipr_preempt.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM

export PATH=$(/usr/es/sbin/cluster/utilities/cl_get_path all)

#####################################
#  MAIN
#
#####################################

# Including file containing SCSIPR functions
. /usr/es/sbin/cluster/events/utils/cl_scsipr_event_functions
[[ -z $(whence clodmget) ]] && export PATH=$(/usr/es/sbin/cluster/utilities/cl_get_path all)

if [[ $VERBOSE_LOGGING == "high" ]]
then
    set -x
    version='1.6'
fi

typeset nodename=""
typeset -i failed_to_preempt=0
set -A down_nodes

## Check if the current Resource Group is Critical RG

typeset CRITICAL_RG=$(eval "echo \${CRITICAL_RG_ACQUIRE}")
if [[ "$CRITICAL_RG" == "YES" ]]
then
    typeset -i count=0
    typeset cluster_nodes=$(clodmget -n -q "object=COMMUNICATION_PATH" -f value HACMPnode)

    typeset node=""
    for node in $cluster_nodes ; do
	unset state substate
	CAA_node_name=$(cl_nn2hn $node)
	if [[ -n $CAA_node_name ]]
	then
	    state=$(LC_ALL=C lscluster -m $CAA_node_name | grep -w "State of node:" | awk -F " " '{print $4}')
	    substate=$(LC_ALL=C lscluster -m $CAA_node_name | grep -w "State of node:" | awk -F " " '{print $5}')
	fi

	if [[ -z $state || $state == "DOWN" && $substate != "STOPPED" ]];then
	    down_nodes[$count]=$node
	    (( count++ ))
	fi
    done
    #
    #	At this point, $down_nodes is an array of PowerHA node names
    #	for which the corresponding CAA state is either DOWN or STOPPED
    #

    typeset LocalNodeName=$(get_local_nodename)

    if ! typeset LocalNodePRKey=$(clpr_obtain_prkey $LocalNodeName)
    then
	#
	: Failed generating the PR Key of node, $LocalNodeName.
	#
	return 1
    fi

    typeset ResGrp=""
    typeset VolGrp=""
    typeset nodes_down=""
    typeset noden=""
	
	for noden in ${down_nodes[@]}
	do
		nodes_down=$nodes_down" "$(clodmget -n -q "object=COMMUNICATION_PATH and value=$noden" -f name HACMPnode)
	done
	
    for nodename in $nodes_down
    do
	if ! PR_Key=$(clpr_obtain_prkey $nodename)
	then
	    #
	    : Failed generating the PR Key of the node $nodename.
	    #
	    # If we failed to genrate the PR key of any one node
	    # from among the down nodes, we would not be able to
	    # preempt that node. Other nodes might get preempted
	    # but data corruption might be caused even if any one
	    # node's key remain on the VGs or disk. 
	    # Preemption of other nodes would be tried, but we
	    # should not let RG to be acquired in this case. Hence,
	    # setting the failed_to_preempt flag as 1.

	    failed_to_preempt=1

	    # Continue to process next node
	    continue
	fi

	#
	: Node $nodename is down, preempt $nodename from the Volume Groups,
	: which are part of any Resource Group.
	#
        typeset ResGrps=$(clodmget -n -q "nodes like \"*$nodename*\"" -f group HACMPgroup)
	for ResGrp in $ResGrps
	do
	    typeset VolGrps=$(clodmget -n -q "group=$ResGrp and name like *VOLUME_GROUP" -f value HACMPresource)
	    for VolGrp in $VolGrps
	    do
		if clpr_ReadRes_vg $VolGrp
		then
		    if clpr_verifyKey_vg $VolGrp $LocalNodePRKey
		    then
                        #
                        : Node $nodename is down, preempting that node from Volume Group $VolGrp.
                        : Verify key is already removed or not, then only try for removal
                        #
                        clpr_verifyKey_vg $VolGrp $PR_Key
                        if (( $? == 0 ))
                        then
                            if ! clpr_preempt_abort_vg $VolGrp $PR_Key
                            then
                                # Checking if preemption failed by verifying the PR Key
                                # of the node in down_nodes.
                                # Return value of 1 indicates that the key is not present.
                                clpr_verifyKey_vg $VolGrp $PR_Key
                                if (( $? != 1 ))
                                then
                        	    #
                        	    : Failed to preempt node $nodename from Volume Group $VolGrp.
                        	    #
                        	    failed_to_preempt=1
                                fi
                            fi
		        fi
		    else
			#
			: Failed Verifying the PR Key of node $LocalNodeName on Volume Group, $VolGrp.
			#
			failed_to_preempt=1
		    fi
		else
		    #
		    : Failed to read reservation on Volume Group, $VolGrp.
		    #
		    failed_to_preempt=1
		fi
	    done
	done
	typeset diskList=$(LC_ALL=C cllsres | grep -w RAW_DISK | cut -f2 -d=)
	if [[ -n $diskList ]]
	then
	    diskList=${diskList#\"}
	    diskList=${diskList%\"}
	    typeset uuid=""
	    for uuid in $diskList
	    do
                typeset hdisk=$(lspv -u | grep -w $uuid | awk '{print $1}')
                if [[ -n $hdisk ]]
                then
                    #
                    : Verify key is already removed or not, then only try for removal
                    #
                    clpr_verifyKey $hdisk $PR_Key
                    if (( $? == 0 ))
                    then
                        if ! clpr_preempt_abort $hdisk $PR_Key
                        then
                	    # Checking if preemption failed by verifying the PR Key
                	    # of the node in down_nodes.
                	    clpr_verifyKey $hdisk $PR_Key
                	    # Return value of 1 indicates that the key
                	    # is not present.
                	    if (( $? != 1 ))
                	    then
                	        #
                	        : Failed to preempt node $nodename from hdisk $hdisk.
                	        #
                	        failed_to_preempt=1
                	    fi
                        fi
                    fi
                fi
	    done
	fi
	diskList=$(LC_ALL=C cllsres | grep -w DISK | cut -f2 -d=)
	if [[ -n $diskList ]]
	then
	    diskList=${diskList#\"}
	    diskList=${diskList%\"}
	    typeset pvid=""
	    for pvid in $diskList
	    do
		typeset hdisk=$(lspv -L | grep -w $pvid | awk '{print $1}')
		if [[ -n $hdisk ]]
		then 
                    #
                    : Verify key is already removed or not, then only try for removal
                    #
                    clpr_verifyKey $hdisk $PR_Key
                    if (( $? == 0 ))
                    then
		        if ! clpr_preempt_abort $hdisk $PR_Key
		        then
		             # Checking if preemption failed by verifying the PR Key
		             # of the node in down_nodes.
		             clpr_verifyKey $hdisk $PR_Key
		             # Return value of 1 indicates that the key
		             # is not present.
		             if (( $? != 1 ))
		             then
		                 #
		                 : Failed to preempt node $nodename from hdisk $hdisk.
		                 #
		                 failed_to_preempt=1
		             fi
                        fi
		    fi
		fi
	    done
	fi
    done
    if [[ $failed_to_preempt == 1 ]]
    then
	return 1
    else
	return 2
    fi
fi
