#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r721 src/43haes/lib/libcspoc/log_output.sh 1.7.1.1 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1996,2016 # 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/lib/libcspoc/log_output.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM # # COMPONENT_NAME: CSPOC # # FUNCTIONS: # # ORIGINS: # # # (C) COPYRIGHT International Business Machines Corp. 1996 # All Rights Reserved # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # ############################################################################### # # Name: # log_output # # Description: # Generates C-SPOC log files entries for the command and the # output files specified. # # Arguments: # # # Return Values: # 0 - success # 1 - failure # ################################################################################ function log_output { typeset USAGE="USAGE: log_output [args] Where: is the full pathname of the C-SPOC log file. is the prefix used for the output file names. is the AIX command to be executed on the nodes. [args] is the argument list for the AIX command." # CHECK USAGE (( $# < 3 )) && { print "$USAGE" return 2 } typeset TMP_LOG PREFIX CMD ARGS DATE_STAMP CDSH_OUTPUT CDSH_ERROR typeset NODE NODELIST NODE_OUTPUT NODE_ERROR RC STATUS # initialize ARGS to nothing, it will then get filled in after # the "right" things have been decoded ARGS="" # GET ARGS TMP_LOG=$1 PREFIX=$2 CMD=$3 shift 3 # since any argument (except for flags which all start in "-") which # we receive has been encoded we need to decode them before we place # them in $ARGS or the log file becomes next to useless. for ARG in $* ; do case $ARG in -*) ARGS="$ARGS $ARG" ;; *) ARGS="$ARGS $(print $ARG | /usr/es/sbin/cluster/cspoc/cldecodearg)" ;; esac done DATE_STAMP="$(LC_ALL=C date '+%Y-%m-%dT%H:%M:%S')|" # THE CDSH OUTPUT FILE NAMES HAVE THE FORMAT: # STDOUT: .out # STDERR: .err # CDSH_OUTPUT=${PREFIX}.out CDSH_ERROR=${PREFIX}.err # ENSURE THAT WE HAVE AT LEAST ONE OUTPUT AND/OR ERROR FILE # OTHERWISE RETURN AN ERROR, SILENTLY! [[ ! -f ${CDSH_OUTPUT} && ! -f ${CDSH_ERROR} ]] && { return 1 } # Ensure that various log files are present for use below [[ ! -f ${CDSH_OUTPUT} ]] && touch ${CDSH_OUTPUT} [[ ! -f ${CDSH_ERROR} ]] && touch ${CDSH_ERROR} [[ ! -f ${TMP_LOG} ]] && touch ${TMP_LOG} # DETERMINE THE LIST OF NODES FROM THE OUTPUT FILE NODELIST=$(cat ${CDSH_OUTPUT} ${CDSH_ERROR} | cut -d: -f1 | sort -u | grep -v dsh) # SEPERATE OUTPUT FROM DSH INTO SEPERATE FILES FOR EACH NODE for NODE in ${NODELIST} do NODE_OUTPUT=${PREFIX}_${NODE}.out NODE_ERROR=${PREFIX}_${NODE}.err grep -w "^${NODE}:" ${CDSH_OUTPUT} > ${NODE_OUTPUT} grep -w "^${NODE}:" ${CDSH_ERROR} > ${NODE_ERROR} # GET RETURN CODE OF AIX COMMAND THAT WAS SAVED TO STDERR integer RC=$(egrep ": RETURN_CODE=" ${NODE_ERROR} | tail -1 | cut -d= -f2) # GENERATE STATUS FIELD FOR LOG FILE if (( $RC == 0 )) then STATUS="success" else STATUS="FAILED" fi # GENERATE THE LOG FILE OUTPUT { # PRINT LOG FILE OUTPUT if [[ $CMD == "clpasswdremote" ]] then # Don't log passwords print "${NODE}: ${STATUS}: ${CMD}" else print "${NODE}: ${STATUS}: ${CMD} ${ARGS}" fi # IF COMMAND FAILED INCLUDE ERRORS if [[ -n $RC ]] && (( $RC != 0 )) then cat ${NODE_OUTPUT} cat ${NODE_ERROR} fi } | sed -e "s?^?${DATE_STAMP}?" >> ${TMP_LOG} 2>&1 rm -f ${NODE_OUTPUT} ${NODE_ERROR} done return 0 } if [[ -n $@ ]] then log_output "$@" fi