Module: check_mk
Branch: master
Commit: 9d59bfdbdcd62d61d6de189933d27c9a98922e85
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=9d59bfdbdcd62d…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Tue Apr 12 14:07:15 2011 +0200
FIX: snmp: fix detection of missing OIDs
END-OIDs are now not any longer assumed to consist of one
component but we take the complete part after the scan prefix
as END OIDs. This avoids the creation of completely empty lines
like ['', ''] when in the MIB the indices of entries consist
of more than one component (like in apc_symmetra_temp).
We are not yet sure if this patch has a negative influence
in other not-yet tested situations...
---
ChangeLog | 1 +
modules/snmp.py | 48 +++++++++++++++++++++++++++++-------------------
2 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index da59213..875bd0b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
1.1.11i1:
Core, Setup, etc.:
* FIX: fix computation of weight when averaging
+ * FIX: fix detection of missing OIDs (led to empty lines)
* SNMP scan functions can now call oid(".1.3.6.1.4.1.9.9.13.1.3.1.3.*")
That will return the *first* OID beginning with .1.3.6.1.4.1.9.9.13.1.3.1.3
* New config option: Set check_submission = "file" in order to write
diff --git a/modules/snmp.py b/modules/snmp.py
index 227f9f7..b7a25c3 100644
--- a/modules/snmp.py
+++ b/modules/snmp.py
@@ -156,6 +156,15 @@ def snmpwalk_on_suboid(hostname, ip, oid):
raise MKSNMPError("SNMP Error on %s" % ip)
return rowinfo
+def extract_end_oid(prefix, complete):
+ return complete[len(prefix):].lstrip('.')
+
+# sort OID strings numerically
+def cmp_oids(o1, o2):
+ i1 = map(int, o1.split('.'))
+ i2 = map(int, o2.split('.'))
+ return cmp(i1, i2)
+
def get_snmp_table(hostname, ip, oid_info):
# oid_info is either ( oid, columns ) or
# ( oid, suboids, columns )
@@ -206,19 +215,19 @@ def get_snmp_table(hostname, ip, oid_info):
else:
rowinfo = snmpwalk_on_suboid(hostname, ip, fetchoid)
- if len(rowinfo) > 0 or True:
- columns.append(rowinfo)
- number_rows = len(rowinfo)
- if len(rowinfo) > max_len:
- max_len = len(rowinfo)
- max_len_col = colno
+ columns.append((fetchoid, rowinfo))
+ number_rows = len(rowinfo)
+ if len(rowinfo) > max_len:
+ max_len = len(rowinfo)
+ max_len_col = colno
if index_column != -1:
index_rows = []
# Take end-oids of non-index columns as indices
- for o, value in columns[max_len_col]:
+ for o, value in columns[max_len_col][1]:
if index_format == OID_END:
- index_rows.append((o, o.split('.')[-1]))
+ eo = extract_end_oid(columns[max_len_col][0], o)
+ index_rows.append((o, eo))
elif index_format == OID_STRING:
index_rows.append((o, o))
else:
@@ -242,29 +251,30 @@ def get_snmp_table(hostname, ip, oid_info):
# First compute the complete list of end-oids appearing in the output
# by looping all results and putting the endoids to a flat list
- #
- # The list needs to be sorted to prevent problems when the first
- # column has missing values in the middle of the tree.
endoids = []
- for column in columns:
+ for fetchoid, column in columns:
for o, value in column:
- endoid = int(o.rsplit('.', 1)[-1])
+ endoid = extract_end_oid(fetchoid, o)
if endoid not in endoids:
endoids.append(endoid)
- endoids.sort()
+
+ # The list needs to be sorted to prevent problems when the first
+ # column has missing values in the middle of the tree. Since we
+ # work with strings of numerical components, a simple string sort
+ # is not correct. 1.14 must come after 1.2!
+ endoids.sort(cmp = cmp_oids)
# Now fill gaps in columns where some endois are missing
new_columns = []
- for column in columns:
+ for fetchoid, column in columns:
i = 0
new_column = []
# Loop all lines to fill holes in the middle of the list. All
- # columns check the the following lines for the correct endoid. If
+ # columns check the following lines for the correct endoid. If
# an endoid differs empty values are added until the hole is filled
for o, value in column:
- beginoid, endoid = o.rsplit('.', 1)
- endoid = int(endoid)
- while i < len(endoids) and endoids[i] != endoid:
+ eo = extract_end_oid(fetchoid, o)
+ while i < len(endoids) and endoids[i] != eo:
new_column.append("") # (beginoid + '.'
+endoids[i], "" ) )
i += 1
new_column.append(value)