#!/bin/bash ############################################################# # # check_omada # # Version 1.0 # # Ein Plugin fuer Icinga / Nagios # zur ueberwachung und Auswertung eines # Omada-Controllers ab Version 5 # # Urheber: Daniel Wenzel # Kontakt: daniel@klenzel.de # # # Abhaengigkeiten: # - 'jq' # - 'curl' # # Beispiel fuer Debian: apt-get install jq curl # # --------------------------------------------- # # 1.0 - Changelog: # # 20230312 # - Initiale Version # # ############################################################# #Funktionen function showUsage { echo " Benutzung: $0 [Parameter] -H Hostname / IP-Adresse des Omada Controllers -P Port (Standard = 443) des Omada-Controllers -u Benutzername -p Passwort -s Angabe der Seiten-ID (nicht Name!) -m Modul 'Count-EAPUsers' => Zeigt auf dem Accesspoint angemeldete Nutzer an 'Get-DeviceLoad' => Gibt CPU-Auslastung aus 'Get-DeviceMem' => Gibt Arbeitsspeicher-Auslastung aus 'Get-PortStat' => Zeigt Traffic-Statistiken eines Ports 'Show-Updates' => Zeigt, ob fuer den Unifi-Controller Aktualisierungen verfuegbar sind 'Show-Connection' => Prueft, ob ein Geraet am Omada-Controller angemeldet ist 'Show-PoEStatus' => Zeigt die verbleibende PoE-Kapazitaet an -i (nur bei Get-PortStat notwendig) Angabe des abzufragenden Ports -d Angabe des abzufragenden Geraets -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 verfuegbarer 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' fuer 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 Gaeste 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 Erlaeuterungen 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";; -i) shift; strInterface="$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 $strDevice ] || [ -z $strSeite ]; then showUsage exit 1 fi #if ( [ "$strModus" == "Get-PortStat" ] ) && ( [ -z $strInterface ] ) ; then # showUsage # exit 1 #fi #if ( [ "$strModus" == "Get-DeviceLoad" ] || [ "$strModus" == "Get-DeviceMem" ] || [ "$strModus" == "Count-EAPUsers" ] || [ "$strModus" == "Show-PoEStatus" ] ) && ( [ -z $intWarning ] || [ -z $intCritical ] ) ; then # showUsage # exit 1 #fi strDevice=$(echo ${strDevice^^}) if [ -z $intPort ] ; then intPort=443 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 #Meta intRandom=$(( $RANDOM % 100000 )) strBaseURL="https://${strHost}:${intPort}" strCookieFile="/tmp/omada_${intRandom}.cookie" strCurlCommand="${strCurlBinary} --silent --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure" #strLogOutAndCleanUp="${strCurlCommand} $strBaseURL/logout > /dev/null 2>&1 ; rm -f ${strCookieFile}" strLogOutAndCleanUp="rm -f ${strCookieFile}" #Anmelden am Controller intControllerID=$(${strCurlCommand} "${strBaseURL}/api/info" | jq -r .result.omadacId) intToken=$(${strCurlCommand} -X POST -H "Content-Type: application/json" "${strBaseURL}/${intControllerID}/api/v2/login" -d '{"username": "'"${strUsername}"'", "password": "'"${strPassword}"'"}' | ${strJQBinary} -r .result.token) strLoginStatus=$(${strCurlCommand} -X GET -H "Content-Type: application/json" -H "Csrf-Token: ${intToken}" "${strBaseURL}/${intControllerID}/api/v2/loginStatus" | ${strJQBinary} -r .msg) if [ "$strLoginStatus" != "Success." ] ; then echo "Unknown: Anmeldung am Omada-Controller fehlgeschlagen" eval ${strLogOutAndCleanUp} exit 2 fi ########## Modi Beginn ########## # [Count-EAPUsers] Zeigt auf dem Accesspoint angemeldete Nutzer an # ------------------------------------------- if [ "$strModus" == "Count-EAPUsers" ] ; then #intAngemeldeteNutzer=$(${strCurlCommand} -X GET -H "Content-Type: application/json" -H "Csrf-Token: ${intToken}" "${strBaseURL}/${intControllerID}/api/v2/sites/${strSeite}/devices" | jq '.result | map(. | select(.name=="'${strDevice}'")) | . [] .clientNum') strDeviceMAC=$(${strCurlCommand} -X GET -H "Content-Type: application/json" -H "Csrf-Token: ${intToken}" "${strBaseURL}/${intControllerID}/api/v2/devices?searchKey=${strDevice}" | ${strJQBinary} -r .result.devices[0].mac) curl --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure -X GET -H "Content-Type: application/json" -H "Csrf-Token: ${intToken}" "${strBaseURL}/${intControllerID}/api/v2/sites/${strSeite}/eaps/${strDeviceMAC}" exit 0 fi # [Get-PortStat] Zeigt Statistiken eines Switchports an # ------------------------------------------- if [ "$strModus" == "Get-PortStat" ] ; then curl --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure -X GET -H "Content-Type: application/json" -H "Csrf-Token: ${intToken}" "${strBaseURL}/${intControllerID}/api/v2/sites/${strSeite}/insight/switch/port/overview?currentPage=1¤tPageSize=100&searchKey=${strDevice}" exit 0 fi #es wurde kein passender Modus gefunden echo "Unkown: Ungueltige Angabe des Moduls" eval ${strLogOutAndCleanUp} exit 3 ########## Modi Ende ##########