如何在不同的 (SNMPv3) 上下文中注册 MIB 模块。在 SNMP 代理端

How can I register a MIB module in a different (SNMPv3) context. In SNMP agent side

我是 SNMP 的新手,我正在尝试在云中创建 SNMP 代理,它将使用上下文名称来区分设备。我在代理端使用 pysnmp。我也在关注中提供的示例程序 http://snmplabs.com/pysnmp/examples/contents.html

现在我想知道如何在代理端添加register multiple context name并在这个context name下注册MIB。全部使用相同的非默认 MIB。

我尝试了 www.snmpalabs.com 中可用的任何示例代码,但是当我使用上下文名称时,我得到超时或 MIB 结束。

def __init__(self, mibObjects):

 snmpEngine = engine.SnmpEngine()

 config.addTransport(
      self._snmpEngine, udp.domainName,                              
      udp.UdpTransport().openServerMode(('127.0.0.1', 161)))

 config.addV3User(self._snmpEngine, 'User', config.usmHMACMD5AuthProtocol, 'PassCode')

 config.addVacmUser(self._snmpEngine, 3, 'User', 'authNoPriv', (1, 3, 6, 1, 4, 1, 44555), (1, 3, 6, 1, 4, 1, 44555))

 snmpContext = context.SnmpContext(snmpEngine)

        responder(snmpEngine,snmpContext)

 mibBuilder = snmpContext.getMibInstrum().getMibBuilder()

 loadmib(mibBuilder)

 snmpContext.registerContextName(
                 v2c.OctetString('MyContextName'),
                 instrum.MibInstrumController(mibBuilder)
        )

 MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance')

 # export our custom mib
 for mibObject in mibObjects:
       nextVar, = mibBuilder.importSymbols(mibObject.mibName,                                
       mibObject.objectType)
       instance = createVariable(MibScalarInstance,          
                                mibObject.valueFunc,                                     
                                mibObject.objectType,                                    
                                nextVar.name, (0,),                                  
                                nextVar.syntax)
      instanceDict = {str(nextVar.name) + "Instance":instance}
      mibBuilder.exportSymbols(mibObject.mibName,
                                        **instanceDict)

我只粘贴了最少的代码。请询问是否需要更多。方法不对,那又是什么呢?是否有任何好的文档或帮助可用?

基本上,您应该有一个 SnmpContext 对象和多个 MIB 树,每个 MIB 树都以不同的名称在 SnmpContext 中注册。

# Create an SNMP context with default ContextEngineId (same as SNMP engine ID)
snmpContext = context.SnmpContext(snmpEngine)

# Create multiple independent trees of MIB managed objects (empty so far)
mibTreeA = instrum.MibInstrumController(builder.MibBuilder())
mibTreeB = instrum.MibInstrumController(builder.MibBuilder())

# Register MIB trees at distinct SNMP Context names
snmpContext.registerContextName(v2c.OctetString('context-a'), mibTreeA)
snmpContext.registerContextName(v2c.OctetString('context-b'), mibTreeB)

# Register SNMP Applications at the SNMP engine for particular SNMP context
cmdrsp.GetCommandResponder(snmpEngine, snmpContext)
cmdrsp.SetCommandResponder(snmpEngine, snmpContext)
cmdrsp.NextCommandResponder(snmpEngine, snmpContext)
cmdrsp.BulkCommandResponder(snmpEngine, snmpContext)

那么您应该能够像这样查询每个 MIB 树:

snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -n context-a 127.0.0.1 .1.3.6
snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -n context-b 127.0.0.1 .1.3.6

由于 MIB 树是空的,您可能会得到 end-of-mib。

这是一个有希望运作的 example script

或者从头开始实施您自己的 SNMP 代理,您可以考虑尝试使用基于相同技术的 SNMP Command Responder 工具,但要使其更容易(希望如此)。