#!/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 <logfile> <prefix> <command> [args]

        Where:  <logfile> is the full pathname of the C-SPOC log file.
                <prefix>  is the prefix used for the output file names.
                <command> 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: <prefix>.out
  #  STDERR: <prefix>.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
