#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2018,2019,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r720 src/43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_cluster.sh 1.16.1.1 # # Licensed Materials - Property of IBM # # Restricted Materials of IBM # # COPYRIGHT International Business Machines Corp. 2006,2015 # 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 # @(#) 454a48d 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_cluster.sh, 726, 2147A_aha726, Sep 09 2021 10:40 AM #============================================================================ # # Name: KLIB_HACMP_delete_cluster # # Description: This is the main, FPATH function that is invoked by clmgr # to delete a cluster. If nodes are specified, then the cluster # definition is removed just from those nodes, and the CAA # cluster, if any, is left alone. If no nodes are specified, # the entire cluster is removed, from all nodes, and the CAA # cluster is also removed as the last step (assuming no errors # have been detected, and the CAA cluster actually exists). # # Inputs: See the "devDoc()" function, below. # # Outputs: None. # # Returns: Zero if no errors are detected. Otherwise, an appropriate # non-zero value is returned. Refer to the "RETURN" section # of the "devDoc()" function, below, for the standard return # code values/meanings for clmgr. # #============================================================================ function KLIB_HACMP_delete_cluster { trap 'on_exit_delete_cluster' EXIT . $HALIBROOT/log_entry "$0()" "$CL" : version=@(#) 454a48d 43haes/lib/ksh93/hacmp/KLIB_HACMP_delete_cluster.sh, 726, 2147A_aha726, Sep 09 2021 10:40 AM : INPUTS: $* typeset nodes=${1//\"/} nodes=${nodes//,/ } [[ $CLMGR_LOGGING == 'med' ]] && set +x # Only trace param values [[ $CLMGR_PROGNAME == "clmgr" && -z $nodes ]] && nodes=ALL #=================================== : Declare and initialize variables #=================================== typeset -u state= typeset REMOTE_NODES= node= CNAME= typeset -i rc=$RC_UNKNOWN cmd_rc=$RC_UNKNOWN delete_local=1 typeset -i delete_all_nodes=1 # Assume we are deleting all nodes typeset -i all_nodes_arg=0 NO_CAA_YET=0 typeset -i PLANNED_DELETIONS=0 ACTUAL_DELETIONS=0 typeset SITE= IDENTIFIERS= RG_NODES= SITE_NODES= #=============================== : See if a cluster even exists #=============================== CL=$LINENO isClusterDefined if (( $? != RC_SUCCESS )); then rc=$RC_NOT_FOUND else print "$0()[$LINENO]($SECONDS): LANG=C LC_ALL=C lscluster -d | grep \"Cluster Name:\"" >>$CLMGR_TMPLOG CNAME=$(lscluster -d 2>>$CLMGR_TMPLOG | grep "Cluster Name:") print "$0()[$LINENO]($SECONDS): lscluster -d RC: $?; CNAME == \"$CNAME\"" >>$CLMGR_TMPLOG if [[ -n $CNAME ]]; then CNAME=${CNAME#*:} CNAME=${CNAME##+([[:space:]])} CNAME=${CNAME%%+([[:space:]])} fi if [[ -z $CNAME ]]; then CNAME=$(CL=$LINENO KLIB_HACMP_get_cluster_name 2>>$CLMGR_TMPLOG) fi /usr/lib/cluster/incluster if (( $? != 0 )); then #=============================================================== : The cluster has not been formed yet, and is currently only a : local definition. Knowing this, we can avoid certain tasks. #=============================================================== NO_CAA_YET=1 fi #=============================================================== : As we delete the cluster, we have to remove all HMCs. #=============================================================== print -- "$0()[$LINENO]($SECONDS): KLIB_HACMP_delete_hmc \"ALL\" " >>$CLMGR_TMPLOG CL=$LINENO KLIB_HACMP_delete_hmc "ALL" >>$CLMGR_TMPLOG #==================================== : Gather the appropriate nodes list #==================================== print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clnodename" >>$CLMGR_TMPLOG typeset all_nodes=$($HAUTILS/clnodename) typeset -i clnodename_rc=$? print "$0()[$LINENO]($SECONDS): clnodename RC: $clnodename_rc; all_nodes == \"$all_nodes\"" >>$CLMGR_TMPLOG if [[ $all_nodes == *([[:space:]]) ]] && \ (( $clnodename_rc == RC_SUCCESS )) then #========================================================== : Somehow we got a cluster definition with no nodes in it #========================================================== print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmclstr" >>$CLMGR_TMPLOG $HAUTILS/clrmclstr >>$CLMGR_TMPLOG 2>&1 rc=$? print "$0()[$LINENO]($SECONDS): clrmclstr RC: $rc" >>$CLMGR_TMPLOG log_return_msg "$rc" "$0()" "$LINENO" return $? fi if [[ -z $nodes ]]; then nodes=$LOCAL_NODE # Default to the local node else if [[ -z $LOCAL_NODE ]]; then dspmsg -s $CLMGR_SET $CLMGR_MSGS 302 "\nWarning: unable to determine the name of the local node.\n\n" fi typeset -u uc_nodes=$(echo $nodes) # 'echo' removes leading/trailing spaces if [[ $uc_nodes == "ALL" ]]; then all_nodes_arg=1 for node in $all_nodes; do [[ $node == $LOCAL_NODE ]] && continue REMOTE_NODES="$REMOTE_NODES $node" done nodes="$REMOTE_NODES $LOCAL_NODE" else for node in $nodes; do [[ $node == $LOCAL_NODE ]] && continue if [[ " $all_nodes " != *+([[:space:]])$node+([[:space:]])* ]] then dspmsg -s $CLMGR_SET $CLMGR_MSGS 303 '\nERROR: the specified node "%1$s" could not be found in the cluster.\n' "$node" 1>&2 rc=$RC_MISSING_INPUT fi REMOTE_NODES="$REMOTE_NODES $node" done if [[ " $nodes " != *+([[:space:]])$LOCAL_NODE+([[:space:]])* ]] then delete_local=0 fi fi fi (( $rc != RC_UNKNOWN )) && unset REMOTE_NODES #========================================================= : Now that we have a list of nodes to remove from the : cluster see if we are removing all nodes, or a subset : This will determine if we remove the CAA cluster with : rmcluster, or just remove one or more nodes from the : CAA cluster with chcluster. #========================================================= node= typeset remaining_nodes= if (( ! all_nodes_arg )); then for node in $all_nodes; do : For each node in \$all_nodes, see if it is in the list : of nodes to delete. If we find a node defined in the : cluster that is not in the list, we are not deleting : all nodes and set delete_all_nodes to 0. if [[ " $nodes " != *+([[:space:]])$node+([[:space:]])* ]]; then delete_all_nodes=0 remaining_nodes=${remaining_nodes:+$remaining_nodes" "}"$node" fi done fi if (( $rc == RC_UNKNOWN )); then if (( NO_CAA_YET )); then #======================================================== : Since there is no real cluster yet, if the local node : is specified for deletion, then really, the entire : cluster must be deleted. If the local node was *not* : specified, then in this case, we just delete nodes : from the configuration. #======================================================== (( ! CLMGR_FORCE )) && print # Blank line, for readability if (( delete_local )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 353 'Deleting the cluster definition from "%1$s"...\n' "$LOCAL_NODE" print -- "$0()[$LINENO]($SECONDS): $HAUTILS/clrmclstr" >>$CLMGR_TMPLOG $HAUTILS/clrmclstr >>$CLMGR_TMPLOG 2>&1 print "$0()[$LINENO]($SECONDS): clrmclstr RC: $?" >>$CLMGR_TMPLOG sleep 2 print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG $HAUTILS/cllsclstr -cS >>$CLMGR_TMPLOG 2>&1 rc=$? print -- "$0()[$LINENO]($SECONDS): cllsclstr RC: $rc" >>$CLMGR_TMPLOG if (( $rc == RC_SUCCESS )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 308 '\nERROR: the cluster removal appears to have failed on node "%1$s":\n From "%1$s": %2$s\n' "$LOCAL_NODE" "$(cat $TMPDIR/clmgr.KHdc.$$)" 1>&2 rc=$RC_ERROR else rc=$RC_SUCCESS print -- "$0()[$LINENO]($SECONDS): stopsrc -s clcomd" >>$CLMGR_TMPLOG stopsrc -s clcomd >>$CLMGR_TMPLOG 2>&1 sleep 3 print -- "$0()[$LINENO]($SECONDS): startsrc -s clcomd" >>$CLMGR_TMPLOG startsrc -s clcomd >>$CLMGR_TMPLOG 2>&1 fi else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 354 'Deleting the following nodes from the cluster definition on "%1$s": ' "$LOCAL_NODE" print "${REMOTE_NODES// /, }" CL=$LINENO KLIB_HACMP_delete_node "$REMOTE_NODES" rc=$? fi log_return_msg "$rc" "$0()" "$LINENO" return $? else #======================================================= : Unable to delete the cluster if its running. Exit with error. #======================================================= typeset -i offline_rc=$RC_UNKNOWN nodes=${nodes##+([[:space:]])} for tempnode in $nodes do # : Find what nodes $tempnode thinks is active # clgetactivenodes -n $tempnode 2>/dev/null 1>&2 returncode=$? # : clgetactivenodes return code is the number of active nodes, : or -1 or 255 in case of an error # if (( $returncode == 255 || $returncode == 0 )) then continue # $tempnode has no clue about active nodes else dspmsg -s $CLMGR_SET $CLMGR_MSGS 351 "\nERROR: cluster services on one or more of the specified nodes, \"%1\$s\", are in a state that prevent the cluster configuration from being removed. A cluster cannot be deleted from a node while cluster services remain active. Please consider running \"%2\$s offline node \" for each active node.\n" "$nodes" "$CLMGR_PROGNAME" 1>&2 rc=$RC_ERROR # Should have an active node list. Mark as error. break fi done fi fi if (( $rc == RC_UNKNOWN && ! delete_all_nodes )); then #=============================================================================== # Check each node in the list whether it belongs to any resource group or site. # If a node is part of any RG/site, delete cluster operation will not succeed. #=============================================================================== (( delete_local )) && REMOTE_NODES="$REMOTE_NODES $LOCAL_NODE" RG_NODES=$($HAUTILS/clodmget -n -f nodes HACMPgroup) if [[ -n $RG_NODES ]]; then for NODE in $RG_NODES; do if [[ " $REMOTE_NODES " == *+([[:space:]])$NODE+([[:space:]])* ]] then rc=$RC_ERROR cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 777 '\nERROR: Cannot delete node \"%1$s\" from the cluster. Remove node \"%1$s\" from all resource groups before attempting to delete the node from the cluster.\n' "$NODE" 1>&2 fi done fi SITE_NODES=$($HAUTILS/clodmget -n -f nodelist HACMPsite) if [[ -n $SITE_NODES ]]; then for NODE in $SITE_NODES; do if [[ " $REMOTE_NODES " == *+([[:space:]])$NODE+([[:space:]])* ]] then rc=$RC_ERROR cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 778 '\nERROR: Cannot delete node \"%1$s\" from the cluster. Remove node \"%1$s\" from site definitions before attempting to delete the node from the cluster.\n' "$NODE" 1>&2 fi done fi if (( $rc == RC_ERROR )); then log_return_msg "$rc" "$0()" "$LINENO" return $rc fi fi #============================================================ : Remove any/all remote nodes first. The local node must be : removed last to avoid severing communications too soon. #============================================================ if (( $rc == RC_UNKNOWN )); then (( delete_all_nodes )) && REMOTE_NODES="$REMOTE_NODES $LOCAL_NODE" #================================================= : Create a signal file for smcaactrl, so it will : know that this operation was initiated from : clmgr, and is therefore authorized to occur. #================================================= date >$HAETC/clmgrrmclstr.$$ for node in $REMOTE_NODES; do typeset -i REMOVE_CAA_CLUSTER=0 REMOVE_CAA_SITE=0 typeset -i CAA_CLUSTER_REMOVAL_FAILED=0 typeset SITE= NODELIST= (( PLANNED_REMOVALS++ )) if [[ $CLUSTER_TYPE == "LC" ]]; then #======================================= : Find which site this node belongs to #======================================= for SITE in $($HAUTILS/clodmget -n -f name HACMPsite); do NODELIST=$($HAUTILS/clodmget -n -q name=$SITE -f nodelist HACMPsite) if [[ " ${NODELIST//,/ } " == *\ $node\ * ]]; then break fi done #==================================================== : Check to see if this is the last node in the site #==================================================== typeset -i LAST_NODE=1 for NODE in ${NODELIST//,/ }; do [[ $node == $NODE ]] && continue : See if a cluster exists on $NODE if [[ $NODE == $LOCAL_NODE ]]; then print "$0()[$LINENO]($SECONDS): $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG $HAUTILS/cllsclstr -cS >/dev/null 2>&1 else print "$0()[$LINENO]($SECONDS): $CLRSH $NODE $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG $CLRSH $NODE $HAUTILS/cllsclstr -cS >/dev/null 2>&1 fi cmd_rc=$? print "$0()[$LINENO]($SECONDS): cllsclstr RC: $cmd_rc" >>$CLMGR_TMPLOG if (( $cmd_rc == RC_SUCCESS )); then : A cluster is defined on $NODE. LAST_NODE=0 break # Exit the sites loop else : No cluster definition was found on $NODE. fi done # End of site nodes loop if (( LAST_NODE && ! delete_all_nodes )); then REMOVE_CAA_SITE=1 elif [[ $node == $LOCAL_NODE ]] && (( delete_all_nodes )) then REMOVE_CAA_CLUSTER=1 fi #========================== # For non-linked clusters #========================== elif [[ $node == $LOCAL_NODE ]] && (( delete_all_nodes )) then REMOVE_CAA_CLUSTER=1 fi if (( REMOVE_CAA_CLUSTER || REMOVE_CAA_SITE )); then rm -f $TMPDIR/clmgr.KHdc.$$ if [[ $node == $LOCAL_NODE ]]; then print "$0()[$LINENO]($SECONDS): /usr/lib/cluster/incluster" >>$CLMGR_TMPLOG /usr/lib/cluster/incluster else print "$0()[$LINENO]($SECONDS): $CLRSH "$node" /usr/lib/cluster/incluster" >>$CLMGR_TMPLOG $CLRSH "$node" /usr/lib/cluster/incluster fi typeset -i incluster_rc=$? print "$0()[$LINENO]($SECONDS): incluster RC: $incluster_rc" >>$CLMGR_TMPLOG if (( $incluster_rc == 0 )); then #========================================== : Perform the CAA cluster or site removal #========================================== if (( REMOVE_CAA_CLUSTER )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 355 'Attempting to remove the CAA cluster from "%1$s"...\n' "$node" else cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 356 'Attempting to remove the CAA site from "%1$s"...\n' "$node" fi typeset TARGET="-n $CNAME" (( REMOVE_CAA_SITE )) && TARGET="-S $SITE" print "$0()[$LINENO]($SECONDS): CAA_FORCE_ENABLED=1 rmcluster -f $TARGET" >>$CLMGR_TMPLOG # NOTE: rmcluster -n/-S should always be run on # the local node, and not through cl_rsh. CAA_FORCE_ENABLED=1 rmcluster -f $TARGET >>$TMPDIR/clmgr.KHdc.$$ 2>&1 print "$0()[$LINENO]($SECONDS): rmcluster RC: $?" >>$CLMGR_TMPLOG #================================= : Verify the CAA cluster is gone #================================= print "$0()[$LINENO]($SECONDS): /usr/lib/cluster/incluster" >>$CLMGR_TMPLOG /usr/lib/cluster/incluster rc=$? print "$0()[$LINENO]($SECONDS): incluster RC: $rc" >>$CLMGR_TMPLOG if (( $rc == RC_SUCCESS )); then cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 610 "\nERROR: an error occurred while attempting to remove the cluster from AIX. See \"%1\$s\" for details.\n\n" "clutils.log" 1>&2 [[ -s $TMPDIR/clmgr.KHdc.$$ ]] && cat $TMPDIR/clmgr.KHdc.$$ 1>&2 cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 610 "\nERROR: an error occurred while attempting to remove the cluster from AIX. See \"%1\$s\" for details.\n\n" "clutils.log" >>$CLMGR_TMPLOG [[ -s $TMPDIR/clmgr.KHdc.$$ ]] && cat $TMPDIR/clmgr.KHdc.$$ >>$CLMGR_TMPLOG rm -f $TMPDIR/clmgr.KHdc.$$ rc=$RC_ERROR CAA_CLUSTER_REMOVAL_FAILED=1 else rc=$RC_SUCCESS fi fi # End of the CAA cluster removal section fi #============================================================= : Attempting to remove LDAP configuration, if RBAC is enabled : from all node of cluster and delete HACMPLDAP odm. : This LDAP deletion is in for loop but it will run only once. #============================================================= is_rbac_enabled=$(clodmget -nq "group=LDAPClient and name=RBACConfig" -f value HACMPLDAP 2>/dev/null) if [[ $is_rbac_enabled == "YES" ]]; then print -- "$0()[$LINENO]($SECONDS): /usr/es/sbin/cluster/cspoc/cl_ldap_client_del" >>$CLMGR_TMPLOG /usr/es/sbin/cluster/cspoc/cl_ldap_client_del ldap_delete_rc=$? print "$0()[$LINENO]($SECONDS):/usr/es/sbin/cluster/cspoc/cl_ldap_client_del RC: $ldap_delete_rc" >>$CLMGR_TMPLOG if (( $ldap_delete_rc != 0 )); then dspmsg -s 129 cspoc.cat 79 "ERROR: %1\$s\n" "Failed to delete LDAP configuration, while deleting cluster. Please fix the given error and try to delete the cluster again!" rc=$RC_ERROR break fi fi #===================================================== : Attempting to remove the SystemMirror cluster from : $node. The DELETE_CLUSTER directive is : used with clrexec #===================================================== cl_dspmsg -s $CLMGR_SET $CLMGR_MSGS 307 'Attempting to delete node "%1$s" from the cluster...\n' "$node" print -- "$0()[$LINENO]($SECONDS): $CLREXEC \"$node\" DELETE_CLUSTER" >>$CLMGR_TMPLOG $CLREXEC "$node" DELETE_CLUSTER >>$TMPDIR/clmgr.KHdc.$$ 2>&1 print "$0()[$LINENO]($SECONDS): $CLREXEC \"$node\" DELETE_CLUSTER RC: $?" >>$CLMGR_TMPLOG #================================================= : Verify whether or not the SystemMirror cluster : was successfully deleted from $node. #================================================= if [[ $node == $LOCAL_NODE ]]; then print -- "$0()[$LINENO]($SECONDS): $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG $HAUTILS/cllsclstr -cS >>$TMPDIR/clmgr.KHdc.$$ 2>&1 else print -- "$0()[$LINENO]($SECONDS): $CLRSH \"$node\" $HAUTILS/cllsclstr -cS" >>$CLMGR_TMPLOG $CLRSH "$node" $HAUTILS/cllsclstr -cS >>$TMPDIR/clmgr.KHdc.$$ 2>&1 fi rc=$? print "$0()[$LINENO]($SECONDS): cllsclstr RC: $rc" >>$CLMGR_TMPLOG if (( $rc == 0 )); then dspmsg -s $CLMGR_SET $CLMGR_MSGS 308 '\nERROR: the cluster removal appears to have failed on node "%1$s":\n From "%1$s": %2$s\n' "$node" "$(cat $TMPDIR/clmgr.KHdc.$$)" 1>&2 rc=$RC_ERROR break else rc=$RC_SUCCESS (( ACTUAL_REMOVALS++ )) if (( ! delete_all_nodes )) && [[ $node != $LOCAL_NODE ]]; then : Remove the node from the local cluster definition CL=$LINENO KLIB_HACMP_delete_node "$node" >>$CLMGR_TMPLOG fi fi #======================== # Remove temporary file #======================== rm -f $TMPDIR/clmgr.KHdc.$$ #====================================================== : If the removal failed, there is no need to continue #====================================================== (( $rc != RC_SUCCESS )) && break done # End of the nodes loop #============================================================ # If the number of node removals matches what was expected, # and if the CAA cluster was removed (if all nodes were # deleted, not just a subset of the nodes), then exit with # a success code. Otherwise an error occurred. #============================================================ if (( $rc == RC_SUCCESS )); then rc=$RC_ERROR if (( PLANNED_REMOVALS == ACTUAL_REMOVALS )); then if (( delete_all_nodes )); then if ! /usr/lib/cluster/incluster; then rc=$RC_SUCCESS fi else rc=$RC_SUCCESS fi fi fi #======================== # Remove temporary file #======================== rm -f $HAETC/clmgrrmclstr.$$ fi fi #================================================== : Update the clevents file with formatted event and : send an event upstream to the GUI server, if the : node has a running GUI agent on it #================================================== if (( $rc == RC_SUCCESS )) && [[ $DISABLE_DELETE_EVENT != "1" ]]; then print "$0()[$LINENO]($SECONDS): cl_send_ui_event NODE \"$LOCAL_NODE\" SYNC PASSED PASSED \"Cluster \\\"$CNAME\\\" was deleted on \$(date).\"" >>$CLMGR_TMPLOG cl_send_ui_event NODE "$LOCAL_NODE" SYNC PASSED PASSED "Cluster \"$CNAME\" was deleted on $(date)." print "$0()[$LINENO]($SECONDS): cl_send_ui_event RC: $?" >>$CLMGR_TMPLOG fi log_return_msg "$rc" "$0()" "$LINENO" return $? } # End of "KLIB_HACMP_delete_cluster()" function on_exit_delete_cluster { rm -f $TMPDIR/clmgr.KHdc.$$ } #============================================================================ # # Name: devDoc # # Description: This is a never-to-be-called, wrapper function that all the # clmgr FPATH functions implement in order to hide embedded # syntax from trace logging. This information is implemented # in POD format, and can be viewed in a number of ways using # POD tools. Some viewing suggestions for this function's POD- # formatted information are: # # perldoc # pod2text -c # pod2text -c --code # pod2html # # However, the more important use for this information is that # it is parsed by clmgr to display the syntax for this file's # operation. The information in the "SYNOPSIS" section is used # for this purpose. This feature was originally implemented # using the man page information. However, in a code review it # was pointed out that this approach had to be changed because # customers do not have to install the man pages! Therefore, a # built-in dependency on man page information would break the # automatic help feature of clmgr. So the SYNPOSIS section must # be used instead. # # IMPORTANT: As a result of this, it is imperative that the # information in this SYNOPSIS be kept in sync # with the man page information, which is owned # by the IDD team. # # Inputs: None. # # Outputs: None. # # Returns: n/a (not intended to be invoked) # #============================================================================ function devDoc { : <<'=cut' >/dev/null 2>&1 =head1 NAME KLIB_HACMP_delete_cluster =head1 SYNOPSIS clmgr delete cluster [ NODES={ALL|,,...} ] =head1 DESCRIPTION Removes the entire cluster configuration from the specified list of nodes, defaulting to the local node if none are specified. =head1 ARGUMENTS 1. nodes [OPTIONAL] [string] One or more (comma or space separated) nodes upon which the cluster configuration should be deleted. If no nodes are specified, then the local system is presumed. Conversely, if the special value of "ALL" is detected, then all nodes in the cluster (as defined on the local node) will be removed. =head1 RETURN 0: no errors were detected; the operation appears to have been successful 1: a general error has occurred 2: a specified resource does not exist, or could not be found 3: some required input was missing 4: some detected input was incorrect in some way 5: a required dependency does not exist 6: a specified search failed to match any data =head1 COPYRIGHT COPYRIGHT International Business Machines Corp. 2005,2010 All Rights Reserved =cut } # End of "devDoc()" #============================================================================== # The following, comment block attempts to enforce coding standards when this # file is edited via emacs or vim. This block _must_ appear at the very end # of the file, or the editor will not find it, and it will be ignored. #============================================================================== # Local Variables: # indent-tabs-mode: nil # tab-width: 4 # End: #============================================================================== # vim: tabstop=4 shiftwidth=4 expandtab #==============================================================================