Icinga Ampel –
Wir bei axxeo haben schon seit geraumer Zeit Icinga im Einsatz. Da Icinga seit längerem eine API anbietet und wir gerne eine Icinga USB Tisch-Ampel zum Anzeigen verschiedener Statusinformationen verwenden wollten, haben wir ein Ampel-Script erstellt.
Dieses Ampel-Script läuft auf einem Beaglebone Black mit der Linux-Distribution Debian 9.
Voraussetzungen zum Betreiben und Ansteuern der USB-Ampel sind:
- libhidapi-dev
- python2.7-dev
- swig
- Clewarecontrol ZIP
Der erste Teil unseres Codes deklariert einige Variablen, spricht die API an und liefert den Status zurück. Hierbei werden Stati, welche “acknowledged” sind, ignoriert.
#! /bin/bash
# /usr/local/bin/ampel.sh
PATH=$PATH:/usr/local/bin
OK=0
WARNING=1
CRITICAL=2
UNKNOWN=3
FAILURE=4
declare -A COLORS=(
[$OK]="GREEN"
[$WARNING]="YELLOW"
[$CRITICAL]="RED"
[$UNKNOWN]="GREEN RED"
[$FAILURE]="GREEN YELLOW RED"
)
call_api()
{
# strip trailing 's'
what=${1:0:-1}
# Zugangsdaten müssen angepasst werden (default: icinga:icinga)
curl -k -s -u icinga:icinga \
-H 'Accept: application/json' \
-H 'X-HTTP-Method-Override: GET' \
-X POST 'https://icinga:5665/v1/objects/'${what}s \
-d '{"attrs": ["state"], "filter": "'$what'.state && !'$what'.acknowledgement && !'$what'.downtime_depth"}'
}
Der zweite Teil wertet alle Hosts aus und liefert am Ende den höchsten gefundenen Status als “return-code” zurück.
get_states()
{
local hosts services state rc=$OK
hosts="$(call_api hosts)"
[ ! "$hosts" ] && return $FAILURE
while read state; do
# host down = state 1
[ $state -eq $WARNING ] && return $CRITICAL || rc=$state
done < <(echo $hosts | jq -r '.results[].attrs.state')
services="$(call_api services)"
[ ! "$services" ] && return $FAILURE
while read state; do
case $state in
$WARNING) rc=$WARNING ;;
$CRITICAL) return $CRITICAL ;;
$UNKNOWN) [ $rc -eq $OK ] && rc=$UNKNOWN ;;
esac
done < <(echo $services | jq -r '.results[].attrs.state')
return $rc
}
Am Ende führen wir eine Endlosschleife aus, die unsere Ampel via “clewarecontrol” anspricht.
signal-cleware.sh init
signal-cleware.sh ${COLORS[$OK]}
rc_last=$OK
while true; do
get_states; rc=$?
if [ $rc -ne $rc_last ]; then
echo $(date '+%F %T') ${COLORS[$rc]}
signal-cleware.sh ${COLORS[$rc]}
rc_last=$rc
fi
sleep $SLEEP
done
# should never arrive here
exit 1
Zum Schluss noch das Programm, dass die Ampel selbst ansteuert.
#! /bin/bash
# /usr/local/bin/signal-cleware.sh
# usage: $0 [GREEN [YELLOW [RED]]] (case ins.)
declare -A SWITCHES=([GREEN]=2 [YELLOW]=1 [RED]=0)
signal()
{
local color=$1 state=$2
clewarecontrol -c 1 -d 904756 -as ${SWITCHES[$color]} $state >/dev/null 2>&1
}
init()
{
for color in ${!SWITCHES[*]}; do
signal $color 1
signal $color 0
done
}
if [ x$1 == xinit ]; then
init
else
for color in ${!SWITCHES[*]}; do
[[ ${*^^} =~ $color ]] && signal $color 1 || signal $color 0
done
fi
