Module: check_mk
Branch: master
Commit: a2a3109397aa79aa806a5acc6d969f30543bab83
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=a2a3109397aa79…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Apr 12 20:50:57 2018 +0200
5973 FIX Fixed broken SNMP walk download via GUI
When clicking on the context menu of a SNMP host, the SNMP walk
can be downloaded from the GUI. This function broke with one the
last innovation releases.
Change-Id: Ic502f02a55b3c947a812a2e4e40b23f88fc72dd8
---
.werks/5973 | 13 ++++++++++++
cmk_base/automations/check_mk.py | 22 +++++++++++++++----
cmk_base/snmp.py | 46 ++++++++++++++++++++++++++--------------
3 files changed, 61 insertions(+), 20 deletions(-)
diff --git a/.werks/5973 b/.werks/5973
new file mode 100644
index 0000000..03a4474
--- /dev/null
+++ b/.werks/5973
@@ -0,0 +1,13 @@
+Title: Fixed broken SNMP walk download via GUI
+Level: 1
+Component: core
+Class: fix
+Compatible: compat
+Edition: cre
+State: unknown
+Version: 1.6.0i1
+Date: 1523558726
+
+When clicking on the context menu of a SNMP host, the SNMP walk
+can be downloaded from the GUI. This function broke with one the
+last innovation releases.
diff --git a/cmk_base/automations/check_mk.py b/cmk_base/automations/check_mk.py
index 80c8aa4..0901dc4 100644
--- a/cmk_base/automations/check_mk.py
+++ b/cmk_base/automations/check_mk.py
@@ -1290,7 +1290,6 @@ class AutomationGetAgentOutput(Automation):
try:
if ty == "agent":
-
data_sources.abstract.DataSource.set_may_use_cache_file(not
data_sources.abstract.DataSource.is_agent_cache_disabled())
ipaddress = ip_lookup.lookup_ip_address(hostname)
@@ -1310,9 +1309,24 @@ class AutomationGetAgentOutput(Automation):
success = False
output += "[%s] %s\n" % (source.id(), source_output)
else:
- path = cmk.paths.snmpwalks_dir + "/" + hostname
- snmp.do_snmpwalk_on({}, hostname, path)
- info = file(path).read()
+ access_data = {
+ "hostname" : hostname,
+ "ipaddress" : ip_lookup.lookup_ipv4_address(hostname),
+ "credentials" : config.snmp_credentials_of(hostname),
+ }
+
+ lines = []
+ for oid in snmp.oids_to_walk():
+ try:
+ for oid, value in snmp.walk_for_export(access_data, oid):
+ lines.append("%s %s\n" % (oid, value))
+ except Exception, e:
+ if cmk.debug.enabled():
+ raise
+ success = False
+ output += "OID '%s': %s\n" % (oid, e)
+
+ info = "".join(lines)
except Exception, e:
success = False
output = "Failed to fetch data from %s: %s\n" % (hostname, e)
diff --git a/cmk_base/snmp.py b/cmk_base/snmp.py
index e8cab12..840ee91 100644
--- a/cmk_base/snmp.py
+++ b/cmk_base/snmp.py
@@ -793,31 +793,45 @@ def do_snmpwalk(options, hostnames):
def do_snmpwalk_on(options, access_data, filename):
hostname = access_data["hostname"]
console.verbose("%s:\n" % hostname)
+
+ oids = oids_to_walk(options)
+
+ with open(filename, "w") as out:
+ for rows in _execute_walks_for_dump(hostname, access_data, oids):
+ for oid, value in rows:
+ out.write("%s %s\n" % (oid, value))
+ console.verbose("%d variables.\n" % len(rows))
+
+ console.verbose("Wrote fetched data to %s%s%s.\n" % (tty.bold, filename,
tty.normal))
+
+
+def _execute_walks_for_dump(hostname, access_data, oids_to_walk):
+ for oid in oids_to_walk:
+ try:
+ console.verbose("Walk on \"%s\"..." % oid)
+ yield walk_for_export(access_data, oid)
+ except Exception, e:
+ console.error("Error: %s\n" % e)
+ if cmk.debug.enabled():
+ raise
+
+
+def oids_to_walk(options=None):
+ if options is None:
+ options = {}
+
oids_to_walk = [
".1.3.6.1.2.1", # SNMPv2-SMI::mib-2
".1.3.6.1.4.1" # SNMPv2-SMI::enterprises
]
+
if "oids" in options:
oids_to_walk = options["oids"]
+
elif "extraoids" in options:
oids_to_walk += options["extraoids"]
- with open(filename, "w") as out:
- for oid in sorted(oids_to_walk, key = lambda x: map(int,
x.strip(".").split("."))):
- try:
- console.verbose("Walk on \"%s\"..." % oid)
-
- rows = walk_for_export(access_data, oid)
- for oid, value in rows:
- out.write("%s %s\n" % (oid, value))
-
- console.verbose("%d variables.\n" % len(rows))
- except Exception, e:
- console.error("Error: %s\n" % e)
- if cmk.debug.enabled():
- raise
-
- console.verbose("Successfully wrote %s%s%s.\n" % (tty.bold, filename,
tty.normal))
+ return sorted(oids_to_walk, key = lambda x: map(int,
x.strip(".").split(".")))
def do_snmpget(*args):