#!/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