[Python bindings] [ <= 5.5.pre2 ] malformed Varbind returned by sess.walk()

Diego Billi <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
NET-SNMP version: 5.5.pre2  (and 5.4.2.1 i think)

I'm using the NET-SNMP python bindings to perform a walk on the OID 
'1.3.6.1.2.1.25.3.3.1.2'.

I'm in a multi-thread environment. The thread doing the walk is not the 
main thread.
It's one of several thread of a thread-pool object.

All works fine, but *SOMETIMES* (not very often) the walk returns a strange
result. The input parameter VarList contains a set of "malformed" Varbind
objects. Some fields are None!

You can see the same output in two different tentatives (OUTPUT 1 and 
OUTPUT 2):

I don't know if it's a problem of my multi-threading environment or not.
I have problems in reproducing the bug.

Thank you.





SOURCE CODE
-----------

def __my_snmpwalk(*args, **kargs):

    """ Just a modified version of netsnmp.snmpget """

    sess = netsnmp.Session(**kargs)
    if not sess.sess_ptr:
        raise SnmpWrapperInvalidHost("Unable to open snmp session with: 
%s" % kargs['DestHost'])
    
    if isinstance(args[0], netsnmp.client.VarList):
        var_list = args[0]
    else:
        var_list = netsnmp.VarList()
        
        for arg in args:
            if isinstance(arg, netsnmp.client.Varbind):
                var_list.append(arg)
            else:
                var_list.append(netsnmp.Varbind(arg))
    
    res = sess.walk(var_list)
    
    return res    


def varstr(vl):
    """ strings a VarList object """

    s = ''
    sep=''
    for v in vl:
        s += sep + str( (v.tag, str(v.iid), v.val) )
        sep = ','
    return s


def __do_walk(oid, host, port, community, timeout, retries,**options):
    res = None
    
    options['DestHost']   = host
    options['RemotePort'] = port
    options['Community']  = community
    options['Timeout']    = int(timeout * SNMP_ONE_SECOND)
    options['Retries']    = retries
    
    if not options.has_key('Version'):
        options['Version'] = SNMP_DEFAULT_VERSION
        
    options['UseNumeric'] = 1    # don not translate oids in return values!
    
    # netsnmp wants fully qualified, dotted-decimal, numeric OID
    if oid[0].isdigit():
        oid2 = '.' + oid
    else:
        oid2 = oid
    
    varlist = netsnmp.VarList( netsnmp.Varbind(oid2)  )
    
    values = __my_snmpwalk(varlist, **options)
    
    
    print "_do_walk() = ("
    print "%s [len=%s]" % (varstr(varlist), len(varlist))
    print ","
    print "%s [len=%s]" % (values, len(values))
    print ")"
    
    return (varlist, values)    

--------
OUTPUT 1
--------

_do_walk() = (
(None, 'None', '1') [len=1]
,
('1',) [len=1]
)

--------
OUTPUT 2
--------

_do_walk() = (
('.1.3.6.1.2.1.25.3.3.1.2', '768', '1') [len=1]
,
('1',) [len=1]
)


SNMPWALK COMMAND TEST
---------------------

This is what i get with the command line program:

    $ snmpwalk -On -v 1 -c public $HOST  1.3.6.1.2.1.25.3.3.1.2

    .1.3.6.1.2.1.25.3.3.1.2.768 = INTEGER: 1


------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables 
unlimited royalty-free distribution of the report engine 
for externally facing server and web deployment. 
http://p.sf.net/sfu/businessobjects
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.