| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598 | #!/bin/bash############################################################### check_unifi65## Version 2.0.01## Ein Plugin für Icinga / Nagios# zur Überwachung und Auswertung eines# Unifi-Controllers ab Version 6## Urheber: Daniel Wenzel# Kontakt: daniel@klenzel.de### Abhängigkeiten:# - 'jq'# - 'awk'# - 'curl'## Beispiel für Debian: apt-get install jq curl## ---------------------------------------------## 2.0.01 - Changelog:## 20220125# - Update für Unifi-Controller Version 6(.5)## 20170605# - Errorhandling beim Login an Unifi-Controller hinzugefügt# - Bugfixes###############################################################Funktionenfunction 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 verarbeitenwhile [ "$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  shiftdoneif [ -z $strHost ] || [ -z $strUsername ] || [ -z $strPassword ] || [ -z $strModus ] || [ -z $intWarning ] || [ -z $intCritical ]; then  showUsage  exit 1fiif ( [ "$strModus" == "Get-DeviceLoad" ] || [ "$strModus" == "Get-DeviceMem" ] || [ "$strModus" == "Get-DeviceUsers" ] || [ $strModus == "Get-DeviceGuests" ] ) && ( [ -z $strDevice ] ) ; then  showUsage  exit 1fiif [ -n $strDevice ] ; then  strDevice=${strDevice,,}fiif [ -z $intPort ] ; then  intPort=8443fiif [ -z $strSeite ] ; then  strSeite="all_sites"fi#################strJQBinary=$(which jq)if [ $? -ne 0 ] ; then  echo "Bitte den JSON-Prozessor ${strJQBinary} installieren"  exit 3fistrCurlBinary=$(which curl)if [ $? -ne 0 ] ; then  echo "Bitte das Paket curl installieren"  exit 3fistrAWKBinary=$(which awk)if [ $? -ne 0 ] ; then  echo "Bitte das Paket awk installieren"  exit 3fi#MetaintRandom=$(( $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 ControllerstrLoginStatus=$(${strCurlCommand} -X POST -H "Content-Type: application/json" --referer ${strBaseURL}/login --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure -d '{"username": "monitoring", "password": "Ye1tWJXLk5Av4Clx"}' ${strBaseURL}/api/login | ${strJQBinary} '.meta.rc')if [ "$strLoginStatus" != "\"ok\"" ] ; then  echo "Unknown: Anmeldung am Unifi-Controller fehlgeschlagen"  eval ${strLogOutAndCleanUp}  exit 2fi#Sites ermittelnarrSites=$(${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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi# [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  fifi#es wurde kein passender Modus gefundenecho "Unkown: Ungültige Angabe des Moduls"eval ${strLogOutAndCleanUp}exit 3########## Modi Ende ##########
 |