Compare commits

...

10 Commits

202
ENV

@ -1,54 +1,58 @@
#!/bin/bash
varName="servicedesc"
varDefault=""
myDelim="[ :-]"
myField=""
myHost=""
myService=""
myContact=""
doUpper=""
doVerbose=""
doNCPA=""
[ "$1" = "set.txt" ] && . set.txt 2> /dev/null
declare -A myVar
myVar[Name]="servicedesc"
myVar[myDelim]="[ :]"
declare -A myOptions
do_help() {
cat << HELP_EOF
This utility is designed to be called by the ARGx parameters of a Nagios configuration as one of the following:
\$\$(\$USER1\$/env [-n <var>] [-t <default>] [-f <field>] [-d <delim>] [-u] [-H|-S|-C <suffix>] [-v]
\$\$(\$USER1\$/env -N [-H suffix]
\$\$(\$USER1\$/env [-n <var>] [-T <var2>] [-t <default>] [-f|-F <field>] [-d <delim>] [-g|-s <val>] [-u|-l] [-v]
\$\$(\$USER1\$/env [-NT] [-NP] [-HT|-ST|-CT suffix]
-H|-S|-C will cause var to be of type NAGIOS__<HOST|SERVICE|CONTACT><var> and then continue with normal processing
Use --pre <prefix> and --post <postfix> to add prefix/postfix to the output string after all other processing has completed, but only if not blank.
Where:
var the name of a case-insensitive NAGIOS_variable (defaults to "servicedesc")
default a default value if \$NAGIOS_var\$ is blank (case sensitive)
field an awk-compatible field number (potentially to use with <delim>)
delim an awk-compatible field delimiter (defaults to space, dash, and colon)
field an awk-compatible field number (potentially to use with <delim>) (see below)
delim an awk-compatible field delimiter (defaults to space and colon)
-T if var returns blank, try vars as NAGIOS___HOSTvar2 before applying -t as a default
Example: svc="HTTP: 8080" and $0 -T HTTPPORT -t 80 -f -1 --num will return 8080 but "svc: HTTP" will return NAGIOS__HTTPPORT if exists, or 80 if not
-u Convert the output to uppercase
-l Convert the output to lowercase
-p Convert / to | (mainly for disk names in NCPA checks)
suffix Take var result and use the it to get NAGIOS__[HOST|SERVICE|CONTACT]<result><suffix>
-v Be verbose (only for debugging)
-N Look for NAGIOS__HOSTNCPA<suffix> (defaults to TOKEN)
Can do double lookup if -H is specified directly: -H TOKEN will find NAGIOS__HOSTNCPATOKEN=Level1 which then finds NAGIOS__HOSTLEVEL1TOKEN=Secret
Or -H PASS will find NAGIOS__HOSTNCPAPASS=Level2 which will then find NAGIOS__HOSTLEVEL2PASS=SuperSecret
-g Returns "val" if "val" appears anywhere in the value of var (basically, a grep) and then continues processing as normal
-s The result must match this value or else it will return blank
--num The result will have all non-numbers stripped from it
-NP Returns NAGIOS__HOSTNCPAPORT (implied default of 5693)
-N DEPRECATED version of -NT
-NT Look for NAGIOS__HOSTNCPA<suffix> (defaults to TOKEN)
Can do double lookup if -HT is specified directly: -HT TOKEN will find NAGIOS__HOSTNCPATOKEN=Level1 which then finds NAGIOS__HOSTLEVEL1TOKEN=Secret
Or -HT PASS will find NAGIOS__HOSTNCPAPASS=Level2 which will then find NAGIOS__HOSTLEVEL2PASS=SuperSecret
The value will always be trimmed of leading and/or trailing spaces/tabs.
If -f is used, then the result will be as if the request were as follows, unless the field starts with a negative, in which case it will read from the last word forward:
echo \$NAGIOS_var\$ | awk -F <delim> '{print $<field>}'
If -F is used, -d is forced to " " and the field number reflects is the first, second, or third of the last three fields
Ex: Disk check on / 80 90 With -F 1=/, -F 2=80, -F 3=90
Examples (service_description is assumed to be "MySQL Check: myDatabase performance"):
.../env Return: "MySQL Check: myDatabase performance"
.../env -n hostName Return: "localhost" (or whatever the name of the host is that ran the check)
.../env -n SERVICESTATE -t 0 Return: current state of the service (0, 1, 2) or 0 if the state is not defined
.../env -n servicedesc -f 2 Return: "Check" (watch out for defaults!)
.../env -n servicedesc -f 4 Return: "myDatabase" (watch out for defaults!)
.../env -n servicedesc -d : -f 2 Return: "myDatabase performance"
.../env -n servicedesc -d : -f -2 Return: "MySQL Check" (2nd field from right, split by :)*
.../env -n servicedesc -f -2 -H pass Return: the value of \$NAGIOS__HOSTNAGIOSXIPASS\$
$0 Return: "MySQL Check: myDatabase performance"
$0 -n hostName Return: "localhost" (or whatever the name of the host is that ran the check)
$0 -n SERVICESTATE -t 0 Return: current state of the service (0, 1, 2) or 0 if the state is not defined
$0 -n servicedesc -f 2 Return: "Check" (watch out for defaults!)
$0 -n servicedesc -f 4 Return: "myDatabase" (watch out for defaults!)
$0 -n servicedesc -d : -f 2 Return: "myDatabase performance"
$0 -n servicedesc -d : -f -2 Return: "MySQL Check" (2nd field from right, split by :)*
$0 -n servicedesc -f -2 -HT pass Return: the value of \$NAGIOS__HOSTNAGIOSXIPASS\$
see https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/macrolist.html for possible macro names.
*0 for this field will print the entire line
@ -59,69 +63,119 @@ HELP_EOF
while [ -n "$1" ]; do
case "$1" in
-h|--help) do_help;;
-n) varName="$2"; shift 2;;
-t) varDefault="$2"; shift 2;;
-d) myDelim="$2"; shift 2;;
-f) myField="$2"; shift 2;;
-H) myHost="$2"; shift 2;;
-S) myService="$2"; shift 2;;
-C) myContact="$2"; shift 2;;
-N) doNCPA="true"; shift 1;;
-u) doUpper="true"; shift 1;;
-v) doVerbose="true"; shift 1;;
-n) myVar[Name]="$2"; shift 2;;
-T) myVar[HostVar]="$2"; shift 2;;
-t) myVar[Default]="$2"; shift 2;;
-d) myVar[myDelim]="$2"; shift 2;;
-f) myVar[myField]="$2"; shift 2;;
-F) myVar[myDelim]=" "; myVar[myField]=$(($2-4)); shift 2;;
-HT) myVar[myHT]="$2"; shift 2;;
-ST) myVar[myST]="$2"; shift 2;;
-CT) myVar[myCT]="$2"; shift 2;;
-g) myVar[myGrep]="$2"; shift 2;;
-s) myVar[myString]="$2"; shift 2;;
--pre) myVar[myPrefix]="$2"; shift 2;;
--post) myVar[myPostfix]="$2"; shift 2;;
-N|-NT) myOptions[doNCPA]="true"; shift 1;;
--num) myOptions[doNumber]="true"; shift 1;;
-NP) myVar[Name]="NAGIOS__HOSTNCPAPORT"; myVar[Default]="5693"; shift 1;;
-H) myOptions[doHost]="true"; shift 1;;
-S) myOptions[doService]="true"; shift 1;;
-C) myOptions[doContact]="true"; shift 1;;
-p) myOptions[doPipe]="true"; shift 1;;
-u) myOptions[doUpper]="true"; shift 1;;
-l) myOptions[doLower]="true"; shift 1;;
-v) myOptions[doVerbose]="true"; shift 1;;
*) shift 1;;
esac
done
do_debug() {
[ -n "$doVerbose" ] && echo "DEBUG: $*"
[ -n "${myOptions[doVerbose]}" ] && echo "### DEBUG: $1"
}
do_lookup() {
var="$1"; def="$2"
val=${!var:-$def}
echo "$val"
}
if [ -n "$doNCPA" ]; then
do_debug "NCPA mode active. myHost=$myHost"
varName=`echo "NAGIOS__HOSTNCPA${myHost:-token}" | tr "a-z" "A-Z"`
do_output() {
val="$1"
[ -z "$val" ] && return
echo "${myVar[myPrefix]}${val}${myVar[myPostfix]}"
}
if [ -n "${myOptions[doNCPA]}" ]; then
do_debug "NCPA mode active. myVar[myHT]}=${myVar[myHT]}"
myVar[Name]=`echo "NAGIOS__HOSTNCPA${myVar[myHT]:-token}" | tr "a-z" "A-Z"`
else
do_debug "NCPA mode NOT active."
varName=`echo "NAGIOS_$varName" | tr "a-z" "A-Z"`
do_debug "myOptions[doHost]=${myOptions[doHost]} myOptions[doService]=${myOptions[doService]} myOptions[doContact]=${myOptions[doContact]}"
[ -n "${myOptions[doHost]}" ] && myVar[Name]="_HOST${myVar[Name]}"
[ -n "${myOptions[doService]}" ] && myVar[Name]="_SERVICE${myVar[Name]}"
[ -n "${myOptions[doContact]}" ] && myVar[Name]="_CONTACT${myVar[Name]}"
myVar[Name]=`echo "NAGIOS_${myVar[Name]}" | tr "a-z" "A-Z"`
fi
do_debug "1: Looking for ${myVar[Name]}..."
myVar[Value]=`do_lookup "${myVar[Name]}"`
do_debug "2: Got myVar[Value]=${myVar[Value]}"
# if -g was specified, then only return the portion of the result that matches
if [ -n "${myVar[myGrep]}" ]; then
do_debug "1: grepping ${myVar[Name]} for ${myVar[myGrep]}"
myVar[Value]=`echo "${myVar[Value]}" | egrep -o -- "${myVar[myGrep]}"`
fi
do_debug "Looking for $varName..."
varValue="${!varName}"
do_debug "Got varValue=$varValue"
if [ -n "$myField" ]; then
do_debug "myField=$myField"
if [ "$myField" -lt 0 ]; then
varValue=`echo "$varValue" | rev | awk -F "$myDelim" -v f="${myField:1}" '{print $f}' | rev`
if [ -n "${myVar[myField]}" ]; then
do_debug "myVar[myField]=${myVar[myField]}"
if [ "${myVar[myField]}" -lt 0 ]; then
myVar[Value]=`echo "${myVar[Value]}" | rev | awk -F "${myVar[myDelim]}" -v f="${myVar[myField]:1}" '{print $f}' | rev`
else
varValue=`echo "$varValue" | awk -F "$myDelim" -v f="$myField" '{print $(f)}'`
myVar[Value]=`echo "${myVar[Value]}" | awk -F "${myVar[myDelim]}" -v f="${myVar[myField]}" '{print $(f)}'`
fi
fi
varValue=`echo $varValue | sed -e "s/^[ \t]*//" -e "s/[ \t]*$//"`
do_debug "After processing varValue=$varValue"
myVar[Value]=`echo ${myVar[Value]} | sed -e "s/^[ \t]*//" -e "s/[ \t]*$//"`
do_debug "3: After processing myVar[Value]=${myVar[Value]}"
[ -n "${myOptions[doUpper]}" ] && myVar[Value]=`echo "${myVar[Value]}" | tr "a-z" "A-Z"`
[ -n "${myOptions[doLower]}" ] && myVar[Value]=`echo "${myVar[Value]}" | tr "A-Z" "a-z"`
[ -n "$doUpper" ] && varValue=`echo "$varValue" | tr "a-z" "A-Z"`
# Check for myHT
if [ -n "${myVar[myHT]}" ]; then
myVar[myHT]=`echo "NAGIOS__HOST${myVar[Value]}${myVar[myHT]}" | tr "a-z" "A-Z"`
do_debug "4: myVar[myHT]=${myVar[myHT]}"
myVar[Value]=`do_lookup ${myVar[myHT]}`
fi
# Check for myHost
if [ -n "$myHost" ]; then
myHost=`echo "NAGIOS__HOST${varValue}${myHost}" | tr "a-z" "A-Z"`
do_debug "myHost=$myHost"
varValue=${!myHost}
# Check for myST
if [ -n "${myVar[myST]}" ]; then
myVar[myST]=`echo "NAGIOS__SERVICE${myVar[Value]}${myVar[myST]}" | tr "a-z" "A-Z"`
do_debug "4: myVar[myST]}=${myVar[myST]}"
myVar[Value]=`do_lookup ${myVar[myST]}`
fi
# Check for myService
if [ -n "$myService" ]; then
myService=`echo "NAGIOS__SERVICE${varValue}${myService}" | tr "a-z" "A-Z"`
do_debug "myService=$myService"
varValue=${!myService}
# Check for myCT
if [ -n "${myVar[myCT]}" ]; then
myVar[myCT]=`echo "NAGIOS__CONTACT${myVar[Value]}${myVar[myCT]}" | tr "a-z" "A-Z"`
do_debug "4: myVar[myCT]=${myVar[myCT]}"
myVar[Value]=`do_lookup "${myVar[myCT]}"`
fi
# Check for myContact
if [ -n "$myContact" ]; then
myContact=`echo "NAGIOS__CONTACT${varValue}${myContact}" | tr "a-z" "A-Z"`
do_debug "myContact=$myContact"
varValue=${!myContact}
[ -n "${myVar[myString]}" -a "${myVar[myString]}" != "${myVar[Value]}" ] && myVar[Value]=""
[ -n "${myOptions[doNumber]}" ] && myVar[Value]=`echo ${myVar[Value]} | tr -d -c "0-9"`
[ -n "${myOptions[doPipe]}" ] && myVar[Value]=`echo ${myVar[Value]} | tr "/" "|"`
do_debug "About to check for -T options because myVar[Value]=${myVar[Value]}"
if [ -z "${myVar[Value]}" ]; then
do_debug "myVar[Value] is blank, checking for ${myVar[HostVar]}"
myVar[Value]=`do_lookup "NAGIOS__HOST${myVar[HostVar]}"`
do_debug "received ${myVar[Value]}"
[ -z "${myVar[Value]}" ] && myVar[Value]="${myVar[Default]}"
fi
[ -z "$varValue" ] && varValue="$varDefault"
echo "$varValue"
# Print the result
do_output "${myVar[Value]}"
exit 0

@ -1,11 +1,32 @@
binFiles=napi nlog get_profile.sh
gzFiles=napi.gz nlog.gz get_profile.sh.gz
libFiles=ENV
sync: bin lib gz
gz: $(gzFiles)
rsync -avu $^ ssd:eloyd/
bin: $(binFiles)
rsync -avu $^ root@192.168.1.19:/usr/local/bin/
rsync -avu $^ root@192.168.1.15:/usr/local/bin/
lib: $(libFiles)
rsync -avu $^ ssd:eloyd/
rsync -avu $(libFiles) root@192.168.1.19:/usr/local/nagios/libexec/
rsync -avu $(libFiles) root@192.168.1.15:/usr/local/nagios/libexec/
napi.gz: napi
gzip -f -9 --keep $<
chmod 644 $@
scp $@ ssd:eloyd/
nagios: napi
gzip -f -9 --keep nlog
rsync -avu nlog napi root@192.168.1.19:/usr/local/bin/
nlog.gz: nlog
gzip -f -9 --keep $<
chmod 644 $@
get_profile.sh.gz: get_profile.sh
gzip -f -9 --keep $<
chmod 644 $@
test: napi
@echo "### Checking HGM:"
@ -22,3 +43,39 @@ test: napi
@echo ""
@echo "Checking stats:"
./napi --stats
ENVtest1="MySQL Check: myDatabase performance"
ENVtest2="Disk Usage on / 80 90"
ENVtest3="One Two: Three - Four 5 6"
test-env: ENV
@echo "This should give $(ENVtest1)"
@NAGIOS_TEST=$(ENVtest1) ./ENV -n test
@echo ""
@echo "This should give / then 80 then 90 then |"
NAGIOS_TEST=$(ENVtest2) ./ENV -n test -F 1
NAGIOS_TEST=$(ENVtest2) ./ENV -n test -F 2
NAGIOS_TEST=$(ENVtest2) ./ENV -n test -F 3
NAGIOS_TEST=$(ENVtest2) ./ENV -n test -F 1 -p
@echo ""
@echo "This should give Check, then myDatabase, then myDatabase performance, then MySQL Check"
NAGIOS_TEST=$(ENVtest1) ./ENV -n test -f 2
NAGIOS_TEST=$(ENVtest1) ./ENV -n test -f 4
NAGIOS_TEST=$(ENVtest1) ./ENV -n test -d : -f 2
NAGIOS_TEST=$(ENVtest1) ./ENV -n test -d : -f -2
@echo ""
@echo "This should give Password"
NAGIOS_TEST=$(ENVtest1) NAGIOS__HOSTMYDATABASEPASS=Password ./ENV -n test -f -2 -HT pass
@echo ""
@echo "Test string is: $(ENVtest3)"
@echo "The first test should be the full test line, then blank line, then number 5, then FourToken twice"
NAGIOS_TEST=$(ENVtest3) ./ENV -n TeSt
NAGIOS_TEST=$(ENVtest3) ./ENV -n TEST -F 2 -S 5
NAGIOS_TEST=$(ENVtest3) ./ENV -n test -F 2 --num
NAGIOS_TEST=$(ENVtest3) NAGIOS__HOSTFOURTOKEN="FourToken" ./ENV -H -n fourtoken
NAGIOS_TEST=$(ENVtest3) NAGIOS__HOSTFOURTOKEN="FourToken" ./ENV -n test -F 1 -HT TOKEN
@echo ""
@echo "This should return Level2"
NAGIOS__HOSTNCPAPASS="Level2" ./ENV set.txt -n asdf -T NCPAPASS
@echo ""
@echo "This should return Balloons, 91, Red"
NAGIOS_TEST="HTTP -S 8099" ./ENV set.txt -n TEST -g "8.*" -d 0 -f 2 --pre "Balloons, " --post ", Red"

@ -0,0 +1,8 @@
/* Blue gradient */
#header {
background: rgb(0,0,255);
background: -moz-linear-gradient(90deg, rgba(0,0,255,1) 0%, rgba(0,0,0,1) 50%);
background: -webkit-linear-gradient(90deg, rgba(0,0,255,1) 0%, rgba(0,0,0,1) 50%);
background: linear-gradient(90deg, rgba(0,0,255,1) 0%, rgba(0,0,0,1) 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#0000ff",endColorstr="#000000",GradientType=1);
}

@ -0,0 +1,8 @@
/* Green gradient */
#header {
background: rgb(0,255,0);
background: -moz-linear-gradient(90deg, rgba(0,255,0,1) 0%, rgba(0,0,0,1) 50%);
background: -webkit-linear-gradient(90deg, rgba(0,255,0,1) 0%, rgba(0,0,0,1) 50%);
background: linear-gradient(90deg, rgba(0,255,0,1) 0%, rgba(0,0,0,1) 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00ff00",endColorstr="#000000",GradientType=1);
}

@ -0,0 +1,8 @@
/* Blue gradient */
#header {
background: rgb(255,0,0);
background: -moz-linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(0,0,0,1) 50%);
background: -webkit-linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(0,0,0,1) 50%);
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(0,0,0,1) 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff0000",endColorstr="#000000",GradientType=1);
}

43
napi

@ -23,6 +23,7 @@ myOptions[Options]=""
verbose="0"
tmpJSON=""
tmpQuick=""
tmpQuicker=""
# Different API commands return different JSON datasets. So let's make a lookup table that figures out where to start the data extracts
declare -A APIinfo
@ -44,7 +45,7 @@ APIinfo["objects/downtime"]=""
APIinfo["objects/contact"]=".contact[]"
APIinfo["objects/host"]=".host[]"
APIinfo["objects/service"]=".[]"
APIinfo["objects/hostgroup"]=".[]"
APIinfo["objects/hostgroup"]=".hostgroup[]"
APIinfo["objects/servicegroup"]=""
APIinfo["objects/contactgroup"]=".contactgroup[]"
APIinfo["objects/timeperiod"]=""
@ -108,6 +109,7 @@ print_helpopt() {
servicestatus|hoststatus:
c Show fields selected by -f as quoted CSV
C Same as C but also include the fields
X Same as C but use a more human-friendly set of names for the fields when printed
hostgroupmembers:
h Only show hosts (not the complete JSON data)
@ -124,9 +126,12 @@ HELPOPT_EOF
print_help() {
cat << HELP_EOF
--api < o*bjects | c*onfig | s*ystem >
-t|--object < hoststatus | servicestatus | logentries | statehistory | ...
--url XI_URL=<value>
--ack problem_has_been_acknowledged=<0,1>
--ace active_checks_enabled=<0,1>
--api < o*bjects | c*onfig | s*ystem >
-c|--command check_command=<value>
-cca current_check_attempt=<value>
--col column name=<type>:<value>
@ -172,8 +177,6 @@ print_help() {
--state 0, 1, or 2 (or other, I suppose)
--stype 0, 1 (SOFT or HARD)
--test Don't call the API, just show what would happen
-t|--object < hoststatus | servicestatus | logentries | statehistory | ...
--url XI_URL=<value>
-v|--verbose verbose=\$((\$verbose + 1))
[...] [...]=<...> NOTE: This will take anything listed as a Nagios configuration directive and search for it
@ -216,9 +219,9 @@ while [ -n "$1" ]; do
case "$1" in
--helpopt) print_helpopt;;
--help) print_help;;
--key) apikey="$2"; shift 2;;
--keyfile) apikeyfile="$2"; shift 2;;
--url) xi_url="$2"; shift 2;;
--key) APIKEY="$2"; shift 2;;
--keyfile) APIkeyFile="$2"; shift 2;;
--url) XI_URL="$2"; shift 2;;
-v|--verbose) verbose=$(($verbose + 1)); shift 1;;
--api) get_myAPI "$2"; shift 2;;
-t|--object) get_myAPIep "$2"; shift 2;;
@ -265,6 +268,10 @@ while [ -n "$1" ]; do
esac
done
# Fix things that are impossible to call
[ "${myOptions[API]}" = "config" -a "${myOptions[APIep]}" = "servicestatus" ] && myOptions[APIep]="service"
[ "${myOptions[API]}" = "config" -a "${myOptions[APIep]}" = "hoststatus" ] && myOptions[APIep]="host"
[ -n "${myOptions[Start]}" ] && myOptions[Start]=`convert_time "${myOptions[Start]}"`
[ -n "${myOptions[End]}" ] && myOptions[End]=`convert_time "${myOptions[End]}"`
# If we're doing status mode, then override a bunch of other options
@ -275,7 +282,7 @@ if [ -n "${myOptions[Status]}" ]; then
myOptions[Apply]=""
myOptions[Options]=""
myOptions[Quick]="true"
myOptions[Options]+="c,C,"
myOptions[Options]+="c,X,"
# If we did a bstatus, then we only want things that are bad
if [ -n "${myOptions[BStatus]}" ]; then
myDir[current_state]="[^0]"
@ -283,6 +290,7 @@ if [ -n "${myOptions[Status]}" ]; then
fi
if [ -n "$APIkeyFile" -a -r "$APIkeyFile" ]; then
do_debug 1 "Looking for url=$url in $APIkeyFile"
while read url key; do
if [ -z "$XI_URL" ]; then
XI_URL="$url"
@ -413,22 +421,24 @@ for thing in "${!myDir[@]}"; do
done
# endpoint specific things
case "${myOptions[APIep]}" in
hostgroupmembers)
case "${myOptions[API]}/${myOptions[APIep]}" in
objects/hostgroupmembers)
[[ ${myOptions[Options]} =~ "h," ]] && jqString+="| .members[] | .[] | .host_name"
[[ ${myOptions[Options]} =~ "o," ]] && jqString+="| .members[] | .[] | .host_object_id"
;;
servicegroupmembers)
objects/servicegroupmembers)
[[ ${myOptions[Options]} =~ "h," ]] && jqString+="| .members[] | .[] | .host_name"
[[ ${myOptions[Options]} =~ "o," ]] && jqString+="| .members[] | .[] | .service_object_id"
[[ ${myOptions[Options]} =~ "s," ]] && jqString+="| .members[] | .[] | .service_description"
tmpQuick=".service_object_id,.host_name,.service_description"
;;
hoststatus) tmpQuick=".host_name,.address,.current_state,.state_type,.last_check,.current_check_attempt,.normal_check_interval,.retry_check_interval,.max_check_attempts,.check_command";;
servicestatus) tmpQuick=".service_description,.host_name,.current_state,.state_type,.last_check,.current_check_attempt,.normal_check_interval,.retry_check_interval,.max_check_attempts,.output";;
contact) tmpQuick=".contact_name,.email_address,.host_notifications_enabled,.service_notifications_enabled,.is_active";;
command) ;;
statehistory) tmpQuick=".host_name,.service_description,.state_time,.state_change,.state,.state_type,.current_check_attempt,.max_check_attempts,.last_state,.last_hard_state,.output";;
objects/hoststatus) tmpQuick=".host_name,.address,.current_state,.state_type,.last_check,.current_check_attempt,.normal_check_interval,.retry_check_interval,.max_check_attempts,.check_command";
tmpQuicker="Host,Address,State,Type,Last Check,Attempt,Normal,Retry,Max,Command";;
objects/servicestatus) tmpQuick=".service_description,.host_name,.current_state,.state_type,.last_check,.current_check_attempt,.normal_check_interval,.retry_check_interval,.max_check_attempts,.output";
tmpQuicker="Service,Host,State,Type,Last Check,Attempt,Normal,Retry,Max,Output";;
objects/contact) tmpQuick=".contact_name,.email_address,.host_notifications_enabled,.service_notifications_enabled,.is_active";;
objects/statehistory) tmpQuick=".host_name,.service_description,.state_time,.state_change,.state,.state_type,.current_check_attempt,.max_check_attempts,.last_state,.last_hard_state,.output";;
config/host) tmpQuick=".host_name,.address,.check_command";;
esac
do_debug 1 "myOptions[Options]=${myOptions[Options]}"
@ -438,6 +448,7 @@ elif [ -n "${myOptions[Quick]}" ]; then
myOptions[Fields]="$tmpQuick"
fi
[[ ${myOptions[Options]} =~ "C," ]] && echo "${myOptions[Fields]}"
[[ ${myOptions[Options]} =~ "X," ]] && echo "$tmpQuicker" && printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -
do_debug 1 "myOptions[Fields]=${myOptions[Fields]}"
[ -n "${myOptions[Fields]}" ] && jq_get_fields
jqString+="${myOptions[MoreJQ]}"

108
nlog

@ -20,36 +20,47 @@ num=""
# These two need to be regexp wildcards to match everything when nothing is specified
aSource="(HOST|SERVICE)"
aType="(ALERT|NOTIFICATION|EVENT HANDLER)"
verbose=""
do_debug() {
[ -n "$verbose" ] && echo "### DEBUG: $*"
}
print_help() {
echo "Usage:"
echo " -d (debug mode)"
echo " -h|--host <host>"
echo " -s|--service <service>"
echo " --state <warning type (OK, WARNING, CRITICAL, UNKNOWN)> no default"
echo " --ok|--warn|--warning|--crit|--critical only print things that match"
echo " --hard only print hard stuff"
echo " --soft only print soft stuff"
echo " --sev|--severity <type (HARD, SOFT)>, default=all"
echo " -Q does a quick version of HARD CRITICAL"
echo " -n <#> selects the alert number, no default"
echo " --type <alert type (ALERT, EVENT, NOTIFICATION)>, default=all"
echo " --event set alert type to EVENT HANDLER"
echo " --src|--source <alert source (HOST, SERVICE)>, default=all"
echo " --from <from time>, default=today at midnight"
echo " --to <to time>, default=now"
echo " --notime don't convert timestamp to human time"
echo " -c|--constant) the equivalent of a tail -f on the Nagios log file"
echo " --file <file[s]>) scan <file[s]> instead of $file; use \"...\" if wildcards"
echo ""
echo "All input is evaluated as a case-insensitive regexp surrounded by wildcards."
echo "Time values can be in the following formats:"
echo " HH:MM[:SS] YYYY-MM-DD YYYY-MM-DD HH:MM[:SS]*"
echo "This program does not directly scan log files other than the current one. If you want"
echo "to scan older files, use the --file option. Note that this can be combined with the"
echo "--from and --to options, but keep in mind that file names are named based on the date they"
echo "were rotated, not the date of their contents."
echo "*Due to the awk pattern matching, dates before 2020-09-09 will produce empty output."
cat << HELP_EOF
Usage:
-d (debug mode)
-h|--host <host>
-s|--service <service>
--current show CURRENT HOST|SERVICE STATE information
--state <warning type (OK, WARNING, CRITICAL, UNKNOWN)> no default
--ok|--warn|--warning|--crit|--critical only print things that match
--up|--down|--un only print things that match (un=unreachable)
--hard|--sort only print things that match
--soft only print soft stuff
--sev|--severity <type (HARD, SOFT)>, default=all
-Q does a quick version of HARD CRITICAL
-n <#> selects the alert number (of max_retries), no default
--type <alert type (ALERT, EVENT, NOTIFICATION)>, default=all
--event set alert type to EVENT HANDLER
--src|--source <alert source (HOST, SERVICE)>, default=all
--from <from time>, default=today at midnight
--to <to time>, default=now
--notime don't convert timestamp to human time
-c|--constant) the equivalent of a tail -f on the Nagios log file
--file <file[s]>) scan <file[s]> instead of $files; use "..." if wildcards
-v turn on verbose/debug mode
All input is evaluated as a case-insensitive regexp surrounded by wildcards.
Time values can be in the following formats:
HH:MM[:SS] YYYY-MM-DD YYYY-MM-DD HH:MM[:SS]*
This program does not directly scan log files other than the current one. If you want
to scan older files, use the --file option. Note that this can be combined with the
--from and --to options, but keep in mind that file names are named based on the date they
were rotated, not the date of their contents.
Some options set others, so options earlier on the command line can be overwritten by later ones
*Due to the awk pattern matching, dates before 2020-09-09 will produce empty output.
HELP_EOF
exit;
}
@ -61,6 +72,10 @@ while [ -n "$1" ]; do
-s|--service) service="$2"; shift 2;;
--state) state="$2"; shift 2;;
--ok) state="OK"; shift 1;;
--up) state="UP"; shift ;;
--down) state="DOWN"; shift 1;;
--un) state="UNREACHABLE"; shift 1;;
--current) aSource="(HOST|SERVICE)"; aType="STATE"; shift 1;;
--warn|--warning) state="WARNING"; shift 1;;
--crit|--critical) state="CRITICAL"; shift 1;;
--hard) severity="HARD"; shift 1;;
@ -74,17 +89,19 @@ while [ -n "$1" ]; do
--from) fromTime="$2"; shift 2;;
--to) toTime="$2"; shift 2;;
--notime) noTime="true"; shift 1;;
-c|--constant) tailMode="-f"; shift 1;;
-c|--constant) tailMode="--follow=name"; shift 1;;
-v) verbose="true"; shift 1;;
*) shift 1;;
esac
done
# $1 $2 $3 $4 $5 $6
# [fromTime] aSource aType: host;service;state;severity;num;text
# $1 $2 $3 $4 $5
# [1690749418] HOST ALERT: Security Cameras; DOWN; SOFT; 1; CRITICAL - 192.168.1.88: rta nan, lost 100%
# [1690765779] SERVICE ALERT: DD-WRT; Port: vlan1 Bandwidth; CRITICAL; SOFT; 4; CRITICAL - Current BW in: 8.22Mbps Out: 1.58Mbps
# $1 $2 $3 $4 $5 $NF
# [1723708041] SERVICE ALERT: localhost; URL Status: frommyhive.com; CRITICAL; SOFT; 1; CRITICAL - Socket timeout
# [1723722735] HOST ALERT: Security Cameras; DOWN; SOFT; 1; CRITICAL - 192.168.1.88: rta nan, lost 100%
# (NF-3)(NF-2)(NF-1)
# [1723694400] CURRENT HOST STATE: localhost; UP;HARD;1;OK - 127.0.0.1 rta 0.067ms lost 0%
# (HOST|SERVICE) (DOWNTIME|FLAPPING)? (ALERT|NOTIFICATION)
timeSel=""
@ -99,13 +116,34 @@ fi
timeSub=""
[ -z "$noTime" ] && timeSub="&& sub (/^\[[0-9]{10}]/, strftime (\"%Y-%m-%d %H:%M:%S\", substr (\$1, 2, 10)), \$1)"
do_debug "host=$host"
do_debug "service=$service"
do_debug "awk=^\[[0-9]{10}] (GLOBAL |CURRENT )?$aSource (DOWNTIME |FLAPPING )?$aType: .*$host.*$service"
do_debug "state=$state"
do_debug "severity=$severity"
do_debug "num=$num"
# $(NF) = the text of the output
# $(NF-1) = check number (of max_retries)
# $(NF-2) = HARD/SOFT
# $(NF-3) = UP/DOWN/UNREACHABLE/OK/WARNING/CRITICAL/etc
tail -n +1 $tailMode $files | gawk -F\; "\
BEGIN {IGNORECASE=1} \
/^\[[0-9]{10}] (GLOBAL )?$aSource (DOWNTIME |FLAPPING )?$aType: .*$host.*;$service/ \
/^\[[0-9]{10}] (GLOBAL |CURRENT )?$aSource (DOWNTIME |FLAPPING )?$aType: .*$host.*$service/ \
&& \$(NF-3)~/$state/ \
&& \$(NF-2)~/$severity/ \
&& \$(NF-1)~/$num/ \
$timeSel \
$timeSub \
{printf \"%s: %s;%s;%s;%s;%s\n\", \$1, \$2, \$3, \$4, \$5, \$6}" |
sed -e "s/;OK;/;\x1b[32mOK\x1b[0m;/" -e "s/;CRITICAL;/;\x1b[31mCRITICAL\x1b[0m;/" -e "s/;WARNING;/;\x1b[33mWARNING\x1b[0m;/" -e "s/;HARD;/;\x1b[35mHARD\x1b[0m;/" -e "s/;SOFT;/;\x1b[36mSOFT\x1b[0m;/"
{
sub(/OK/, \"\x1b[32mOK\x1b[0m\", \$(NF-3))
sub(/WARNING/, \"\x1b[31mWARNING\x1b[0m\", \$(NF-3))
sub(/CRITICAL/, \"\x1b[33mCRITICAL\x1b[0m\", \$(NF-3))
sub(/UP/, \"\x1b[32mUP\x1b[0m\", \$(NF-3))
sub(/DOWN/, \"\x1b[33mDOWN\x1b[0m\", \$(NF-3))
sub(/UNREACHABLE/, \"\x1b[31mUNREACHABLE\x1b[0m\", \$(NF-3))
sub(/HARD/, \"\x1b[35mHARD\x1b[0m\", \$(NF-2))
sub(/SOFT/, \"\x1b[36mSOFT\x1b[0m\", \$(NF-2))
printf \"%s: %s;%s;%s;%s;%s\n\", \$1, \$2, \$3, \$4, \$5, \$6
}"

@ -0,0 +1,35 @@
#!/bin/sh
do_stop() {
service nagios stop
service npcd stop
service ndo2db stop
service mysqld stop
service postgresql stop
service httpd stop
service crond stop
}
do_start() {
service crond start
service httpd start
service postgresql start
service mysqld start
service ndo2db start
service npcd start
service nagios start
}
do_restart() {
do_stop
do_start
}
while [ -n "$1" ]; do
case "$1" in
--stop) do_stop; exit;;
--start) do_start; exit;;
--restart) do_restart; exit;;
*) echo "Usage: $0 (--stop | --start | --restart)"; exit;;
esac
done
Loading…
Cancel
Save