def test_add_permanent(self, mock_set_logging, mock_loadConfig, mock_time): mock_time.return_value = 0 oidDb = oid_db.OidDb(mock.MagicMock(config={})) # add sysDescr and expect it to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 61 # add snmpOutNoSuchNames and expect sysDescr & snmpOutNoSuchNames # to be in the OID DB oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 122 # update snmpOutNoSuchNames, but expect sysDescr to still be there oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid)
def addVacmView(snmpEngine, viewName, viewType, subTree, subTreeMask): vacmViewTreeFamilyEntry, tblIdx = __cookVacmViewInfo( snmpEngine, viewName, subTree) # Allow bitmask specification in form of an OID if rfc1902.OctetString('.').asOctets() in rfc1902.OctetString(subTreeMask): subTreeMask = rfc1902.ObjectIdentifier(subTreeMask) if isinstance(subTreeMask, rfc1902.ObjectIdentifier): subTreeMask = tuple(subTreeMask) if len(subTreeMask) < len(subTree): subTreeMask += (1,) * (len(subTree) - len(subTreeMask)) subTreeMask = rfc1902.OctetString.fromBinaryString( ''.join(str(x) for x in subTreeMask)) snmpEngine.msgAndPduDsp.mibInstrumController.writeVars( ((vacmViewTreeFamilyEntry.name + (6,) + tblIdx, 'destroy'),) ) snmpEngine.msgAndPduDsp.mibInstrumController.writeVars( ((vacmViewTreeFamilyEntry.name + (1,) + tblIdx, viewName), (vacmViewTreeFamilyEntry.name + (2,) + tblIdx, subTree), (vacmViewTreeFamilyEntry.name + (3,) + tblIdx, subTreeMask), (vacmViewTreeFamilyEntry.name + (4,) + tblIdx, viewType), (vacmViewTreeFamilyEntry.name + (6,) + tblIdx, 'createAndGo')) )
def walk(self, oid): """Does a SNMP WALK request and returns the result as OID list.""" if self._active_connection is None: raise RuntimeError('No transport host set') self._info('Walk starts at OID %s' % (oid, )) oid = utils.parse_oid(oid) error_indication, error, _, var_bind_table = \ self._active_connection.cmd_gen.nextCmd( self._active_connection.authentication_data, self._active_connection.transport_target, oid ) if error_indication: raise RuntimeError('SNMP WALK failed: %s' % error_indication) if error != 0: raise RuntimeError('SNMP WALK failed: %s' % error.prettyPrint()) oids = list() for var_bind_table_row in var_bind_table: oid, obj = var_bind_table_row[0] oid = ''.join(('.', str(oid))) if obj.isSuperTypeOf(rfc1902.ObjectIdentifier()): obj = ''.join(('.', str(obj))) else: obj = obj.prettyOut(obj) self._info('%s: %s' % (oid, obj)) oids.append((oid, obj)) return oids
def test_sendTrap(self, mock_ntforg, mock_snmp_config): self.mock_queue = mock.MagicMock with mock.patch( 'bdssnmpadaptor.config.open', side_effect=[io.StringIO(self.CONFIG), io.StringIO(self.CONFIG), io.StringIO(self.CONFIG)]): ntf = snmp_notificator.SnmpNotificationOriginator( mock.MagicMock(config={}), self.mock_queue) self.my_loop.run_until_complete(ntf.sendTrap({})) mock_snmpEngine = mock_snmp_config.getSnmpEngine.return_value expectedVarBinds = [ (rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.3.0'), mock.ANY), (rfc1902.ObjectIdentifier('1.3.6.1.6.3.1.1.4.1.0'), rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.103.1.0.1.1')), (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.1.0'), rfc1902.Integer32(1)), (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.2.0'), rfc1902.OctetString('error')), (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.3.0'), rfc1902.Integer32(0)), (rfc1902.ObjectIdentifier('1.3.6.1.4.1.50058.104.2.1.4.0'), rfc1902.OctetString('error')), ] ntf._ntfOrg.sendVarBinds.assert_called_once_with( mock_snmpEngine, mock.ANY, None, '', expectedVarBinds, mock.ANY)
def test___init__(self): oid = oid_db.OidDbItem( oid='1.3.6.7.8', name='ifIndex', value=rfc1902.OctetString(hexValue='123456789'), ) self.assertEqual(rfc1902.ObjectIdentifier('1.3.6.7.8'), oid.oid) self.assertEqual('ifIndex', oid.name) self.assertEqual(b'\x124Vx\x90', oid.value)
def test_add_expire(self, mock_set_logging, mock_loadConfig, mock_time): mock_time.return_value = 0 oidDb = oid_db.OidDb(mock.MagicMock(config={})) # add sysDescr.0 and expect it to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 61 # add sysORDescr.1 and expect sysDescr.0 & sysORDescr.1 # to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysORDescr', 1, value='descr') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 122 # add sysORDescr.2 and expect sysORDescr.1 to expire oidDb.add('SNMPv2-MIB', 'sysORDescr', 2, value='descr') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) not_expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1') oidItem = oidDb.getObjectByOid(not_expected) self.assertIsNone(oidItem) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.2') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid)
def _get_call_context(self, ac_info, next_flag=False, set_flag=False): if ac_info is None: return {'nextFlag': next_flag, 'setFlag': set_flag} ac_fun, snmp_engine = ac_info # we injected snmpEngine object earlier # this API is first introduced in pysnmp 4.2.6 execCtx = snmp_engine.observer.getExecutionContext( 'rfc3412.receiveMessage:request') (transport_domain, transport_address, security_model, security_name, security_level, context_engine_id, context_name, pdu_type) = (execCtx['transportDomain'], execCtx['transportAddress'], execCtx['securityModel'], execCtx['securityName'], execCtx['securityLevel'], execCtx['contextEngineId'], execCtx['contextName'], execCtx['pdu'].__class__.__name__) if isinstance(transport_address, udp.UdpTransportAddress): transport_protocol = 'udpv4' elif isinstance(transport_address, udp6.Udp6TransportAddress): transport_protocol = 'udpv6' else: transport_protocol = 'unknown' log.info('SNMP EngineID %s, transportDomain %s, transportAddress %s, ' 'securityModel %s, securityName %s, securityLevel ' '%s' % (hasattr(snmp_engine, 'snmpEngineID') and snmp_engine.snmpEngineID.prettyPrint() or '<unknown>', transport_domain, transport_address, security_model, security_name, security_level)) return { 'snmpEngine': snmp_engine, 'transportDomain': rfc1902.ObjectIdentifier(transport_domain), 'transportAddress': transport_address, 'transportEndpoint': transport_address.getLocalAddress(), 'transportProtocol': transport_protocol, 'securityModel': security_model, 'securityName': security_name, 'securityLevel': security_level, 'contextEngineId': context_engine_id, 'contextName': context_name, 'pduType': pdu_type, 'nextFlag': next_flag, 'setFlag': set_flag }
def test_add_value(self, mock_set_logging, mock_loadConfig): oidDb = oid_db.OidDb(mock.MagicMock(config={})) oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expectedOid) self.assertEqual(expectedOid, oidItem.oid) expectedValue = rfc1902.OctetString('my system') self.assertEqual(expectedValue, oidItem.value) self.assertIsNone(oidItem.code)
def test_add_code(self, mock_set_logging, mock_loadConfig): oidDb = oid_db.OidDb(mock.MagicMock(config={})) code = """ # no op pass """ oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='', code=code) expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expectedOid) self.assertEqual(expectedOid, oidItem.oid) self.assertEqual('', str(oidItem.value)) self.assertIsInstance(oidItem.code, types.CodeType)
def get_next(self, oid): """Does a SNMP GET-NEXT request and returns the result as OID list.""" if self._active_connection is None: raise RuntimeError('No transport host set') self._info('GET-NEXT starts at OID %s' % (oid, )) oid = utils.parse_oid(oid) self._info("This is a test after oid = utils.parse_oid(oid)") error_indication, error, _, var_bind_table = \ self._active_connection.cmd_gen.nextOneCmd( self._active_connection.authentication_data, self._active_connection.transport_target, oid ) if error_indication: raise RuntimeError('SNMP GET-NEXT 1 failed: %s' % error_indication) if error != 0: if error == 13: return () else: raise RuntimeError('SNMP GET-NEXT 2 failed: %s' % error.prettyPrint()) vbTuple = () for var_bind_table_row in var_bind_table: oid, obj = var_bind_table_row[0] oid = ''.join(('.', str(oid))) if obj.isSuperTypeOf(rfc1902.ObjectIdentifier()): obj = ''.join(('.', str(obj))) else: obj = obj.prettyOut(obj) self._info('%s: %s' % (oid, obj)) vbTuple = (oid, obj) return vbTuple
def resolveWithMib(self, mibViewController): """Perform MIB variable ID and associated value conversion. Parameters ---------- mibViewController : :py:class:`~pysnmp.smi.view.MibViewController` class instance representing MIB browsing functionality. Returns ------- : :py:class:`~pysnmp.smi.rfc1902.ObjectType` reference to itself Raises ------ SmiError In case of fatal MIB hanling errora Notes ----- Calling this method involves :py:meth:`~pysnmp.smi.rfc1902.ObjectIdentity.resolveWithMib` method invocation. Examples -------- >>> objectType = ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), 'Linux i386') >>> objectType.resolveWithMib(mibViewController) ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), DisplayString('Linux i386')) >>> str(objectType) 'SNMPv2-MIB::sysDescr."0" = Linux i386' >>> """ if self.__state & self.stClean: return self self.__args[0].resolveWithMib(mibViewController) MibScalar, MibTableColumn = mibViewController.mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar', 'MibTableColumn') if not isinstance(self.__args[0].getMibNode(), (MibScalar, MibTableColumn)): if not isinstance(self.__args[1], AbstractSimpleAsn1Item): raise SmiError('MIB object %r is not OBJECT-TYPE (MIB not loaded?)' % (self.__args[0],)) self.__state |= self.stClean return self if isinstance(self.__args[1], (rfc1905.UnSpecified, rfc1905.NoSuchObject, rfc1905.NoSuchInstance, rfc1905.EndOfMibView)): self.__state |= self.stClean return self try: self.__args[1] = self.__args[0].getMibNode().getSyntax().clone(self.__args[1]) except PyAsn1Error: raise SmiError('MIB object %r having type %r failed to cast value %r: %s' % ( self.__args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class__.__name__, self.__args[1], sys.exc_info()[1])) if self.__args[1].isSuperTypeOf(rfc1902.ObjectIdentifier()): self.__args[1] = ObjectIdentity(self.__args[1]).resolveWithMib(mibViewController) self.__state |= self.stClean debug.logger & debug.flagMIB and debug.logger('resolved %r syntax is %r' % (self.__args[0], self.__args[1])) return self
def resolveWithMib(self, mibViewController, ignoreErrors=True): """Perform MIB variable ID and associated value conversion. Parameters ---------- mibViewController : :py:class:`~pysnmp.smi.view.MibViewController` class instance representing MIB browsing functionality. Other Parameters ---------------- ignoreErrors: :py:class:`bool` If `True` (default), ignore MIB object name or value casting failures if possible. Returns ------- : :py:class:`~pysnmp.smi.rfc1902.ObjectType` reference to itself Raises ------ SmiError In case of fatal MIB hanling errora Notes ----- Calling this method involves :py:meth:`~pysnmp.smi.rfc1902.ObjectIdentity.resolveWithMib` method invocation. Examples -------- >>> from pysmi.hlapi import varbinds >>> mibViewController = varbinds.AbstractVarBinds.getMibViewController( engine ) >>> objectType = ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), 'Linux i386') >>> objectType.resolveWithMib(mibViewController) ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'), DisplayString('Linux i386')) >>> str(objectType) 'SNMPv2-MIB::sysDescr."0" = Linux i386' >>> """ if self._state & self.ST_CLEAM: return self self._args[0].resolveWithMib(mibViewController) MibScalar, MibTableColumn = mibViewController.mibBuilder.importSymbols( 'SNMPv2-SMI', 'MibScalar', 'MibTableColumn') if not isinstance(self._args[0].getMibNode(), (MibScalar, MibTableColumn)): if (ignoreErrors and not isinstance(self._args[1], AbstractSimpleAsn1Item)): raise SmiError('MIB object %r is not OBJECT-TYPE ' '(MIB not loaded?)' % (self._args[0], )) self._state |= self.ST_CLEAM return self if isinstance(self._args[1], (rfc1905.UnSpecified, rfc1905.NoSuchObject, rfc1905.NoSuchInstance, rfc1905.EndOfMibView)): self._state |= self.ST_CLEAM return self syntax = self._args[0].getMibNode().getSyntax() try: self._args[1] = syntax.clone(self._args[1]) except PyAsn1Error as exc: err = ('MIB object %r having type %r failed to cast value ' '%r: %s' % (self.__args[0].prettyPrint(), self.__args[0].getMibNode().getSyntax().__class__.__name__, self.__args[1], sys.exc_info()[1])) debug.logger & debug.FLAG_MIB and debug.logger(err) if (not ignoreErrors or not isinstance(self.__args[1], AbstractSimpleAsn1Item)): raise SmiError(err) if rfc1902.ObjectIdentifier().isSuperTypeOf(self._args[1], matchConstraints=False): self._args[1] = ObjectIdentity( self._args[1]).resolveWithMib(mibViewController) self._state |= self.ST_CLEAM debug.logger & debug.FLAG_MIB and debug.logger( 'resolved %r syntax is %r' % (self._args[0], self._args[1])) return self
class OidDbTestCase(unittest.TestCase): MIB_OBJECTS = [ (('SNMPv2-MIB', 'sysDescr', 0), 'my system'), (('SNMPv2-MIB', 'snmpOutNoSuchNames', 0), 123), (('SNMPv2-MIB', 'snmpEnableAuthenTraps', 0), 1) ] OIDS = [ rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0'), rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0'), rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.30.0'), ] def setUp(self): with mock.patch.object(oid_db, 'loadConfig', autospec=True): with mock.patch.object(oid_db, 'set_logging', autospec=True): self.oidDb = oid_db.OidDb(mock.MagicMock(config={})) for ident, value in reversed(self.MIB_OBJECTS): self.oidDb.add(*ident, value=value) super(OidDbTestCase, self).setUp() @mock.patch.object(oid_db, 'loadConfig', autospec=True) @mock.patch.object(oid_db, 'set_logging', autospec=True) def test_add_value(self, mock_set_logging, mock_loadConfig): oidDb = oid_db.OidDb(mock.MagicMock(config={})) oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expectedOid) self.assertEqual(expectedOid, oidItem.oid) expectedValue = rfc1902.OctetString('my system') self.assertEqual(expectedValue, oidItem.value) self.assertIsNone(oidItem.code) @mock.patch.object(oid_db, 'loadConfig', autospec=True) @mock.patch.object(oid_db, 'set_logging', autospec=True) def test_add_code(self, mock_set_logging, mock_loadConfig): oidDb = oid_db.OidDb(mock.MagicMock(config={})) code = """ # no op pass """ oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='', code=code) expectedOid = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expectedOid) self.assertEqual(expectedOid, oidItem.oid) self.assertEqual('', str(oidItem.value)) self.assertIsInstance(oidItem.code, types.CodeType) @mock.patch('time.time', autospec=True) @mock.patch.object(oid_db, 'loadConfig', autospec=True) @mock.patch.object(oid_db, 'set_logging', autospec=True) def test_add_expire(self, mock_set_logging, mock_loadConfig, mock_time): mock_time.return_value = 0 oidDb = oid_db.OidDb(mock.MagicMock(config={})) # add sysDescr.0 and expect it to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 61 # add sysORDescr.1 and expect sysDescr.0 & sysORDescr.1 # to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysORDescr', 1, value='descr') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 122 # add sysORDescr.2 and expect sysORDescr.1 to expire oidDb.add('SNMPv2-MIB', 'sysORDescr', 2, value='descr') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) not_expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.1') oidItem = oidDb.getObjectByOid(not_expected) self.assertIsNone(oidItem) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.9.1.3.2') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) @mock.patch('time.time', autospec=True) @mock.patch.object(oid_db, 'loadConfig', autospec=True) @mock.patch.object(oid_db, 'set_logging', autospec=True) def test_add_permanent(self, mock_set_logging, mock_loadConfig, mock_time): mock_time.return_value = 0 oidDb = oid_db.OidDb(mock.MagicMock(config={})) # add sysDescr and expect it to be in the OID DB oidDb.add('SNMPv2-MIB', 'sysDescr', 0, value='my system') expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 61 # add snmpOutNoSuchNames and expect sysDescr & snmpOutNoSuchNames # to be in the OID DB oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) mock_time.return_value = 122 # update snmpOutNoSuchNames, but expect sysDescr to still be there oidDb.add('SNMPv2-MIB', 'snmpOutNoSuchNames', 0, value=123) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.1.1.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) expected = rfc1902.ObjectIdentifier('1.3.6.1.2.1.11.21.0') oidItem = oidDb.getObjectByOid(expected) self.assertEqual(expected, oidItem.oid) def test_getNextOid(self): for idx, oid in enumerate(self.OIDS[:-1]): nextOid = self.oidDb.getNextOid(oid) self.assertEqual(self.OIDS[idx + 1], nextOid) def test_getObjFromOid_good(self): oidItem = self.oidDb.getObjectByOid(self.OIDS[1]) self.assertEqual(self.OIDS[1], oidItem.oid) def test_getObjFromOid_not_exists(self): oidItem = self.oidDb.getObjectByOid(self.OIDS[1] + (1,)) self.assertIsNone(oidItem)