Package: snimpy
Version: 0.8.3-1
Severity: normal

Hi *.

Using the snimpy.snmp.walk() method to retrieve SNMP data
returns more data than expected if the SNMP version
is not 1. It seems the walk result includes the OIDs
from the tree "above".

Consider the following SNMP data for ifDescr:

maus@fraggle:~ $ snmpwalk -v2c -c public sw-hp1920-8g-1 .1.3.6.1.2.1.2.2.1.2
iso.3.6.1.2.1.2.2.1.2.1 = STRING: "GigabitEthernet1/0/1"
iso.3.6.1.2.1.2.2.1.2.2 = STRING: "GigabitEthernet1/0/2"
iso.3.6.1.2.1.2.2.1.2.3 = STRING: "GigabitEthernet1/0/3"
iso.3.6.1.2.1.2.2.1.2.4 = STRING: "GigabitEthernet1/0/4"
iso.3.6.1.2.1.2.2.1.2.5 = STRING: "GigabitEthernet1/0/5"
iso.3.6.1.2.1.2.2.1.2.6 = STRING: "GigabitEthernet1/0/6"
iso.3.6.1.2.1.2.2.1.2.7 = STRING: "GigabitEthernet1/0/7"
iso.3.6.1.2.1.2.2.1.2.8 = STRING: "GigabitEthernet1/0/8"
iso.3.6.1.2.1.2.2.1.2.9 = STRING: "GigabitEthernet1/0/9"
iso.3.6.1.2.1.2.2.1.2.10 = STRING: "GigabitEthernet1/0/10"
iso.3.6.1.2.1.2.2.1.2.11 = STRING: "NULL0"
iso.3.6.1.2.1.2.2.1.2.12 = STRING: "Vlan-interface1"
iso.3.6.1.2.1.2.2.1.2.13 = STRING: "Vlan-interface101"
iso.3.6.1.2.1.2.2.1.2.14 = STRING: "Bridge-Aggregation1"

The expected and correct result will be returned if SNMP version 1 is used:

maus@fraggle:~ $ cat snimpy_walk_1.py
#!/usr/bin/env python
import snimpy
import snimpy.snmp

session = snimpy.snmp.Session("sw-hp1920-8g-1", community="public", version=1)

result = session.walk(".1.3.6.1.2.1.2.2.1.2")
for r in result:
  print("OID: %s" % (r[0], ))

results in:

maus@fraggle:~ $ ./snimpy_walk_1.py
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 12)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 13)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 14)

Using this snippet to retrieve the data with SNMP v2c:

maus@fraggle:~ $ cat snimpy_walk_2c.py
#!/usr/bin/env python
import snimpy
import snimpy.snmp

session = snimpy.snmp.Session("sw-hp1920-8g-1", community="public", version=2)

result = session.walk(".1.3.6.1.2.1.2.2.1.2")
for r in result:
  print("OID: %s" % (r[0], ))

results in:

maus@fraggle:~ $ ./snimpy_walk_2c.py
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 12)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 13)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 14)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 12)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 13)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 14)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 12)

Same for SNMPv3:

maus@fraggle:~ $ cat snimpy_walk_3.py
#!/usr/bin/env python
import snimpy
import snimpy.snmp

session = snimpy.snmp.Session("sw-hp1920-8g-1", 
                              version=3, secname="snmpv3user",
                              authprotocol="SHA",
                              authpassword="auth_password",
                              privprotocol="AES128",
                              privpassword="priv_password")

result = session.walk(".1.3.6.1.2.1.2.2.1.2")
for r in result:
  print("OID: %s" % (r[0], ))


which returns:

maus@fraggle:~ $ ./snimpy_walk_3.py
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 12)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 13)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 14)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 12)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 13)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 14)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 1)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 2)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 3)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 4)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 5)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 6)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 7)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 8)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 9)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 10)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 11)
OID: (1, 3, 6, 1, 2, 1, 2, 2, 1, 4, 12)

Although the results from .1.3.6.1.2.1.2.2.1.2 are correct, it also
contain all data from the upper tree (.1.3.6.1.2.1.2.2.1)

BTW, all snimpy versions up to 0.8.6 show this behavior (didn't build
packages for 0.8.7 and 0.8.8 yet because of the requirement for
cffi >= 1.0.0).

Sincerely yours,

Andreas Maus.

-- System Information:
Debian Release: 8.2
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages snimpy depends on:
ii  libc6           2.19-18+deb8u1
ii  libsmi2ldbl     0.4.8+dfsg2-10+b2
ii  python          2.7.9-1
ii  python-cffi     0.8.6-1
ii  python-pysnmp4  4.2.5-1
pn  python2.7:any   <none>

snimpy recommends no packages.

Versions of packages snimpy suggests:
pn  ipython  <none>

-- no debconf information
-- 
"Things that try to look like things often do
 look more like things than things. Well-known fact."
Granny Weatherwax - "Wyrd sisters"

Attachment: signature.asc
Description: Digital signature

Reply via email to