我需要将本地.mib文件编译为PySNMP可以使用的格式。根据{{3}},此类文件应由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
答案 0 :(得分:0)
我怀疑问题在于基础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'))