From c1ce9295c059ae22bf4647b425d244b3b6098e4e Mon Sep 17 00:00:00 2001 From: Markus Birth Date: Tue, 28 Nov 2017 15:04:13 +0100 Subject: [PATCH] Added miranda_densite. --- src/miranda_densite/baseinfo.ini | 7 ++ .../checks/miranda_densite_presence | 61 ++++++++++++++++++ .../checks/miranda_densite_status | 52 +++++++++++++++ .../web/htdocs/images/icons/Miranda.png | Bin 0 -> 14164 bytes 4 files changed, 120 insertions(+) create mode 100644 src/miranda_densite/baseinfo.ini create mode 100644 src/miranda_densite/checks/miranda_densite_presence create mode 100644 src/miranda_densite/checks/miranda_densite_status create mode 100644 src/miranda_densite/web/htdocs/images/icons/Miranda.png diff --git a/src/miranda_densite/baseinfo.ini b/src/miranda_densite/baseinfo.ini new file mode 100644 index 0000000..c6d6683 --- /dev/null +++ b/src/miranda_densite/baseinfo.ini @@ -0,0 +1,7 @@ +[info] +title = Miranda Densité SNMP Checks +author = Markus Birth +description = SNMP based checks (card/PSU presence, system status) for the Miranda Densité frame controller. +version = 2015.07.22.1 +version.min_required = 1.2.8p2 +download_url = https://github.com/mbirth/check_mk-plugins diff --git a/src/miranda_densite/checks/miranda_densite_presence b/src/miranda_densite/checks/miranda_densite_presence new file mode 100644 index 0000000..de8fc49 --- /dev/null +++ b/src/miranda_densite/checks/miranda_densite_presence @@ -0,0 +1,61 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +def inventory_miranda_densite_presence(info): + inventory = [] + for oidEnd, overallPresence in info: + inventory.append( ( "Presence", None ) ) + return inventory + +def check_miranda_densite_presence(item, _no_params, info): + status = 0 + for oidEnd, overallPresence in info: + slot_used = ["➊", "➋", "➌", "➍", "➎", "➏", "➐", "➑", "➒", "➓", "⓫", "⓬", "⓭", "⓮", "⓯", "⓰", "⓱", "⓲", "⓳", "⓴", "PSU1", "PSU2" ] + slot_empty = ["➀", "➁", "➂", "➃", "➄", "➅", "➆", "➇", "➈", "➉", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳", "----", "----" ] + bits = bin(int(overallPresence))[2:].zfill(22)[::-1] + + message = "Slots: " + text = "" + ctr = 0 + for c in bits[0:20]: + if c == '1': + message += slot_used[ctr] + else: + message += slot_empty[ctr] + ctr = ctr + 1 + + message += " / PSUs: " + ctr = 0 + for c in bits[20:]: + if c == '1': + message += slot_used[ctr] + else: + status = 1 + message += slot_empty[ctr] + ctr = ctr + 1 + + if status == 1: + message = "PSU missing!\n" + message + + return status, message + + return 3, "%s not found in SNMP data." % item + +check_info["miranda_densite_presence"] = { + "check_function" : check_miranda_densite_presence, + "inventory_function" : inventory_miranda_densite_presence, + "service_description" : "%s", + "snmp_info" : (".1.3.6.1.4.1.3872.8.1", [ + OID_END, + 1, #overallPresence + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.3872.8.1.1.0"), + "has_perfdata" : False +} diff --git a/src/miranda_densite/checks/miranda_densite_status b/src/miranda_densite/checks/miranda_densite_status new file mode 100644 index 0000000..09bc721 --- /dev/null +++ b/src/miranda_densite/checks/miranda_densite_status @@ -0,0 +1,52 @@ +#!/usr/bin/python +# -*- coding: utf-8; py-indent-offset: 4 -*- +# _______ __ _ ____ __ +# | | \ | |___ \ / / +# | | \| | __) | / /-,_ +# | | |\ |/ __/ /__ _| +# |_______|_| \__|_____| |_| +# +# @author Markus Birth + +def inventory_miranda_densite_status(info): + inventory = [] + for oidEnd, overallStatus in info: + inventory.append( ( "Status", None ) ) + return inventory + +def check_miranda_densite_status(item, _no_params, info): + status = 0 + for oidEnd, overallStatus in info: + devices = ["Slot 1", "Slot 2", "Slot 3", "Slot 4", "Slot 5", "Slot 6", "Slot 7", "Slot 8", "Slot 9", "Slot 10", \ + "Slot 11", "Slot 12", "Slot 13", "Slot 14", "Slot 15", "Slot 16", "Slot 17", "Slot 18", "Slot 19", "Slot 20", \ + "PSU1", "PSU2", "PSU1 Fan", "PSU2 Fan", "Rear Fan 1", "Rear Fan 2"] + bits = bin(int(overallStatus))[2:].zfill(26)[::-1] + + message = "Error in: " + ctr = 0 + for c in bits: + if c == '1': + if status == 2: + message += ", " + message += devices[ctr] + status = 2 + ctr = ctr + 1 + + if status == 0: + message = "No errors reported." + + return status, message + + return 3, "%s not found in SNMP data." % item + +check_info["miranda_densite_status"] = { + "check_function" : check_miranda_densite_status, + "inventory_function" : inventory_miranda_densite_status, + "service_description" : "%s", + "snmp_info" : (".1.3.6.1.4.1.3872.8.1", [ + OID_END, + 2, #overallStatus + ]), + "snmp_scan_function" : lambda oid: oid(".1.3.6.1.4.1.3872.8.1.1.0"), + "has_perfdata" : False +} diff --git a/src/miranda_densite/web/htdocs/images/icons/Miranda.png b/src/miranda_densite/web/htdocs/images/icons/Miranda.png new file mode 100644 index 0000000000000000000000000000000000000000..816c6c7d2264636126d31fac2e96ae8def841493 GIT binary patch literal 14164 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 akYKA%^kcv_;?Z{`z@)|H0o9@g0sjZ>MW#gn literal 0 HcmV?d00001