Re: how to inject global handler that handles request to any OID?

Fulko Hew <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <CAGuV3hNk6Sz39eZwxS0Wks_yg69JzFzOD5nyPN8o0-1WM4iqMQ@mail.gmail.com>
On Tue, Dec 4, 2012 at 11:08 AM, STOTTS Timothy <
[email protected]> wrote:

> How can I do the following?
>
> 1. create a handler registration for the top OID of:
> const oid top_oid[] = { 1 };
> const size_t top_oid_len = OID_LENGTH(top_oid);
>
> 2. inject the handler such that any GET, SET, GETBULK (any USM
> authenticated access at all) of any node under the subtree of the top OID
> will call a function I specify
>
> 3. the handler function will have access to a value in memory that
> represents the IP address of the SNMP manager that is calling this SNMP
> agent as multiple managers/browsers will be accessing the device, and a
> decision must be made based on IP address
>

I seem to recall looking into getting the source IP address of the
originating manager
and concluding that the information is not currently available at this
level of messaging/API.
But,

... snip ...

I had to do this (sortof) in my (Perl based) SNMP network simulator.

NOTE, this is not an 'injector' as you are asking about,
but a complete replacement handler for any OIDs (which was what _I_ needed).

What I found was that I couldn't register the 'top OID' of '1'
but what I could do was register for each of the next levels down.
This isn't really a problem because your probably only interested in '1.3'.


My Perl snippet is below,
I hope it helps you, or gives you ideas.

Fulko



use NetSNMP::OID    (':all');
use NetSNMP::agent  (':all');
use NetSNMP::ASN    (':all');

my $oidId = '1.0';                                       # start at the top
of the ISO tree...
while (1) {
    $oid = getNextOidById($oidId) if (!defined($oid));   # look for the
'next known' OID/variable (it may be in another sub-tree)
    last unless defined($oid);                           # we're done
searching if nothing was found
    last unless (my ($suboid) = ($oid =~ /^1\.(\d*)/));  # also done if we
leave the '1.x' tree, else extract the 'x' part of the OID
    $oidId = "1.$suboid";                                # build a new base
OID based on the sub-tree ID we found something in
    my $regoid = new NetSNMP::OID(".$oidId");            # note that we
have to prepend a leading dot onto the OID
    $agent->register($0, $regoid, \&my_snmp_handler);    # in order to
register to receive transactions for that sub-tree
    print STDERR "Simulating OID sub-tree: $oidId\n";
    $suboid++;                                           # bump to the next
potential sub-tree after the one we found
    $oidId = "1.$suboid";                                # and make a new
top node
}

sub my_snmp_handler {
    my ($handler, $registration_info, $request_info, $requests) = @_;

    my $targetIp = inet_ntoa($request_info->getTargetIp());
    for (my $request = $requests; $request; $request = $request->next()) {
# loop over each component of the request
        simulate($targetIp, $request_info, $request);
# and pass it to the simulator
    }
}

    # the simulator is invoked with:
    #   the address of the simulated host,
    #   the SNMP operation (get, getnext, etc.)
    #   the request object

sub simulate {
    my ($targetIp, $request_info, $request) = @_;

    my $mode = $request_info->getMode();
    my $oid = $request->getOID();
    $oid =~ s/^ccitt\.//;               # 'iso' comes in as 'ccitt.1', so
we need to strip off the front part and leave the '.1' behind
    $oid =~ s/^iso/1/;                  # and then... replace the 'iso' at
the front of the OID with its numeric value

    if ($mode != MODE_GET && $mode != MODE_GETNEXT ) {
        print "Unsupported Operation - $mode\n";
        $request->setError($request_info, SNMP_ERR_GENERR);   # return the
'genErr' error
        return;
    }
    ...
    $request->setValue($type, $value);          # return the appropriate
value and type
    ...
    if ($mode == MODE_GETNEXT) {                # during getnext's only...
        $request->setOID(find_next_oid...());   # replace the pre-filled-in
response OID with
    }                                           # whatever we determine the
'next' one should be
}

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d

_______________________________________________
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.