PySNMP 添加自定义 MIB
PySNMP adding custom MIBs
我一直在尝试让自定义 MIB 工作,但没有成功。
理想情况下,我希望从 ASN1 源获取完整的 MIB 列表,但由于失败,我尝试了多种选择。
我已经下载了 IF-MIB 和 IANAifType-MIB,并复制了基于文本和 PySNMP 格式的编译版本,但 none 似乎已被读取。 .py 文件未被编译。
2018-08-21 21:14:18,442 pysmi: running pysmi version 0.3.1
2018-08-21 21:14:18,442 pysmi: debug category 'searcher' enabled
2018-08-21 21:14:18,442 pysmi: debug category 'reader' enabled
2018-08-21 21:14:18,442 pysmi: debug category 'compiler' enabled
2018-08-21 21:14:19,595 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:19,595 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:19,595 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:19,595 pysmi: current MIB borrower(s):
2018-08-21 21:14:20,343 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:20,343 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:20,343 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:20,343 pysmi: current MIB borrower(s):
2018-08-21 21:14:22,527 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:22,527 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:22,527 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:22,527 pysmi: current MIB borrower(s):
:~$ ls /usr/share/snmp/mibs/I*
/usr/share/snmp/mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt
/usr/share/snmp/mibs/IANAifType-MIB
/usr/share/snmp/mibs/IANAifType-MIB.py
/usr/share/snmp/mibs/IANAifType-MIB.txt
/usr/share/snmp/mibs/IANA-LANGUAGE-MIB.txt
/usr/share/snmp/mibs/IANA-RTPROTO-MIB.txt
/usr/share/snmp/mibs/IF-MIB
/usr/share/snmp/mibs/IF-MIB.py
:~$ ls /usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/I*
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/IANAifType-MIB.py
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/IF-MIB.py
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/INET-ADDRESS-MIB.py
:~$ ls /usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/__pycache__/I*
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/__pycache__/INET-ADDRESS-MIB.cpython-35.pyc
我尝试使用以下方法从 snmplabs 站点导入:
from pysnmp.smi import builder
# load mibs
MIBDIR = 'http://mibs.snmplabs.com/asn1/@mib@'
mibBuilder = builder.MibBuilder()
mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),)
mibBuilder.setMibSources(*mibSources)
我也尝试在 cmdgen 上将 .addAsn1MibSource('http://mibs.snmplabs.com/asn1/@mib@')
附加到我的 OID 的末尾。
我仍然得到 SNMPv2-SMI::mib-2.2.2.1.2.27 = Ethernet0/1/0.101
而不是 IF-MIB::ifDescr.27 = STRING: Ethernet0/1/0.101
的输出。我还能做些什么来弄清楚我做错了什么?
尝试将 .loadMibs('IF-MIB', ...)
附加到您传递给 cmdgen 的 ObjectType
对象。问题是,如果你在没有明确引用 MIB 的情况下进行查询(例如使用 OID),pysnmp 将不知道应该加载哪个 MIB 来解析响应变量。
如果您的自定义 MIB 是格式良好的 ASN.1 文档,则无需将其显式编译到 pysnmp - pysnmp 将调用 pysmi 为您编译 MIB。
更新:
MIB 在第一次 .loadMibs()
调用时仅加载一次,并从那时起保留在内存中。因此,从技术上讲,您不需要在每次迭代时重复 .loadMibs()
调用。
避免显式 .loadMibs()
的一种方法是在查询中将托管对象作为 MIB 和符号对而不是 OID 传递。这将触发隐式 MIB 加载。
但这不适用于反向查找,例如如果您使用 SNMP 代理并最终收到属于您从未加载过的其他 MIB 的 OID。对于这种情况,仍然建议 .loadMibs()
调用。
@Ilya Etingof
抱歉,由于声誉不足,无法回复评论......请提供上述答案的示例。我不断得到
pysnmp.smi.error.SmiError: ObjectType object not fully initialized
为了
ObjectType(ObjectIdentity('1.3.6.1.2.1.25.2.3').loadMibs('HOST-RESOURCES-MIB'))
到目前为止我遵循的步骤是
from pysnmp.hlapi import ObjectIdentity, ObjectType
mibBuilder = builder.MibBuilder()
mibBuilder.addMibSources(builder.DirMibSource('C://Users//Downloads//HOST-RESOURCES-MIB.txt'))
errorIndication, errorStatus, errorIndex, \
varBindTable = cmdgen.CommandGenerator().bulkCmd(
cmdgen.CommunityData('test'),
cmdgen.UdpTransportTarget(('test-ip', 161)),
0,
1,
ObjectType(ObjectIdentity('1.3.6.1.2.1.25.2.3').loadMibs('HOST-RESOURCES-MIB'))
)
if errorIndication:
print(errorIndication)
else:
if errorStatus:
print('%s at %s\n' % (
errorStatus.prettyPrint(),
errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
))
else:
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
我一直在尝试让自定义 MIB 工作,但没有成功。
理想情况下,我希望从 ASN1 源获取完整的 MIB 列表,但由于失败,我尝试了多种选择。
我已经下载了 IF-MIB 和 IANAifType-MIB,并复制了基于文本和 PySNMP 格式的编译版本,但 none 似乎已被读取。 .py 文件未被编译。
2018-08-21 21:14:18,442 pysmi: running pysmi version 0.3.1
2018-08-21 21:14:18,442 pysmi: debug category 'searcher' enabled
2018-08-21 21:14:18,442 pysmi: debug category 'reader' enabled
2018-08-21 21:14:18,442 pysmi: debug category 'compiler' enabled
2018-08-21 21:14:19,595 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:19,595 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:19,595 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:19,595 pysmi: current MIB borrower(s):
2018-08-21 21:14:20,343 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:20,343 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:20,343 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:20,343 pysmi: current MIB borrower(s):
2018-08-21 21:14:22,527 pysmi: current MIB source(s): FileReader{"/usr/share/snmp/mibs"}, FileReader{"/usr/share/mibs"}
2018-08-21 21:14:22,527 pysmi: current compiled MIBs location(s): StubSearcher
2018-08-21 21:14:22,527 pysmi: current compiled MIBs location(s): StubSearcher, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs"}, PyPackageSearcher{"/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/instances"}, PyPackageSearcher{"pysnmp_mibs"}
2018-08-21 21:14:22,527 pysmi: current MIB borrower(s):
:~$ ls /usr/share/snmp/mibs/I*
/usr/share/snmp/mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt
/usr/share/snmp/mibs/IANAifType-MIB
/usr/share/snmp/mibs/IANAifType-MIB.py
/usr/share/snmp/mibs/IANAifType-MIB.txt
/usr/share/snmp/mibs/IANA-LANGUAGE-MIB.txt
/usr/share/snmp/mibs/IANA-RTPROTO-MIB.txt
/usr/share/snmp/mibs/IF-MIB
/usr/share/snmp/mibs/IF-MIB.py
:~$ ls /usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/I*
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/IANAifType-MIB.py
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/IF-MIB.py
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/INET-ADDRESS-MIB.py
:~$ ls /usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/__pycache__/I*
/usr/local/lib/python3.5/dist-packages/pysnmp/smi/mibs/__pycache__/INET-ADDRESS-MIB.cpython-35.pyc
我尝试使用以下方法从 snmplabs 站点导入:
from pysnmp.smi import builder
# load mibs
MIBDIR = 'http://mibs.snmplabs.com/asn1/@mib@'
mibBuilder = builder.MibBuilder()
mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),)
mibBuilder.setMibSources(*mibSources)
我也尝试在 cmdgen 上将 .addAsn1MibSource('http://mibs.snmplabs.com/asn1/@mib@')
附加到我的 OID 的末尾。
我仍然得到 SNMPv2-SMI::mib-2.2.2.1.2.27 = Ethernet0/1/0.101
而不是 IF-MIB::ifDescr.27 = STRING: Ethernet0/1/0.101
的输出。我还能做些什么来弄清楚我做错了什么?
尝试将 .loadMibs('IF-MIB', ...)
附加到您传递给 cmdgen 的 ObjectType
对象。问题是,如果你在没有明确引用 MIB 的情况下进行查询(例如使用 OID),pysnmp 将不知道应该加载哪个 MIB 来解析响应变量。
如果您的自定义 MIB 是格式良好的 ASN.1 文档,则无需将其显式编译到 pysnmp - pysnmp 将调用 pysmi 为您编译 MIB。
更新:
MIB 在第一次 .loadMibs()
调用时仅加载一次,并从那时起保留在内存中。因此,从技术上讲,您不需要在每次迭代时重复 .loadMibs()
调用。
避免显式 .loadMibs()
的一种方法是在查询中将托管对象作为 MIB 和符号对而不是 OID 传递。这将触发隐式 MIB 加载。
但这不适用于反向查找,例如如果您使用 SNMP 代理并最终收到属于您从未加载过的其他 MIB 的 OID。对于这种情况,仍然建议 .loadMibs()
调用。
@Ilya Etingof
抱歉,由于声誉不足,无法回复评论......请提供上述答案的示例。我不断得到
pysnmp.smi.error.SmiError: ObjectType object not fully initialized
为了
ObjectType(ObjectIdentity('1.3.6.1.2.1.25.2.3').loadMibs('HOST-RESOURCES-MIB'))
到目前为止我遵循的步骤是
from pysnmp.hlapi import ObjectIdentity, ObjectType
mibBuilder = builder.MibBuilder()
mibBuilder.addMibSources(builder.DirMibSource('C://Users//Downloads//HOST-RESOURCES-MIB.txt'))
errorIndication, errorStatus, errorIndex, \
varBindTable = cmdgen.CommandGenerator().bulkCmd(
cmdgen.CommunityData('test'),
cmdgen.UdpTransportTarget(('test-ip', 161)),
0,
1,
ObjectType(ObjectIdentity('1.3.6.1.2.1.25.2.3').loadMibs('HOST-RESOURCES-MIB'))
)
if errorIndication:
print(errorIndication)
else:
if errorStatus:
print('%s at %s\n' % (
errorStatus.prettyPrint(),
errorIndex and varBindTable[-1][int(errorIndex)-1] or '?'
))
else:
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))