Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get data from SNMP with python?

How to get value mac and vlan from fdb table uses python?
In bash snmpwalk work fine:

snmpwalk -v2c -c pub 192.168.0.100 1.3.6.1.2.1.17.7.1.2.2.1.2

pysnmp:

import os, sys
import socket
import random
from struct import pack, unpack
from datetime import datetime as dt

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto.rfc1902 import Integer, IpAddress, OctetString

ip='192.168.0.100'
community='pub'
value=(1,3,6,1,2,1,17,7,1,2,2,1,2)

generator = cmdgen.CommandGenerator()
comm_data = cmdgen.CommunityData('server', community, 1) # 1 means version SNMP v2c
transport = cmdgen.UdpTransportTarget((ip, 161))

real_fun = getattr(generator, 'getCmd')
res = (errorIndication, errorStatus, errorIndex, varBinds)\
    = real_fun(comm_data, transport, value)

if not errorIndication is None  or errorStatus is True:
       print "Error: %s %s %s %s" % res
else:
       print "%s" % varBinds

output: [(ObjectName(1.3.6.1.2.1.17.7.1.2.2.1.2), NoSuchInstance(''))]

import netsnmp

def getmac():
    oid = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.2.1.17.7.1.2.2.1.2'))
    res = netsnmp.snmpgetbulk(oid, Version = 2, DestHost='192.168.0.100',
                           Community='pub')
    return res

print getmac()

output: ('27', '27', '25', '27', '27', '27', '24', '27', '25', '18', '4', '27', '25', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '23', '25', '27', '27', '27', '25', '27', '25', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '25', '25', '25', '7', '27', '27', '9', '25', '27', '20', '19', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '11', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '27', '25', '27', '27', '27', '27', '27', '27', '27', '27', '27', '2', '27', '5', '27', '0', '27', '27', '27', '27', '27')

Firs script(pysnmp) return NoSuchInstance. Second script(netsnmp) return list of ports but without mac and vlan. What wrong?

like image 427
uralbash Avatar asked Dec 22 '11 08:12

uralbash


1 Answers

In the pysnmp example you are doing an SNMPGET (snmpget), not a GETNEXT (snmpwalk). If you change,

real_fun = getattr(generator, 'getCmd')

to

real_fun = getattr(generator, 'nextCmd')

you will start to see useful results.

As for the discrepancy you saw in the results between snmpwalk and the python net-snmp bindings result: snmpwalk and snmpbulkget behave differently. If you do an snmpbulkget from the command line with the same options as the snmpwalk you'll receive the same results as your python net-snmp example.

If you update the following line in your python net-snmp example,

res = netsnmp.snmpgetbulk(oid, Version=2, DestHost='192.168.0.100', 
                          Community='pub')

to

res = netsnmp.snmpwalk(oid, Version=2, DestHost='192.168.0.100', 
                       Community='pub')

then you should now get the same list of results from the python net-snmp example as you see when you do an snmpwalk on the command line.

like image 178
lostriebo Avatar answered Oct 06 '22 14:10

lostriebo