I noticed later on that the output format for the variable values had changed
to the equivalent of “-OQUt” (see snmpcmd man page), and the variable names are
formatted as for “-Os” (leaf name without module id). Sure enough, if I run
"sudo snmptrapd -OQUts -Le -f -m ALL” then I consistently get the same output:-
———————————————————————————————————————————
2014-12-04 08:56:05 localhost [UDP: [127.0.0.1]:42028->[127.0.0.1]:162]:
sysUpTimeInstance = 5717369 snmpTrapOID.0 = coldStart sysLocation.0 =
Just here
*** trap receiver ***
VARBINDS:
sysUpTimeInstance = 5717369 (67)
snmpTrapOID.0 = coldStart (6)
sysLocation.0 = "Just here" (4)
SNMP::MIB info for VARBINDS:
sysUpTimeInstance has no instance index
snmpTrapOID.0 parent label = snmpTrapOID
sysLocation.0 parent label = sysLocation
———————————————————————————————————————————
What’s more, if I change the command line to "sudo snmptrapd -OQUtn -Le -f -m
ALL” to output numeric OIDs and send in 2 traps then the bug is even more
apparent:-
———————————————————————————————————————————
2014-12-04 09:00:18 localhost [UDP: [127.0.0.1]:50081->[127.0.0.1]:162]:
.1.3.6.1.2.1.1.3.0 = 5742652 .1.3.6.1.6.3.1.1.4.1.0 = .1.3.6.1.6.3.1.1.5.1
.1.3.6.1.2.1.1.6.0 = Just here
*** trap receiver ***
VARBINDS:
.1.3.6.1.2.1.1.3.0 = 5742652 (67)
.1.3.6.1.6.3.1.1.4.1.0 = .1.3.6.1.6.3.1.1.5.1 (6)
.1.3.6.1.2.1.1.6.0 = "Just here" (4)
SNMP::MIB info for VARBINDS:
.1.3.6.1.2.1.1.3.0 parent label = sysUpTime
snmpTrapOID.0 parent label = snmpTrapOID
sysLocation.0 parent label = sysLocation
perl callback function 0x9bc3eb8 returns 1
2014-12-04 09:00:22 localhost [UDP: [127.0.0.1]:58763->[127.0.0.1]:162]:
sysUpTimeInstance = 5743117 snmpTrapOID.0 = coldStart sysLocation.0 =
Just here
*** trap receiver ***
VARBINDS:
sysUpTimeInstance = 5743117 (67)
snmpTrapOID.0 = coldStart (6)
sysLocation.0 = "Just here" (4)
SNMP::MIB info for VARBINDS:
sysUpTimeInstance has no instance index
snmpTrapOID.0 parent label = snmpTrapOID
sysLocation.0 parent label = sysLocation
perl callback function 0x9bc3eb8 returns 1
———————————————————————————————————————————
I get numeric OIDs up to the point where $SNMP::MIB{$oid}->{parent} gets called
for the first time, then after that I get textual leaf-only OIDs. This affects
the trap daemons own output logging as well as what’s coming from Perl.
So it’s pretty certain that using %SNMP::MIB affects the output flags for the
underlying SNMP session. The problem is that I’m running in the context of
NetSNMP::TrapReceiver so there’s no session object for me to examine - I guess
that’s hidden in the guts of the implementation.
Perhaps %SNMP::MIB is only designed to be used in the context of an SNMP agent
(or at least has only been tested there). Or maybe the problem is that I
haven’t called SNMP::session->new before attempting to use %SNMP::MIB.
Kevin
> On 3 Dec 2014, at 23:21, Kevin Broadey <[email protected]> wrote:
>
> This is weird. Probably best if I just show you what I did, what I saw, and
> what I expected to see…
>
> I’m running an Ubuntu 14.04 LTS server with Net-SNMP version 5.7.2. I’ve
> also installed Lubuntu desktop to give me a lightweight GUI environment.
>
> My /etc/snmp/snmptrapd.conf file contains this:-
> ——————————————————————————————————————————
> authCommunity log,execute,net public
> perl do "/usr/share/snmp/traphandlers/default_handler.pl";
> ——————————————————————————————————————————
>
> and the default_handler.pl file contains this:-
> ——————————————————————————————————————————
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> use SNMP;
>
> sub trap_receiver {
> my ($pdu, $vars) = @_;
>
> print "VARBINDS:\n";
>
> foreach (@{$vars}) {
> my ($oid, $value, $type) = @$_;
> print "$oid = $value ($type)\n";
> }
>
> print "\nSNMP::MIB info for VARBINDS:\n";
>
> foreach (@{$vars}) {
> my ($oid, $value, $type) = @$_;
>
> if ($oid =~ /^(.*)\.[0-9]+$/) {
> print "$oid parent label = $SNMP::MIB{$1}->{label}\n";
> } else {
> print "$oid has no instance index\n";
> }
> }
>
> return NETSNMPTRAPD_HANDLER_OK;
> }
>
> unless (NetSNMP::TrapReceiver::register("all", \&trap_receiver)) {
> warn "Failed to register default Perl traphandler\n";
> } else {
> warn "Registered default Perl traphandler\n";
> }
> ——————————————————————————————————————————
>
> now I run “sudo snmptrapd -Le -f -m ALL” to get the trap daemon running in
> test mode (it isn’t running from init) and then inject a test trap with
> “snmptrap -v 2c -c public localhost '' SNMPv2-MIB::coldStart
> SNMPv2-MIB::sysLocation.0 s 'Just here’” from a separate terminal window.
>
> Here’s the output I get:-
> ——————————————————————————————————————————
> 2014-12-03 22:57:32 localhost [UDP: [127.0.0.1]:44173->[127.0.0.1]:162]:
> DISMAN-EXPRESSION-MIB::sysUpTimeInstance = Timeticks: (2677185) 7:26:11.85
> SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-MIB::coldStart
> SNMPv2-MIB::sysLocation.0 = STRING: Just here
> VARBINDS:
> DISMAN-EXPRESSION-MIB::sysUpTimeInstance = Timeticks: (2677185) 7:26:11.85
> (67)
> SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-MIB::coldStart (6)
> SNMPv2-MIB::sysLocation.0 = STRING: "Just here" (4)
>
> SNMP::MIB info for VARBINDS:
> DISMAN-EXPRESSION-MIB::sysUpTimeInstance has no instance index
> SNMPv2-MIB::snmpTrapOID.0 parent label = snmpTrapOID
> sysLocation.0 parent label = sysLocation
> perl callback function 0x882ee04 returns 1
> ——————————————————————————————————————————
>
> Everything looks okay, with the stuff from my Perl script matching what’s
> come from SNMP’s built-in logging, except that "sysLocation.0” is missing its
> "SNMPv2-MIB::” module id on the line before last. This is the weird thing.
> What caused the stringification of the blessed OID object to change?
>
> Leaving snmptrapd running, run the snmptrap command again to inject exactly
> the same trap message. This time the output is:-
> ——————————————————————————————————————————
> 2014-12-03 23:06:35 localhost [UDP: [127.0.0.1]:37609->[127.0.0.1]:162]:
> sysUpTimeInstance 0:7:35:14.59 snmpTrapOID.0 coldStart sysLocation.0
> Just here
> VARBINDS:
> sysUpTimeInstance = 0:7:35:14.59 (67)
> snmpTrapOID.0 = coldStart (6)
> sysLocation.0 = "Just here" (4)
>
> SNMP::MIB info for VARBINDS:
> sysUpTimeInstance has no instance index
> snmpTrapOID.0 parent label = snmpTrapOID
> sysLocation.0 parent label = sysLocation
> perl callback function 0x882ee04 returns 1
>
> ——————————————————————————————————————————
>
> This time around the module name is missing from the snmptrapd standard
> logging as well as from ALL the Perl script output, so the problem is deeper
> than the Perl layer. Somehow, accessing %SNMP::MIB has affected the
> underlying Net-SNMP C library.
>
> The line that causes the damage is 'print "$oid parent label =
> $SNMP::MIB{$1}->{label}\n”;’ when called for SNMPv2-MIB::snmpTrapOID.0, which
> is the very first time the tied hash is called, so something in the code from
> that point changes the setting that tells the library whether to include the
> module id in the OID name.
>
> Can someone please give this a try and tell the list whether you can
> reproduce my observations? Can someone tell me what to do to avoid this
> behaviour? As you can imagine, this is seriously hampering my trap handler
> development as my callback function needs the module name and oid for each
> varbind in the trap message in order to correctly process it.
>
> Many thanks for your help!
> Kevin
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
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