On Tue, Dec 21, 2004 at 09:45:03AM -0700, Jim wrote:
> Rob Bloodgood wrote:
> > That being said: it sounds like you're issuing 4 different OID requests.  
> > It also sounds like you're 
> > creating a session per VLAN.
> > 
> > You ONLY create a session per VLAN *if* each VLAN has a different IP 
> > address.  Otherwise you simply send 
> > another request to your main SNMP component instance.
> 
> Each vlan has the same IP, but a different community string; is that 
> sufficient for the factory to create a new session?
> 
> I know that sounds odd, but to get an OID (e.g .1.3.6.1.2.1.17.4.3.1.2 
> to get a list of bridge ports) for vlan 321, one uses "[EMAIL PROTECTED]" as 
> the comstring (our comstring isn't "public" but you get the idea).

Did I mention I wasn't an SNMP expert? :-)
Yes, you do need a different component for each community string as well.
 
> > As far as the OID requests, you should be able to ask for all 4 in one 
> > query (unless, of course, they're 
> > all on different hosts).  If you can't, or you're dealing with async 
> > issues, I've solved this type of 
> > situation by creating a little object class that has placeholders for each 
> > expected response, and an 
> > is_done() method that returns true when all placeholders are filled (and be 
> > sure to code that an error 
> > counts as filling the correct slot for that request's answer).
> > 
> > Once you get your is_done() running true, and you're finished with said 
> > host, you can then shut down the 
> > component instance for that host if your program isn't a long-running 
> > daemon.
> 
> An important detail that I left out is that I'm using "walk" to get the 
> entire table. As Net::SNMP::get_table doesn't look for array references 
> as the value of -basoid, I can't get it in one request.

As far as I know, the trick with walk is to simply detect when your answer 
changes OID's, like
0.0.0.0.0.1.0
0.0.0.0.0.1.1
0.0.0.0.0.1.2
0.0.0.0.0.1.3
0.0.0.0.0.1.4
0.0.0.0.0.2.0 # this one is your "last", so stop reading, you have your whole 
answer.

 
> I just switched to getbulk as the related get_bulk_request() seems to 
> support an OID list, but my test switch isn't responding correctly. I'll 
> need to fiddle with that...

PoCo::SNMP is a thin wrapper over Net::SNMP.  So whatever's supported in 
Net::SNMP should work 
essentially according to the docs.  HOWEVER the test(s) might be incomplete or 
inaccurate.  Let me know 
if you find a weakness in the implementation.  Or let me know if you find the 
answer.

> Have you released the class that implements is_done()? I don't imagine 
> it's too difficult, but I'm lazy... :-)

Here's a snippet, from my module.  There are of course other methods but here's 
everything that pertains 
to the is_done() functionality:

=============================

# make an entry per request
sub _init {
    my $self = shift;
    $self->{ _s } = { 'request1' => undef,
                      'request2' => undef,
                      'request3' => undef,
                    };
    $self;
}

# keys of available requests
sub requests {
    my $self = shift;
    keys %{$self->{_s}};
}

# assign a defined result to a request
sub finish {
    my $self = shift;
    my ($s, $arg) = @_;
    $self->{_s}{$s} = $arg;
}

# does the request have a defined result?
sub has_finished {
    my $self = shift;
    defined $self->{_s}{ +shift };
}

# returns true if there are no remaining requests that are not finished
sub is_done {
    my $self = shift;
    0 == scalar grep { ! $self->has_finished($_) } $self->requests
}

=============================

Hope this helps!

L8r,
Rob

Reply via email to