PySNMP MibNotFoundError-不编译MIB文件

时间:2019-01-24 13:57:12

标签: python-3.x pysnmp

我需要将本地.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

1 个答案:

答案 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'))