0

我是 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)
4

1 回答 1

0

看起来您的 MIB 转换不成功,最终产生了一个空的 .py MIB 模块。造成这种情况的常见原因是 smidump 工具未找到 LM-SENSORS-MIB.mib 所需的其他 MIB 模块。因此,请查看 LM-SENSORS-MIB.mib 并确保您已在 smidump 搜索路径中引用了所有 MIB。

要进一步调试此问题,请尝试运行:

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

shell 脚本以查看如何调用 smidump,然后尝试在不使用“-k”选项且 stderr 可见的情况下重新调用它。

此外,最好安装一个新的 libsmi/smidump 包。

于 2014-05-30T07:46:12.560 回答