diff --git a/check_unifi45.sh b/check_unifi45.sh new file mode 100644 index 0000000..2f7f727 --- /dev/null +++ b/check_unifi45.sh @@ -0,0 +1,593 @@ +#!/bin/bash + +############################################################# +# +# check_unifi45 +# +# Version 1.0.01 +# +# Ein Plugin für Icinga / Nagios +# zur Überwachung und Auswertung eines +# Unifi-Controllers ab Version 4 +# +# Urheber: Daniel Wenzel +# Kontakt: daniel@klenzel.de +# +# +# Abhängigkeiten: +# - 'jq' +# - 'awk' +# - 'curl' +# +# Beispiel für Debian: apt-get install jq curl +# +# --------------------------------------------- +# +# 1.0.01 - Changelog: +# +# 20170605 +# - Errorhandling beim Login an Unifi-Controller hinzugefügt +# - Bugfixes +# +############################################################# + +#Funktionen +function showUsage { + echo " + Benutzung: $0 [Parameter] + -H Hostname / IP-Adresse + + -P Port (Standard = 8443) + + -u Benutzername + + -p Passwort + + -m Modul + 'Count-Users' => Zeigt im WLAN angemeldete Nutzer an + 'Active-Alarms' => Anzahl der unbestätigten Alarm-Meldungen + 'Offline-APs' => Anzahl der nicht verfügbaren Accesspoints + 'Has-Updates' => Anzahl der Accesspoints, für die ein Update zur Verfügung steht + 'Not-Adopted' => Anzahl der Accesspoints, die keiner Seite zugewiesen wurden + 'Get-DeviceLoad' => Benötigt Parameter -d => Zeigt die CPU-Auslastung eines Accesspoints an + 'Get-DeviceMem' => Benötigt Parameter -d => Zeigt die RAM-Belegung eines Accesspoints an + 'Get-DeviceUsers' => Benötigt Parameter -d => Zeigt die mit einem AP verbundenen Nutzer an + 'Get-DeviceGuests' => Benötigt Parameter -d => Zeigt die mit einem AP verbundenen Gäste an + 'Show-DevLastSeen' => Benötigt Parameter -d => Zeigt die Sekunden an, wann der AP zuletzt gesehen wurde + 'Show-Updates' => Zeigt, ob für den Unifi-Controller Aktualisierungen verfügbar sind + + -d (nur bei bestimmten Modulen notwendig) Angabe der MAC-Adresse eines abzufragenden Accesspoints + + -s Angabe der Seiten-ID (nicht Name!) (Standard = alle Seiten summiert) + + -w Angabe, unter welchem Wert der Status 'Warning' ausgegeben werden soll + 'Count-Users' => Warnung, wenn Anzahl Nutzer kleiner als der definierte Warning-Wert + Eingabe im Format: 'n' + 'Active-Alarms' => Ab dieser Anzahl von Alarmmeldungen wird der Status 'Warning' ausgeben + Eingabe im Format: 'n' + 'Offline-APs' => Ab dieser Anzahl nicht verfügbarer APs wird der Status 'Warning' ausgeben + Eingabe im Format: 'n' + 'Has-Updates' => Ab dieser Anzahl von gefundenen Upgrades wird der Status 'Warning' ausgeben + Eingabe im Format: 'n' + 'Not-Adopted' => Ab dieser Anzahl nicht zugewiesener Accesspoints wird der Status 'Warning' ausgeben + Eingabe im Format: 'n' + 'Get-DeviceLoad' => Ist die Load der letzten Minute größer als der angegebene Wert, wird der Status 'Warning' ausgeben + Eingabe im Format: 'n.nn' + 'Get-DeviceMem' => Ist die Auslastung des Arbeitsspeichers höher als der angegebene Wert, wird der Status 'Warning' ausgeben + Eingabe im Format: 'nn' (z.B. '80' für 80% Auslastung) + 'Get-DeviceUsers' => Gibt die maximale Anzahl der mit einem AP verbundenen Nutzer an, ab der der Status 'Warning' ausgegeben wird + Eingabe im Format: 'n' + 'Get-DeviceGuests' => Gibt die maximale Anzahl der mit einem AP verbundenen Gäste an, ab der der Status 'Warning' ausgegeben wird + Eingabe im Format: 'n' + 'Show-DevLastSeen' => Gibt die vergangenen Sekunden der letzten Sichtung an, ab die der Status 'Warning' ausgegeben wird + + -c Angabe, unter welchem Wert der Status 'Critical' ausgegeben werden soll + Erläuterungen analog zu 'Warning' + " +} + + +#Paramter verarbeiten +while [ "$1" != "" ]; do + case "$1" in + -H) shift; strHost="$1";; + -P) shift; intPort="$1";; + -u) shift; strUsername="$1";; + -p) shift; strPassword="$1";; + -m) shift; strModus="$1";; + -d) shift; strDevice="$1";; + -s) shift; strSeite="$1";; + -w) shift; intWarning="$1";; + -c) shift; intCritical="$1";; + *) showUsage; exit 3;; + esac + shift +done + +if [ -z $strHost ] || [ -z $strUsername ] || [ -z $strPassword ] || [ -z $strModus ] || [ -z $intWarning ] || [ -z $intCritical ]; then + showUsage + exit 1 +fi + +if ( [ $strModus == "Get-DeviceLoad" ] || [ $strModus == "Get-DeviceMem" ] || [ $strModus == "Get-DeviceUsers" ] || [ $strModus == "Get-DeviceGuests" ] ) && ( [ -z $strDevice ] ) ; then + showUsage + exit 1 +fi + +if [ -n $strDevice ] ; then + strDevice=${strDevice,,} +fi + +if [ -z $intPort ] ; then + intPort=8443 +fi + +if [ -z $strSeite ] ; then + strSeite="all_sites" +fi + + + +################# + +strJQBinary=$(which jq) +if [ $? -ne 0 ] ; then + echo "Bitte den JSON-Prozessor ${strJQBinary} installieren" + exit 3 +fi + +strCurlBinary=$(which curl) +if [ $? -ne 0 ] ; then + echo "Bitte das Paket curl installieren" + exit 3 +fi + +strAWKBinary=$(which awk) +if [ $? -ne 0 ] ; then + echo "Bitte das Paket awk installieren" + exit 3 +fi + + +#Meta +intRandom=$(( $RANDOM % 100000 )) +strBaseURL="https://${strHost}:${intPort}" +strCookieFile="/tmp/unifi_${intRandom}.cookie" +strCurlCommand="${strCurlBinary} --tlsv1 --silent --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure" +strLogOutAndCleanUp="${strCurlCommand} $strBaseURL/logout > /dev/null 2>&1 ; rm -f ${strCookieFile}" + +#Anmelden am Controller +strLoginStatus=$(${strCurlCommand} --data "{'username':'$strUsername', 'password':'$strPassword'}" $strBaseURL/api/login | ${strJQBinary} '.meta.rc') + +if [ $strLoginStatus != "\"ok\"" ] ; then + echo "Unknown: Anmeldung am Unifi-Controller fehlgeschlagen" + eval ${strLogOutAndCleanUp} + exit 2 +fi + + +#Sites ermitteln +arrSites=$(${strCurlCommand} $strBaseURL/api/self/sites | ${strJQBinary} -r '.data[].name') + + +########## Modi Beginn ########## + + + +# [Count-Users] Zeige angemeldete Nutzer im WLAN +# ------------------------------------------- +if [ $strModus == "Count-Users" ] ; then + + intAngemeldeteNutzer=0 + + if [ $strSeite == "all_sites" ] ; then + + for strSite in $arrSites; do + intAngemeldeteNutzer=$((intAngemeldeteNutzer + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/sta | ${strJQBinary} '.data[].mac' | wc -l))) + done + + else + intAngemeldeteNutzer=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/sta | ${strJQBinary} '.data[].mac' | wc -l) + fi + + if [ $intAngemeldeteNutzer -lt $intCritical ] ; then + echo "Critical: Angemeldete Nutzer (${intAngemeldeteNutzer}) kleiner als die minimale Menge (${intCritical}) | ActiveUsers=${intAngemeldeteNutzer}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intAngemeldeteNutzer -lt $intWarning ] ; then + echo "Warning: Angemeldete Nutzer (${intAngemeldeteNutzer}) kleiner als die minimale Menge (${intWarning}) | ActiveUsers=${intAngemeldeteNutzer}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es sind ${intAngemeldeteNutzer} Nutzer/Geräte im WLAN aktiv | ActiveUsers=${intAngemeldeteNutzer}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + +# [Active-Alarms] Anzahl der unbestätigten Alarm-Meldungen +# ------------------------------------------- +if [ $strModus == "Active-Alarms" ] ; then + + intAlarmMeldungen=0 + + if [ $strSeite == "all_sites" ] ; then + + for strSite in $arrSites; do + intAlarmMeldungen=$((intAlarmMeldungen + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/cnt/alarm?archived=false | ${strJQBinary} '.data[].count'))) + done + + else + intAlarmMeldungen=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/cnt/alarm?archived=false | ${strJQBinary} '.data[].count') + fi + + if [ $intAlarmMeldungen -ge $intCritical ] ; then + echo "Critical: ${intAlarmMeldungen} aktive Alarmmeldungen (> ${intCritical}) | ActiveAlarms=${intAlarmMeldungen}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intAlarmMeldungen -ge $intWarning ] ; then + echo "Warning: ${intAlarmMeldungen} aktive Alarmmeldungen (> ${intWarning}) | ActiveAlarms=${intAlarmMeldungen}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es liegen keine oder nur wenige unbestätigte Alarmmeldungen vor (Anzahl ${intAlarmMeldungen})| ActiveAlarms=${intAlarmMeldungen}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [Offline-APs] Anzahl der nicht verfügbaren Accesspoints +# ------------------------------------------- +if [ $strModus == "Offline-APs" ] ; then + + strOfflineAPs="" + intOfflineAPs=0 + intAvailAPs=0 + + if [ $strSeite == "all_sites" ] ; then + + for strSite in $arrSites; do + intAvailAPs=$(( intAvailAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l))) + strOfflineAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name') + intOfflineAPs=$(( intOfflineAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name' | wc -l))) + done + + strOfflineAPs=$(echo ${strOfflineAPs} | tr "\n" ", ") + + else + intAvailAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l) + intOfflineAPs=$(( intOfflineAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name' | wc -l))) + strOfflineAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name') + strOfflineAPs=$(echo ${strOfflineAPs} | tr "\n" ", ") + fi + + intOnlineAPs=$(( intAvailAPs - intOfflineAPs )) + + if [ $intOfflineAPs -ge $intCritical ] ; then + echo "Critical: ${intOfflineAPs} von ${intAvailAPs} Accesspoints nicht verfügbar (${strOfflineAPs}) | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intOfflineAPs -ge $intWarning ] ; then + echo "Warning: ${intOfflineAPs} von ${intAvailAPs} Accesspoints nicht verfügbar (${strOfflineAPs}) | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: ${intAvailAPs} von ${intAvailAPs} Accesspoints sind verfügbar | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [Has-Updates] Anzahl der Accesspoints, für die ein Update zur Verfügung steht +# ------------------------------------------- +if [ $strModus == "Has-Updates" ] ; then + + strUpgradableAPs="" + intUpgradableAPs=0 + intAvailAPs=0 + + if [ $strSeite == "all_sites" ] ; then + + for strSite in $arrSites; do + intAvailAPs=$(( intAvailAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l))) + strUpgradableAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name') + intUpgradableAPs=$(( intUpgradableAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name' | wc -l))) + done + strUpgradableAPs=$(echo ${strUpgradableAPs} | tr "\"" " ") + + else + intAvailAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l) + intUpgradableAPs=$(( intUpgradableAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name' | wc -l))) + strUpgradableAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name') + strUpgradableAPs=$(echo ${strUpgradableAPs} | tr "\n" ", ") + fi + + if [ $intUpgradableAPs -ge $intCritical ] ; then + echo "Critical: Für ${intUpgradableAPs} von ${intAvailAPs} Accesspoints ist ein Upgrade verfügbar (${strUpgradableAPs}) | UpgradableAPs=${intUpgradableAPs}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intUpgradableAPs -ge $intWarning ] ; then + echo "Warning: Für ${intUpgradableAPs} von ${intAvailAPs} Accesspoints ist ein Upgrade verfügbar (${strUpgradableAPs}) | UpgradableAPs=${intUpgradableAPs}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es sind keine oder nur wenige Upgrades für Accesspoints verfügbar | UpgradableAPs=${intUpgradableAPs}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [Not-Adopted] Anzahl der Accesspoints, die keiner Seite zugewiesen wurden +# ------------------------------------------- +if [ $strModus == "Not-Adopted" ] ; then + + strNotAdoptedAPs="" + intNotAdoptedAPs=0 + + if [ $strSeite == "all_sites" ] ; then + + for strSite in $arrSites; do + strNotAdoptedAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name') + intNotAdoptedAPs=$(( intNotAdoptedAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name' | wc -l))) + done + + strNotAdoptedAPs=$(echo ${strNotAdoptedAPs} | tr "\"" " ") + + else + intNotAdoptedAPs=$(( intNotAdoptedAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name' | wc -l))) + strNotAdoptedAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name') + strNotAdoptedAPs=$(echo ${strNotAdoptedAPs} | tr "\n" ", ") + fi + + if [ $intNotAdoptedAPs -ge $intCritical ] ; then + echo "Critical: Es wurden ${intNotAdoptedAPs} nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intNotAdoptedAPs -ge $intWarning ] ; then + echo "Warning: Es wurden ${intNotAdoptedAPs} nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es wurden keine nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [Get-DeviceUsers] Zeigt die mit einem AP verbundenen Nutzer an +# ------------------------------------------- +if [ $strModus == "Get-DeviceUsers" ] ; then + + intAPBenutzer=0 + + for strSite in $arrSites; do + intAPBenutzerTMP=0 + strAPBenutzerCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .[\"user-num_sta\"]'" + intAPBenutzerTMP=$(eval ${strAPBenutzerCMD}) + intAPBenutzer=$((intAPBenutzer + intAPBenutzerTMP )) + done + + if [ $intAPBenutzer -gt $intCritical ] ; then + echo "Critical: Angemeldete Nutzer am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPBenutzer} > ${intCritical}) | ActiveAPUsers=${intAPBenutzer}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intAPBenutzer -gt $intWarning ] ; then + echo "Warning: Angemeldete Nutzer am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPBenutzer} > ${intWarning}) | ActiveAPUsers=${intAPBenutzer}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es sind ${intAPBenutzer} Nutzer/Geräte am Accesspoint '${strDevice}' angemeldet | ActiveAPUsers=${intAPBenutzer}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + + +# [Get-DeviceGuests] Zeigt die mit einem AP verbundenen Nutzer an +# ------------------------------------------- +if [ $strModus == "Get-DeviceGuests" ] ; then + + intAPGaeste=0 + + for strSite in $arrSites; do + intAPGaesteTMP=0 + strAPGaesteCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .[\"guest-num_sta\"]'" + intAPGaesteTMP=$(eval ${strAPGaesteCMD}) + intAPGaeste=$((intAPGaeste + intAPGaesteTMP )) + done + + if [ $intAPGaeste -gt $intCritical ] ; then + echo "Critical: Angemeldete Gäste am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPGaeste} > ${intCritical}) | ActiveAPGuests=${intAPGaeste}" + eval ${strLogOutAndCleanUp} + exit 2 + elif [ $intAPGaeste -gt $intWarning ] ; then + echo "Warning: Angemeldete Gäste am Accesspoint '${strDevice}' kleiner als die maximale Menge (${intAPGaeste} > ${intWarning}) | ActiveAPGuests=${intAPGaeste}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Es sind ${intAPGaeste} Gäste am Accesspoint '${strDevice}' angemeldet | ActiveAPGuests=${intAPGaeste}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + +# [Get-DeviceLoad] Zeigt die CPU-Auslastung eines Accesspoints an +# ------------------------------------------- +if [ $strModus == "Get-DeviceLoad" ] ; then + + intLoad1Min=0 + intLoad5Min=0 + intLoad15Min=0 + for strSite in $arrSites; do + strAPLoad1MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_1' | tr -d '\"'" + strAPLoad5MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_5' | tr -d '\"'" + strAPLoad15MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_15' | tr -d '\"'" + intCheckAPLoad=$(eval ${strAPLoad1MinCMD}) + + if [ "x${intCheckAPLoad}" != "x" ] ; then + intLoad1Min=$(eval ${strAPLoad1MinCMD}) + intLoad5Min=$(eval ${strAPLoad5MinCMD}) + intLoad15Min=$(eval ${strAPLoad15MinCMD}) + fi + done + + if ( expr $intLoad1Min \> $intCritical >/dev/null ) ; then + echo "Critical: CPU-Auslastung des Accesspoints '${strDevice}' zu hoch (${intLoad1Min} > ${intCritical}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}" + eval ${strLogOutAndCleanUp} + exit 2 + elif ( expr $intLoad1Min \> $intWarning >/dev/null ) ; then + echo "Warning: CPU-Auslastung des Accesspoints '${strDevice}' zu hoch (${intLoad1Min} > ${intWarning}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: CPU-Auslastung des Accesspoints '${strDevice}' in Ordnung (${intLoad1Min}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [GGet-DeviceMem] Zeigt die RAM-Belegung eines Accesspoints an +# ------------------------------------------- +if [ $strModus == "Get-DeviceMem" ] ; then + + intAPMemTotal=0 + intAPMemUsed=0 + for strSite in $arrSites; do + strAPMemTotalCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .mem_total'" + strAPMemUsedCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .mem_used'" + intCheckAPMem=$(eval ${strAPMemTotalCMD}) + + if [ "x${intCheckAPMem}" != "x" ] ; then + intAPMemTotal=$(eval ${strAPMemTotalCMD}) + intAPMemUsed=$(eval ${strAPMemUsedCMD}) + fi + done + + intAPMemFree=$(( intAPMemTotal - intAPMemUsed )) + intAPMemUsedPercent=$(${strAWKBinary} "BEGIN {OFMT=\"%.2f\"; print $intAPMemUsed / $intAPMemTotal * 100;}") + + if ( expr $intAPMemUsedPercent \> $intCritical >/dev/null ) ; then + echo "Critical: Speicherauslastung des Accesspoints '${strDevice}' zu hoch (${intAPMemUsedPercent}% > ${intCritical}%) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B" + eval ${strLogOutAndCleanUp} + exit 2 + elif ( expr $intAPMemUsedPercent \> $intWarning >/dev/null ) ; then + echo "Warning: Speicherauslastung des Accesspoints '${strDevice}' zu hoch (${intAPMemUsedPercent}% > ${intWarning}%) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Speicherauslastung des Accesspoints '${strDevice}' in Ordnung (${intAPMemUsedPercent}% belegt) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + +# [Show-DevLastSeen] Zeigt die Sekunden an, wann der AP zuletzt gesehen wurde +# ------------------------------------------- +if [ $strModus == "Show-DevLastSeen" ] ; then + + intTimeStampNow=$(date +%s) + intDevLastSeen=0 + + for strSite in $arrSites; do + strDevLastSeenCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .last_seen'" + intCheckDevLastSeen=$(eval ${strDevLastSeenCMD}) + if [ $(echo "$intCheckDevLastSeen" | grep [[:digit:]]) ] ; then + intDevLastSeen=$intCheckDevLastSeen + fi + done + + intDevLastSeenSeconds=$(( intTimeStampNow - intDevLastSeen )) + + if ( expr $intDevLastSeenSeconds \> $intCritical >/dev/null ); then + echo "Critical: Letzter Kontakt zum Accesspoint '${strDevice}' zu lange her (vor ${intDevLastSeenSeconds} Sekunden) | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s" + eval ${strLogOutAndCleanUp} + exit 2 + elif ( expr $intDevLastSeenSeconds \> $intWarning >/dev/null ) ; then + echo "Warning: Letzter Kontakt zum Accesspoint '${strDevice}' zu lange her (vor ${intDevLastSeenSeconds} Sekunden) | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Letzter Kontakt zum Accesspoint '${strDevice}' vor ${intDevLastSeenSeconds} Sekunden | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + + +# [Show-Updates] Zeigt, ob für den Unifi-Controller Aktualisierungen verfügbar sind +# ------------------------------------------- +if [ $strModus == "Show-Updates" ] ; then + + boolControllerHasUpdates="false" + boolControllerHasUpdates="${strCurlCommand} $strBaseURL/api/s/default/stat/sysinfo | ${strJQBinary} '.data[].update_available'" + + if [ "z$boolControllerHasUpdates" == "xtrue" ] ; then + echo "Warning: Für den Unifi-Controller sind Updates verfügbar" + eval ${strLogOutAndCleanUp} + exit 1 + else + echo "OK: Für den Unifi-Controller sind keine Updates verfügbar" + eval ${strLogOutAndCleanUp} + exit 0 + fi + +fi + + + + + + +#es wurde kein passender Modus gefunden +echo "Unkown: Ungültige Angabe des Moduls" +eval ${strLogOutAndCleanUp} +exit 3 +########## Modi Ende ########## \ No newline at end of file