我需要将本地.mib文件编译成PySNMP可以使用的格式。根据documentation的规定,这样的文件应该由PySNMP自动编译。
到目前为止,它可以处理随PySNMP一起安装的预编译文件,但不能处理任何本地文件。当我尝试指定我的.mib文件所在的位置时,我得到这个错误:
pysnmp.smi.error.MibNotFoundError: CISCO-IETF-IPMROUTE-MIB compilation error(s): missingcaused by <class 'pysnmp.smi.error.MibNotFoundError'>: MIB file "CISCO-IETF-IPMROUTE-MIB.py[co]" not found in search path (DirMibSource('/usr/lib/python3.4/site-packages/pysnmp/smi/mibs'), DirMibSource('/usr/lib/python3.4/site-packages/pysnmp/smi/mibs/instances'), DirMibSource('pysnmp_mibs'), DirMibSource('/root/.pysnmp/mibs'), DirMibSource('~/projects/nemo/MIBs'))我的代码:
def find_name_type(oid, module):
mibBuilder = builder.MibBuilder()
compiler.addMibCompiler(mibBuilder, sources = ['~/projects/mibs'])
mibBuilder.addMibSources(builder.DirMibSource('~/projects/mibs'))
mibBuilder.loadModules(module)
mibView = view.MibViewController(mibBuilder)
oid, label, suffix = mibView.getNodeName(oid)
modName, symName, suffix = mibView.getNodeLocation(oid)
mibNode, = mibBuilder.importSymbols(modName, symName)
data_type = mibNode.syntax.__class__.__name__
return label[-1], data_type当输入是例如
find_name_type((1,3,6,1,2,1,31,1,1,1,6), 'IF-MIB')输出为ifHCInOctets Counter64,因为IF-MIB已经编译。任何其他.mib文件都不会编译,因此
find_name_type((1, 3, 6, 1, 4, 1, 9, 10, 117, 1, 1, 2, 1, 17), 'CISCO-IETF-IPMROUTE-MIB') 引发上述错误。~/projects/mibs的内容如下:
CISCO-IETF-IPMROUTE-MIB.mib
IF-MIB.mib发布于 2019-01-24 23:10:10
我怀疑问题在于底层的pysmi没有将~扩展到用户名中。因此,要么尝试使用ASN.1 MIB绝对路径,要么自己扩展该路径:
compiler.addMibCompiler(mibBuilder, sources = [os.path.expanduser('~/projects/mibs')])如果两者都不起作用,请尝试启用pysmi调试,以查看它在何处搜索ASN.1 MIB:
from pysmi import debug
debug.setLogger(debug.Debug('all'))https://stackoverflow.com/questions/54348320
复制相似问题