在pysnmp中使用自定义MIB

0 投票
1 回答
1956 浏览
提问于 2025-04-18 08:00

我刚开始学习Python编程,现在正在做一个项目,想了解更多关于SNMP和MIB的知识。我在Eclipse和pyDev上使用pysnmp框架进行编程。用过这个框架的人应该知道,它的文档并不是特别全面。

接下来是我的问题!

我开始创建一个小应用程序,目的是获取单个设备的CPU温度。我知道我的代码是有效的,因为它可以成功从预装的MIB中获取其他值(比如sysName和sysUpTime)。我使用build-pysnmp-mib把LM-SENSORS-MIB文件转换成.py格式,并把它包含在我的项目中。我用以下代码把这个MIB加载到搜索路径中:

mibBuilder - cmdGen.snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder

mibSources = mibBuilder.getMibSources() + (
   builder.DirMidSource('/path/'),
   )

mibBuilder.setMibSources(*mibSources)

然后在执行snmp查询时,我使用

   errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
        cmdgen.CommunityData('public'),
        cmdgen.UdpTransportTarget((self.getIp(), 161)),
        cmdgen.MibVariable('1.3.6.1.4.1.2021.13.16.2.1.3.2').loadMibs()
     )

结果我遇到了错误

Traceback (most recent call last):
File "/home/adam/workspace/MSc Project/Interface.py", line 20, in <module>
print(temp.getTemperature())
File "/home/adam/workspace/MSc Project/Classes/Device.py", line 34, in getTemperature
cmdgen.MibVariable('1.3.6.1.4.1.2021.13.16.2.1.3.2').loadMibs()
File "/usr/lib/python2.7/dist-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line   424, in getCmd
kwargs.get('contextName', null)
File "/usr/lib/python2.7/dist-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 277, in getCmd
self.makeReadVarBinds(varNames),
File "/usr/lib/python2.7/dist-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 201, in makeReadVarBinds
[ (x, self._null) for x in varNames ], oidOnly=True
File "/usr/lib/python2.7/dist-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 209, in makeVarBinds
varName.resolveWithMib(self.mibViewController, oidOnly=True)
File "/usr/lib/python2.7/dist-packages/pysnmp/entity/rfc3413/oneliner/mibvar.py", line 79, in resolveWithMib
mibViewController.mibBuilder.loadModules(*self.__modNamesToLoad)
File "/usr/lib/python2.7/dist-packages/pysnmp/smi/builder.py", line 259, in loadModules
'MIB module \"%s\" load error: %s' % (modPath,   traceback.format_exception(*sys.exc_info()))
pysnmp.smi.error.SmiError: MIB module "Custom_MIBs/LM-SENSORS-MIB.py" load error:  ['Traceback (most recent call last):\n', '  File "/usr/lib/python2.7/dist- packages/pysnmp/smi/builder.py", line 255, in loadModules\n    exec(modData, g)\n', '  File  "<string>", line 7, in <module>\n', '  File "/usr/lib/python2.7/dist- packages/pysnmp/smi/builder.py", line 294, in importSymbols\n    \'importSymbols: empty MIB  module name\'\n', 'SmiError: importSymbols: empty MIB module name\n']

正如我所说,我知道我的代码在预装的MIB上是有效的,所以问题可能出在MIB本身或我调用它的方式上。如果有人有任何想法或者需要更多信息,请告诉我。

谢谢!

编辑:

LM-SENSORS-MIB.py的输出:

# PySNMP SMI module. Autogenerated from smidump -f python LM-SENSORS-MIB
# by libsmi2pysnmp-0.1.3 at Thu May 29 22:09:39 2014,
# Python version sys.version_info(major=2, minor=7, micro=7, releaselevel='candidate', serial=1)

# Imports

( DisplayString, Gauge32, Integer32, ModuleIdentity, MibScalar, MibTable, MibTableRow, MibTableColumn, ucdExperimental, ) = mibBuilder.importSymbols("", "DisplayString", "Gauge32", "Integer32", "ModuleIdentity", "MibScalar", "MibTable", "MibTableRow", "MibTableColumn", "ucdExperimental")
( Integer, ObjectIdentifier, OctetString, ) = mibBuilder.importSymbols("ASN1", "Integer", "ObjectIdentifier", "OctetString")
( NamedValues, ) = mibBuilder.importSymbols("ASN1-ENUMERATION", "NamedValues")
( ConstraintsIntersection, ConstraintsUnion, SingleValueConstraint, ValueRangeConstraint, ValueSizeConstraint, ) = mibBuilder.importSymbols("ASN1-REFINEMENT", "ConstraintsIntersection", "ConstraintsUnion", "SingleValueConstraint", "ValueRangeConstraint", "ValueSizeConstraint")
( Bits, Integer32, MibIdentifier, TimeTicks, ) = mibBuilder.importSymbols("SNMPv2-SMI", "Bits", "Integer32", "MibIdentifier", "TimeTicks")

# Exports

# Module identity
mibBuilder.exportSymbols("LM-SENSORS-MIB", PYSNMP_MODULE_ID=lmSensorsMIB)

1 个回答

0

看起来你的MIB转换没有成功,最终导致生成了一个空的.py MIB模块。造成这种情况的常见原因是,LM-SENSORS-MIB.mib所需的其他MIB模块没有被smidump工具找到。所以你需要查看LM-SENSORS-MIB.mib,确保在smidump的搜索路径中包含了所有引用的MIB。

为了进一步调试这个问题,可以尝试运行:

sh -x build-pysnmp-mib LM-SENSORS-MIB.mib

这个shell脚本可以查看smidump是如何被调用的,然后再试着重新调用它,但不要加'-k'选项,并且要让错误信息可见。

另外,建议安装一个新的libsmi/smidump包。

撰写回答