vincentbernat / snimpy

interactive SNMP tool with Python
http://snimpy.readthedocs.org/
185 stars 44 forks source link

print(mgr.fgVpnTunEntPhase1Name.items()) produces "snimpy.snmp.SNMPNoSuchInstance: No such instance exists" #88

Closed seans11 closed 4 years ago

seans11 commented 4 years ago

I'm trying to iterate on the values returned from ProxyColumn and for some reason I'm receiving "SNMPNoSuchInstance". I know an instance can be retrieved using snmpwalk, so I'm at a loss on how I can further troubleshoot what is causing this issue. Any help would be greatly appreciated. Thank you!

Code:

from snimpy.manager import load, Manager

load('SNMPv2-MIB')
load('IF-MIB')
load('/opt/myapp/mibs/FORTINET-CORE-MIB-build1066.mib')
load('/opt/myapp/mibs/FORTINET-FORTIGATE-MIB-build1066.mib')

m = Manager(
    host='192.168.1.254',
    community='public',
    version=2,
    cache=False)

# the following two lines work fine
print(m.ifHCInOctets.items())
print(m.fgFwPolPktCount.items())

# this line fails
print(m.fgVpnTunEntPhase1Name.items())

Error:

Traceback (most recent call last):
  File "/home/myapp/myapp-original/myapp/fg_test.py", line 17, in <module>
    print(m.fgVpnTunEntPhase1Name.items())
  File "/usr/lib64/python2.7/_abcoll.py", line 395, in items
    return [(key, self[key]) for key in self]
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/manager.py", line 548, in __getitem__
    return self._op("get", self._oid_suffix + index)
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/manager.py", line 406, in _op
    *args)
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/snmp.py", line 295, in get
    return self._op(self._cmdgen.getCmd, *oids)
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/snmp.py", line 287, in _op
    return tuple([(oid, self._convert(val)) for oid, val in results])
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/snmp.py", line 255, in _convert
    self._check_exception(value)
  File "/home/myapp/.local/share/virtualenvs/myapp-original-rNnEJu-w/lib64/python2.7/site-packages/snimpy/snmp.py", line 225, in _check_exception
    raise SNMPNoSuchInstance("No such instance exists")  # noqa: F821
snimpy.snmp.SNMPNoSuchInstance: No such instance exists

Running an snmpwalk appears to work fine:

snmpwalk -v2c -c public 192.168.1.254 FORTINET-FORTIGATE-MIB::fgVpnTunEntPhase1Name
FORTINET-FORTIGATE-MIB::fgVpnTunEntPhase1Name.1.1 = STRING: vpn-abc123-0
FORTINET-FORTIGATE-MIB::fgVpnTunEntPhase1Name.2.1 = STRING: vpn-abc123-1

Interesting that an snmpget did not work:

snmpget -v2c -c public 192.168.1.254 fgVpnTunEntPhase1Name.1.1
fgVpnTunEntPhase1Name.1.1: Unknown Object Identifier (Sub-id not found: (top) -> fgVpnTunEntPhase1Name)
vincentbernat commented 4 years ago

Instead of items(), you can use iteritems(). This will avoid the extra GET lookup you get with items().

seans11 commented 4 years ago

Excellent! That fixed my problem, but I'm a little confused why the ".items()" method causes the "SNMPNoSuchInstance" error?

vincentbernat commented 4 years ago

It walks like snmpwalk, but then for each OID in the result, it does an additional snmpget. items() is provided by Python and iteritems() is provided by Snimpy.