check_unifi65.sh 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. #!/bin/bash
  2. #############################################################
  3. #
  4. # check_unifi65
  5. #
  6. # Version 2.0.01
  7. #
  8. # Ein Plugin für Icinga / Nagios
  9. # zur Überwachung und Auswertung eines
  10. # Unifi-Controllers ab Version 6
  11. #
  12. # Urheber: Daniel Wenzel
  13. # Kontakt: daniel@klenzel.de
  14. #
  15. #
  16. # Abhängigkeiten:
  17. # - 'jq'
  18. # - 'awk'
  19. # - 'curl'
  20. #
  21. # Beispiel für Debian: apt-get install jq curl
  22. #
  23. # ---------------------------------------------
  24. #
  25. # 2.0.01 - Changelog:
  26. #
  27. # 20220125
  28. # - Update für Unifi-Controller Version 6(.5)
  29. #
  30. # 20170605
  31. # - Errorhandling beim Login an Unifi-Controller hinzugefügt
  32. # - Bugfixes
  33. #
  34. #############################################################
  35. #Funktionen
  36. function showUsage {
  37. echo "
  38. Benutzung: $0 [Parameter]
  39. -H Hostname / IP-Adresse
  40. -P Port (Standard = 8443)
  41. -u Benutzername
  42. -p Passwort
  43. -m Modul
  44. 'Count-Users' => Zeigt im WLAN angemeldete Nutzer an
  45. 'Active-Alarms' => Anzahl der unbestätigten Alarm-Meldungen
  46. 'Offline-APs' => Anzahl der nicht verfügbaren Accesspoints
  47. 'Has-Updates' => Anzahl der Accesspoints, für die ein Update zur Verfügung steht
  48. 'Not-Adopted' => Anzahl der Accesspoints, die keiner Seite zugewiesen wurden
  49. 'Get-DeviceLoad' => Benötigt Parameter -d => Zeigt die CPU-Auslastung eines Accesspoints an
  50. 'Get-DeviceMem' => Benötigt Parameter -d => Zeigt die RAM-Belegung eines Accesspoints an
  51. 'Get-DeviceUsers' => Benötigt Parameter -d => Zeigt die mit einem AP verbundenen Nutzer an
  52. 'Get-DeviceGuests' => Benötigt Parameter -d => Zeigt die mit einem AP verbundenen Gäste an
  53. 'Show-DevLastSeen' => Benötigt Parameter -d => Zeigt die Sekunden an, wann der AP zuletzt gesehen wurde
  54. 'Show-Updates' => Zeigt, ob für den Unifi-Controller Aktualisierungen verfügbar sind
  55. -d (nur bei bestimmten Modulen notwendig) Angabe der MAC-Adresse eines abzufragenden Accesspoints
  56. -s Angabe der Seiten-ID (nicht Name!) (Standard = alle Seiten summiert)
  57. -w Angabe, unter welchem Wert der Status 'Warning' ausgegeben werden soll
  58. 'Count-Users' => Warnung, wenn Anzahl Nutzer kleiner als der definierte Warning-Wert
  59. Eingabe im Format: 'n'
  60. 'Active-Alarms' => Ab dieser Anzahl von Alarmmeldungen wird der Status 'Warning' ausgeben
  61. Eingabe im Format: 'n'
  62. 'Offline-APs' => Ab dieser Anzahl nicht verfügbarer APs wird der Status 'Warning' ausgeben
  63. Eingabe im Format: 'n'
  64. 'Has-Updates' => Ab dieser Anzahl von gefundenen Upgrades wird der Status 'Warning' ausgeben
  65. Eingabe im Format: 'n'
  66. 'Not-Adopted' => Ab dieser Anzahl nicht zugewiesener Accesspoints wird der Status 'Warning' ausgeben
  67. Eingabe im Format: 'n'
  68. 'Get-DeviceLoad' => Ist die Load der letzten Minute größer als der angegebene Wert, wird der Status 'Warning' ausgeben
  69. Eingabe im Format: 'n.nn'
  70. 'Get-DeviceMem' => Ist die Auslastung des Arbeitsspeichers höher als der angegebene Wert, wird der Status 'Warning' ausgeben
  71. Eingabe im Format: 'nn' (z.B. '80' für 80% Auslastung)
  72. 'Get-DeviceUsers' => Gibt die maximale Anzahl der mit einem AP verbundenen Nutzer an, ab der der Status 'Warning' ausgegeben wird
  73. Eingabe im Format: 'n'
  74. 'Get-DeviceGuests' => Gibt die maximale Anzahl der mit einem AP verbundenen Gäste an, ab der der Status 'Warning' ausgegeben wird
  75. Eingabe im Format: 'n'
  76. 'Show-DevLastSeen' => Gibt die vergangenen Sekunden der letzten Sichtung an, ab die der Status 'Warning' ausgegeben wird
  77. -c Angabe, unter welchem Wert der Status 'Critical' ausgegeben werden soll
  78. Erläuterungen analog zu 'Warning'
  79. "
  80. }
  81. #Paramter verarbeiten
  82. while [ "$1" != "" ]; do
  83. case "$1" in
  84. -H) shift; strHost="$1";;
  85. -P) shift; intPort="$1";;
  86. -u) shift; strUsername="$1";;
  87. -p) shift; strPassword="$1";;
  88. -m) shift; strModus="$1";;
  89. -d) shift; strDevice="$1";;
  90. -s) shift; strSeite="$1";;
  91. -w) shift; intWarning="$1";;
  92. -c) shift; intCritical="$1";;
  93. *) showUsage; exit 3;;
  94. esac
  95. shift
  96. done
  97. if [ -z $strHost ] || [ -z $strUsername ] || [ -z $strPassword ] || [ -z $strModus ] || [ -z $intWarning ] || [ -z $intCritical ]; then
  98. showUsage
  99. exit 1
  100. fi
  101. if ( [ "$strModus" == "Get-DeviceLoad" ] || [ "$strModus" == "Get-DeviceMem" ] || [ "$strModus" == "Get-DeviceUsers" ] || [ $strModus == "Get-DeviceGuests" ] ) && ( [ -z $strDevice ] ) ; then
  102. showUsage
  103. exit 1
  104. fi
  105. if [ -n $strDevice ] ; then
  106. strDevice=${strDevice,,}
  107. fi
  108. if [ -z $intPort ] ; then
  109. intPort=8443
  110. fi
  111. if [ -z $strSeite ] ; then
  112. strSeite="all_sites"
  113. fi
  114. #################
  115. strJQBinary=$(which jq)
  116. if [ $? -ne 0 ] ; then
  117. echo "Bitte den JSON-Prozessor ${strJQBinary} installieren"
  118. exit 3
  119. fi
  120. strCurlBinary=$(which curl)
  121. if [ $? -ne 0 ] ; then
  122. echo "Bitte das Paket curl installieren"
  123. exit 3
  124. fi
  125. strAWKBinary=$(which awk)
  126. if [ $? -ne 0 ] ; then
  127. echo "Bitte das Paket awk installieren"
  128. exit 3
  129. fi
  130. #Meta
  131. intRandom=$(( $RANDOM % 100000 ))
  132. strBaseURL="https://${strHost}:${intPort}"
  133. strCookieFile="/tmp/unifi_${intRandom}.cookie"
  134. strCurlCommand="${strCurlBinary} --tlsv1 --silent --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure"
  135. strLogOutAndCleanUp="${strCurlCommand} $strBaseURL/logout > /dev/null 2>&1 ; rm -f ${strCookieFile}"
  136. #Anmelden am Controller
  137. strLoginStatus=$(${strCurlCommand} -X POST -H "Content-Type: application/json" --referer ${strBaseURL}/login --cookie ${strCookieFile} --cookie-jar ${strCookieFile} --insecure -d "{\"username\": \"$strUsername\", \"password\": \"$strPassword\"}" ${strBaseURL}/api/login | ${strJQBinary} '.meta.rc')
  138. if [ "$strLoginStatus" != "\"ok\"" ] ; then
  139. echo "Unknown: Anmeldung am Unifi-Controller fehlgeschlagen"
  140. eval ${strLogOutAndCleanUp}
  141. exit 2
  142. fi
  143. #Sites ermitteln
  144. arrSites=$(${strCurlCommand} $strBaseURL/api/self/sites | ${strJQBinary} -r '.data[].name')
  145. ########## Modi Beginn ##########
  146. # [Count-Users] Zeige angemeldete Nutzer im WLAN
  147. # -------------------------------------------
  148. if [ "$strModus" == "Count-Users" ] ; then
  149. intAngemeldeteNutzer=0
  150. if [ "$strSeite" == "all_sites" ] ; then
  151. for strSite in $arrSites; do
  152. intAngemeldeteNutzer=$((intAngemeldeteNutzer + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/sta | ${strJQBinary} '.data[].mac' | wc -l)))
  153. done
  154. else
  155. intAngemeldeteNutzer=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/sta | ${strJQBinary} '.data[].mac' | wc -l)
  156. fi
  157. if [ $intAngemeldeteNutzer -lt $intCritical ] ; then
  158. echo "Critical: Angemeldete Nutzer (${intAngemeldeteNutzer}) kleiner als die minimale Menge (${intCritical}) | ActiveUsers=${intAngemeldeteNutzer}"
  159. eval ${strLogOutAndCleanUp}
  160. exit 2
  161. elif [ $intAngemeldeteNutzer -lt $intWarning ] ; then
  162. echo "Warning: Angemeldete Nutzer (${intAngemeldeteNutzer}) kleiner als die minimale Menge (${intWarning}) | ActiveUsers=${intAngemeldeteNutzer}"
  163. eval ${strLogOutAndCleanUp}
  164. exit 1
  165. else
  166. echo "OK: Es sind ${intAngemeldeteNutzer} Nutzer/Geräte im WLAN aktiv | ActiveUsers=${intAngemeldeteNutzer}"
  167. eval ${strLogOutAndCleanUp}
  168. exit 0
  169. fi
  170. fi
  171. # [Active-Alarms] Anzahl der unbestätigten Alarm-Meldungen
  172. # -------------------------------------------
  173. if [ "$strModus" == "Active-Alarms" ] ; then
  174. intAlarmMeldungen=0
  175. if [ "$strSeite" == "all_sites" ] ; then
  176. for strSite in $arrSites; do
  177. intAlarmMeldungen=$((intAlarmMeldungen + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/cnt/alarm?archived=false | ${strJQBinary} '.data[].count')))
  178. done
  179. else
  180. intAlarmMeldungen=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/cnt/alarm?archived=false | ${strJQBinary} '.data[].count')
  181. fi
  182. if [ $intAlarmMeldungen -ge $intCritical ] ; then
  183. echo "Critical: ${intAlarmMeldungen} aktive Alarmmeldungen (> ${intCritical}) | ActiveAlarms=${intAlarmMeldungen}"
  184. eval ${strLogOutAndCleanUp}
  185. exit 2
  186. elif [ $intAlarmMeldungen -ge $intWarning ] ; then
  187. echo "Warning: ${intAlarmMeldungen} aktive Alarmmeldungen (> ${intWarning}) | ActiveAlarms=${intAlarmMeldungen}"
  188. eval ${strLogOutAndCleanUp}
  189. exit 1
  190. else
  191. echo "OK: Es liegen keine oder nur wenige unbestätigte Alarmmeldungen vor (Anzahl ${intAlarmMeldungen})| ActiveAlarms=${intAlarmMeldungen}"
  192. eval ${strLogOutAndCleanUp}
  193. exit 0
  194. fi
  195. fi
  196. # [Offline-APs] Anzahl der nicht verfügbaren Accesspoints
  197. # -------------------------------------------
  198. if [ "$strModus" == "Offline-APs" ] ; then
  199. strOfflineAPs=""
  200. intOfflineAPs=0
  201. intAvailAPs=0
  202. if [ "$strSeite" == "all_sites" ] ; then
  203. for strSite in $arrSites; do
  204. intAvailAPs=$(( intAvailAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l)))
  205. strOfflineAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name')
  206. intOfflineAPs=$(( intOfflineAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name' | wc -l)))
  207. done
  208. strOfflineAPs=$(echo ${strOfflineAPs} | tr "\n" ", ")
  209. else
  210. intAvailAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l)
  211. intOfflineAPs=$(( intOfflineAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name' | wc -l)))
  212. strOfflineAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select(.state!=1) | .name')
  213. strOfflineAPs=$(echo ${strOfflineAPs} | tr "\n" ", ")
  214. fi
  215. intOnlineAPs=$(( intAvailAPs - intOfflineAPs ))
  216. if [ $intOfflineAPs -ge $intCritical ] ; then
  217. echo "Critical: ${intOfflineAPs} von ${intAvailAPs} Accesspoints nicht verfügbar (${strOfflineAPs}) | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}"
  218. eval ${strLogOutAndCleanUp}
  219. exit 2
  220. elif [ $intOfflineAPs -ge $intWarning ] ; then
  221. echo "Warning: ${intOfflineAPs} von ${intAvailAPs} Accesspoints nicht verfügbar (${strOfflineAPs}) | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}"
  222. eval ${strLogOutAndCleanUp}
  223. exit 1
  224. else
  225. echo "OK: ${intAvailAPs} von ${intAvailAPs} Accesspoints sind verfügbar | OnlineAPs=${intOnlineAPs} OfflineAPs=${intOfflineAPs}"
  226. eval ${strLogOutAndCleanUp}
  227. exit 0
  228. fi
  229. fi
  230. # [Has-Updates] Anzahl der Accesspoints, für die ein Update zur Verfügung steht
  231. # -------------------------------------------
  232. if [ "$strModus" == "Has-Updates" ] ; then
  233. strUpgradableAPs=""
  234. intUpgradableAPs=0
  235. intAvailAPs=0
  236. if [ "$strSeite" == "all_sites" ] ; then
  237. for strSite in $arrSites; do
  238. intAvailAPs=$(( intAvailAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l)))
  239. strUpgradableAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name')
  240. intUpgradableAPs=$(( intUpgradableAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name' | wc -l)))
  241. done
  242. strUpgradableAPs=$(echo ${strUpgradableAPs} | tr "\"" " ")
  243. else
  244. intAvailAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | .name' | wc -l)
  245. intUpgradableAPs=$(( intUpgradableAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name' | wc -l)))
  246. strUpgradableAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.upgradable==true) | .name')
  247. strUpgradableAPs=$(echo ${strUpgradableAPs} | tr "\n" ", ")
  248. fi
  249. if [ $intUpgradableAPs -ge $intCritical ] ; then
  250. echo "Critical: Für ${intUpgradableAPs} von ${intAvailAPs} Accesspoints ist ein Upgrade verfügbar (${strUpgradableAPs}) | UpgradableAPs=${intUpgradableAPs}"
  251. eval ${strLogOutAndCleanUp}
  252. exit 2
  253. elif [ $intUpgradableAPs -ge $intWarning ] ; then
  254. echo "Warning: Für ${intUpgradableAPs} von ${intAvailAPs} Accesspoints ist ein Upgrade verfügbar (${strUpgradableAPs}) | UpgradableAPs=${intUpgradableAPs}"
  255. eval ${strLogOutAndCleanUp}
  256. exit 1
  257. else
  258. echo "OK: Es sind keine oder nur wenige Upgrades für Accesspoints verfügbar | UpgradableAPs=${intUpgradableAPs}"
  259. eval ${strLogOutAndCleanUp}
  260. exit 0
  261. fi
  262. fi
  263. # [Not-Adopted] Anzahl der Accesspoints, die keiner Seite zugewiesen wurden
  264. # -------------------------------------------
  265. if [ "$strModus" == "Not-Adopted" ] ; then
  266. strNotAdoptedAPs=""
  267. intNotAdoptedAPs=0
  268. if [ "$strSeite" == "all_sites" ] ; then
  269. for strSite in $arrSites; do
  270. strNotAdoptedAPs+=$(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name')
  271. intNotAdoptedAPs=$(( intNotAdoptedAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name' | wc -l)))
  272. done
  273. strNotAdoptedAPs=$(echo ${strNotAdoptedAPs} | tr "\"" " ")
  274. else
  275. intNotAdoptedAPs=$(( intNotAdoptedAPs + $(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name' | wc -l)))
  276. strNotAdoptedAPs=$(${strCurlCommand} $strBaseURL/api/s/${strSeite}/stat/device | ${strJQBinary} '.data[] | select (.adopted!=true) | .name')
  277. strNotAdoptedAPs=$(echo ${strNotAdoptedAPs} | tr "\n" ", ")
  278. fi
  279. if [ $intNotAdoptedAPs -ge $intCritical ] ; then
  280. echo "Critical: Es wurden ${intNotAdoptedAPs} nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}"
  281. eval ${strLogOutAndCleanUp}
  282. exit 2
  283. elif [ $intNotAdoptedAPs -ge $intWarning ] ; then
  284. echo "Warning: Es wurden ${intNotAdoptedAPs} nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}"
  285. eval ${strLogOutAndCleanUp}
  286. exit 1
  287. else
  288. echo "OK: Es wurden keine nicht zugewiesene Accesspoints gefunden | NotAdoptedAPs=${intNotAdoptedAPs}"
  289. eval ${strLogOutAndCleanUp}
  290. exit 0
  291. fi
  292. fi
  293. # [Get-DeviceUsers] Zeigt die mit einem AP verbundenen Nutzer an
  294. # -------------------------------------------
  295. if [ "$strModus" == "Get-DeviceUsers" ] ; then
  296. intAPBenutzer=0
  297. for strSite in $arrSites; do
  298. intAPBenutzerTMP=0
  299. strAPBenutzerCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .[\"user-num_sta\"]'"
  300. intAPBenutzerTMP=$(eval ${strAPBenutzerCMD})
  301. intAPBenutzer=$((intAPBenutzer + intAPBenutzerTMP ))
  302. done
  303. if [ $intAPBenutzer -gt $intCritical ] ; then
  304. echo "Critical: Angemeldete Nutzer am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPBenutzer} > ${intCritical}) | ActiveAPUsers=${intAPBenutzer}"
  305. eval ${strLogOutAndCleanUp}
  306. exit 2
  307. elif [ $intAPBenutzer -gt $intWarning ] ; then
  308. echo "Warning: Angemeldete Nutzer am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPBenutzer} > ${intWarning}) | ActiveAPUsers=${intAPBenutzer}"
  309. eval ${strLogOutAndCleanUp}
  310. exit 1
  311. else
  312. echo "OK: Es sind ${intAPBenutzer} Nutzer/Geräte am Accesspoint '${strDevice}' angemeldet | ActiveAPUsers=${intAPBenutzer}"
  313. eval ${strLogOutAndCleanUp}
  314. exit 0
  315. fi
  316. fi
  317. # [Get-DeviceGuests] Zeigt die mit einem AP verbundenen Nutzer an
  318. # -------------------------------------------
  319. if [ "$strModus" == "Get-DeviceGuests" ] ; then
  320. intAPGaeste=0
  321. for strSite in $arrSites; do
  322. intAPGaesteTMP=0
  323. strAPGaesteCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .[\"guest-num_sta\"]'"
  324. intAPGaesteTMP=$(eval ${strAPGaesteCMD})
  325. intAPGaeste=$((intAPGaeste + intAPGaesteTMP ))
  326. done
  327. if [ $intAPGaeste -gt $intCritical ] ; then
  328. echo "Critical: Angemeldete Gäste am Accesspoint '${strDevice}' größer als die maximale Menge (${intAPGaeste} > ${intCritical}) | ActiveAPGuests=${intAPGaeste}"
  329. eval ${strLogOutAndCleanUp}
  330. exit 2
  331. elif [ $intAPGaeste -gt $intWarning ] ; then
  332. echo "Warning: Angemeldete Gäste am Accesspoint '${strDevice}' kleiner als die maximale Menge (${intAPGaeste} > ${intWarning}) | ActiveAPGuests=${intAPGaeste}"
  333. eval ${strLogOutAndCleanUp}
  334. exit 1
  335. else
  336. echo "OK: Es sind ${intAPGaeste} Gäste am Accesspoint '${strDevice}' angemeldet | ActiveAPGuests=${intAPGaeste}"
  337. eval ${strLogOutAndCleanUp}
  338. exit 0
  339. fi
  340. fi
  341. # [Get-DeviceLoad] Zeigt die CPU-Auslastung eines Accesspoints an
  342. # -------------------------------------------
  343. if [ "$strModus" == "Get-DeviceLoad" ] ; then
  344. intLoad1Min=0
  345. intLoad5Min=0
  346. intLoad15Min=0
  347. for strSite in $arrSites; do
  348. strAPLoad1MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_1' | tr -d '\"'"
  349. strAPLoad5MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_5' | tr -d '\"'"
  350. strAPLoad15MinCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .loadavg_15' | tr -d '\"'"
  351. intCheckAPLoad=$(eval ${strAPLoad1MinCMD})
  352. if [ "x${intCheckAPLoad}" != "x" ] ; then
  353. intLoad1Min=$(eval ${strAPLoad1MinCMD})
  354. intLoad5Min=$(eval ${strAPLoad5MinCMD})
  355. intLoad15Min=$(eval ${strAPLoad15MinCMD})
  356. fi
  357. done
  358. if ( expr $intLoad1Min \> $intCritical >/dev/null ) ; then
  359. echo "Critical: CPU-Auslastung des Accesspoints '${strDevice}' zu hoch (${intLoad1Min} > ${intCritical}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}"
  360. eval ${strLogOutAndCleanUp}
  361. exit 2
  362. elif ( expr $intLoad1Min \> $intWarning >/dev/null ) ; then
  363. echo "Warning: CPU-Auslastung des Accesspoints '${strDevice}' zu hoch (${intLoad1Min} > ${intWarning}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}"
  364. eval ${strLogOutAndCleanUp}
  365. exit 1
  366. else
  367. echo "OK: CPU-Auslastung des Accesspoints '${strDevice}' in Ordnung (${intLoad1Min}) | APLoad1Min=${intLoad1Min} APLoad5Min=${intLoad5Min} APLoad15Min=${intLoad15Min}"
  368. eval ${strLogOutAndCleanUp}
  369. exit 0
  370. fi
  371. fi
  372. # [GGet-DeviceMem] Zeigt die RAM-Belegung eines Accesspoints an
  373. # -------------------------------------------
  374. if [ "$strModus" == "Get-DeviceMem" ] ; then
  375. intAPMemTotal=0
  376. intAPMemUsed=0
  377. for strSite in $arrSites; do
  378. strAPMemTotalCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .mem_total'"
  379. strAPMemUsedCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .sys_stats | .mem_used'"
  380. intCheckAPMem=$(eval ${strAPMemTotalCMD})
  381. if [ "x${intCheckAPMem}" != "x" ] ; then
  382. intAPMemTotal=$(eval ${strAPMemTotalCMD})
  383. intAPMemUsed=$(eval ${strAPMemUsedCMD})
  384. fi
  385. done
  386. intAPMemFree=$(( intAPMemTotal - intAPMemUsed ))
  387. intAPMemUsedPercent=$(${strAWKBinary} "BEGIN {OFMT=\"%.2f\"; print $intAPMemUsed / $intAPMemTotal * 100;}")
  388. if ( expr $intAPMemUsedPercent \> $intCritical >/dev/null ) ; then
  389. echo "Critical: Speicherauslastung des Accesspoints '${strDevice}' zu hoch (${intAPMemUsedPercent}% > ${intCritical}%) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B"
  390. eval ${strLogOutAndCleanUp}
  391. exit 2
  392. elif ( expr $intAPMemUsedPercent \> $intWarning >/dev/null ) ; then
  393. echo "Warning: Speicherauslastung des Accesspoints '${strDevice}' zu hoch (${intAPMemUsedPercent}% > ${intWarning}%) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B"
  394. eval ${strLogOutAndCleanUp}
  395. exit 1
  396. else
  397. echo "OK: Speicherauslastung des Accesspoints '${strDevice}' in Ordnung (${intAPMemUsedPercent}% belegt) | APMemUsedPercent=${intAPMemUsedPercent}% APMemTotal=${intAPMemTotal}B APMemUsed=${intAPMemUsed}B APMemFree=${intAPMemFree}B"
  398. eval ${strLogOutAndCleanUp}
  399. exit 0
  400. fi
  401. fi
  402. # [Show-DevLastSeen] Zeigt die Sekunden an, wann der AP zuletzt gesehen wurde
  403. # -------------------------------------------
  404. if [ "$strModus" == "Show-DevLastSeen" ] ; then
  405. intTimeStampNow=$(date +%s)
  406. intDevLastSeen=0
  407. for strSite in $arrSites; do
  408. strDevLastSeenCMD="${strCurlCommand} $strBaseURL/api/s/${strSite}/stat/device | ${strJQBinary} '.data[] | select (.mac==\"${strDevice}\") | .last_seen'"
  409. intCheckDevLastSeen=$(eval ${strDevLastSeenCMD})
  410. if [ $(echo "$intCheckDevLastSeen" | grep [[:digit:]]) ] ; then
  411. intDevLastSeen=$intCheckDevLastSeen
  412. fi
  413. done
  414. intDevLastSeenSeconds=$(( intTimeStampNow - intDevLastSeen ))
  415. if ( expr $intDevLastSeenSeconds \> $intCritical >/dev/null ); then
  416. echo "Critical: Letzter Kontakt zum Accesspoint '${strDevice}' zu lange her (vor ${intDevLastSeenSeconds} Sekunden) | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s"
  417. eval ${strLogOutAndCleanUp}
  418. exit 2
  419. elif ( expr $intDevLastSeenSeconds \> $intWarning >/dev/null ) ; then
  420. echo "Warning: Letzter Kontakt zum Accesspoint '${strDevice}' zu lange her (vor ${intDevLastSeenSeconds} Sekunden) | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s"
  421. eval ${strLogOutAndCleanUp}
  422. exit 1
  423. else
  424. echo "OK: Letzter Kontakt zum Accesspoint '${strDevice}' vor ${intDevLastSeenSeconds} Sekunden | APLastSeenSecondsBefore=${intDevLastSeenSeconds}s"
  425. eval ${strLogOutAndCleanUp}
  426. exit 0
  427. fi
  428. fi
  429. # [Show-Updates] Zeigt, ob für den Unifi-Controller Aktualisierungen verfügbar sind
  430. # -------------------------------------------
  431. if [ "$strModus" == "Show-Updates" ] ; then
  432. boolControllerHasUpdates="false"
  433. boolControllerHasUpdates="${strCurlCommand} $strBaseURL/api/s/default/stat/sysinfo | ${strJQBinary} '.data[].update_available'"
  434. if [ "z$boolControllerHasUpdates" == "xtrue" ] ; then
  435. echo "Warning: Für den Unifi-Controller sind Updates verfügbar"
  436. eval ${strLogOutAndCleanUp}
  437. exit 1
  438. else
  439. echo "OK: Für den Unifi-Controller sind keine Updates verfügbar"
  440. eval ${strLogOutAndCleanUp}
  441. exit 0
  442. fi
  443. fi
  444. #es wurde kein passender Modus gefunden
  445. echo "Unkown: Ungültige Angabe des Moduls"
  446. eval ${strLogOutAndCleanUp}
  447. exit 3
  448. ########## Modi Ende ##########