check_unifi45.sh 22 KB

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