Module: check_mk
Branch: master
Commit: 2a053fc1eb831589a0752ac401be200de5d18872
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2a053fc1eb8315…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu Apr 25 10:37:09 2019 +0200
Move version specific snmp credentials processing to HostConfig
CMK-2030
Change-Id: Ie20fbbc25046a81fb2e20819d034aaa5e20e7ee5
---
cmk_base/automations/check_mk.py | 14 ++++----------
cmk_base/config.py | 16 +++++++++++++++-
tests/unit/cmk_base/test_config.py | 19 +++++++++++++++++++
3 files changed, 38 insertions(+), 11 deletions(-)
diff --git a/cmk_base/automations/check_mk.py b/cmk_base/automations/check_mk.py
index ea24628..aa0cb2c 100644
--- a/cmk_base/automations/check_mk.py
+++ b/cmk_base/automations/check_mk.py
@@ -1217,16 +1217,10 @@ class AutomationDiagHost(Automation):
# Determine SNMPv2/v3 community
if hostname not in config.explicit_snmp_communities:
- communities = config_cache.host_extra_conf(hostname,
config.snmp_communities)
- for entry in communities:
- if (test == "snmpv3") and not isinstance(entry,
tuple):
- continue
-
- if (test != "snmpv3") and isinstance(entry, tuple):
- continue
-
- credentials = entry
- break
+ cred = host_config.snmp_credentials_of_version(
+ snmp_version=3 if test == "snmpv3" else 2)
+ if cred is not None:
+ credentials = cred
# SNMP versions
if test in ['snmpv2', 'snmpv3']:
diff --git a/cmk_base/config.py b/cmk_base/config.py
index 177701a..845c0d8 100644
--- a/cmk_base/config.py
+++ b/cmk_base/config.py
@@ -2397,11 +2397,12 @@ class HostConfig(object):
)
def _snmp_credentials(self):
+ # type: () -> cmk_base.snmp_utils.SNMPCredentials
"""Determine SNMP credentials for a specific host
It the host is found int the map snmp_communities, that community is
returned. Otherwise the snmp_default_community is returned (wich is
- preset with "public", but can be overridden in main.mk
+ preset with "public", but can be overridden in main.mk.
"""
try:
return explicit_snmp_communities[self.hostname]
@@ -2415,6 +2416,19 @@ class HostConfig(object):
# nothing configured for this host -> use default
return snmp_default_community
+ def snmp_credentials_of_version(self, snmp_version):
+ # type: (int) -> Optional[cmk_base.snmp_utils.SNMPCredentials]
+ for entry in self._config_cache.host_extra_conf(self.hostname,
snmp_communities):
+ if snmp_version == 3 and not isinstance(entry, tuple):
+ continue
+
+ if snmp_version != 3 and isinstance(entry, tuple):
+ continue
+
+ return entry
+
+ return None
+
def _snmp_port(self):
# type: () -> int
ports = self._config_cache.host_extra_conf(self.hostname, snmp_ports)
diff --git a/tests/unit/cmk_base/test_config.py b/tests/unit/cmk_base/test_config.py
index d8df3f2..b2d0105 100644
--- a/tests/unit/cmk_base/test_config.py
+++ b/tests/unit/cmk_base/test_config.py
@@ -778,6 +778,25 @@ def test_host_config_exit_code_spec_individual(monkeypatch, hostname,
result):
assert
config_cache.get_host_config(hostname).exit_code_spec(data_source_id="snmp") ==
result
+(a)pytest.mark.parametrize("hostname,version,result"sult", [
+ ("testhost1", 2, None),
+ ("testhost2", 2, "bla"),
+ ("testhost2", 3, ('noAuthNoPriv', 'v3')),
+ ("testhost3", 2, "bla"),
+ ("testhost3", 3, None),
+ ("testhost4", 2, None),
+ ("testhost4", 3, ('noAuthNoPriv', 'v3')),
+])
+def test_host_config_snmp_credentials_of_version(monkeypatch, hostname, version,
result):
+ ts = Scenario().add_host(hostname)
+ ts.set_ruleset("snmp_communities", [
+ ("bla", [], ["testhost2", "testhost3"], {}),
+ (('noAuthNoPriv', 'v3'), [], ["testhost2",
"testhost4"], {}),
+ ])
+ config_cache = ts.apply(monkeypatch)
+ assert config_cache.get_host_config(hostname).snmp_credentials_of_version(version) ==
result
+
+
@pytest.mark.parametrize("hostname,section_name,result", [
("testhost1", "uptime", None),
("testhost2", "uptime", None),