#!/bin/ksh
#  ALTRAN_PROLOG_BEGIN_TAG                                                    
#  This is an automatically generated prolog.                                  
#                                                                              
#  Copyright (C) Altran ACT S.A.S. 2018,2019,2021.  All rights reserved.  
#                                                                              
#  ALTRAN_PROLOG_END_TAG                                                      
#                                                                              
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# 61haes_r714 src/43haes/usr/sbin/cluster/diag/cld_logfiles.sh 1.8 
#  
# Licensed Materials - Property of IBM 
#  
# COPYRIGHT International Business Machines Corp. 1990,2007 
# 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/diag/cld_logfiles.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM
###############################################################################
#   COMPONENT_NAME: DIAG
#
#   FUNCTIONS: none
#
#  Name: cld_logfiles
#
#  Description: Parses either the hacmp.out or cluster.log file
#  		according to user input.  Optionally saves output to file.
#  Returns:
#       0 - Success
#       1 - Failure
#       2 - Wrong number of args
#
#  Arguments: -t type ( of log input: hacmp.out, cluster.log )
#	      -h hostname ( of host to use )
#	      -s ( view event start/comletion)
#	      -e ( view errors )
#	      -w ( view warnings )
#	      -f ( view failures/erros )
#	      -d ( # corresponding to how many days' worth of data to view )
#	      -r filename (to save output) 
#	      event ... ( list of event names for which to view )	
#	      process ... ( list of processes for which to view )
#	      
#
#  Environment: PATH
#
###############################################################################

intr_handler()
{
	echo "Exiting."
	exit 1
}
###############################################################################
#
# Set trap statement to catch hangup, interrupt, and quit signals
#
###############################################################################
[ "$VERBOSE_LOGGING" = "high" ] && set -x
PROGNAME=$(basename ${0})
PATH="$($(dirname ${0})/../utilities/cl_get_path all)"
HA_DIR="$(cl_get_path)"

trap intr_handler 1 2 3

STATUS=0

###############################################################################
#
#  Name:  usage
#
#  This routine displays the usage message and exits
#
#  Arguments:    none
#  Usage:        usage
#  Returns:      1 - exit with error
#  Environment:
#
###############################################################################
usage1()
{
    dspmsg scripts.cat 465 "usage: $PROGNAME scripts [-h host] [-s] [-f] [-d days] [-R file] [event ...]\n" $PROGNAME
    dspmsg scripts.cat 580 "Where:     -h host 	is the name of a remote host from which to gather log data\n"
    dspmsg scripts.cat 581 "           -s 		filters start/complete events\n"
    dspmsg scripts.cat 582 "           -f 		filters failure events\n"
    dspmsg scripts.cat 583 "           -d days 	defines the number of previous days from which to retrieve log\n"
    dspmsg scripts.cat 584 "           -R file 	is file to which output is saved\n"
    dspmsg scripts.cat 585 "           event      	is a list of cluster events\n"
exit 1
}

usage2()
{
    dspmsg scripts.cat 466 "usage: $PROGNAME syslog [-h host] [-e] [-w] [-d days] [-R file] [process ...]\n" $PROGNAME
    dspmsg scripts.cat 586 "Where:     -h host  	is the name of a remote host from which to gather log data\n"
    dspmsg scripts.cat 587 "           -e       	filters error events\n"
    dspmsg scripts.cat 588 "           -w       	filters warning events\n"
    dspmsg scripts.cat 589 "           -d days  	defines the number of previous days from which to retrieve log\n"
    dspmsg scripts.cat 590 "           -R file  	is file to which output is saved\n"
    dspmsg scripts.cat 591 "           process 	is a list of cluster daemon processes\n"
    exit 1
}

usage3()
{
    dspmsg scripts.cat 575 "Invalid arguments\n"
    exit 1
}

if [ "$#" -lt "2" ]
then
    usage3
fi

# Get command line options
set -- `getopt "d:efh:R:st:T:w" $*`
if [ $? -ne 0 ]
then
    if [ "$2" = "scripts" ]
    then
        usage1
    else
	usage2
    fi
fi

# Parse command line.
while [ $1 != -- ]
do
    case $1 in
    -d)
	DAYS="$2"
        shift ; shift
        ;;
    -e)
        ERRORS="TRUE"
        shift 
        ;;
    -f)
        FAILURES="TRUE"
        shift 
        ;;
    -h)
	HOSTNAME="$2"
        shift ; shift
        ;;
    -R)
        FILE="$2"
        shift ; shift
        ;;
    -s)
        START="TRUE"
        shift 
        ;;
    -t)
        TYPE="$2"
        shift ; shift
        ;;
    -w)
        WARNINGS="TRUE"
        shift 
        ;;
    *)
        usage3
        ;;
    esac
done

shift   # lose the --

if [ "$TYPE" = "" ]
then
	usage3
fi

# Set defaults
LOCALHOST=$(hostname)
DAYS=${DAYS:-""} # default to ""
ERRORS=${ERRORS:-"FALSE"} # default to FALSE
FAILURES=${FAILURES:-"FALSE"} # default to FALSE
HOSTNAME=${HOSTNAME:-"$LOCALHOST"} # default to localhost
FILE=${FILE:-"/var/hacmp/log/cld_log.out"} # default logfile
START=${START:-"FALSE"} # default to FALSE
WARNINGS=${WARNINGS:-"FALSE"} # default to FALSE

# Get syslog configuration file
typeset SYSLOG_CONF=""
SYSLOG_CONF=$(clgetsyslog)
# Use default configuration file for any kind of failures
if (( $? != 0 ))
then
    SYSLOG_CONF="/etc/syslog.conf"
fi
# set log file pathnames
SCRIPTS_HDR=`odmget -q"name=hacmp.out" HACMPlogs | grep value | cut -d'"' -f2`
SCRIPTS_TAIL="hacmp.out"
SCRIPTS="$SCRIPTS_HDR/$SCRIPTS_TAIL"
SYSLOG=`awk '/user.notice/ { print $2 }' ${SYSLOG_CONF}`
SYSLOG_TAIL="cluster.log"
SYSLOG_HDR=${SYSLOG%/cluster.log}

STRINGS=""
DATE_STRINGS=""
TEMPFILE="/tmp/cld_logfiles$$"
# Create temporary file
touch $TEMPFILE

case $TYPE in
     "scripts")

	# Check for proper command line args
	if [ "$ERRORS" = "TRUE" -o "$WARNINGS" = "TRUE" ]
	then
	    usage1
	fi

        # Set up string keyword for which to search
        if [ "$FAILURES" = "TRUE" ]
        then
            if [ "$STRINGS" = "" ]
            then
                STRINGS="Fail|fail|FAIL"
            else
                STRINGS="$STRINGS|Fail|fail|FAIL"
            fi
        fi

        if [ "$START" = "TRUE" ]
        then
            if [ "$STRINGS" = "" ]
            then
                STRINGS="START|COMPLET"
            else
                STRINGS="$STRINGS|START|COMPLET"
            fi
        fi

	for event in $*
	do
	    if [ "$STRINGS" = "" ]
            then
	    	STRINGS="$event"
	    else
	    	STRINGS="$STRINGS|$event"
	    fi
	done

	# Set up counter for hacmp.out.xxx
	if [ "$DAYS" = "" ]
	then
	    DAYS=0
	fi

        COUNT=`expr $DAYS`
	if [ $COUNT -gt 7 ]
	then
    	    dspmsg scripts.cat 467 "Limited to 7 days maximum with -d option.\n"
	    COUNT=7
        else
            if [ $COUNT -lt 0 ]
            then
                 usage1
            fi
	fi
        if [ "$LOCALHOST" = "$HOSTNAME" ]
        then
            while [ $COUNT -gt 0 ]
            do
                if [ -f $SCRIPTS.$COUNT ]
                then
		    if [ "$STRINGS" = "" ]
            	    then
			echo $SCRIPTS.$COUNT >> $TEMPFILE
			cat $SCRIPTS.$COUNT >> $TEMPFILE
		    else
			echo $SCRIPTS.$COUNT >> $TEMPFILE
                    	cat $SCRIPTS.$COUNT | egrep "$STRINGS" >> $TEMPFILE
		    fi
                else
    	    	    dspmsg scripts.cat 468 "$PROGNAME: $SCRIPTS.$COUNT not found.  Skipping.\n" $PROGNAME $SCRIPTS $COUNT
                fi
                COUNT=`expr $COUNT - 1`
            done

            if [ -f $SCRIPTS ]
            then
		if [ "$STRINGS" = "" ]
                then
		    echo $SCRIPTS >> $TEMPFILE
                    cat $SCRIPTS >> $TEMPFILE
		else
		    echo $SCRIPTS >> $TEMPFILE
                    cat $SCRIPTS | egrep "$STRINGS" >> $TEMPFILE
		fi
            else
    	    	dspmsg scripts.cat 469 "$PROGNAME: $SCRIPTS not found.  Skipping.\n" $PROGNAME $SCRIPTS 
            fi
	    cat $TEMPFILE | more
	else
	    while [ $COUNT -gt 0 ]
            do
		FOUND=""
		FOUND=`cl_rsh $HOSTNAME find $SCRIPTS_HDR -name $SCRIPTS_TAIL.$COUNT -print`
		if [ "$FOUND" != "" ]
		then
		    if [ "$STRINGS" = "" ]
                    then
			echo $SCRIPTS.$COUNT >> $TEMPFILE
                        cl_rsh $HOSTNAME cat $SCRIPTS.$COUNT >> $TEMPFILE
                    else
			echo $SCRIPTS.$COUNT >> $TEMPFILE
                        cl_rsh $HOSTNAME cat $SCRIPTS.$COUNT | egrep "$STRINGS" >> $TEMPFILE
                    fi
                else
    	    	    dspmsg scripts.cat 468 "$PROGNAME: $SCRIPTS.$COUNT not found.  Skipping.\n" $PROGNAME $SCRIPTS $COUNT
                fi
                COUNT=`expr $COUNT - 1`
            done

	    FOUND=""
            FOUND=`cl_rsh $HOSTNAME find $SCRIPTS_HDR -name $SCRIPTS_TAIL -print`
            if [ "$FOUND" != "" ]
            then
		if [ "$STRINGS" = "" ]
                then
		    echo $SCRIPTS >> $TEMPFILE
                    cl_rsh $HOSTNAME cat $SCRIPTS >> $TEMPFILE
		else
		    echo $SCRIPTS >> $TEMPFILE
                    cl_rsh $HOSTNAME cat $SCRIPTS | egrep "$STRINGS" >> $TEMPFILE
		fi
            else
    	    	dspmsg scripts.cat 469 "$PROGNAME: $SCRIPTS not found.  Skipping.\n" $PROGNAME $SCRIPTS 
            fi
	    cat $TEMPFILE | more
        fi

        cp $TEMPFILE $FILE
	rm $TEMPFILE
     ;;

     "syslog")

	# Check for proper command line args
	if [ "$START" = "TRUE" -o "$FAILURES" = "TRUE" ]
	then
	    usage2
	fi

        # Set up string keyword for which to search
        if [ "$ERRORS" = "TRUE" ]
        then
            if [ "$STRINGS" = "" ]
            then
                STRINGS="Error|error|ERROR"
            else
                STRINGS="$STRINGS|Error|error|ERROR"
            fi
        fi

        if [ "$WARNINGS" = "TRUE" ]
        then
            if [ "$STRINGS" = "" ]
            then
                STRINGS="Warn|warn|WARN"
            else
                STRINGS="$STRINGS|Warn|warn|WARN"
            fi
        fi

	for process in $*
	do
            if [ "$STRINGS" = "" ]
            then
	        STRINGS="$process"
	    else
	        STRINGS="$STRINGS|$process"
	    fi
	done

	if [ "$DAYS" != "" ]
	then
	    COUNT=`expr $DAYS`
	    if [ $COUNT -gt 7 ]
	    then
    	        dspmsg scripts.cat 467 "Limited to 7 days maximum with -d option.\n"
	    	COUNT=7
            else
                 if [ $COUNT -lt 0 ]
                 then
                     usage2
                 fi
	    fi
#
# if user entered -d 0, we don't want to go thru the until loop once and
# generate the current date in the DATE_STRINGS. Otherwise, -d 0 will
# only get data from the current date and not using ALL data in the file
# as documented.
#
            if [ $COUNT -gt 0 ]
            then
	        until [ $COUNT -lt 0 ]
	        do
	    	    WHOLE_DATE=$(cld_getdate -d$COUNT)
	    	    DATE=$(echo "$WHOLE_DATE" | cut -c 5-10)
            	    if [ "$DATE_STRINGS" = "" ]
            	    then
	                DATE_STRINGS="($DATE)"
	    	    else
	                DATE_STRINGS="$DATE_STRINGS|($DATE)"
	    	    fi
                    COUNT=`expr $COUNT - 1`
	        done
            fi
	fi
	    
        if [ "$LOCALHOST" = "$HOSTNAME" ]
        then
            if [ -f $SYSLOG ]
            then
	        if [ "$STRINGS" = "" ]
            	then
	            if [ "$DATE_STRINGS" = "" ]
            	    then
            	    	cat $SYSLOG >> $TEMPFILE
		    	cat $TEMPFILE | more
		    else
            	    	cat $SYSLOG | egrep "$DATE_STRINGS" >> $TEMPFILE
		    	cat $TEMPFILE | more
		    fi
	    	else
	            if [ "$DATE_STRINGS" = "" ]
            	    then
        	    	cat $SYSLOG | egrep "$STRINGS" >> $TEMPFILE
		    	cat $TEMPFILE | more
		    else
        	    	cat $SYSLOG | egrep "$STRINGS" | egrep "$DATE_STRINGS" >> $TEMPFILE
		    	cat $TEMPFILE | more
		    fi
	    	fi
            else
    	        dspmsg scripts.cat 470 "$PROGNAME: $SYSLOG not found.\n" $PROGNAME $SYSLOG
            fi

	else
	    FOUND=""
	    FOUND=`cl_rsh $HOSTNAME find $SYSLOG_HDR -name $SYSLOG_TAIL -print`
	    if [ "$FOUND" != "" ]
	    then
		if [ "$STRINGS" = "" ]
		then
		    if [ "$DATE_STRINGS" = "" ]
                    then
			cl_rsh $HOSTNAME cat $SYSLOG >> $TEMPFILE
		        cat $TEMPFILE | more
		    else
		        cl_rsh $HOSTNAME cat $SYSLOG | egrep "$DATE_STRINGS" >> $TEMPFILE
		        cat $TEMPFILE | more
		    fi
		else
		    if [ "$DATE_STRINGS" = "" ]
                    then
                        cl_rsh $HOSTNAME cat $SYSLOG | egrep "$STRINGS" >> $TEMPFILE
                        cat $TEMPFILE | more
                    else
		        cl_rsh $HOSTNAME cat $SYSLOG | egrep "$STRINGS" | egrep "$DATE_STRINGS" >> $TEMPFILE
		        cat $TEMPFILE | more
		    fi
		fi
	    else
    	        dspmsg scripts.cat 470 "$PROGNAME: $SYSLOG not found.\n" $PROGNAME $SYSLOG
	    fi
        fi
        cp $TEMPFILE $FILE
	rm $TEMPFILE
     ;;


     *)
	usage3
     ;;
esac

exit $STATUS