Module: check_mk
Branch: master
Commit: 43b81dec459c3c16738599fb15384efb779f2bbc
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=43b81dec459c3c…
Author: Konstantin Büttner <kb(a)mathias-kettner.de>
Date: Wed May 24 15:03:43 2017 +0200
4631 FIX cisco_ace_rserver: Fix broken IP address parsing
Due to a change in the way SNMP is handled by Check_MK between
versions 1.2.6 and 1.2.8, OIDs representing the IP address of
the interface would now no longer be parsed (crash-free but
incorrectly) and crash. This has been fixed.
Re-discovery is required if and only if neither a description
nor a name had been used as an item before.
Change-Id: Ie552fd9efed593bf718ebd9cd47561ece44789e2
---
.werks/4631 | 16 ++++++++++++++++
checks/cisco_ace_rserver | 28 +++++++++++++++++++++++-----
2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/.werks/4631 b/.werks/4631
new file mode 100644
index 0000000..a78110b
--- /dev/null
+++ b/.werks/4631
@@ -0,0 +1,16 @@
+Title: cisco_ace_rserver: Fix broken IP address parsing
+Level: 1
+Component: checks
+Class: fix
+Compatible: incomp
+Edition: cre
+State: unknown
+Version: 1.5.0i1
+Date: 1495630510
+
+Due to a change in the way SNMP is handled by Check_MK between
+versions 1.2.6 and 1.2.8, OIDs representing the IP address of
+the interface would now no longer be parsed (crash-free but
+incorrectly) and crash. This has been fixed.
+Re-discovery is required if and only if neither a description
+nor a name had been used as an item before.
diff --git a/checks/cisco_ace_rserver b/checks/cisco_ace_rserver
index 49ae410..e23dc77 100644
--- a/checks/cisco_ace_rserver
+++ b/checks/cisco_ace_rserver
@@ -24,17 +24,34 @@
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
+# Parse an InetAddress type object as defined in the SNMP-FRAMEWORK-MIB
+def parse_framework_mib_inet_address(ip_address_type, ip_address):
+ if ip_address_type == 1:
+ return "%d.%d.%d.%d" % tuple(ip_address)
+ elif ip_address_type == 2:
+ return "%x:%x:%x:%x:%x:%x:%x:%x" % tuple(ip_address)
+ elif ip_address_type == 3:
+ return "%d.%d.%d.%d%%%d%d%d%d" % tuple(ip_address)
+ elif ip_address_type == 4:
+ return "%x:%x:%x:%x:%x:%x:%x:%x%%%d%d%d%d" % tuple(ip_address)
+ elif ip_address_type == 5: # Means DNS name - Reconvert to ASCII string
+ return "".join(map(chr,ip_address))
+ elif ip_address_type == 0: # Unknown address type - represent as hex string
+ return "".join(map(lambda byte: "%x" % byte, ip_address))
+
def inventory_cisco_ace_rserver(info):
- for name, ip, descr, admin_status, oper_status, conns in info:
+ for name, ip_address_type, ip_address, descr, admin_status, oper_status, conns in
info:
+ ip = parse_framework_mib_inet_address(int(ip_address_type), ip_address)
if name != '':
item = name
elif descr != '':
item = descr
else:
- item = socket.inet_ntoa(ip)
+ ip
yield item, None
+
def check_cisco_ace_rserver(item, _no_params, info):
admin_stati = {
"1": "in service",
@@ -62,8 +79,8 @@ def check_cisco_ace_rserver(item, _no_params, info):
"18": (2, "max load reached"),
}
- for name, ip, descr, admin_status, oper_status, conns in info:
- ip_addr = socket.inet_ntoa(ip)
+ for name, ip_address_type, ip_address, descr, admin_status, oper_status, conns in
info:
+ ip_addr = parse_framework_mib_inet_address(ip_address_type, ip_address)
if name == item or ip_addr == item or descr == item:
admin_state = admin_stati[admin_status]
state, state_txt = oper_stati[oper_status]
@@ -82,7 +99,8 @@ check_info['cisco_ace_rserver'] = {
"service_description" : "ACE RServer %s",
"snmp_info" : ( ".1.3.6.1.4.1.9.9.470.1.1.1.1", [ #
cesRserverEntry
"1", # cesRserverName
- "4", # cesRserverIpAddress
+ "3", # cesRserverIpAddressType
+ BINARY("4"), # cesRserverIpAddress
"5", # cesRserverDescription
"12", # cesRserverAdminStatus
"13", # cesRserverOperStatus