#!/bin/ksh93
#  ALTRAN_PROLOG_BEGIN_TAG                                                    
#  This is an automatically generated prolog.                                  
#                                                                              
#  Copyright (C) Altran ACT S.A.S. 2019,2021.  All rights reserved.  
#                                                                              
#  ALTRAN_PROLOG_END_TAG                                                      
#                                                                              
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# 61haes_r720 src/43haes/usr/sbin/cluster/sa/tsmclient/sbin/cl_tsm_client_config.sh 1.4.1.1 
#  
# Licensed Materials - Property of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2010 
# 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/sa/tsmclient/sbin/cl_tsm_client_config.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM

###############################################################################################
#
# NAME:
#       cl_tsm_client_config
#
# PURPOSE:
#       create PowerHA SystemMirror configuration for TSM backup archive and HSM client. This script configures TSM client
#       Resource Group with Application clients, Volume Groups, and service IP address
#
# ARGUMENTS:
#       -a Application name
#	-d TSM client configuration directory
#       -p Primary Node
#       -t Takeover Nodes(s)
#	-f file systems to be backed up
#       -s Service IP
#       -n Netmask/prefix Length
#	-h HSM (space management client)
#
# RETURNS
#  0 on success
#  1 on Failure
#################################################################################################
typeset version="1.0"
[[ "$VERBOSE_LOGGING" == "high" ]] && set -x
. /usr/es/sbin/cluster/sa/tsmclient/sbin/cl_tsmcliGlobals
. /usr/es/sbin/cluster/sa/tsmclient/sbin/cl_tsmcliUtilities

KLIB_HACMPLOG_ENTRY=$KLIB_TSM_CLIENT_HACMPLOG_ENTRY

typeset APPLICATION_ID     # Smart Assist Application Name of the TSM backup archive client.
typeset PRIMNODE TAKEOVNODES # primary and takeover nodes.
typeset FILESYSTEMS          # TSM client file systems to be backed up.
typeset SERVICE_IP           # Service IP for the TSM client.
typeset NETMASK              # Netmask/ prefix Length of service IP address.
typeset HSM		     # HSM client is included or not along with backup archive client.	
typeset MODIFY="N"           # Modify the TSM client configuration.
typeset TSM_CONF_DIR	     # TSM configuration directory

typeset SMARTASSIST_ID="TSM_CLIENT" # TSM client smart assist ID
typeset COMPONENT_ID                  # component ID of TSM client smart assist
typeset SHARED_VGS		#shared VGs for the TSM client
typeset  DEPENDENT_RG		#Dependent RGs for client RG if the VG is already defined in PowerHA SystemMirror configuration
typeset DEPENDENT_VG		#dependent VGs that are already defined in PowerHA SystemMirror configuration
#################################################################################
# Function: addClientInstance
#
# Purpose: To create PowerHA SystemMirror resources and Resource group for Managing
#          TSM client configuration.
#
# Arguments: None.
#
# Returns: 0 for Sucess
#          1 for Failure
################################################################################

function addClientInstance      {

        [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
        typeset rgname="TSM_CLI_RG_"$APPLICATION_ID
        typeset appname="TSM_CLI_APP_"$APPLICATION_ID
        typeset appmonname="TSM_CLI_APP_MON_"$APPLICATION_ID
	typeset hsmapp="TSM_HSM_APP_"$APPLICATION_ID
	typeset hsmappmon="TSM_HSM_APP_MON_"$APPLICATION_ID
	typeset cli_application=""

        COMPONENT_ID="TSM_BACLIENT"

        KLIB_SA_logmsg INFO 1 21 tsmclientsa.cat "Adding TSM client configuration %1\$s\n" $APPLICATION_ID
        dspmsg -s 1 tsmclientsa.cat 21 " Adding TSM client configuration %1\$s\n" $APPLICATION_ID

	rgname=$(getUnusedName $rgname "resource_group")
        [[ "$?" == "1" ]] && {
        KLIB_SA_logmsg ERROR 1 22 tsmclientsa.cat "Unable to get the unused name for %1\$s=%2\$s\n" "resource_group" $rgname
        exit 1
        }

        appname=$(getUnusedName $appname "application")
        [[ "$?" == "1" ]] && {
        KLIB_SA_logmsg ERROR 1 22 tsmclientsa.cat "Unable to get the unused name for %1\$s=%2\$s\n" "application" $appname
        exit 1
        }

        appmonname=$(getUnusedName $appmonname "application_monitor")
        [[ "$?" == "1" ]] && {
        KLIB_SA_logmsg ERROR 1 22 tsmclientsa.cat "Unable to get the unused name for %1\$s=%2\$s\n" "application_monitor" $appmonname
        exit 1
        }

	hsmapp=$(getUnusedName $hsmapp "application")
        [[ "$?" == "1" ]] && {
        KLIB_SA_logmsg ERROR 1 22 tsmclientsa.cat "Unable to get the unused name for %1\$s=%2\$s\n" "application" $hsmapp
        exit 1
        }

        hsmappmon=$(getUnusedName $hsmappmon "application_monitor")
        [[ "$?" == "1" ]] && {
        KLIB_SA_logmsg ERROR 1 22 tsmclientsa.cat "Unable to get the unused name for %1\$s=%2\$s\n" "application_monitor" $hsmappmon
        exit 1
        }
	
	#File systems to VGs
	filesystems_vgs

	isVGsAlreadyDefined "$SHARED_VGS"
        isServiceIPLabelAlreadyDefined $SERVICE_IP
        [[ "$?" == "0" ]] && {
        KLIB_SA_logmsg ERROR 1 27 tsmclientsa.cat "service label %1\$s already defined in the PowerHA SystemMirror configuration\n" $SERVICE_IP
        exit 1
        }

        #Adding service IP label
        addServiceIPLabel

	#creating Resource Group for TSM client configuration
        dspmsg -s 1 tsmclientsa.cat 32 "Adding TSM client Resource Group %1\$s to PowerHA SystemMirror configuration\n" $rgname
        KLIB_SA_logmsg INFO 1 32 tsmclientsa.cat "Adding TSM client Resource Group %1\$s to PowerHA SystemMirror configuration\n" $rgname
        claddgrp -g "$rgname" -n "$PRIMNODE $TAKEOVNODES" \
                -S "OHN" -O "FNPN" -B "FBHPN" \
                -K $APPLICATION_ID

        (( $? != 0 )) && {
                             KLIB_SA_logmsg ERROR 1 44 tsmclientsa.cat "Failed while adding location dependency (for TSM client Resource Group %1$s) of \"online on same node\" dependency.\n" $rgname

                             exit 1
                          }
	
        #creating HSM client Application client
	if [[ $HSM == "y" ]]; then
        	hsmstartscript="$TSM_CLIENT_HA_SBIN/cl_tsmHSMclientstart -a $APPLICATION_ID"
        	hsmstopscript="$TSM_CLIENT_HA_SBIN/cl_tsmHSMclientstop -a $APPLICATION_ID"
        	hsmmonitorscript="$TSM_CLIENT_HA_SBIN/cl_tsmHSMclientmonitor -a $APPLICATION_ID"

  	        KLIB_SA_logmsg INFO 1 34 tsmclientsa.cat "Adding TSM HSM client Application client %1\$s to PowerHA SystemMirror configuration\n" $appname

 	        clvt add application $hsmapp \
        	        STARTSCRIPT="$hsmstartscript" \
                	STOPSCRIPT="$hsmstopscript" >/dev/null 2>&1|| {
                        	                       KLIB_SA_logmsg ERROR 1 35 tsmclientsa.cat "Failed while adding TSM HSM client Application client %1\$s\n" $hsmapp
                                	               exit 1
                                        	    }

              	  KLIB_SA_logmsg INFO 1 36 tsmclientsa.cat "Adding TSM HSM client Application monitor %1\$s to PowerHA SystemMirror configuration\n" $appmonname

        	claddappmon name=$hsmappmon \
        	MONITOR_TYPE='user' \
        	RESOURCE_TO_MONITOR=$hsmapp \
        	INVOCATION='longrunning' \
        	FAILURE_ACTION='fallover' \
        	RESTART_METHOD="$hsmstartscript" \
        	CLEANUP_METHOD="$hsmstopscript" \
        	MONITOR_METHOD="$hsmmonitorscript" \
        	MONITOR_INTERVAL='180' \
        	HUNG_MONITOR_SIGNAL='9' \
        	STABILIZATION_INTERVAL='180' \
        	RESTART_COUNT='5' \
        	RESTART_INTERVAL='792' >/dev/null 2>&1 || {
                                                   KLIB_SA_logmsg ERROR 1 37 tsmclientsa.cat "Failed while adding TSM HSM client Application monitor %1\$s\n" $hsmappmon
                                                   exit 1
                                               }
		cli_application=$hsmapp
	else
	#creating backup archive client Application client

        	startscript="$TSM_CLIENT_HA_SBIN/cl_tsmBAclientstart -a $APPLICATION_ID"
        	stopscript="$TSM_CLIENT_HA_SBIN/cl_tsmBAclientstop"
        	monitorscript="$TSM_CLIENT_HA_SBIN/cl_tsmBAclientmonitor -a $APPLICATION_ID"

        	KLIB_SA_logmsg INFO 1 38 tsmclientsa.cat "Adding TSM backup archive client Application client %1\$s to PowerHA SystemMirror configuration\n" $appname

   	        clvt add application $appname \
           	     STARTSCRIPT="$startscript" \
        	     STOPSCRIPT="$stopscript" >/dev/null 2>&1|| {
                                               KLIB_SA_logmsg ERROR 1 39 tsmclientsa.cat "Failed while adding TSM backup archive client Application client %1\$s\n" $appname
                                               exit 1
                                            }

 	       KLIB_SA_logmsg INFO 1 60 tsmclientsa.cat "Adding TSM backup archive client Application monitor %1\$s to PowerHA SystemMirror configuration\n" $appmonname

		claddappmon name=$appmonname \
 	        MONITOR_TYPE='user' \
       		RESOURCE_TO_MONITOR=$appname \
       		INVOCATION='longrunning' \
        	FAILURE_ACTION='fallover' \
        	RESTART_METHOD="$startscript" \
        	CLEANUP_METHOD="$stopscript" \
        	MONITOR_METHOD="$monitorscript" \
        	MONITOR_INTERVAL='180' \
        	HUNG_MONITOR_SIGNAL='9' \
        	STABILIZATION_INTERVAL='180' \
        	RESTART_COUNT='5' \
        	RESTART_INTERVAL='792' >/dev/null 2>&1 || {
                                             KLIB_SA_logmsg ERROR 1 40 tsmclientsa.cat "Failed while adding TSM backup archive client Application monitor %1\$s\n" $appmonname
                                             exit 1
                                            }
		cli_application=$appname
	fi

	# Add service IP, Application and VG to Resource Group
        KLIB_SA_logmsg INFO 1 41 tsmclientsa.cat "Modifying TSM client Resource Group %1\$s\n" $rgname
        clvt modify resource_group "$rgname" \
        SERVICE_LABEL="$SERVICE_IP" \
        APPLICATIONS="$cli_application"\
	FILESYSTEM="ALL" \
	VG_AUTO_IMPORT='false' \
        VOLUME_GROUP="$SHARED_VGS" >/dev/null 2>&1||{ 
					[[ -z $DEPENDENT_RG ]] && {
                       				KLIB_SA_logmsg ERROR 1 42 tsmclientsa.cat "Failed while modifying TSM client Resource Group %1\$s\n" $rgname
                                       		exit 1
                                  	}
				}
				 
	# Add dependencies between the Resource groups if the client VG is a pert of another RG
	[[ -n $DEPENDENT_RG ]] && {
					first_rg=""
					rest_rg=""
					for i in $DEPENDENT_RG
					do 
						if [[ -z $first_rg ]]
						then
						  	first_rg=$i
						else
							[[ -z $rest_rg ]] && rest_rg=$i
							rest_rg=$(echo "$rest_rg $i")
						fi
					done

					if [[ -z $rest_rg ]];then
					 	 rest_rg=$rgname
					else
						rest_rg=$(echo "$rest_rg $rgname")
					fi
				
					same_participating_nodes $rgname "$DEPENDENT_RG"
					[[ $? == 1 ]] && {
								KLIB_SA_logmsg ERROR 1 62 tsmclientsa.cat "The resource Groups %1\$s on which the VGs already configured are not having same participating nodes\n" $DEPENDENT_RG
								exit 1
							 }

					clvt delete resource_group $rgname >/dev/null 2>&1 || {
												KLIB_SA_logmsg ERROR 1 63 tsmclientsa.cat "Failed while deleting the TSM client Resource group %1\$s when the volume group defined to TSM client is already present in the other Resource group\n" $rgname
												exit 1
											      }		
	
					s_rg=$(echo $DEPENDENT_RG|awk '{print $1}')
					t_nodes=$(clvt query resource_group $s_rg|grep NODES|awk -F= '{ print $2 }' | sed -e "s/\"//g")
                                        startup=$(clvt query resource_group $s_rg|grep STARTUP|awk -F= '{ print $2 }' | sed -e "s/\"//g")
                                        fallover=$(clvt query resource_group $s_rg|grep FALLOVER|awk -F= '{ print $2 }' | sed -e "s/\"//g")
                                        fallback=$(clvt query resource_group $s_rg|grep FALLBACK|awk -F= '{ print $2 }' | sed -e "s/\"//g")
					
					/usr/es/sbin/cluster/utilities/claddgrp -g "$rgname" -n "$t_nodes" -S "$startup" -O "$fallover" \
					-B "$fallback" >/dev/null 2>&1|| {
                                        			KLIB_SA_logmsg ERROR 1 64 tsmclientsa.cat "Failed while adding TSM client Resource Group %1\$s when the Volume group is shared between the Resource groups\n" $rgname
                                        			exit 1
                                    			}

					/usr/es/sbin/cluster/utilities/clrgdependency -t "NODECOLLOCATION" -a -l "$DEPENDENT_RG $rgname" || {
                                                                                        KLIB_SA_logmsg ERROR 1 44 tsmclientsa.cat "Failed while Adding on line on same node dependency locational dependency for TSM client Resource Group %1\$s\n" $rgname
                                                                                         exit 1
                                                                                }


					/usr/es/sbin/cluster/utilities/clrgdependency -t "PARENT_CHILD" -a -p "$first_rg" -c "$rest_rg" || {
											KLIB_SA_logmsg ERROR 1 43 tsmclientsa.cat "Failed while Adding parent /child dependencies for TSM client Resource Group %1\$s\n" $rgname
 						                                         exit 1
                                  						}
					rem_vgs=""
					for vg in $SHARED_VGS 	
					do
						found=0
						for dep in $DEPENDENT_VG
						do
							[[ $vg == $dep ]] && found=1
						done
						[[ $found == 0 ]]&& rem_vgs=$(echo "$rem_vgs $vg")
					done
					
					if [[ -n $rem_vgs ]];then
						clvt modify resource_group "$rgname" \
					        SERVICE_LABEL="$SERVICE_IP" \
					        APPLICATIONS="$cli_application" \
						FILESYSTEM="ALL" \
						VG_AUTO_IMPORT='false' \
					        VOLUME_GROUP="$rem_vgs" >/dev/null 2>&1 || {
                                                                        KLIB_SA_logmsg ERROR 1 65 tsmclientsa.cat "Failed while modifying TSM client Resource Group %1\$s\n while adding the remaining vgs that are not present in other Resource groups\n" $rgname
                                                                        exit 1
                                                                }
					else
						clvt modify resource_group "$rgname" \
                                                SERVICE_LABEL="$SERVICE_IP" \
                                                APPLICATIONS="$cli_application" >/dev/null 2>&1 || {
                                                                        KLIB_SA_logmsg ERROR 1 66 tsmclientsa.cat "Failed while modifying TSM client Resource Group %1\$s\n while adding service IP and application\n" $rgname
                                                                        exit 1
								}
					fi
					}

        # Add the entry to HACMPsa_metadata ODM

        KLIB_SA_logmsg INFO 1 45 tsmclientsa.cat "Adding TSM client configuration to ODM\n"
        claddsaapp -a $APPLICATION_ID \
        RESOURCE_GROUP=$rgname \
        SMARTASSIST_ID="$SMARTASSIST_ID" \
        COMPONENT_ID="$COMPONENT_ID" \
        APPLICATION_NAME="$APPLICATION_ID" \
	HSM_CLIENT="$HSM" \
        SHARED_FILESYSTEM="$FILESYSTEMS" \
	DSM_SYS_MOD_TIME="" \
	DSM_OPT_MOD_TIME="" \
	TSM_CONF_DIR="$TSM_CONF_DIR" \
	DEPENDENT_RG="$DEPENDENT_RG" >/dev/null 2>&1|| {
                                               KLIB_SA_logmsg ERROR 1 46 tsmclientsa.cat "Failed while Adding TSM client configuration to ODM\n"
                                               exit 1
                                        }


        # generate verify scripts for verification
        dspmsg -s 1 tsmclientsa.cat 47 "Generating verify script for TSM client configuration %1\$s\n" $APPLICATION_ID
        nodes=$(clvt query node)
        KLIB_SA_logmsg INFO 1 47 tsmclientsa.cat "Generating verify script for TSM client configuration %1\$s\n" $APPLICATION_ID
        generateVerifyScript $COMPONENT_ID $APPLICATION_ID "$nodes"
        [[ "$?" == 1 ]] && {
                                KLIB_SA_logmsg ERROR 1 49 tsmclientsa.cat "Failed while Generating verify script for TSM client configuration %1\$s\n" $APPLICATION_ID
                                exit 1
                           }
	#dsm.sys file collection across all the nodes in cluster
	sys_file_collection
        return 0
	
}

#################################################################################
# Function: modifyClientInstance
#
# Purpose: To modify PowerHA SystemMirror resources and Resource group for Managing
#	   TSM client smart assist
#
# Arguments: None.
#
# Returns: 0 for Sucess
#          1 for Failure
#
################################################################################

function modifyClientInstance      {

        [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
        removeHAresources 
        addClientInstance
        return $?

}

#################################################################################
# Function: removeHAresources
#
# Purpose: To remove PowerHA SystemMirror resources and Resource group for Managing
#          TSM client Instance.
#
# Arguments: None.
#
# Returns: 0 for Sucess
#          1 for Failure
#
################################################################################
function removeHAresources      {

        [[ "$VERBOSE_LOGGING" == "high" ]] && set -x

        KLIB_SA_logmsg INFO 1 51 tsmclientsa.cat "Removing TSM client %1\$s from PowerHA SystemMirror configuration\n" $APPLICATION_ID
        dspmsg -s 1 tsmclientsa.cat 51 " Removing TSM client %1\$s from PowerHA SystemMirror configuration\n" $APPLICATION_ID
        rg=$(clodmget -q "name=RESOURCE_GROUP and application_id=$APPLICATION_ID" -f value -n HACMPsa_metadata)
        [[ $? != 0 ]] && {
                                KLIB_SA_logmsg ERROR 1 52 tsmclientsa.cat "Resource Group %1\$s not found in ODM\n" $rg
                                exit 1
                         }

	# removing the RG dependencies
        depedent=$(clodmget -q "name=DEPENDENT_RG and application_id=$APPLICATION_ID" -f value -n HACMPsa_metadata)
	[[ $? != 0 ]] && {
                                    KLIB_SA_logmsg ERROR 1 53 tsmclientsa.cat "DEPENDENT_RG not found in ODM\n"
                                    exit 1
                          }
	[[ -n $depedent ]] && {
					#removing online on same node dependency
					/usr/es/sbin/cluster/utilities/clrgdependency -t "NODECOLLOCATION" -d -l "$depedent $rg" || {
										KLIB_SA_logmsg ERROR 1 54 tsmclientsa.cat "Failed while Removing online on same node dependency between the client RG %1\$s and other RGs%2\$s\n" $rg $depedent
               							                 exit 1
                         							}
					#removing parent-child dependency
					parent=""
					child=""
					for i in $depedent;do
						if [[ -z $parent ]];then
							parent=$i
						else
							[[ -z $child ]] && child=$i
							child=$(echo "$child $i")
						fi
					done
	
					if [[ -z $child ]];then
						child=$rg
					else
						child=$(echo "$child $rg")
					fi
					/usr/es/sbin/cluster/utilities/clrgdependency -t "PARENT_CHILD" -d -p "$parent" -c "$child" || {
                                                                                KLIB_SA_logmsg ERROR 1 55 tsmclientsa.cat "Failed while Removing parent/child dependency between the client RG %1\$s and other RGs%2\$s\n" $rg $depedent
                                                                                 exit 1
                                                                                }
			      }	
        app_serv=$(clvt query resource_group $rg|grep APPLICATIONS|awk -F= '{ print $2 }' | sed "s/\"//g" )

        for ap_srv in $app_serv
        do
                app_mons=$(clvt query application $ap_srv|grep ASSOCIATEDMONITORS |awk -F= '{ print $2 }' | sed "s/\"//g" )

                #removing the application monitors
                for mon in $app_mons
                do
                        clvt delete application_monitor $mon >/dev/null 2>&1
                        [[ $? != 0 ]] && {
                                KLIB_SA_logmsg ERROR 1 56 tsmclientsa.cat "Failed while deleting Application monitor %1\$s for changing TSM client configuration\n" $app_mons
                                exit 1
                        }
                done
        done

        for app in $app_serv;do
                clvt delete application $app > /dev/null 2>&1
                [[ $? != 0 ]] && {
                                        KLIB_SA_logmsg ERROR 1 57 tsmclientsa.cat "Failed while deleting Application clients for changing TSM client configuration%1\$s\n" $app
                                        exit 1
                                }
        done

        clvt delete resource_group $rg >/dev/null 2>&1
        (( $? != 0 )) && {
                                KLIB_SA_logmsg ERROR 1 58 tsmclientsa.cat "Failed while deleting Resource Group %1\$s for changing TSM client configuration\n" $rg
                                exit 1
                         }

        # Remove the metadata entries 
        clrmsaapp -a $APPLICATION_ID >/dev/null 2>&1
        (( $? != 0 )) && {
                                KLIB_SA_logmsg ERROR 1 59 tsmclientsa.cat "Failed while deleting ODMs for changing TSM client configuration\n"
                                exit 1
                         }

        return 0
}

#################################################################################
# Function: filesystems_vgs
#
# Purpose: To get VG information for the shared filesystems
#
# Arguments: None.
#
# Returns: 0 for Sucess
#          1 for Failure
#
################################################################################

function filesystems_vgs      {

        [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
	for i in $FILESYSTEMS;do
		vg=$(dir_fs_vg $i 0)
		[[ $? == 1 ]] && {
					KLIB_SA_logmsg INFO 1 23 tsmclientsa.cat "File system %1\$s specified is not a valid file system\n" $i
					exit 1
				 }
		SHARED_VGS=$(echo "$SHARED_VGS $vg")
	done
	return 0
}

#----------------------------------------------------------------------------
# Function:
#   isVGsAlreadyDefined
#
# Purpose:
#   Determine if a list of volume groups are already defined.  If a VG
#   is already define to PowerHA SystemMirror, then remove that VG from the client VG list.
#   The VG which is a part of already configured RG will be having online on same
#   node dependency and parent child dependency.
#
# Arguments:
#   (1) by ref List of PowerHA SystemMirror volume groups
#
# Return:
#   0 on success
#   no return if failure (exit)
#----------------------------------------------------------------------------

function isVGsAlreadyDefined {
    [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
    typeset vgs=$1
    mod_vgs=""
    typeset vg
    rg=""
    KLIB_SA_logmsg INFO 1 24 tsmclientsa.cat "This function checks to see if the VG's are already defined to the PowerHA SystemMirror configuration\n"
    for vg in $vgs; do
        KLIB_SA_logmsg DEBUG 1 25 tsmclientsa.cat "Checking the Volume Group=%1\$s in  PowerHA SystemMirror configuration\n" $vg
        rg=$(isVolumeGroupAlreadyDefined $vg)
        (( $? != 1 )) && {
            KLIB_SA_logmsg INFO 1 26 tsmclientsa.cat "Volume Group=%1\$s is already defined in PowerHA SystemMirror configuration so removing from client VG list\n" $vg
	    DEPENDENT_RG=$(echo "$DEPENDENT_RG $rg")
	    DEPENDENT_VG=$(echo "$DEPENDENT_VG $vg")
        }
	mod_vgs=$(echo "$mod_vgs $vg")
    done
    SHARED_VGS="$mod_vgs"
    return 0
}

#----------------------------------------------------------------------------
# Function:
#   addServiceIPLabel
#
# Purpose:
#   Adds Service IP label to the PowerHA SystemMirror configuration if
#   it doesn't already exist.
#
# Arguments:
#   n/a
#
# Returns:
#   0 on success
#   1 on failure
#----------------------------------------------------------------------------
function addServiceIPLabel {
    [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
    typeset results

    #
    # Can the service IP label be resolved?
    #
    /usr/bin/host $SERVICE_IP >/dev/null 2>&1
    (( $? != 0 )) && {
        # The service IP label cannot be resolved
        KLIB_SA_logmsg ERROR 1 28 Tsmclientsa.cat "Service IP label %1\$s can not be resolved\n" $SERVICE_IP
        exit 1
    }

    result=$(clvt query interface | grep $SERVICE_IP)
    [[ -n $result ]] &&
        clvt delete interface $SERVICE_IP

    clvt query service_ip $SERVICE_IP >/dev/null 2>&1
    [[ $? != "0" ]] && { # Create the service IP label
        KLIB_SA_logmsg INFO 1 29 tsmclientsa.cat "creating Service IP label %1\$s\n" $SERVICE_IP

        nodes=$(echo "$PRIMNODE $TAKEOVNODES")

        addr=$(/usr/bin/host $SERVICE_IP|awk '{print $3}'| sed s/,//g)
        isipv6addr $addr
        if [[ "$?" == "0" ]]
        then
                Net_type="2" # Net_type will be specified in HACMPadapter ODM for IPv6=2, IPv4=1
        else
                Net_type="1"
        fi
        network=$(getServiceNetwork $Net_type "$nodes")

        # There are no suitable networks defined to create
        # the service IP label on, abort
        [[ -z $network ]] && {
            KLIB_SA_logmsg ERROR 1 30 tsmclientsa.cat "No suitable PowerHA SystemMirror network is defined to create service IP label\n"
            exit 1
        }

        /usr/es/sbin/cluster/utilities/claddnode -T service -B "$SERVICE_IP" -P "$NETMASK" -w "$network" > /dev/null 2>&1
        (( $? != 0 )) && {
            KLIB_SA_logmsg ERROR 1 31 tsmclientsa.cat "Error while adding service IP label %1\$s to netowk %2\$s\n" $SERVICE_IP $network
            exit 1
        }
    }

    return 0
}

#----------------------------------------------------------------------------
# Function:
#   getVerifyHeader
#
# Purpose:
#   Generate the verification parameterized script header for TSM client.
#   This is called at verification time.
#
# Arguments:
#   (1) Component ID
#   (2) Application Name
#
# Output:
#   Script output to stdout
#
# Returns:
#   n/a
#----------------------------------------------------------------------------

function getVerifyHeader {
    [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
    c_id=$1
    sa_id=$2

    KLIB_SA_logmsg INFO 1 44 tsmclientsa.cat "Generating verify Header for TSM client Application name %1\$s\n" $sa_id
    echo "#\n# PowerHA SystemMirror / TSM client"
    echo "# TSM client Application Verificiation script generated for: $sa_id"
    echo "# Date: $(date)\n#\n"

    print -n "Component.Name.DefaultName = \""
    print -n $c_id
    echo "\""
    echo "Component.Nodes = \"S=TSM_CLIENT:A=$sa_id\""

    return 0

}

#----------------------------------------------------------------------------
# Function:
#   generateTSMVerifyScript
#
# Purpose:
#   Generates the parameterized verification script for
#   TSM client smart assist.
#
# Arguments:
#  n/a
#
# Returns:
#   0 on success
#   1 on failure
#----------------------------------------------------------------------------

function generateTSMVerifyScript {
        [[ "$VERBOSE_LOGGING" == "high" ]] && set -x


    # Generates a fileset parameterised verification script to
    # Obtain TSM backup archived client is installed or not.

    echo "\n#\n# Perform file set validation for TSM client\n#"
    localnode=$(get_local_nodename)	
    installed_base_fileset=$(lslpp -iqc tivoli.tsm.client.ba.*.base|cut -d ":" -f2|cut -d " " -f1)
    installed_common_fileset=$(lslpp -iqc tivoli.tsm.client.ba.*.common|cut -d ":" -f2|cut -d " " -f1)	
    
    echo "HAVerify.Fileset.severity = \"ERROR\""
    echo "HAVerify.Fileset.exists[0].name =\"$installed_base_fileset\""
    echo "HAVerify.Fileset.exists[1].name =\"$installed_common_fileset\""

    return 0
}

#----------------------------------------------------------------------------
# Function:
#   generateVerifyScript
#
# Purpose:
#   Generates the cluster verification parameterized script for
#   TSM client smart assist, then pushes the file across to
#   other nodes in the cluster
#
# Arguments:
#   (1) Component Identifier
#   (2) Application Name
#   (3) nodes
#
# Returns:
#   0 on success
#   1 on failure
#----------------------------------------------------------------------------

function generateVerifyScript {
    [[ "$VERBOSE_LOGGING" == "high" ]] && set -x
    typeset cid=$1
    typeset sa_id=$2
    typeset nodes=$3
    typeset localnode=$(get_local_nodename)

    [[ -z $sa_id || -z $cid ]] && return 1
    [[ -z $nodes ]] && return 1

    typeset TEST_ROOT=/usr/es/sbin/cluster/etc/config/verify
    typeset VERIFICATION_FILENAME=${sa_id}"_"${cid}".ver"

    {
        getVerifyHeader $cid $sa_id
        generateTSMVerifyScript

    } > $TEST_ROOT/$VERIFICATION_FILENAME

    for node in $nodes; do
        [[ "$node" != "$localnode" ]] && {
            cl_rcp $TEST_ROOT/$VERIFICATION_FILENAME \
                $node:$TEST_ROOT/$VERIFICATION_FILENAME
            [[ $? != 0 ]] && {
                                KLIB_SA_logmsg ERROR 1 48 tsmclientsa.cat "Pushing the verification scripts to other node %1\$s is failed\n" $node
                                return 1
                             }
        }
    done



    clvt delete file_collection $cid >/dev/null 2>&1
    clvt add file_collection $cid \
        FILES="$TEST_ROOT/$VERIFICATION_FILENAME" \
        ISPROPOGATEDFILEDURINGSYNC="true" \
        ISPROPOGATEAUTOWHENDETECTED="true" >/dev/null 2>&1
    claddsaapp -a $APPLICATION_ID FILE_COLLECTION=$cid
    return 0
}

#----------------------------------------------------------------------------
# Function:
#   sys_file_collection
#
# Purpose:
#   TSM client smart assist, pushes the file dsm.sys across to
#   other nodes in the cluster
#
# Arguments:
#		n/a
#
# Returns:
#   0 on success
#   1 on failure
#----------------------------------------------------------------------------

function sys_file_collection {
	[[ "$VERBOSE_LOGGING" == "high" ]] && set -x
	TSM_CLI_BIN=""
	localnode=$(get_local_nodename)
	lslpp -iq tivoli.tsm.client.ba.64bit.common > /dev/null 2>&1
	if [[ $? == 0 ]];then
        	TSM_CLI_BIN=$TSM_CLIENT_BA_BIN64
	else
        	TSM_CLI_BIN=$TSM_CLIENT_BA_BIN
	fi
	nodes=$(echo "$PRIMNODE $TAKEOVNODES")

	# checks for non empty file 
	[[ -s $TSM_CLI_BIN/dsm.sys ]] || {
						KLIB_SA_logmsg ERROR 1 61 tsmclientsa.cat "dsm.sys file is not present in the default TSM client installation directory\n"
                                        exit 1
                                }
	
	for node in $nodes; do
	 	[[ "$node" != "$localnode" ]] && {
			cl_rcp $TSM_CLI_BIN/dsm.sys $node:$TSM_CLI_BIN/dsm.sys
			[[ $? != 0 ]] && {
					KLIB_SA_logmsg ERROR 1 50 tsmclientsa.cat "Pushing the dsm.sys scripts to other node %1\$s is failed\n" $node
        	                        exit 1
				}
		}
	done
	 
	clvt delete file_collection dsm_sys >/dev/null 2>&1
	clvt add file_collection dsm_sys \
	FILES="$TSM_CLI_BIN/dsm.sys" \
	ISPROPOGATEDFILEDURINGSYNC="true" \
        ISPROPOGATEAUTOWHENDETECTED="true" >/dev/null 2>&1

	return 0
}

###########################################
# main
###########################################

while getopts a:p:t:f:s:n:h:d:m opt
do
        case $opt in
        m) # modifying TSM client
                MODIFY="Y"
                ;;
        a) # Application Name
                APPLICATION_ID=$OPTARG
                APPLICATION_ID=$(echo $APPLICATION_ID|sed s/*$//) #Remove the trailing whitespaces if any at the end of the string
                KLIB_SA_logmsg INFO 1 10 tsmclientsa.cat "Validating TSM client Smart Assist application id\n"
                validateAppName "$APPLICATION_ID"
                [[ "$?" == "1" ]] && {
                KLIB_SA_logmsg ERROR 1 11 tsmclientsa.cat "TSM client smart assist Application id=%1\$s is not in the range [a-z][A-z][0-9]_\n" "$APPLICATION_ID"
                exit 1
                }

                KLIB_SA_logmsg DEBUG 1 12 tsmclientsa.cat "completion of validating TSM client Smart Assist for applicaton id=%1\$s\n" "$APPLICATION_ID"
                ;;
        p) # Primary node
                PRIMNODE=$OPTARG
                ;;
        t) # Takeover nodes
                TAKEOVNODES=$OPTARG
                ;;
	f) # filesystems that need to be taken for backup
		FILESYSTEMS=$OPTARG
		;;
        s) # Service IP of the TSM client
                SERVICE_IP=$OPTARG
                ;;
        n) # Netmask/prefix length of the service IP
                NETMASK=$OPTARG
                ;;
        h) # TSM space management client
                HSM=$OPTARG
		if [[ $HSM == "y" ]];then
			sa_nodes=$(echo "$PRIMNODE $TAKEOVNODES")
			local_node=$(get_local_nodename)
			hsm_uninstalled=""
			for i in $sa_nodes
 		        do
        			[[ $i == $local_node ]] && {
                                        /usr/bin/lslpp -iq tivoli.tsm.client.hsm.jfs2 >/dev/null 2>&1
                                        [[ $? != 0 ]] && hsm_uninstalled=$(echo "$hsm_uninstalled $i")
                                	   }

 		       		cl_rsh $i "/usr/bin/lslpp -iq tivoli.tsm.client.hsm.jfs2 >/dev/null 2>&1"
              				[[ $? != 0 ]] && hsm_uninstalled=$(echo "$hsm_uninstalled $i")
			done
			[[ -n $hsm_uninstalled ]] && {
							KLIB_SA_logmsg ERROR 1 13 tsmclientsa.cat " TSM HSM client is not installed on the nodes %1\$s but it is selected for PowerHA SystemMirror configuration\n" $hsm_uninstalled
							dspmsg -s 1 tsmclientsa.cat 13 "TSM HSM client is not installed on the nodes %1\$s but it is selected for PowerHA SystemMirror configuration\n" $hsm_uninstalled
							exit 1
						     }					
		fi
                ;;

	d) # TSM client configuration directory
		TSM_CONF_DIR=$OPTARG
		;;
        esac
done
	
#
#Validate the node names, if there are any Name duplication for Primary and Takeover nodes
#
KLIB_SA_logmsg INFO 1 14 tsmclientsa.cat "Validating TSM client Nodes\n"
validateNodes $PRIMNODE "$TAKEOVNODES"
(( $? != 0 )) && {
KLIB_SA_logmsg ERROR 1 15 tsmclientsa.cat "TSM client smart assist has primary=%1\$s and takeover nodes=%2\$s as repetitive\n" $PRIMNODE "$TAKEOVNODES"
exit 1
}
KLIB_SA_logmsg DEBUG 1 16 tsmclientsa.cat "completion of validating TSM client Smart Assist nodes primary=%1\$s amd takeover nodes=%2\$s\n" $PRIMNODE "$TAKEOVNODES"
if [[ "$MODIFY" == "Y" ]]
then
        KLIB_SA_logmsg INFO 1 17 tsmclientsa.cat "Modify the TSM client configuration=%1\$s\n" $APPLICATION_ID
        dspmsg -s 1 tsmclientsa.cat 17 " Modifying TSM client configuration=%1\$s\n" $APPLICATION_ID
        modifyClientInstance
        exit $?
else

        #check If the TSM client is already configured to PowerHA SystemMirror.

        KLIB_SA_logmsg INFO 1 18 tsmclientsa.cat "Checking if the TSM client is already configured.\n"
        app_id=$(clodmget -q "name=APPLICATION_NAME" -f application_id -n HACMPsa_metadata)

        [[ $app_id == $APPLICATION_ID ]] &&  {
			KLIB_SA_logmsg ERROR 1 19 tsmclientsa.cat "TSM client with application %1\$s is already configured\n" $APPLICATION_ID
                        exit 1
             }
        KLIB_SA_logmsg DEBUG 1 20 tsmclientsa.cat "TSM client with application %1\$s is not already configured\n" $APPLICATION_ID

        addClientInstance
        exit $?
fi
