#!/bin/bash

#
# Long story short: pokud bude v logu puppetu mezi poslednimi 10 "Finished catalog run" pokazde radka "/Stage.*(notice)",
# znamena to, ze pokazde puppet neco delal behem poslednich 10 behu, coz je spatne a meli bychom o tom vedet. Pravdepodobne by
# se to melo spojit s existujicim pluginem, tj. nejdriv zkontrolovat, ze tam neni syntakticka chyba a v pripade, ze neni, projit
# jestli se tam nedela neco furt do kola.
#

echo '<<<puppet>>>'

LOG=/var/log/syslog
LIMIT=10

if ! which puppet > /dev/null 2>&1 ; then
    exit 0
fi

if [ ! -e /var/lib/puppet/stop ]; then 
    i=0
    while read line
    do
	    #now=`date --date="now" "+%s"`
	    #year=$(date +%Y)
	    
	    # example:
	    # Jan 31 01:03:12 naiglos.grid.cesnet.cz puppet-agent[18386]: Applied catalog in 7.60 seconds
	    line_time=`date --date="$(echo "$line" | awk -F" " '{print $1" "$2" "$3}')" "+%s" 2>/dev/null`
		if [ -z $line_time ] ; then
			# example:
			#  2024-01-31T05:20:17.938398+01:00 pbs-m1 puppet-agent[1606756]: Applied catalog in 10.81 seconds
			line_time=`date --date="$(echo "$line" | awk -F" " '{print $1}')" "+%s" 2>/dev/null`
		fi

        echo "$line_time $line"

	    echo "$line" | grep -qE "Finished catalog|Applied catalog"
	    if [ "$?" -eq 0 ]
	    then
		    let i=i+1
		    if [ $i -eq $LIMIT ]
		    then
			    break
		    fi
	    fi

    done < <(tac `ls -t1 -d $LOG* | grep -v '\.\(gz\|bz2\)$'` | egrep 'Applied catalog|Finished catalog|/Stage')


    #pripadne chyby zaznamename a vypiseme
    FAILED=$(grep -e 'failed: [1-9]' /var/lib/puppet/state/last_run_summary.yaml 2>/dev/null | sed 's/^ *//;s/ *$//')
    MESSAGE=$(grep -e "^\s*message" /var/lib/puppet/state/last_run_report.yaml 2>/dev/null | grep -vE "Applied catalog in|Finished catalog run in" | sed 's/^ *//;s/ *$//')

    if [ ${#FAILED} -gt 0 ]
    then
        echo "FAILED: $FAILED"
    fi

    if [ ${#MESSAGE} -gt 0 ]
    then
        echo "MESSAGE: $MESSAGE"
    fi
else
    echo "WARNING: Puppet propagations stopped by reason: $(cat /var/lib/puppet/stop 2>/dev/null | tr '\n' ' ')"
fi


