From 36f027ac713d52fdd026df726822aa80d713e74e Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 15 Dec 2020 10:46:14 -0500 Subject: [PATCH] Implement support for Cisco switches Cisco bridge mib requires to be instanced by vlan. Detect through proprietary mibs and use it to guide bridge mib walking. --- .../confluent/networking/macmap.py | 35 ++++++++++++++----- confluent_server/confluent/snmputil.py | 2 +- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/confluent_server/confluent/networking/macmap.py b/confluent_server/confluent/networking/macmap.py index 915bf812..9f84c42a 100644 --- a/confluent_server/confluent/networking/macmap.py +++ b/confluent_server/confluent/networking/macmap.py @@ -195,6 +195,7 @@ def _map_switch_backend(args): haveqbridge = False mactobridge = {} conn = snmp.Session(switch, password, user) + ifnamemap = get_portnamemap(conn) for vb in conn.walk('1.3.6.1.2.1.17.7.1.2.2.1.2'): haveqbridge = True oid, bridgeport = vb @@ -216,16 +217,32 @@ def _map_switch_backend(args): *([int(x) for x in oid[-6:]]) ) mactobridge[macaddr] = int(bridgeport) + #ciscoiftovlanmap = {} + vlanstocheck = set([]) + for vb in conn.walk('.1.3.6.1.4.1.9.9.68.1.2.2.1.2'): + vlanstocheck.add(vb[1]) + #ciscotrunktovlanmap = {} + for vb in conn.walk('.1.3.6.1.4.1.9.9.46.1.6.1.1.5'): + vlanstocheck.add(vb[1]) + if not vlanstocheck: + vlanstocheck.add(None) bridgetoifmap = {} - for vb in conn.walk('1.3.6.1.2.1.17.1.4.1.2'): - bridgeport, ifidx = vb - bridgeport = int(str(bridgeport).rsplit('.', 1)[1]) - try: - bridgetoifmap[bridgeport] = int(ifidx) - except ValueError: - # ifidx might be '', skip in such a case - continue - ifnamemap = get_portnamemap(conn) + for vlan in vlanstocheck: + if vlan: + if user: + conn = snmp.Session(switch, password, user, 'vlan-{}'.format(vlan)) + else: + if not isinstance(password, str): + password = password.decode('utf8') + conn = snmp.Session(switch, '{}@{}'.format(password, vlan)) + for vb in conn.walk('1.3.6.1.2.1.17.1.4.1.2'): + bridgeport, ifidx = vb + bridgeport = int(str(bridgeport).rsplit('.', 1)[1]) + try: + bridgetoifmap[bridgeport] = int(ifidx) + except ValueError: + # ifidx might be '', skip in such a case + continue maccounts = {} bridgetoifvalid = False for mac in mactobridge: diff --git a/confluent_server/confluent/snmputil.py b/confluent_server/confluent/snmputil.py index 05090947..e6dac474 100644 --- a/confluent_server/confluent/snmputil.py +++ b/confluent_server/confluent/snmputil.py @@ -78,7 +78,7 @@ class Session(object): # automatic behavior (e.g. DES is weak, so it's likely to be # overriden, but some devices only support DES) tp = _get_transport(self.server) - ctx = snmp.ContextData(self.context) + ctx = snmp.ContextData(contextName=self.context) resolvemib = False if '::' in oid: resolvemib = True