From 5368290655530c5e292a8ce51216b4856a786dd9 Mon Sep 17 00:00:00 2001 From: Morten Brekkevold Date: Mon, 13 Nov 2023 11:14:11 +0100 Subject: [PATCH 1/4] Trust get_preferred_snmp_management_profile Netbox.get_preferred_snmp_manage_profile() should be trusted to return a proper SNMP profile. I see no reason to guard against faulty return values like this. --- python/nav/portadmin/snmp/base.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/python/nav/portadmin/snmp/base.py b/python/nav/portadmin/snmp/base.py index dcb550defb..1ed3ae22de 100644 --- a/python/nav/portadmin/snmp/base.py +++ b/python/nav/portadmin/snmp/base.py @@ -21,6 +21,7 @@ from typing import Dict, Sequence, List, Any from nav import Snmp +from nav.Snmp.profile import get_snmp_session_for_profile from nav.Snmp import safestring, OID from nav.Snmp.errors import ( UnsupportedSnmpVersionError, @@ -174,10 +175,6 @@ def _get_read_only_handle(self): if not profile: raise NoReadOnlyManagementProfileError - if not hasattr(profile, "snmp_community") or not hasattr( - profile, "snmp_version" - ): - raise InvalidManagementProfileError self.read_only_handle = Snmp.Snmp( host=self.netbox.ip, From d0286813eddee1049e3728a8afe7433d5d97b0e1 Mon Sep 17 00:00:00 2001 From: Morten Brekkevold Date: Mon, 13 Nov 2023 11:20:07 +0100 Subject: [PATCH 2/4] Use get_snmp_session_for_profile() in SNMPHandler Lets the utility function set up the SNMP session for SNMPHandler based management handlers in PortAdmin. --- python/nav/portadmin/snmp/base.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/python/nav/portadmin/snmp/base.py b/python/nav/portadmin/snmp/base.py index 1ed3ae22de..c9186f622f 100644 --- a/python/nav/portadmin/snmp/base.py +++ b/python/nav/portadmin/snmp/base.py @@ -176,10 +176,8 @@ def _get_read_only_handle(self): if not profile: raise NoReadOnlyManagementProfileError - self.read_only_handle = Snmp.Snmp( + self.read_only_handle = get_snmp_session_for_profile(profile)( host=self.netbox.ip, - community=profile.snmp_community, - version=profile.snmp_version, retries=self.retries, timeout=self.timeout, ) @@ -206,10 +204,8 @@ def _get_read_write_handle(self): """ if self.read_write_handle is None: profile = self.netbox.get_preferred_snmp_management_profile(writeable=True) - self.read_write_handle = Snmp.Snmp( + self.read_write_handle = get_snmp_session_for_profile(profile)( host=self.netbox.ip, - community=profile.snmp_community, - version=profile.snmp_version, retries=self.retries, timeout=self.timeout, ) From 9ca27c585d2e0658adf8c06cd8ee0e2fe17a35c5 Mon Sep 17 00:00:00 2001 From: Morten Brekkevold Date: Thu, 16 Nov 2023 10:35:22 +0100 Subject: [PATCH 3/4] Fix profile fixture The profile fixture returned a mocked management profile object that was incomplete. The new SNMP setup routines inspect the profile configuration more closely, and would fail. There is no need to use a Mock to mock a profile, just create an instance with an actual configuration dict, but just don't save it anywhere. --- tests/unittests/portadmin/conftest.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/unittests/portadmin/conftest.py b/tests/unittests/portadmin/conftest.py index d6ff307574..66102a03eb 100644 --- a/tests/unittests/portadmin/conftest.py +++ b/tests/unittests/portadmin/conftest.py @@ -3,14 +3,16 @@ import pytest from nav.enterprise.ids import VENDOR_ID_HEWLETT_PACKARD, VENDOR_ID_CISCOSYSTEMS +from nav.models.manage import ManagementProfile from nav.portadmin.management import ManagementFactory @pytest.fixture def profile(): - profile = Mock() - profile.snmp_version = 2 - profile.snmp_community = "public" + profile = ManagementProfile( + protocol=ManagementProfile.PROTOCOL_SNMP, + configuration={"version": 2, "community": "public"}, + ) return profile From 493e595c76fdc49ee0f4b0e88c2040154ee2e2ab Mon Sep 17 00:00:00 2001 From: Morten Brekkevold Date: Thu, 16 Nov 2023 11:43:54 +0100 Subject: [PATCH 4/4] Remove unused imports. --- python/nav/portadmin/snmp/base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/python/nav/portadmin/snmp/base.py b/python/nav/portadmin/snmp/base.py index c9186f622f..f2eb65b0f0 100644 --- a/python/nav/portadmin/snmp/base.py +++ b/python/nav/portadmin/snmp/base.py @@ -14,13 +14,11 @@ # details. You should have received a copy of the GNU General Public License # along with NAV. If not, see . # -import time from functools import wraps from operator import attrgetter import logging from typing import Dict, Sequence, List, Any -from nav import Snmp from nav.Snmp.profile import get_snmp_session_for_profile from nav.Snmp import safestring, OID from nav.Snmp.errors import (