- Rev'd to 1.0
- Added DebugSNMP option - fixed [ 1111284 ] Parameters not being set with AutoSpecify by changing around arg passing in new() and specify() - took out the bulkwalk_no for net-snmp 5.1 thing - fixed up the check for $INIT and $DEBUG so they don't have to be explicitly set in every subclass. - Fixed error detection when creating a new SNMP Session + Added L2::Foundry to device_type() + Added munge_i_up() to account for bug where IF-MIB and RFC1213-MIB data collide
This commit is contained in:
97
Info.pm
97
Info.pm
@@ -9,7 +9,7 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
package SNMP::Info;
|
package SNMP::Info;
|
||||||
$VERSION = '0.10';
|
$VERSION = 1.0;
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Exporter;
|
use Exporter;
|
||||||
@@ -29,7 +29,7 @@ SNMP::Info - Object Oriented Perl5 Interface to Network devices and MIBs through
|
|||||||
|
|
||||||
=head1 VERSION
|
=head1 VERSION
|
||||||
|
|
||||||
SNMP::Info - Version 0.10
|
SNMP::Info - Version 1.0
|
||||||
|
|
||||||
=head1 AUTHOR
|
=head1 AUTHOR
|
||||||
|
|
||||||
@@ -550,6 +550,12 @@ Prints Lots of debugging messages
|
|||||||
|
|
||||||
(default off)
|
(default off)
|
||||||
|
|
||||||
|
=item DebugSNMP
|
||||||
|
|
||||||
|
Set $SNMP::debugging level for Net-SNMP.
|
||||||
|
|
||||||
|
See L<SNMP> for more details.
|
||||||
|
|
||||||
=item MibDirs
|
=item MibDirs
|
||||||
|
|
||||||
Array ref to list of directories in which to look for MIBs. Note this will
|
Array ref to list of directories in which to look for MIBs. Note this will
|
||||||
@@ -603,6 +609,7 @@ sub new {
|
|||||||
my $proto = shift;
|
my $proto = shift;
|
||||||
my $class = ref($proto) || $proto;
|
my $class = ref($proto) || $proto;
|
||||||
my %args = @_;
|
my %args = @_;
|
||||||
|
my %sess_args = %args;
|
||||||
my $new_obj = {};
|
my $new_obj = {};
|
||||||
bless $new_obj,$class;
|
bless $new_obj,$class;
|
||||||
|
|
||||||
@@ -621,63 +628,69 @@ sub new {
|
|||||||
# SNMP::Info specific args :
|
# SNMP::Info specific args :
|
||||||
if (defined $args{Debug}){
|
if (defined $args{Debug}){
|
||||||
$new_obj->debug($args{Debug});
|
$new_obj->debug($args{Debug});
|
||||||
delete $args{Debug};
|
delete $sess_args{Debug};
|
||||||
} else {
|
} else {
|
||||||
$new_obj->debug($DEBUG);
|
$new_obj->debug(defined $DEBUG ? $DEBUG : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $args{DebugSNMP}){
|
||||||
|
$SNMP::debugging = $args{DebugSNMP};
|
||||||
|
delete $sess_args{DebugSNMP};
|
||||||
}
|
}
|
||||||
|
|
||||||
my $auto_specific = 0;
|
my $auto_specific = 0;
|
||||||
if (defined $args{AutoSpecify}){
|
if (defined $args{AutoSpecify}){
|
||||||
$auto_specific = $args{AutoSpecify} || 0;
|
$auto_specific = $args{AutoSpecify} || 0;
|
||||||
delete $args{AutoSpecify};
|
delete $sess_args{AutoSpecify};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (defined $args{BulkRepeaters}){
|
if (defined $args{BulkRepeaters}){
|
||||||
$new_obj->{BulkRepeaters} = $args{BulkRepeaters};
|
$new_obj->{BulkRepeaters} = $args{BulkRepeaters};
|
||||||
delete $args{BulkRepeaters};
|
delete $sess_args{BulkRepeaters};
|
||||||
}
|
}
|
||||||
|
|
||||||
# Net-SNMP 5.1.x has a bug in BULKWALK.
|
if (defined $args{BulkWalk}){
|
||||||
if ($SNMP::VERSION =~ /^5\.1\.\d/) {
|
|
||||||
$new_obj->{BulkWalk} = 0;
|
|
||||||
print "SNMP::Info::new() BULKWALK disabled because of bug in Net-SNMP 5.1.x. Upgrade Net-SNMP.\n"
|
|
||||||
if $new_obj->debug();
|
|
||||||
delete $args{BulkWalk} if exists $args{BulkWalk};
|
|
||||||
} elsif (defined $args{BulkWalk}){
|
|
||||||
$new_obj->{BulkWalk} = $args{BulkWalk};
|
$new_obj->{BulkWalk} = $args{BulkWalk};
|
||||||
delete $args{BulkWalk};
|
delete $sess_args{BulkWalk};
|
||||||
}
|
}
|
||||||
|
|
||||||
my $sess = undef;
|
my $sess = undef;
|
||||||
if (defined $args{Session}){
|
if (defined $args{Session}){
|
||||||
$sess = $args{Session};
|
$sess = $args{Session};
|
||||||
delete $args{Session};
|
delete $sess_args{Session};
|
||||||
}
|
}
|
||||||
if (defined $args{BigInt}){
|
if (defined $args{BigInt}){
|
||||||
$BIGINT = $args{BigInt};
|
$BIGINT = $args{BigInt};
|
||||||
delete $args{BigInt};
|
delete $sess_args{BigInt};
|
||||||
}
|
}
|
||||||
if (defined $args{MibDirs}){
|
if (defined $args{MibDirs}){
|
||||||
$new_obj->{mibdirs} = $args{MibDirs};
|
$new_obj->{mibdirs} = $args{MibDirs};
|
||||||
delete $args{MibDirs};
|
delete $sess_args{MibDirs};
|
||||||
}
|
|
||||||
|
|
||||||
# Initialize mibs if not done
|
|
||||||
my $init_ref = $new_obj->{init};
|
|
||||||
unless ( $$init_ref ) {
|
|
||||||
$new_obj->init();
|
|
||||||
$$init_ref=1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$new_obj->{nosuch} = $args{RetryNoSuch} || $NOSUCH;
|
$new_obj->{nosuch} = $args{RetryNoSuch} || $NOSUCH;
|
||||||
|
|
||||||
|
# Initialize mibs if not done
|
||||||
|
my $init_ref = $new_obj->{init};
|
||||||
|
unless ( defined $$init_ref and $$init_ref ) {
|
||||||
|
$new_obj->init();
|
||||||
|
$$init_ref=1;
|
||||||
|
}
|
||||||
|
|
||||||
# Connects to device unless open session is provided.
|
# Connects to device unless open session is provided.
|
||||||
$sess = new SNMP::Session( 'UseEnums' => 1, %args , 'RetryNoSuch' => $new_obj->{nosuch})
|
$sess = new SNMP::Session( 'UseEnums' => 1, %sess_args , 'RetryNoSuch' => $new_obj->{nosuch})
|
||||||
unless defined $sess;
|
unless defined $sess;
|
||||||
|
|
||||||
|
# No session object created
|
||||||
unless (defined $sess){
|
unless (defined $sess){
|
||||||
|
$new_obj->error_throw("SNMP::Info::new() Failed to Create Session. ");
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Session object created but SNMP connection failed.
|
||||||
my $sess_err = $sess->{ErrorStr} || '';
|
my $sess_err = $sess->{ErrorStr} || '';
|
||||||
$new_obj->error_throw("SNMP::Info::new() Failed to Create Session. $sess_err");
|
if ($sess_err){
|
||||||
|
$new_obj->error_throw("SNMP::Info::new() Net-SNMP session creation failed. $sess_err");
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -854,6 +867,9 @@ sub device_type {
|
|||||||
|
|
||||||
# Device Type Overrides
|
# Device Type Overrides
|
||||||
|
|
||||||
|
# Foundry EdgeIron,?
|
||||||
|
$objtype = 'SNMP::Info::Layer2::Foundry' if ($desc =~ /foundry/i);
|
||||||
|
|
||||||
# Catalyst 1900 series override
|
# Catalyst 1900 series override
|
||||||
$objtype = 'SNMP::Info::Layer2::C1900' if ($desc =~ /catalyst/i and $desc =~ /\D19\d{2}/);
|
$objtype = 'SNMP::Info::Layer2::C1900' if ($desc =~ /catalyst/i and $desc =~ /\D19\d{2}/);
|
||||||
|
|
||||||
@@ -996,8 +1012,7 @@ sub specify {
|
|||||||
|
|
||||||
my $args = $self->args();
|
my $args = $self->args();
|
||||||
my $session = $self->session();
|
my $session = $self->session();
|
||||||
my $sub_obj = $device_type->new(%$args,'Session'=>$session);
|
my $sub_obj = $device_type->new(%$args,'Session'=>$session,'AutoSpecify' => 0);
|
||||||
$sub_obj->debug($self->debug());
|
|
||||||
|
|
||||||
unless (defined $sub_obj) {
|
unless (defined $sub_obj) {
|
||||||
$self->error_throw("SNMP::Info::specify() - Could not connect with new class ($device_type)");
|
$self->error_throw("SNMP::Info::specify() - Could not connect with new class ($device_type)");
|
||||||
@@ -1590,7 +1605,9 @@ that the MIB is present and has loaded correctly.
|
|||||||
$info->init() will throw an exception if a MIB does not load.
|
$info->init() will throw an exception if a MIB does not load.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
%MIBS = ('RFC1213-MIB' => 'sysName');
|
%MIBS = (
|
||||||
|
'RFC1213-MIB' => 'sysName',
|
||||||
|
);
|
||||||
|
|
||||||
=item %MUNGE
|
=item %MUNGE
|
||||||
|
|
||||||
@@ -1619,6 +1636,7 @@ Sample %MUNGE:
|
|||||||
'i_pkts_multi_out64' => \&munge_counter64,
|
'i_pkts_multi_out64' => \&munge_counter64,
|
||||||
'i_pkts_bcast_in64' => \&munge_counter64,
|
'i_pkts_bcast_in64' => \&munge_counter64,
|
||||||
'i_pkts_bcast_out64' => \&munge_counter64,
|
'i_pkts_bcast_out64' => \&munge_counter64,
|
||||||
|
'i_up' => \&munge_i_up,
|
||||||
);
|
);
|
||||||
|
|
||||||
=back
|
=back
|
||||||
@@ -1929,6 +1947,26 @@ sub munge_counter64 {
|
|||||||
return $bigint;
|
return $bigint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=item munge_i_up
|
||||||
|
|
||||||
|
There is a collision between data in IF-MIB and RFC-1213.
|
||||||
|
For devices that fully implement IF-MIB it might return 7 for
|
||||||
|
a port that is down. This munges the data against the IF-MIB
|
||||||
|
by hand.
|
||||||
|
|
||||||
|
TODO: Get the precidence of MIBs and overriding of MIB data in Net-SNMP
|
||||||
|
figured out. Heirarchy/precendence of MIBS in SNMP::Info.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
sub munge_i_up {
|
||||||
|
my $i_up = shift;
|
||||||
|
return unless defined $i_up;
|
||||||
|
|
||||||
|
$i_up = 'down' if $i_up eq '7';
|
||||||
|
|
||||||
|
return $i_up;
|
||||||
|
}
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head2 Internaly Used Functions
|
=head2 Internaly Used Functions
|
||||||
@@ -1969,6 +2007,7 @@ sub init {
|
|||||||
my $mibs = $self->mibs();
|
my $mibs = $self->mibs();
|
||||||
|
|
||||||
foreach my $mib (keys %$mibs){
|
foreach my $mib (keys %$mibs){
|
||||||
|
#print "SNMP::Info::init() - Loading mib:$mib\n" if $self->debug();
|
||||||
&SNMP::loadModules("$mib");
|
&SNMP::loadModules("$mib");
|
||||||
|
|
||||||
unless (defined $SNMP::MIB{$mibs->{$mib}}){
|
unless (defined $SNMP::MIB{$mibs->{$mib}}){
|
||||||
|
|||||||
Reference in New Issue
Block a user