#!/bin/ksh
#  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
#
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# 61haes_r714 src/43haes/usr/sbin/cluster/events/fail_interface.sh 1.15.1.1 
#  
# Licensed Materials - Property of IBM 
#  
# Restricted Materials of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2002,2011 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
# @(#)  7d4c34b 43haes/usr/sbin/cluster/events/fail_interface.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM
#########################################################################
#
#   COMPONENT_NAME: EVENTS
#
#   FUNCTIONS: none
#
#########################################################################


#########################################################################
#                                                                       #
#       Name:           fail_adapter                                    #
#                                                                       #
#	Description:	This event script is called when an		#
#			adapter goes down.                              #
#									#
#       Called by:      cluster manager                                 #
#                                                                       #
#       Calls to:       none                           			#
#                                                                       #
#       Arguments:      nodename (with the failed adapter)		#
#			address (of the failed adapter)         	#
#                                                                       #
#       Returns:        0       success                                 #
#                       1       failure                                 #
#                       2       bad argument                            #
#                                                                       #
#########################################################################

typeset PROGNAME=${0##*/}
export PATH="$(/usr/es/sbin/cluster/utilities/cl_get_path all)"

set -a
eval $(cllsparam -n $LOCALNODENAME)
set +a

if [[ $VERBOSE_LOGGING == "high" ]]; then
    set -x
    version='%I%'
fi
OP_SEP="$(cl_get_path -S)"

if [ $# -ne 2 ]
then
        cl_echo 8061 "Usage: $PROGNAME nodename failed_address\n" $PROGNAME
        exit 2
fi

NODENAME=$1
ADDR=$2
PREFIX_LEN=""
ADDR_FAMILY=""

set -u

MSG=$(dspmsg scripts.cat 8062 "Interface $ADDR has failed on node $NODENAME.\n" $ADDR $NODENAME)
echo $MSG >/dev/console

if [[ "$NODENAME" = "$LOCALNODENAME" ]]
then
    # If this is an aliasing network, then we may need to re-alias persistent
    # IP labels.
    NETWORK=$(cllsif -J "$OP_SEP" -Sn $ADDR | cut -d"$OP_SEP" -f3)
    ALIASING=$(odmget -q"name=$NETWORK" HACMPnetwork \
                | awk '$1 == "alias" {print $3}' \
                | sed 's/"//g')
    if [[ $ALIASING = "1" ]]; then
	# Change NSORDER
        # In case if NSORDER is not defined, we get parameter not set errors.
        # To avoid it, better disable variable strictness.
        set +u 
	saveNSORDER=${NSORDER:-UNDEFINED}
        set -u
	NSORDER=local; export NSORDER
	netstat -in
	netstat -rnC
        cl_configure_persistent_address fail_boot -i $ADDR -n $NETWORK
	# If the subnets are equal, delete net route.  This route will be
	# added back in join_interface.
	# find boots
	NETMASK=$(LC_ALL=C clgetif -n $ADDR)
	IF1=$(LC_ALL=C clgetif -a $ADDR)
	BOOT1=$ADDR
	BOOT2=$(cllsif -J "$OP_SEP" -Si $LOCALNODENAME | \
	       awk -F"$OP_SEP" -v net=$NETWORK -v if1=$IF1 '($2=="boot" && \
	       $3==net && $9!=if1) {printf("%s\n",$7)}')
	if [[ -n "$BOOT2" ]]
	then
	    # find route to delete
            if [[ "$PLATFORM" = "__AIX__" ]]; then
	        BROUTE=$(netstat -rn|awk -v boot1=$BOOT1 \
		    '(NR > 4 && $1!="default" && $2==boot1 && $3=="U") \
		    {printf("%s %s",$1,$2)}')
            elif [[  "$PLATFORM" = "__LINUX__" ]]; then
                #no route to delete as in Linux it automatically updates the static routing table
                BROUTE=''
            fi 
	    if [[ -n "$BROUTE" ]]
	    then
		for bootaddr in $BOOT2
		do
		    if [[ $(clgetnet $BOOT1 $NETMASK) = $(clgetnet $bootaddr $NETMASK) ]]
		    then
			#
			# Finding address family.
			#
			ADDR_FAMILY=$(cllsif -J "$OP_SEP" -Sn $BOOT1 | cut -d"$OP_SEP" -f15)
			# The subnets are equal check for default.
			if [[ -n $(netstat -rn|awk -v if1=$IF1 \
			    '(NR > 4 && $6==if1 && $1=="default")') ]]
			then
				case "$ADDR_FAMILY" in
					AF_INET)
			    			ifconfig $IF1 delete $BOOT1
			    			ifconfig $IF1 alias $BOOT1 netmask $NETMASK
			    			;;
			    		AF_INET6)
						ifconfig $IF1 inet6 $BOOT1 delete
						ifconfig $IF1 inet6 alias $BOOT1 prefixlen $NETMASK
						;;
					*)
						dspmsg scripts.cat 9503 "\n$PROGNAME: ERROR: Invalid address \
family for IP address \"$BOOT1\".\n" $PROGNAME $BOOT1
						exit 1
						;;
				esac
			fi
			# The subnets are equal so delete net route
			case "$ADDR_FAMILY" in
				AF_INET)
					route delete -net $BROUTE
					;;
				AF_INET6)
					route delete -inet6 -net $BROUTE
					;;
				*)
					dspmsg scripts.cat 9503 "\n$PROGNAME: ERROR: Invalid address \
family for IP address \"$BOOT1\".\n" $PROGNAME $BOOT1
					exit 1
					;;
			esac
			
			netstat -in
			netstat -rnC
			break
		    fi
		done
	    fi
	fi

	if [[ $saveNSORDER != UNDEFINED ]]; then
	    export NSORDER=$saveNSORDER
	else
	    export NSORDER=""
	fi
    fi
fi

exit 0

