diff --git a/icinga-cli.sh b/icinga-cli.sh index 670c262fae27691ff56fa0a84bcb47e41805a64e..973b9df8b0f278a50a71d2372fc779b1a0aba352 100755 --- a/icinga-cli.sh +++ b/icinga-cli.sh @@ -21,12 +21,12 @@ # 2023-02-17 v0.14 ah add hostnamme into CFGSTORAGE # 2023-02-17 v0.15 ah check inc_getconfig.sh exists and hostname -f has a value # 2023-11-01 v0.16 ah generate json with "jo" -# 2023-11-02 v0.17 ah generate json with "jo" +# 2023-11-02 v0.17 ah fix line breaks of sent output, shell check fixes # ====================================================================== _product="ICINGA PASSIVE CLIENT" -_version="0.16" +_version="0.17" _license="GNU GPL 3.0" _copyright='(c) Institute for Medical Education * University of Bern' @@ -103,14 +103,6 @@ function _getFileSnapshot(){ # function loopChecks(){ - # TODO-MEMORY-CHECK - # echo ${MY_NAME} | egrep "^(kvm4|icinga)" - # echo ${MY_NAME} | egrep "^(monitortest)" - # if [ $? -ne 0 ]; then - # echo "HARD EXIT - DO NOT EXECUTE ANY CHECK ON $MY_NAME" - # exit 1 - # fi - local lockfile lockfile="${dir_data}/loop.pid" local snapShotStart @@ -129,6 +121,8 @@ function loopChecks(){ fi _log "---------- starting in a permanent loop" + icingaHostMustExist + echo "Serviceloop started $(date) - process id $$" > "${lockfile}" if [ $? -ne 0 ]; then _elog "ABORT: Lock file is not writable ${lockfile}." @@ -145,23 +139,21 @@ function loopChecks(){ while true; do # typeset -i local iSleep=$(($RANDOM%$sleeptime)) # sleep minimum is half of $sleeptime - typeset -i local iSleep=$(($RANDOM%$sleeptime/2+$sleeptime/2)) + local iSleep + typeset -i iSleep=$(($RANDOM%$sleeptime/2+$sleeptime/2)) _log "sleeping $iSleep sec ..." sleep $iSleep _log "______________________________________________________________________" _log "" - _getFileSnapshot>$snapShotCurrent - if [ $? -ne 0 ]; then + if ! _getFileSnapshot > "$snapShotCurrent"; then _elog "ABORT: Snapshot file is not writable ${snapShotCurrent}." _elog $( ls -l "${snapShotCurrent}" ) exit 1 fi - diff $snapShotStart $snapShotCurrent >/dev/null - if [ $? -ne 0 ]; then - _elog "ABORT: Files were updated / overwritten. The loop must be restarted.\n`diff $snapShotStart $snapShotCurrent`" + if ! diff "$snapShotStart" "$snapShotCurrent" >/dev/null; then + _elog "ABORT: Files were updated / overwritten. The loop must be restarted.\n$(diff $snapShotStart $snapShotCurrent)" exit 1 fi - icingaHostMustExist processAllChecks done } @@ -172,13 +164,15 @@ function loopChecks(){ # function processAllChecks(){ # loop over all defined checks - typeset -i local iChecksTotal + local iChecksTotal; typeset -i iChecksTotal + local iCounter; typeset -i iCounter + local iLoopStart; typeset -i iLoopStart + local iLoopEnd; typeset -i iLoopEnd + local iLoopTime; typeset -i iLoopTime + iChecksTotal=$(getChecks | wc -l) - typeset -i local iCounter iCounter=0 - _rc_all=0 - typeset -i local iLoopStart iLoopStart=$(_getUnixTs) _log "" @@ -191,48 +185,19 @@ function processAllChecks(){ _log "" done - typeset -i local iLoopEnd iLoopEnd=$(_getUnixTs) - typeset -i local iLoopTime iLoopTime=$iLoopEnd-$iLoopStart _log "------ loop done - needed $iLoopTime sec - rc=$_rc_all" } -# ...................................................................... -# -# parse a config file and set global vars: -# checkName -# checkCommand -# checkInterval -# param string full path of a config file -# -function UNUSED_parseCheckConfig(){ - local _myconfig="$1" - - if [ ! -r "$_myconfig" ]; then - _elog "ERROR: config file is not readable [$_myconfig]" - exit 1 - fi - - # EXAMPLE a config contains ... - # checkname=check_cronstatus - # command=check_cronstatus -param1 -param2 - # interval=60 - - checkName=$(cat $_myconfig | grep ^checkname= | cut -f 2 -d "=") - checkCommand=$(cat $_myconfig | grep ^command= | cut -f 2 -d "=") - checkInterval=$(cat $_myconfig | grep ^interval= | cut -f 2 -d "=") - -} - # actions for icinga host # param string action; "get" only function icingaHost(){ local _logPrefix="${MY_NAME} :: API |" local _apiRequest=objects/hosts/${MY_NAME} local _localCache=${dir_data}/host_${MY_NAME}_deployed-at-icinga.txt - typeset -i local _iRefreshCache=120 + local _iRefreshCache; typeset -i _iRefreshCache=120 local sAction=$1 @@ -305,20 +270,23 @@ function processCheck(){ local _myconfig=$1 local _force=$2 - typeset -i local iPipes - typeset -i local iCheckStart - iCheckStart=$(_getUnixTs) - - _parseCheckConfig "${_myconfig}" - local _logPrefix="${checkName} |" - _log "${_logPrefix} INFO: every ${checkInterval} sec: ${checkCommand}" + local iPipes; typeset -i iPipes + local iCheckStart; typeset -i iCheckStart local _outfile=${dir_data}/service__check__${checkName}__output.txt local _output local _FoundErrors local _response=${dir_data}/service__check__${checkName}__icinga_response.txt - typeset -i local _rc=0 + local _rc; typeset -i _rc=0 + local iTsEnd; typeset -i iTsEnd + local iTsStart; typeset -i iTsStart + + iCheckStart=$(_getUnixTs) + + _parseCheckConfig "${_myconfig}" + local _logPrefix="${checkName} |" + _log "${_logPrefix} INFO: every ${checkInterval} sec: ${checkCommand}" _initHttp @@ -328,7 +296,6 @@ function processCheck(){ _log "${_logPrefix} INFO: Never executed before" doRun=1 else - # typeset -i iAgeLastRun=$(($(date +%s) - $(date +%s -r "$_outfile"))) typeset -i iAgeLastRun iAgeLastRun=$(_getFileAge "$_outfile") _log "${_logPrefix} INFO: last run was $iAgeLastRun sec ago ... vs Interval = $checkInterval ... sleeptime = $sleeptime" @@ -355,37 +322,35 @@ function processCheck(){ # --- this executes the check plugin ... # _log "${_logPrefix} starting $myFullscript $myparams" - typeset -i local iTsStart=`date +%s` - # $myFullscript $myparams | tee $_outfile - eval $myFullscript $myparams > $_outfile + iTsStart=$(date +%s) + eval $myFullscript $myparams > "$_outfile" rc=$? if [ ! -w $_outfile ]; then _elog "${_logPrefix} ERROR: output file $_outfile is not writable." _elog "${_logPrefix} $( ls -ld ${dir_data} $_outfile )" exit 1 fi - test $rc -gt 0 && _FoundErrors+="Exitcode of check is $rc (greater zero).\n" - typeset -i local iTsEnd=`date +%s` - # outPerfdata=`grep '|' $_outfile | cut -f 2 -d '|'` - outPerfdata=`grep '|' $_outfile | rev | cut -f 1 -d '|' | rev` + test $rc -gt 0 && _FoundErrors+="Exitcode of check is greater zero ... " + iTsEnd=$(date +%s) + outPerfdata=$(grep '|' $_outfile | rev | cut -f 1 -d '|' | rev | grep "=") _output="$( cat "$_outfile" )" _echo _echo -------- check output: _echo "$_output" iPipes=$( grep -o "|" < "$_outfile" | wc -l ) - _echo "Pipe chars: $iPipes" + # _echo "Pipe chars: $iPipes" if [[ $iPipes -gt 1 ]]; then _elog "WARNING - pipes were found in plugin output" _elog "command was: $myFullscript $myparams" _log "${_logPrefix} WARNING - pipes were found in plugin output" fi - # sed -i "s#|#:#g" "$_outfile" _echo - # echo -------- extracted performance data: - # echo $outPerfdata - # echo + + # + # --- extract performance data: + # if ! test -n "$outPerfdata" && echo "$outPerfdata" | grep "=[0-9\.]*;[0-9\.]*;[0-9\.]*;[0-9\.]*;" >/dev/null; then _elog "WARNING - this does not look like performance data: $outPerfdata" _elog "command was: $myFullscript $myparams" @@ -395,29 +360,24 @@ function processCheck(){ _log "${_logPrefix} check command finished with returncode $rc" _rc=$_rc+$rc + # # --- send check result to Icinga # fields of the object # https://icinga.com/docs/icinga2/latest/doc/12-icinga2-api/#process-check-result - - - commandAsJson="$(jq -nR --arg data """${myFullscript} $myparams""" '$data')" - outAsJson="$( jq -nR --arg data """${_output}""" '$data')" - - local JSONPARAMS=" - check_source=${MY_NAME} - check_command=${commandAsJson} - exit_status=$rc - ttl=$checkInterval - execution_start=$iTsStart - execution_end=$iTsEnd - performance_data="\"${outPerfdata}\"" - plugin_output=$outAsJson - " - - data=$( eval jo -p -d. $JSONPARAMS ) - - slot="`_getName4Svcathost ${checkName} | sed 's# #%20#g'`" + # + data="$( jo \ + check_source=${MY_NAME} \ + check_command="""${myFullscript} $myparams""" \ + exit_status=$rc \ + ttl=$checkInterval \ + execution_start=$iTsStart \ + execution_end=$iTsEnd \ + performance_data="\"${outPerfdata}\"" \ + plugin_output="""${_output}""" + )" + + slot="$(_getName4Svcathost ${checkName} | sed 's# #%20#g')" _log "${_logPrefix} starting POST of data to monitoring server" _echo POST actions/process-check-result?service=${MY_NAME}!${slot} "$data" @@ -430,18 +390,20 @@ function processCheck(){ fi # --- check if data were sent successfully - # fgrep "HTTP/1.1 200" ${_response} >/dev/null - # _testHttpOk ${_response} >/dev/null - http.isOk >/dev/null - if [ $? -eq 0 ]; then + if http.isOk >/dev/null; then _log "${_logPrefix} rc=$rc - OK, response was sent to Icinga" else - _elog "${_logPrefix} rc=$rc - WARNING: $(http.getStatuscode) the check response was NOT sent to Icinga" + local httpcode; httpcode=$(http.getStatuscode) _rc=$_rc+1 - _FoundErrors+="Response was not sent to Icinga." + case $httpcode in + 404) _FoundErrors+="Icinga response $httpcode: host or service check was not created in Icinga yet ... " ;; + *) _FoundErrors+="Icinga response was not sent to Icinga: $httpcode ... " ;; + esac _echo - _echo For Debugging: - _echo "$data" + _elog "${_logPrefix} rc=$rc - $_FoundErrors" + # _echo + # _echo For Debugging: + # _echo "$data" _log "$data" fi @@ -454,11 +416,13 @@ function processCheck(){ # add current result to global returncode _rc_all=$_rc_all+$_rc - typeset -i local iCheckEnd=`_getUnixTs` - typeset -i local iCheckTime=$iCheckEnd-$iCheckStart + local iCheckEnd; typeset -i iCheckEnd + local iCheckTime; typeset -i iCheckTime + + iCheckEnd=$(_getUnixTs) + iCheckTime=$iCheckEnd-$iCheckStart _log "${_logPrefix} finished after $iCheckTime sec with returncode $_rc" - test $_rc -eq 0 || (_echo; _echo "ERRORS: [${checkName}] $_FoundErrors"; _echo; _echo) } # ---------------------------------------------------------------------- # help @@ -466,7 +430,7 @@ function processCheck(){ # show help text function showHelp(){ -self=`basename $0` +self=$(basename $0) cat <<EOH @@ -489,7 +453,7 @@ GENERAL PARAMETERS show this help and abort. --version or -v - show the version abd abort + show the version abd abort. It must be the 1st parameter. SERVICE ACTIONS @@ -538,11 +502,7 @@ DEBUGGING EOH } -function showVersion(){ - echo "$_license" - echo "$_copyright" - echo -} + # ---------------------------------------------------------------------- # # MAIN @@ -551,6 +511,7 @@ function showVersion(){ . "$( dirname $0 )/inc_functions.sh" +# show version without header if [ "$1" = "--version" ] || [ "$1" = "-v" ]; then echo "$( basename $0) v$_version" echo "$_license .. $_copyright" @@ -601,9 +562,6 @@ if [ -z "${dir_cfg}" ]; then exit 1 fi -icingaHostMustExist - - touch ${logfile} @@ -615,11 +573,6 @@ do showHelp exit 0 ;; - '--version' | '-v') - showVersion - exit 0 - ;; - '--list') getChecks