2085 lines
86 KiB
Perl
2085 lines
86 KiB
Perl
package GLPlugin::SNMP;
|
|
our @ISA = qw(GLPlugin);
|
|
|
|
use strict;
|
|
use File::Basename;
|
|
use Digest::MD5 qw(md5_hex);
|
|
use Data::Dumper;
|
|
use AutoLoader;
|
|
our $AUTOLOAD;
|
|
|
|
use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 };
|
|
|
|
{
|
|
our $mode = undef;
|
|
our $plugin = undef;
|
|
our $blacklist = undef;
|
|
our $session = undef;
|
|
our $rawdata = {};
|
|
our $tablecache = {};
|
|
our $info = [];
|
|
our $extendedinfo = [];
|
|
our $summary = [];
|
|
our $oidtrace = [];
|
|
our $uptime = 0;
|
|
}
|
|
|
|
sub v2tov3 {
|
|
my $self = shift;
|
|
if ($self->opts->community && $self->opts->community =~ /^snmpv3(.)(.+)/) {
|
|
my $separator = $1;
|
|
my ($authprotocol, $authpassword, $privprotocol, $privpassword,
|
|
$username, $contextengineid, $contextname) = split(/$separator/, $2);
|
|
$self->override_opt('authprotocol', $authprotocol)
|
|
if defined($authprotocol) && $authprotocol;
|
|
$self->override_opt('authpassword', $authpassword)
|
|
if defined($authpassword) && $authpassword;
|
|
$self->override_opt('privprotocol', $privprotocol)
|
|
if defined($privprotocol) && $privprotocol;
|
|
$self->override_opt('privpassword', $privpassword)
|
|
if defined($privpassword) && $privpassword;
|
|
$self->override_opt('username', $username)
|
|
if defined($username) && $username;
|
|
$self->override_opt('contextengineid', $contextengineid)
|
|
if defined($contextengineid) && $contextengineid;
|
|
$self->override_opt('contextname', $contextname)
|
|
if defined($contextname) && $contextname;
|
|
$self->override_opt('protocol', '3') ;
|
|
}
|
|
if (($self->opts->authpassword || $self->opts->authprotocol ||
|
|
$self->opts->privpassword || $self->opts->privprotocol) &&
|
|
! $self->opts->protocol eq '3') {
|
|
$self->override_opt('protocol', '3') ;
|
|
}
|
|
}
|
|
|
|
sub add_snmp_args {
|
|
my $self = shift;
|
|
$self->add_arg(
|
|
spec => 'port=i',
|
|
help => '--port
|
|
The SNMP port to use (default: 161)',
|
|
required => 0,
|
|
default => 161,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'domain=s',
|
|
help => '--domain
|
|
The transport domain to use (default: udp/ipv4, other possible values: udp6, udp/ipv6, tcp, tcp4, tcp/ipv4, tcp6, tcp/ipv6)',
|
|
required => 0,
|
|
default => 'udp',
|
|
);
|
|
$self->add_arg(
|
|
spec => 'protocol|P=s',
|
|
help => '--protocol
|
|
The SNMP protocol to use (default: 2c, other possibilities: 1,3)',
|
|
required => 0,
|
|
default => '2c',
|
|
);
|
|
$self->add_arg(
|
|
spec => 'community|C=s',
|
|
help => '--community
|
|
SNMP community of the server (SNMP v1/2 only)',
|
|
required => 0,
|
|
default => 'public',
|
|
);
|
|
$self->add_arg(
|
|
spec => 'username:s',
|
|
help => '--username
|
|
The securityName for the USM security model (SNMPv3 only)',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'authpassword:s',
|
|
help => '--authpassword
|
|
The authentication password for SNMPv3',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'authprotocol:s',
|
|
help => '--authprotocol
|
|
The authentication protocol for SNMPv3 (md5|sha)',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'privpassword:s',
|
|
help => '--privpassword
|
|
The password for authPriv security level',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'privprotocol=s',
|
|
help => '--privprotocol
|
|
The private protocol for SNMPv3 (des|aes|aes128|3des|3desde)',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'contextengineid=s',
|
|
help => '--contextengineid
|
|
The context engine id for SNMPv3 (10 to 64 hex characters)',
|
|
required => 0,
|
|
);
|
|
$self->add_arg(
|
|
spec => 'contextname=s',
|
|
help => '--contextname
|
|
The context name for SNMPv3 (empty represents the "default" context)',
|
|
required => 0,
|
|
);
|
|
}
|
|
|
|
sub validate_args {
|
|
my $self = shift;
|
|
$self->SUPER::validate_args();
|
|
if ($self->opts->mode eq 'walk') {
|
|
if ($self->opts->snmpwalk && $self->opts->hostname) {
|
|
if ($self->check_messages == CRITICAL) {
|
|
# gemecker vom super-validierer, der sicherstellt, dass die datei
|
|
# snmpwalk existiert. in diesem fall wird sie aber erst neu angelegt,
|
|
# also schnauze.
|
|
my ($code, $message) = $self->check_messages;
|
|
if ($message eq sprintf("file %s not found", $self->opts->snmpwalk)) {
|
|
$self->clear_critical;
|
|
}
|
|
}
|
|
# snmp agent wird abgefragt, die ergebnisse landen in einem file
|
|
# opts->snmpwalk ist der filename. da sich die ganzen get_snmp_table/object-aufrufe
|
|
# an das walkfile statt an den agenten halten wuerden, muss opts->snmpwalk geloescht
|
|
# werden. stattdessen wird opts->snmpdump als traeger des dateinamens mitgegeben.
|
|
# nur sinnvoll mit mode=walk
|
|
$self->create_opt('snmpdump');
|
|
$self->override_opt('snmpdump', $self->opts->snmpwalk);
|
|
$self->override_opt('snmpwalk', undef);
|
|
} elsif (! $self->opts->snmpwalk && $self->opts->hostname && $self->opts->mode eq 'walk') {
|
|
# snmp agent wird abgefragt, die ergebnisse landen in einem file, dessen name
|
|
# nicht vorgegeben ist
|
|
$self->create_opt('snmpdump');
|
|
}
|
|
} else {
|
|
if ($self->opts->snmpwalk && ! $self->opts->hostname) {
|
|
# normaler aufruf, mode != walk, oid-quelle ist eine datei
|
|
$self->override_opt('hostname', 'snmpwalk.file'.md5_hex($self->opts->snmpwalk))
|
|
} elsif ($self->opts->snmpwalk && $self->opts->hostname) {
|
|
# snmpwalk hat vorrang
|
|
$self->override_opt('hostname', undef);
|
|
}
|
|
}
|
|
}
|
|
|
|
sub init {
|
|
my $self = shift;
|
|
if ($self->mode =~ /device::walk/) {
|
|
my @trees = ();
|
|
my $name = $0;
|
|
$name =~ s/.*\///g;
|
|
$name = sprintf "/tmp/snmpwalk_%s_%s", $name, $self->opts->hostname;
|
|
if ($self->opts->oids) {
|
|
# create pid filename
|
|
# already running?;x
|
|
@trees = split(",", $self->opts->oids);
|
|
|
|
} elsif ($self->can("trees")) {
|
|
@trees = $self->trees;
|
|
push(@trees, "1.3.6.1.2.1.1");
|
|
} else {
|
|
@trees = ("1.3.6.1.2.1", "1.3.6.1.4.1");
|
|
}
|
|
if ($self->opts->snmpdump) {
|
|
$name = $self->opts->snmpdump;
|
|
}
|
|
if (defined $self->opts->offline) {
|
|
$self->{pidfile} = $name.".pid";
|
|
if (! $self->check_pidfile()) {
|
|
$self->debug("Exiting because another walk is already running");
|
|
printf STDERR "Exiting because another walk is already running\n";
|
|
exit 3;
|
|
}
|
|
$self->write_pidfile();
|
|
my $timedout = 0;
|
|
my $snmpwalkpid = 0;
|
|
$SIG{'ALRM'} = sub {
|
|
$timedout = 1;
|
|
printf "UNKNOWN - %s timed out after %d seconds\n",
|
|
$GLPlugin::plugin->{name}, $self->opts->timeout;
|
|
kill 9, $snmpwalkpid;
|
|
};
|
|
alarm($self->opts->timeout);
|
|
unlink $name.".partial";
|
|
while (! $timedout && @trees) {
|
|
my $tree = shift @trees;
|
|
$SIG{CHLD} = 'IGNORE';
|
|
my $cmd = sprintf "snmpwalk -ObentU -v%s -c %s %s %s >> %s",
|
|
$self->opts->protocol,
|
|
$self->opts->community,
|
|
$self->opts->hostname,
|
|
$tree, $name.".partial";
|
|
$self->debug($cmd);
|
|
$snmpwalkpid = fork;
|
|
if (not $snmpwalkpid) {
|
|
exec($cmd);
|
|
} else {
|
|
wait();
|
|
}
|
|
}
|
|
rename $name.".partial", $name if ! $timedout;
|
|
-f $self->{pidfile} && unlink $self->{pidfile};
|
|
if ($timedout) {
|
|
printf "CRITICAL - timeout. There are still %d snmpwalks left\n", scalar(@trees);
|
|
exit 3;
|
|
} else {
|
|
printf "OK - all requested oids are in %s\n", $name;
|
|
}
|
|
} else {
|
|
printf "rm -f %s\n", $name;
|
|
foreach (@trees) {
|
|
printf "snmpwalk -ObentU -v%s -c %s %s %s >> %s\n",
|
|
$self->opts->protocol,
|
|
$self->opts->community,
|
|
$self->opts->hostname,
|
|
$_, $name;
|
|
}
|
|
}
|
|
exit 0;
|
|
} elsif ($self->mode =~ /device::uptime/) {
|
|
$self->add_info(sprintf 'device is up since %s',
|
|
$self->human_timeticks($self->{uptime}));
|
|
$self->set_thresholds(warning => '15:', critical => '5:');
|
|
$self->add_message($self->check_thresholds($self->{uptime} / 60));
|
|
$self->add_perfdata(
|
|
label => 'uptime',
|
|
value => $self->{uptime} / 60,
|
|
places => 0,
|
|
);
|
|
my ($code, $message) = $self->check_messages(join => ', ', join_all => ', ');
|
|
$GLPlugin::plugin->nagios_exit($code, $message);
|
|
} elsif ($self->mode =~ /device::supportedmibs/) {
|
|
our $mibdepot = [];
|
|
my $unknowns = {};
|
|
my @outputlist = ();
|
|
%{$unknowns} = %{$self->rawdata};
|
|
if ($self->opts->name && -f $self->opts->name) {
|
|
eval { require $self->opts->name };
|
|
$self->add_critical($@) if $@;
|
|
} elsif ($self->opts->name && ! -f $self->opts->name) {
|
|
$self->add_unknown("where is --name mibdepotfile?");
|
|
}
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.60', 'ietf', 'v2', 'ACCOUNTING-CONTROL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.238', 'ietf', 'v2', 'ADSL2-LINE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.238.2', 'ietf', 'v2', 'ADSL2-LINE-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.94.3', 'ietf', 'v2', 'ADSL-LINE-EXT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.94', 'ietf', 'v2', 'ADSL-LINE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.94.2', 'ietf', 'v2', 'ADSL-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.74', 'ietf', 'v2', 'AGENTX-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.123', 'ietf', 'v2', 'AGGREGATE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.118', 'ietf', 'v2', 'ALARM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.23', 'ietf', 'v2', 'APM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.3', 'ietf', 'v2', 'APPC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.13.1', 'ietf', 'v1', 'APPLETALK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.27', 'ietf', 'v2', 'APPLICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.62', 'ietf', 'v2', 'APPLICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.5', 'ietf', 'v2', 'APPN-DLUR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.4', 'ietf', 'v2', 'APPN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.4', 'ietf', 'v2', 'APPN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.4.0', 'ietf', 'v2', 'APPN-TRAP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.49', 'ietf', 'v2', 'APS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.117', 'ietf', 'v2', 'ARC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.37.1.14', 'ietf', 'v2', 'ATM2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.59', 'ietf', 'v2', 'ATM-ACCOUNTING-INFORMATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.37', 'ietf', 'v2', 'ATM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.37', 'ietf', 'v2', 'ATM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.37.3', 'ietf', 'v2', 'ATM-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.15', 'ietf', 'v2', 'BGP4-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.15', 'ietf', 'v2', 'BGP4-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.122', 'ietf', 'v2', 'BLDG-HVAC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17.1', 'ietf', 'v1', 'BRIDGE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17', 'ietf', 'v2', 'BRIDGE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.19', 'ietf', 'v2', 'CHARACTER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.94', 'ietf', 'v2', 'CIRCUIT-IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.1.1', 'ietf', 'v1', 'CLNS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.1.1', 'ietf', 'v1', 'CLNS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.132', 'ietf', 'v2', 'COFFEE-POT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.89', 'ietf', 'v2', 'COPS-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.18.1', 'ietf', 'v1', 'DECNET-PHIV-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.21', 'ietf', 'v2', 'DIAL-CONTROL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.108', 'ietf', 'v2', 'DIFFSERV-CONFIG-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.97', 'ietf', 'v2', 'DIFFSERV-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.66', 'ietf', 'v2', 'DIRECTORY-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.88', 'ietf', 'v2', 'DISMAN-EVENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.90', 'ietf', 'v2', 'DISMAN-EXPRESSION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.82', 'ietf', 'v2', 'DISMAN-NSLOOKUP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.82', 'ietf', 'v2', 'DISMAN-NSLOOKUP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.80', 'ietf', 'v2', 'DISMAN-PING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.80', 'ietf', 'v2', 'DISMAN-PING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.63', 'ietf', 'v2', 'DISMAN-SCHEDULE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.63', 'ietf', 'v2', 'DISMAN-SCHEDULE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.64', 'ietf', 'v2', 'DISMAN-SCRIPT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.64', 'ietf', 'v2', 'DISMAN-SCRIPT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.81', 'ietf', 'v2', 'DISMAN-TRACEROUTE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.81', 'ietf', 'v2', 'DISMAN-TRACEROUTE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.46', 'ietf', 'v2', 'DLSW-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.32.2', 'ietf', 'v2', 'DNS-RESOLVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.32.1', 'ietf', 'v2', 'DNS-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.127.5', 'ietf', 'v2', 'DOCS-BPI-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.69', 'ietf', 'v2', 'DOCS-CABLE-DEVICE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.69', 'ietf', 'v2', 'DOCS-CABLE-DEVICE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.126', 'ietf', 'v2', 'DOCS-IETF-BPI2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.132', 'ietf', 'v2', 'DOCS-IETF-CABLE-DEVICE-NOTIFICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.127', 'ietf', 'v2', 'DOCS-IETF-QOS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.125', 'ietf', 'v2', 'DOCS-IETF-SUBMGT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.127', 'ietf', 'v2', 'DOCS-IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.127', 'ietf', 'v2', 'DOCS-IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.45', 'ietf', 'v2', 'DOT12-IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.53', 'ietf', 'v2', 'DOT12-RPTR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.155', 'ietf', 'v2', 'DOT3-EPON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.158', 'ietf', 'v2', 'DOT3-OAM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.2.2.1.1', 'ietf', 'v1', 'DPI20-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.82', 'ietf', 'v2', 'DS0BUNDLE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.81', 'ietf', 'v2', 'DS0-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.18', 'ietf', 'v2', 'DS1-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.18', 'ietf', 'v2', 'DS1-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.18', 'ietf', 'v2', 'DS1-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.30', 'ietf', 'v2', 'DS3-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.30', 'ietf', 'v2', 'DS3-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.29', 'ietf', 'v2', 'DSA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.26', 'ietf', 'v2', 'DSMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.7', 'ietf', 'v2', 'EBN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.167', 'ietf', 'v2', 'EFM-CU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.47', 'ietf', 'v2', 'ENTITY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.47', 'ietf', 'v2', 'ENTITY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.47', 'ietf', 'v2', 'ENTITY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.99', 'ietf', 'v2', 'ENTITY-SENSOR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.131', 'ietf', 'v2', 'ENTITY-STATE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.130', 'ietf', 'v2', 'ENTITY-STATE-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.70', 'ietf', 'v2', 'ETHER-CHIPSET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.7', 'ietf', 'v1', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.7', 'ietf', 'v1', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.35', 'ietf', 'v2', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.35', 'ietf', 'v2', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.35', 'ietf', 'v2', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.35', 'ietf', 'v2', 'EtherLike-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.224', 'ietf', 'v2', 'FCIP-MGMT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.56', 'ietf', 'v2', 'FC-MGMT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.15.73.1', 'ietf', 'v1', 'FDDI-SMT73-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.75', 'ietf', 'v2', 'FIBRE-CHANNEL-FE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.111', 'ietf', 'v2', 'Finisher-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.40', 'ietf', 'v2', 'FLOW-METER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.40', 'ietf', 'v2', 'FLOW-METER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.32', 'ietf', 'v2', 'FRAME-RELAY-DTE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.86', 'ietf', 'v2', 'FR-ATM-PVC-SERVICE-IWF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.47', 'ietf', 'v2', 'FR-MFR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.44', 'ietf', 'v2', 'FRNETSERV-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.44', 'ietf', 'v2', 'FRNETSERV-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.44', 'ietf', 'v2', 'FRNETSERV-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.95', 'ietf', 'v2', 'FRSLD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.16', 'ietf', 'v2', 'GMPLS-LABEL-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.15', 'ietf', 'v2', 'GMPLS-LSR-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.12', 'ietf', 'v2', 'GMPLS-TC-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.13', 'ietf', 'v2', 'GMPLS-TE-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.98', 'ietf', 'v2', 'GSMP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.29', 'ietf', 'v2', 'HC-ALARM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.107', 'ietf', 'v2', 'HC-PerfHist-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.20.5', 'ietf', 'v2', 'HC-RMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.25.1', 'ietf', 'v1', 'HOST-RESOURCES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.25.7.1', 'ietf', 'v2', 'HOST-RESOURCES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.6.1.5', 'ietf', 'v2', 'HPR-IP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.6', 'ietf', 'v2', 'HPR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.106', 'ietf', 'v2', 'IANA-CHARSET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.110', 'ietf', 'v2', 'IANA-FINISHER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.152', 'ietf', 'v2', 'IANA-GMPLS-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.30', 'ietf', 'v2', 'IANAifType-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.128', 'ietf', 'v2', 'IANA-IPPM-METRICS-REGISTRY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.119', 'ietf', 'v2', 'IANA-ITU-ALARM-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.154', 'ietf', 'v2', 'IANA-MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.109', 'ietf', 'v2', 'IANA-PRINTER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.2.6.2.13.1.1', 'ietf', 'v1', 'IBM-6611-APPN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.166', 'ietf', 'v2', 'IF-CAP-STACK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.230', 'ietf', 'v2', 'IFCP-MGMT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.77', 'ietf', 'v2', 'IF-INVERTED-STACK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.31', 'ietf', 'v2', 'IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.31', 'ietf', 'v2', 'IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.31', 'ietf', 'v2', 'IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.85', 'ietf', 'v2', 'IGMP-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.76', 'ietf', 'v2', 'INET-ADDRESS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.76', 'ietf', 'v2', 'INET-ADDRESS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.76', 'ietf', 'v2', 'INET-ADDRESS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.52.5', 'ietf', 'v2', 'INTEGRATED-SERVICES-GUARANTEED-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.52', 'ietf', 'v2', 'INTEGRATED-SERVICES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.27', 'ietf', 'v2', 'INTERFACETOPN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.17', 'ietf', 'v2', 'IPATM-IPMC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.57', 'ietf', 'v2', 'IPATM-IPMC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.4.24', 'ietf', 'v2', 'IP-FORWARD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.4.24', 'ietf', 'v2', 'IP-FORWARD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.168', 'ietf', 'v2', 'IPMCAST-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.48', 'ietf', 'v2', 'IP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.48', 'ietf', 'v2', 'IP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.83', 'ietf', 'v2', 'IPMROUTE-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.46', 'ietf', 'v2', 'IPOA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.141', 'ietf', 'v2', 'IPS-AUTH-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.153', 'ietf', 'v2', 'IPSEC-SPD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.103', 'ietf', 'v2', 'IPV6-FLOW-LABEL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.56', 'ietf', 'v2', 'IPV6-ICMP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.55', 'ietf', 'v2', 'IPV6-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.91', 'ietf', 'v2', 'IPV6-MLD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.86', 'ietf', 'v2', 'IPV6-TCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.87', 'ietf', 'v2', 'IPV6-UDP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.142', 'ietf', 'v2', 'ISCSI-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.20', 'ietf', 'v2', 'ISDN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.138', 'ietf', 'v2', 'ISIS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.163', 'ietf', 'v2', 'ISNS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.121', 'ietf', 'v2', 'ITU-ALARM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.120', 'ietf', 'v2', 'ITU-ALARM-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.2699.1.1', 'ietf', 'v2', 'Job-Monitoring-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.95', 'ietf', 'v2', 'L2TP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.165', 'ietf', 'v2', 'LANGTAG-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.227', 'ietf', 'v2', 'LMP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.227', 'ietf', 'v2', 'LMP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.101', 'ietf', 'v2', 'MALLOC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.26.1', 'ietf', 'v1', 'MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.26.6', 'ietf', 'v2', 'MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.26.6', 'ietf', 'v2', 'MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.26.6', 'ietf', 'v2', 'MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.26.6', 'ietf', 'v2', 'MAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.171', 'ietf', 'v2', 'MIDCOM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.38.1', 'ietf', 'v1', 'MIOX25-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.44', 'ietf', 'v2', 'MIP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.133', 'ietf', 'v2', 'MOBILEIPV6-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.38', 'ietf', 'v2', 'Modem-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.8', 'ietf', 'v2', 'MPLS-FTN-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.11', 'ietf', 'v2', 'MPLS-L3VPN-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.9', 'ietf', 'v2', 'MPLS-LC-ATM-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.10', 'ietf', 'v2', 'MPLS-LC-FR-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.5', 'ietf', 'v2', 'MPLS-LDP-ATM-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.6', 'ietf', 'v2', 'MPLS-LDP-FRAME-RELAY-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.7', 'ietf', 'v2', 'MPLS-LDP-GENERIC-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.9.10.65', 'ietf', 'v2', 'MPLS-LDP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.4', 'ietf', 'v2', 'MPLS-LDP-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.2', 'ietf', 'v2', 'MPLS-LSR-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.1', 'ietf', 'v2', 'MPLS-TC-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.166.3', 'ietf', 'v2', 'MPLS-TE-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.92', 'ietf', 'v2', 'MSDP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.28', 'ietf', 'v2', 'MTA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.28', 'ietf', 'v2', 'MTA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.28', 'ietf', 'v2', 'MTA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.123', 'ietf', 'v2', 'NAT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.27', 'ietf', 'v2', 'NETWORK-SERVICES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.27', 'ietf', 'v2', 'NETWORK-SERVICES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.71', 'ietf', 'v2', 'NHRP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.92', 'ietf', 'v2', 'NOTIFICATION-LOG-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.133', 'ietf', 'v2', 'OPT-IF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.14', 'ietf', 'v2', 'OSPF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.14', 'ietf', 'v2', 'OSPF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.14.16', 'ietf', 'v2', 'OSPF-TRAP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.14.16', 'ietf', 'v2', 'OSPF-TRAP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.34', 'ietf', 'v2', 'PARALLEL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17.6', 'ietf', 'v2', 'P-BRIDGE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.58', 'ietf', 'v2', 'PerfHist-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.58', 'ietf', 'v2', 'PerfHist-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.172', 'ietf', 'v2', 'PIM-BSR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.61', 'ietf', 'v2', 'PIM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.157', 'ietf', 'v2', 'PIM-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.93', 'ietf', 'v2', 'PINT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.140', 'ietf', 'v2', 'PKTC-IETF-MTA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.169', 'ietf', 'v2', 'PKTC-IETF-SIG-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.124', 'ietf', 'v2', 'POLICY-BASED-MANAGEMENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.105', 'ietf', 'v2', 'POWER-ETHERNET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.23.4', 'ietf', 'v1', 'PPP-BRIDGE-NCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.23.3', 'ietf', 'v1', 'PPP-IP-NCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.23.1.1', 'ietf', 'v1', 'PPP-LCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.23.2', 'ietf', 'v1', 'PPP-SEC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.43', 'ietf', 'v2', 'Printer-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.43', 'ietf', 'v2', 'Printer-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.79', 'ietf', 'v2', 'PTOPO-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17.7', 'ietf', 'v2', 'Q-BRIDGE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.2.2', 'ietf', 'v2', 'RADIUS-ACC-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.2.2', 'ietf', 'v2', 'RADIUS-ACC-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.2.1', 'ietf', 'v2', 'RADIUS-ACC-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.2.1', 'ietf', 'v2', 'RADIUS-ACC-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.1.2', 'ietf', 'v2', 'RADIUS-AUTH-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.1.2', 'ietf', 'v2', 'RADIUS-AUTH-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.1.1', 'ietf', 'v2', 'RADIUS-AUTH-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.67.1.1', 'ietf', 'v2', 'RADIUS-AUTH-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.145', 'ietf', 'v2', 'RADIUS-DYNAUTH-CLIENT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.146', 'ietf', 'v2', 'RADIUS-DYNAUTH-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.31', 'ietf', 'v2', 'RAQMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.32', 'ietf', 'v2', 'RAQMON-RDS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.39', 'ietf', 'v2', 'RDBMS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.1', 'ietf', 'v1', 'RFC1066-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.1', 'ietf', 'v1', 'RFC1156-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.1', 'ietf', 'v1', 'RFC1158-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.1', 'ietf', 'v1', 'RFC1213-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.12', 'ietf', 'v1', 'RFC1229-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.7', 'ietf', 'v1', 'RFC1230-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.9', 'ietf', 'v1', 'RFC1231-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.2', 'ietf', 'v1', 'RFC1232-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.15', 'ietf', 'v1', 'RFC1233-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.13.1', 'ietf', 'v1', 'RFC1243-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.13.1', 'ietf', 'v1', 'RFC1248-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.13.1', 'ietf', 'v1', 'RFC1252-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.14.1', 'ietf', 'v1', 'RFC1253-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.15', 'ietf', 'v1', 'RFC1269-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.1', 'ietf', 'v1', 'RFC1271-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.7', 'ietf', 'v1', 'RFC1284-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.15.1', 'ietf', 'v1', 'RFC1285-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17.1', 'ietf', 'v1', 'RFC1286-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.18.1', 'ietf', 'v1', 'RFC1289-phivMIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.31', 'ietf', 'v1', 'RFC1304-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.32', 'ietf', 'v1', 'RFC1315-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.19', 'ietf', 'v1', 'RFC1316-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.33', 'ietf', 'v1', 'RFC1317-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.34', 'ietf', 'v1', 'RFC1318-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.20.2', 'ietf', 'v1', 'RFC1353-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.4.24', 'ietf', 'v1', 'RFC1354-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.16', 'ietf', 'v1', 'RFC1381-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.5', 'ietf', 'v1', 'RFC1382-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.23.1', 'ietf', 'v1', 'RFC1389-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.7', 'ietf', 'v1', 'RFC1398-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.18', 'ietf', 'v1', 'RFC1406-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.30', 'ietf', 'v1', 'RFC1407-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.24.1', 'ietf', 'v1', 'RFC1414-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.23', 'ietf', 'v2', 'RIPv2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16', 'ietf', 'v2', 'RMON2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16', 'ietf', 'v2', 'RMON2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.1', 'ietf', 'v1', 'RMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.20.8', 'ietf', 'v2', 'RMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.112', 'ietf', 'v2', 'ROHC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.114', 'ietf', 'v2', 'ROHC-RTP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.113', 'ietf', 'v2', 'ROHC-UNCOMPRESSED-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.33', 'ietf', 'v2', 'RS-232-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.134', 'ietf', 'v2', 'RSTP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.51', 'ietf', 'v2', 'RSVP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.87', 'ietf', 'v2', 'RTP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.139', 'ietf', 'v2', 'SCSI-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.104', 'ietf', 'v2', 'SCTP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.4300.1', 'ietf', 'v2', 'SFLOW-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.149', 'ietf', 'v2', 'SIP-COMMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.36', 'ietf', 'v2', 'SIP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.151', 'ietf', 'v2', 'SIP-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.148', 'ietf', 'v2', 'SIP-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.150', 'ietf', 'v2', 'SIP-UA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.88', 'ietf', 'v2', 'SLAPM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.22', 'ietf', 'v2', 'SMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.4.4', 'ietf', 'v1', 'SMUX-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34', 'ietf', 'v2', 'SNA-NAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34', 'ietf', 'v2', 'SNA-NAU-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.41', 'ietf', 'v2', 'SNA-SDLC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.18', 'ietf', 'v2', 'SNMP-COMMUNITY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.18', 'ietf', 'v2', 'SNMP-COMMUNITY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.10', 'ietf', 'v2', 'SNMP-FRAMEWORK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.10', 'ietf', 'v2', 'SNMP-FRAMEWORK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.10', 'ietf', 'v2', 'SNMP-FRAMEWORK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.21', 'ietf', 'v2', 'SNMP-IEEE802-TM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.11', 'ietf', 'v2', 'SNMP-MPD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.11', 'ietf', 'v2', 'SNMP-MPD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.11', 'ietf', 'v2', 'SNMP-MPD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.13', 'ietf', 'v2', 'SNMP-NOTIFICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.13', 'ietf', 'v2', 'SNMP-NOTIFICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.13', 'ietf', 'v2', 'SNMP-NOTIFICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.14', 'ietf', 'v2', 'SNMP-PROXY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.14', 'ietf', 'v2', 'SNMP-PROXY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.14', 'ietf', 'v2', 'SNMP-PROXY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.22.1.1', 'ietf', 'v1', 'SNMP-REPEATER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.22.1.1', 'ietf', 'v1', 'SNMP-REPEATER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.22.5', 'ietf', 'v2', 'SNMP-REPEATER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.12', 'ietf', 'v2', 'SNMP-TARGET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.12', 'ietf', 'v2', 'SNMP-TARGET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.12', 'ietf', 'v2', 'SNMP-TARGET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.15', 'ietf', 'v2', 'SNMP-USER-BASED-SM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.15', 'ietf', 'v2', 'SNMP-USER-BASED-SM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.15', 'ietf', 'v2', 'SNMP-USER-BASED-SM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.20', 'ietf', 'v2', 'SNMP-USM-AES-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.101', 'ietf', 'v2', 'SNMP-USM-DH-OBJECTS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.2', 'ietf', 'v2', 'SNMPv2-M2M-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.1', 'ietf', 'v2', 'SNMPv2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.1', 'ietf', 'v2', 'SNMPv2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.1', 'ietf', 'v2', 'SNMPv2-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.3', 'ietf', 'v2', 'SNMPv2-PARTY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.6', 'ietf', 'v2', 'SNMPv2-USEC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.16', 'ietf', 'v2', 'SNMP-VIEW-BASED-ACM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.16', 'ietf', 'v2', 'SNMP-VIEW-BASED-ACM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.6.3.16', 'ietf', 'v2', 'SNMP-VIEW-BASED-ACM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.39', 'ietf', 'v2', 'SONET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.39', 'ietf', 'v2', 'SONET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.39', 'ietf', 'v2', 'SONET-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.17.3', 'ietf', 'v1', 'SOURCE-ROUTING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.28', 'ietf', 'v2', 'SSPM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.54', 'ietf', 'v2', 'SYSAPPL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.137', 'ietf', 'v2', 'T11-FC-FABRIC-ADDR-MGR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.162', 'ietf', 'v2', 'T11-FC-FABRIC-CONFIG-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.159', 'ietf', 'v2', 'T11-FC-FABRIC-LOCK-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.143', 'ietf', 'v2', 'T11-FC-FSPF-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.135', 'ietf', 'v2', 'T11-FC-NAME-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.144', 'ietf', 'v2', 'T11-FC-ROUTE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.161', 'ietf', 'v2', 'T11-FC-RSCN-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.176', 'ietf', 'v2', 'T11-FC-SP-AUTHENTICATION-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.178', 'ietf', 'v2', 'T11-FC-SP-POLICY-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.179', 'ietf', 'v2', 'T11-FC-SP-SA-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.175', 'ietf', 'v2', 'T11-FC-SP-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.177', 'ietf', 'v2', 'T11-FC-SP-ZONING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.147', 'ietf', 'v2', 'T11-FC-VIRTUAL-FABRIC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.160', 'ietf', 'v2', 'T11-FC-ZONE-SERVER-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.136', 'ietf', 'v2', 'T11-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.156', 'ietf', 'v2', 'TCP-ESTATS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.4.1.23.2.29.1', 'ietf', 'v1', 'TCPIPX-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.49', 'ietf', 'v2', 'TCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.49', 'ietf', 'v2', 'TCP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.200', 'ietf', 'v2', 'TE-LINK-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.122', 'ietf', 'v2', 'TE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.3.124', 'ietf', 'v2', 'TIME-AGGREGATE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.8', 'ietf', 'v2', 'TN3270E-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.34.9', 'ietf', 'v2', 'TN3270E-RT-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.9', 'ietf', 'v2', 'TOKENRING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.9', 'ietf', 'v2', 'TOKENRING-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.1', 'ietf', 'v1', 'TOKEN-RING-RMON-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.42', 'ietf', 'v2', 'TOKENRING-STATION-SR-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.16.30', 'ietf', 'v2', 'TPM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.100', 'ietf', 'v2', 'TRANSPORT-ADDRESS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.116', 'ietf', 'v2', 'TRIP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.115', 'ietf', 'v2', 'TRIP-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.131', 'ietf', 'v2', 'TUNNEL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.131', 'ietf', 'v2', 'TUNNEL-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.170', 'ietf', 'v2', 'UDPLITE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.50', 'ietf', 'v2', 'UDP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.50', 'ietf', 'v2', 'UDP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.33', 'ietf', 'v2', 'UPS-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.164', 'ietf', 'v2', 'URI-TC-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.229', 'ietf', 'v2', 'VDSL-LINE-EXT-MCM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.228', 'ietf', 'v2', 'VDSL-LINE-EXT-SCM-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.10.97', 'ietf', 'v2', 'VDSL-LINE-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.129', 'ietf', 'v2', 'VPN-TC-STD-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.68', 'ietf', 'v2', 'VRRP-MIB']);
|
|
push(@{$mibdepot}, ['1.3.6.1.2.1.65', 'ietf', 'v2', 'WWW-MIB']);
|
|
my $oids = $self->get_entries_by_walk(-varbindlist => [
|
|
'1.3.6.1.2.1', '1.3.6.1.4.1',
|
|
]);
|
|
foreach my $mibinfo (@{$mibdepot}) {
|
|
$GLPlugin::SNMP::mib_ids->{$mibinfo->[3]} = $mibinfo->[0];
|
|
}
|
|
$GLPlugin::SNMP::mib_ids->{'SNMP-MIB2'} = "1.3.6.1.2.1";
|
|
foreach my $mib (keys %{$GLPlugin::SNMP::mib_ids}) {
|
|
if ($self->implements_mib($mib)) {
|
|
push(@outputlist, [$mib, $GLPlugin::SNMP::mib_ids->{$mib}]);
|
|
$unknowns = {@{[map {
|
|
$_, $self->rawdata->{$_}
|
|
} grep {
|
|
substr($_, 0, length($GLPlugin::SNMP::mib_ids->{$mib})) ne
|
|
$GLPlugin::SNMP::mib_ids->{$mib} || (
|
|
substr($_, 0, length($GLPlugin::SNMP::mib_ids->{$mib})) eq
|
|
$GLPlugin::SNMP::mib_ids->{$mib} &&
|
|
substr($_, length($GLPlugin::SNMP::mib_ids->{$mib}), 1) ne ".")
|
|
} keys %{$unknowns}]}};
|
|
}
|
|
}
|
|
my $toplevels = {};
|
|
map {
|
|
/^(1\.3\.6\.1\.(2|4)\.1\.\d+\.\d+)\./; $toplevels->{$1} = 1;
|
|
} keys %{$unknowns};
|
|
foreach (sort {$a cmp $b} keys %{$toplevels}) {
|
|
push(@outputlist, ["<unknown>", $_]);
|
|
}
|
|
foreach (sort {$a->[0] cmp $b->[0]} @outputlist) {
|
|
printf "implements %s %s\n", $_->[0], $_->[1];
|
|
}
|
|
$self->add_ok("have fun");
|
|
my ($code, $message) = $self->check_messages(join => ', ', join_all => ', ');
|
|
$GLPlugin::plugin->nagios_exit($code, $message);
|
|
}
|
|
}
|
|
|
|
sub check_snmp_and_model {
|
|
my $self = shift;
|
|
$GLPlugin::SNMP::mibs_and_oids->{'MIB-II'} = {
|
|
sysDescr => '1.3.6.1.2.1.1.1',
|
|
sysObjectID => '1.3.6.1.2.1.1.2',
|
|
sysUpTime => '1.3.6.1.2.1.1.3',
|
|
sysName => '1.3.6.1.2.1.1.5',
|
|
};
|
|
$GLPlugin::SNMP::mibs_and_oids->{'SNMP-FRAMEWORK-MIB'} = {
|
|
snmpEngineID => '1.3.6.1.6.3.10.2.1.1.0',
|
|
snmpEngineBoots => '1.3.6.1.6.3.10.2.1.2.0',
|
|
snmpEngineTime => '1.3.6.1.6.3.10.2.1.3.0',
|
|
snmpEngineMaxMessageSize => '1.3.6.1.6.3.10.2.1.4.0',
|
|
};
|
|
if ($self->opts->snmpwalk) {
|
|
my $response = {};
|
|
if (! -f $self->opts->snmpwalk) {
|
|
$self->add_message(CRITICAL,
|
|
sprintf 'file %s not found',
|
|
$self->opts->snmpwalk);
|
|
} elsif (-x $self->opts->snmpwalk) {
|
|
my $cmd = sprintf "%s -ObentU -v%s -c%s %s 1.3.6.1.4.1 2>&1",
|
|
$self->opts->snmpwalk,
|
|
$self->opts->protocol,
|
|
$self->opts->community,
|
|
$self->opts->hostname;
|
|
open(WALK, "$cmd |");
|
|
while (<WALK>) {
|
|
if (/^([\.\d]+) = .*?: (\-*\d+)/) {
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\.\d]+) = .*?: "(.*?)"/) {
|
|
$response->{$1} = $2;
|
|
$response->{$1} =~ s/\s+$//;
|
|
}
|
|
}
|
|
close WALK;
|
|
} else {
|
|
if (defined $self->opts->offline && $self->opts->mode ne 'walk') {
|
|
if ((time - (stat($self->opts->snmpwalk))[9]) > $self->opts->offline) {
|
|
$self->add_message(UNKNOWN,
|
|
sprintf 'snmpwalk file %s is too old', $self->opts->snmpwalk);
|
|
}
|
|
}
|
|
$self->opts->override_opt('hostname', 'walkhost') if $self->opts->mode ne 'walk';
|
|
open(MESS, $self->opts->snmpwalk);
|
|
while(<MESS>) {
|
|
# SNMPv2-SMI::enterprises.232.6.2.6.7.1.3.1.4 = INTEGER: 6
|
|
if (/^([\d\.]+) = .*?INTEGER: .*\((\-*\d+)\)/) {
|
|
# .1.3.6.1.2.1.2.2.1.8.1 = INTEGER: down(2)
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\d\.]+) = .*?Opaque:.*?Float:.*?([\-\.\d]+)/) {
|
|
# .1.3.6.1.4.1.2021.10.1.6.1 = Opaque: Float: 0.938965
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\d\.]+) = STRING:\s*$/) {
|
|
$response->{$1} = "";
|
|
} elsif (/^([\d\.]+) = Network Address: (.*)/) {
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\d\.]+) = Hex-STRING: (.*)/) {
|
|
$response->{$1} = "0x".$2;
|
|
$response->{$1} =~ s/\s+$//;
|
|
} elsif (/^([\d\.]+) = \w+: (\-*\d+)/) {
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\d\.]+) = \w+: "(.*?)"/) {
|
|
$response->{$1} = $2;
|
|
$response->{$1} =~ s/\s+$//;
|
|
} elsif (/^([\d\.]+) = \w+: (.*)/) {
|
|
$response->{$1} = $2;
|
|
$response->{$1} =~ s/\s+$//;
|
|
} elsif (/^([\d\.]+) = (\-*\d+)/) {
|
|
$response->{$1} = $2;
|
|
} elsif (/^([\d\.]+) = "(.*?)"/) {
|
|
$response->{$1} = $2;
|
|
$response->{$1} =~ s/\s+$//;
|
|
}
|
|
}
|
|
close MESS;
|
|
}
|
|
foreach my $oid (keys %$response) {
|
|
if ($oid =~ /^\./) {
|
|
my $nodot = $oid;
|
|
$nodot =~ s/^\.//g;
|
|
$response->{$nodot} = $response->{$oid};
|
|
delete $response->{$oid};
|
|
}
|
|
}
|
|
map { $response->{$_} =~ s/^\s+//; $response->{$_} =~ s/\s+$//; }
|
|
keys %$response;
|
|
$self->set_rawdata($response);
|
|
} else {
|
|
$self->set_timeout_alarm();
|
|
if (eval "require Net::SNMP") {
|
|
my %params = ();
|
|
my $net_snmp_version = Net::SNMP->VERSION(); # 5.002000 or 6.000000
|
|
$params{'-translate'} = [ # because we see "NULL" coming from socomec devices
|
|
-all => 0x0,
|
|
-nosuchobject => 1,
|
|
-nosuchinstance => 1,
|
|
-endofmibview => 1,
|
|
-unsigned => 1,
|
|
];
|
|
$params{'-hostname'} = $self->opts->hostname;
|
|
$params{'-version'} = $self->opts->protocol;
|
|
if ($self->opts->port) {
|
|
$params{'-port'} = $self->opts->port;
|
|
}
|
|
if ($self->opts->domain) {
|
|
$params{'-domain'} = $self->opts->domain;
|
|
}
|
|
$self->v2tov3;
|
|
if ($self->opts->protocol eq '3') {
|
|
$params{'-version'} = $self->opts->protocol;
|
|
$params{'-username'} = $self->opts->username;
|
|
if ($self->opts->authpassword) {
|
|
$params{'-authpassword'} = $self->opts->authpassword;
|
|
}
|
|
if ($self->opts->authprotocol) {
|
|
$params{'-authprotocol'} = $self->opts->authprotocol;
|
|
}
|
|
if ($self->opts->privpassword) {
|
|
$params{'-privpassword'} = $self->opts->privpassword;
|
|
}
|
|
if ($self->opts->privprotocol) {
|
|
$params{'-privprotocol'} = $self->opts->privprotocol;
|
|
}
|
|
# context hat in der session nix verloren, sondern wird
|
|
# als zusatzinfo bei den requests mitgeschickt
|
|
#if ($self->opts->contextengineid) {
|
|
# $params{'-contextengineid'} = $self->opts->contextengineid;
|
|
#}
|
|
#if ($self->opts->contextname) {
|
|
# $params{'-contextname'} = $self->opts->contextname;
|
|
#}
|
|
} else {
|
|
$params{'-community'} = $self->opts->community;
|
|
}
|
|
my ($session, $error) = Net::SNMP->session(%params);
|
|
if (! defined $session) {
|
|
$self->add_message(CRITICAL,
|
|
sprintf 'cannot create session object: %s', $error);
|
|
$self->debug(Data::Dumper::Dumper(\%params));
|
|
} else {
|
|
my $max_msg_size = $session->max_msg_size();
|
|
$session->max_msg_size(4 * $max_msg_size);
|
|
$GLPlugin::SNMP::session = $session;
|
|
}
|
|
} else {
|
|
$self->add_message(CRITICAL,
|
|
'could not find Net::SNMP module');
|
|
}
|
|
}
|
|
if (! $self->check_messages()) {
|
|
my $tic = time;
|
|
my $sysUptime = $self->get_snmp_object('MIB-II', 'sysUpTime', 0);
|
|
my $snmpEngineTime = $self->get_snmp_object('SNMP-FRAMEWORK-MIB', 'snmpEngineTime');
|
|
my $sysDescr = $self->get_snmp_object('MIB-II', 'sysDescr', 0);
|
|
my $tac = time;
|
|
if (defined $sysUptime && defined $sysDescr) {
|
|
# drecksschrott asa liefert negative werte
|
|
if (defined $snmpEngineTime && $snmpEngineTime > 0) {
|
|
$self->{uptime} = $snmpEngineTime;
|
|
} else {
|
|
$self->{uptime} = $self->timeticks($sysUptime);
|
|
}
|
|
$self->{productname} = $sysDescr;
|
|
$self->{sysobjectid} = $self->get_snmp_object('MIB-II', 'sysObjectID', 0);
|
|
$self->debug(sprintf 'uptime: %s', $self->{uptime});
|
|
$self->debug(sprintf 'up since: %s',
|
|
scalar localtime (time - $self->{uptime}));
|
|
$GLPlugin::SNMP::uptime = $self->{uptime};
|
|
$self->debug('whoami: '.$self->{productname});
|
|
} else {
|
|
if ($tac - $tic >= $GLPlugin::SNMP::session->timeout) {
|
|
$self->add_message(UNKNOWN,
|
|
'could not contact snmp agent, timeout during snmp-get sysUptime');
|
|
} else {
|
|
$self->add_message(CRITICAL,
|
|
'got neither sysUptime nor sysDescr, is this snmp agent working correctly?');
|
|
}
|
|
$GLPlugin::SNMP::session->close if $GLPlugin::SNMP::session;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub no_such_model {
|
|
my $self = shift;
|
|
printf "Model %s is not implemented\n", $self->{productname};
|
|
exit 3;
|
|
}
|
|
|
|
sub no_such_mode {
|
|
my $self = shift;
|
|
if (ref($self) eq "Classes::Generic") {
|
|
$self->init();
|
|
} elsif (ref($self) eq "Classes::Device") {
|
|
$self->add_message(UNKNOWN, 'the device did not implement the mibs this plugin is asking for');
|
|
$self->add_message(UNKNOWN,
|
|
sprintf('unknown device%s', $self->{productname} eq 'unknown' ?
|
|
'' : '('.$self->{productname}.')'));
|
|
} elsif (ref($self) eq "GLPlugin::SNMP") {
|
|
# uptime, offline
|
|
$self->init();
|
|
} else {
|
|
eval {
|
|
bless $self, "Classes::Generic";
|
|
$self->init();
|
|
};
|
|
if ($@) {
|
|
bless $self, "GLPlugin::SNMP";
|
|
$self->init();
|
|
}
|
|
}
|
|
if (ref($self) eq "GLPlugin::SNMP") {
|
|
printf "Mode %s is not implemented for this type of device\n",
|
|
$self->opts->mode;
|
|
exit 3;
|
|
}
|
|
}
|
|
|
|
sub uptime {
|
|
my $self = shift;
|
|
return $GLPlugin::SNMP::uptime;
|
|
}
|
|
|
|
sub discover_suitable_class {
|
|
my $self = shift;
|
|
my $sysobj = $self->get_snmp_object('MIB-II', 'sysObjectID', 0);
|
|
if ($sysobj && exists $GLPlugin::SNMP::discover_ids->{$sysobj}) {
|
|
return $GLPlugin::SNMP::discover_ids->{$sysobj};
|
|
}
|
|
}
|
|
|
|
sub implements_mib {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
if (! exists $GLPlugin::SNMP::mib_ids->{$mib}) {
|
|
return 0;
|
|
}
|
|
my $sysobj = $self->get_snmp_object('MIB-II', 'sysObjectID', 0);
|
|
$sysobj =~ s/^\.// if $sysobj;
|
|
if ($sysobj && $sysobj eq $GLPlugin::SNMP::mib_ids->{$mib}) {
|
|
$self->debug(sprintf "implements %s (sysobj exact)", $mib);
|
|
return 1;
|
|
}
|
|
if ($GLPlugin::SNMP::mib_ids->{$mib} eq
|
|
substr $sysobj, 0, length $GLPlugin::SNMP::mib_ids->{$mib}) {
|
|
$self->debug(sprintf "implements %s (sysobj)", $mib);
|
|
return 1;
|
|
}
|
|
# some mibs are only composed of tables
|
|
my $traces;
|
|
if ($self->opts->snmpwalk) {
|
|
$traces = {@{[map {
|
|
$_, $self->rawdata->{$_}
|
|
} grep {
|
|
substr($_, 0, length($GLPlugin::SNMP::mib_ids->{$mib})) eq $GLPlugin::SNMP::mib_ids->{$mib}
|
|
} keys %{$self->rawdata}]}};
|
|
} else {
|
|
my %params = (
|
|
-varbindlist => [
|
|
$GLPlugin::SNMP::mib_ids->{$mib}
|
|
]
|
|
);
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$params{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$params{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
$traces = $GLPlugin::SNMP::session->get_next_request(%params);
|
|
}
|
|
if ($traces && # must find oids following to the ident-oid
|
|
! exists $traces->{$GLPlugin::SNMP::mib_ids->{$mib}} && # must not be the ident-oid
|
|
grep { # following oid is inside this tree
|
|
substr($_, 0, length($GLPlugin::SNMP::mib_ids->{$mib})) eq $GLPlugin::SNMP::mib_ids->{$mib};
|
|
} keys %{$traces}) {
|
|
$self->debug(sprintf "implements %s (found traces)", $mib);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
sub timeticks {
|
|
my $self = shift;
|
|
my $timestr = shift;
|
|
if ($timestr =~ /\((\d+)\)/) {
|
|
# Timeticks: (20718727) 2 days, 9:33:07.27
|
|
$timestr = $1 / 100;
|
|
} elsif ($timestr =~ /(\d+)\s*day[s]*.*?(\d+):(\d+):(\d+)\.(\d+)/) {
|
|
# Timeticks: 2 days, 9:33:07.27
|
|
$timestr = $1 * 24 * 3600 + $2 * 3600 + $3 * 60 + $4;
|
|
} elsif ($timestr =~ /(\d+):(\d+):(\d+):(\d+)\.(\d+)/) {
|
|
# Timeticks: 0001:03:18:42.77
|
|
$timestr = $1 * 3600 * 24 + $2 * 3600 + $3 * 60 + $4;
|
|
} elsif ($timestr =~ /(\d+):(\d+):(\d+)\.(\d+)/) {
|
|
# Timeticks: 9:33:07.27
|
|
$timestr = $1 * 3600 + $2 * 60 + $3;
|
|
} elsif ($timestr =~ /(\d+)\s*hour[s]*.*?(\d+):(\d+)\.(\d+)/) {
|
|
# Timeticks: 3 hours, 42:17.98
|
|
$timestr = $1 * 3600 + $2 * 60 + $3;
|
|
} elsif ($timestr =~ /(\d+)\s*minute[s]*.*?(\d+)\.(\d+)/) {
|
|
# Timeticks: 36 minutes, 01.96
|
|
$timestr = $1 * 60 + $2;
|
|
} elsif ($timestr =~ /(\d+)\.\d+\s*second[s]/) {
|
|
# Timeticks: 01.02 seconds
|
|
$timestr = $1;
|
|
} elsif ($timestr =~ /^(\d+)$/) {
|
|
$timestr = $1 / 100;
|
|
}
|
|
return $timestr;
|
|
}
|
|
|
|
sub human_timeticks {
|
|
my $self = shift;
|
|
my $timeticks = shift;
|
|
my $days = int($timeticks / 86400);
|
|
$timeticks -= ($days * 86400);
|
|
my $hours = int($timeticks / 3600);
|
|
$timeticks -= ($hours * 3600);
|
|
my $minutes = int($timeticks / 60);
|
|
my $seconds = $timeticks % 60;
|
|
$days = $days < 1 ? '' : $days .'d ';
|
|
return $days . sprintf "%dh %dm %ds", $hours, $minutes, $seconds;
|
|
}
|
|
|
|
sub internal_name {
|
|
my $self = shift;
|
|
my $class = ref($self);
|
|
$class =~ s/^.*:://;
|
|
if (exists $self->{flat_indices}) {
|
|
return sprintf "%s_%s", uc $class, $self->{flat_indices};
|
|
} else {
|
|
return sprintf "%s", uc $class;
|
|
}
|
|
}
|
|
|
|
################################################################
|
|
# file-related functions
|
|
#
|
|
sub create_interface_cache_file {
|
|
my $self = shift;
|
|
my $extension = "";
|
|
if ($self->opts->snmpwalk && ! $self->opts->hostname) {
|
|
$self->opts->override_opt('hostname',
|
|
'snmpwalk.file'.md5_hex($self->opts->snmpwalk))
|
|
}
|
|
if ($self->opts->community) {
|
|
$extension .= md5_hex($self->opts->community);
|
|
}
|
|
$extension =~ s/\//_/g;
|
|
$extension =~ s/\(/_/g;
|
|
$extension =~ s/\)/_/g;
|
|
$extension =~ s/\*/_/g;
|
|
$extension =~ s/\s/_/g;
|
|
return sprintf "%s/%s_interface_cache_%s", $self->statefilesdir(),
|
|
$self->opts->hostname, lc $extension;
|
|
}
|
|
|
|
sub create_entry_cache_file {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
return lc sprintf "%s_%s_%s_%s_cache",
|
|
$self->create_interface_cache_file(),
|
|
$mib, $table, join('#', @{$key_attr});
|
|
}
|
|
|
|
sub update_entry_cache {
|
|
my $self = shift;
|
|
my $force = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
if (ref($key_attr) ne "ARRAY") {
|
|
$key_attr = [$key_attr];
|
|
}
|
|
my $cache = sprintf "%s_%s_%s_cache",
|
|
$mib, $table, join('#', @{$key_attr});
|
|
my $statefile = $self->create_entry_cache_file($mib, $table, $key_attr);
|
|
my $update = time - 3600;
|
|
#my $update = time - 1;
|
|
if ($force || ! -f $statefile || ((stat $statefile)[9]) < ($update)) {
|
|
$self->debug(sprintf 'force update of %s %s %s %s cache',
|
|
$self->opts->hostname, $self->opts->mode, $mib, $table);
|
|
$self->{$cache} = {};
|
|
foreach my $entry ($self->get_snmp_table_objects($mib, $table)) {
|
|
my $key = join('#', map { $entry->{$_} } @{$key_attr});
|
|
my $hash = $key . '-//-' . join('.', @{$entry->{indices}});
|
|
$self->{$cache}->{$hash} = $entry->{indices};
|
|
}
|
|
$self->save_cache($mib, $table, $key_attr);
|
|
}
|
|
$self->load_cache($mib, $table, $key_attr);
|
|
}
|
|
|
|
sub save_cache {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
if (ref($key_attr) ne "ARRAY") {
|
|
$key_attr = [$key_attr];
|
|
}
|
|
my $cache = sprintf "%s_%s_%s_cache",
|
|
$mib, $table, join('#', @{$key_attr});
|
|
$self->create_statefilesdir();
|
|
my $statefile = $self->create_entry_cache_file($mib, $table, $key_attr);
|
|
open(STATE, ">".$statefile.".".$$);
|
|
printf STATE Data::Dumper::Dumper($self->{$cache});
|
|
close STATE;
|
|
rename $statefile.".".$$, $statefile;
|
|
$self->debug(sprintf "saved %s to %s",
|
|
Data::Dumper::Dumper($self->{$cache}), $statefile);
|
|
}
|
|
|
|
sub load_cache {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
if (ref($key_attr) ne "ARRAY") {
|
|
$key_attr = [$key_attr];
|
|
}
|
|
my $cache = sprintf "%s_%s_%s_cache",
|
|
$mib, $table, join('#', @{$key_attr});
|
|
my $statefile = $self->create_entry_cache_file($mib, $table, $key_attr);
|
|
$self->{$cache} = {};
|
|
if ( -f $statefile) {
|
|
our $VAR1;
|
|
our $VAR2;
|
|
eval {
|
|
require $statefile;
|
|
};
|
|
if($@) {
|
|
printf "rumms\n";
|
|
}
|
|
# keinesfalls mehr require verwenden!!!!!!
|
|
# beim require enthaelt VAR1 andere werte als beim slurp
|
|
# und zwar diejenigen, die beim letzten save_cache geschrieben wurden.
|
|
my $content = do { local (@ARGV, $/) = $statefile; my $x = <>; close ARGV; $x };
|
|
$VAR1 = eval "$content";
|
|
$self->debug(sprintf "load %s", Data::Dumper::Dumper($VAR1));
|
|
$self->{$cache} = $VAR1;
|
|
}
|
|
}
|
|
|
|
|
|
################################################################
|
|
# top-level convenience functions
|
|
#
|
|
sub get_snmp_objects {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my @mos = @_;
|
|
foreach (@mos) {
|
|
my $value = $self->get_snmp_object($mib, $_, 0);
|
|
if (defined $value) {
|
|
$self->{$_} = $value;
|
|
} else {
|
|
my $value = $self->get_snmp_object($mib, $_);
|
|
if (defined $value) {
|
|
$self->{$_} = $value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub get_snmp_tables {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $infos = shift;
|
|
foreach my $info (@{$infos}) {
|
|
my $arrayname = $info->[0];
|
|
my $table = $info->[1];
|
|
my $class = $info->[2];
|
|
my $filter = $info->[3];
|
|
$self->{$arrayname} = [] if ! exists $self->{$arrayname};
|
|
if (! exists $GLPlugin::SNMP::tablecache->{$mib} || ! exists $GLPlugin::SNMP::tablecache->{$mib}->{$table}) {
|
|
$GLPlugin::SNMP::tablecache->{$mib}->{$table} = [];
|
|
foreach ($self->get_snmp_table_objects($mib, $table)) {
|
|
my $new_object = $class->new(%{$_});
|
|
next if (defined $filter && ! &$filter($new_object));
|
|
push(@{$self->{$arrayname}}, $new_object);
|
|
push(@{$GLPlugin::SNMP::tablecache->{$mib}->{$table}}, $new_object);
|
|
}
|
|
} else {
|
|
$self->debug(sprintf "get_snmp_tables %s %s cache hit", $mib, $table);
|
|
foreach (@{$GLPlugin::SNMP::tablecache->{$mib}->{$table}}) {
|
|
push(@{$self->{$arrayname}}, $_);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
################################################################
|
|
# 2nd level
|
|
#
|
|
sub get_snmp_object {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $mo = shift;
|
|
my $index = shift;
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib} &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$mo}) {
|
|
my $oid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$mo}.
|
|
(defined $index ? '.'.$index : '');
|
|
my $response = $self->get_request(-varbindlist => [$oid]);
|
|
if (defined $response->{$oid}) {
|
|
if ($response->{$oid} eq 'noSuchInstance' || $response->{$oid} eq 'noSuchObject') {
|
|
$response->{$oid} = undef;
|
|
} elsif (my @symbols = $self->make_symbolic($mib, $response, [[$index]])) {
|
|
$response->{$oid} = $symbols[0]->{$mo};
|
|
}
|
|
}
|
|
$self->debug(sprintf "GET: %s::%s (%s) : %s", $mib, $mo, $oid, defined $response->{$oid} ? $response->{$oid} : "<undef>");
|
|
return $response->{$oid};
|
|
}
|
|
return undef;
|
|
}
|
|
|
|
sub get_snmp_table_objects_with_cache {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
#return $self->get_snmp_table_objects($mib, $table);
|
|
$self->update_entry_cache(0, $mib, $table, $key_attr);
|
|
my @indices = $self->get_cache_indices($mib, $table, $key_attr);
|
|
my @entries = ();
|
|
foreach ($self->get_snmp_table_objects($mib, $table, \@indices)) {
|
|
push(@entries, $_);
|
|
}
|
|
return @entries;
|
|
}
|
|
|
|
# get_snmp_table_objects('MIB-Name', 'Table-Name', 'Table-Entry', [indices])
|
|
# returns array of hashrefs
|
|
sub get_snmp_table_objects {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $indices = shift || [];
|
|
my @entries = ();
|
|
my $augmenting_table;
|
|
$self->debug(sprintf "get_snmp_table_objects %s %s", $mib, $table);
|
|
if ($table =~ /^(.*?)\+(.*)/) {
|
|
$table = $1;
|
|
$augmenting_table = $2;
|
|
}
|
|
my $entry = $table;
|
|
$entry =~ s/Table/Entry/g;
|
|
if (scalar(@{$indices}) == 1) {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib} &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$table}) {
|
|
my $result = {};
|
|
my $eoid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry}.'.';
|
|
my $eoidlen = length($eoid);
|
|
my @columns = map {
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}
|
|
} grep {
|
|
substr($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}, 0, $eoidlen) eq
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry}.'.'
|
|
} keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}};
|
|
my $index = join('.', @{$indices->[0]});
|
|
my $ifresult = $self->get_entries(
|
|
-startindex => $index,
|
|
-endindex => $index,
|
|
-columns => \@columns,
|
|
);
|
|
map { $result->{$_} = $ifresult->{$_} }
|
|
keys %{$ifresult};
|
|
if ($augmenting_table &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$augmenting_table}) {
|
|
my $entry = $augmenting_table;
|
|
$entry =~ s/Table/Entry/g;
|
|
my $eoid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry}.'.';
|
|
my $eoidlen = length($eoid);
|
|
my @columns = map {
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}
|
|
} grep {
|
|
substr($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}, 0, $eoidlen) eq $eoid
|
|
} keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}};
|
|
my $ifresult = $self->get_entries(
|
|
-startindex => $index,
|
|
-endindex => $index,
|
|
-columns => \@columns,
|
|
);
|
|
map { $result->{$_} = $ifresult->{$_} }
|
|
keys %{$ifresult};
|
|
}
|
|
@entries = $self->make_symbolic($mib, $result, $indices);
|
|
@entries = map { $_->{indices} = shift @{$indices}; $_ } @entries;
|
|
}
|
|
} elsif (scalar(@{$indices}) > 1) {
|
|
# man koennte hier pruefen, ob die indices aufeinanderfolgen
|
|
# und dann get_entries statt get_table aufrufen
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib} &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$table}) {
|
|
my $result = {};
|
|
my $eoid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry}.'.';
|
|
my $eoidlen = length($eoid);
|
|
my @columns = map {
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}
|
|
} grep {
|
|
substr($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}, 0, $eoidlen) eq $eoid
|
|
} keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}};
|
|
my @sortedindices = map { $_->[0] }
|
|
sort { $a->[1] cmp $b->[1] }
|
|
map { [$_,
|
|
join '', map { sprintf("%30d",$_) } split( /\./, $_)
|
|
] } map { join('.', @{$_})} @{$indices};
|
|
my $startindex = $sortedindices[0];
|
|
my $endindex = $sortedindices[$#sortedindices];
|
|
if (0) {
|
|
# holzweg. dicke ciscos liefern unvollstaendiges resultat, d.h.
|
|
# bei 138,19,157 kommt nur 138..144, dann ist schluss.
|
|
# maxrepetitions bringt nichts.
|
|
$result = $self->get_entries(
|
|
-startindex => $startindex,
|
|
-endindex => $endindex,
|
|
-columns => \@columns,
|
|
);
|
|
} else {
|
|
foreach my $ifidx (@sortedindices) {
|
|
my $ifresult = $self->get_entries(
|
|
-startindex => $ifidx,
|
|
-endindex => $ifidx,
|
|
-columns => \@columns,
|
|
);
|
|
map { $result->{$_} = $ifresult->{$_} }
|
|
keys %{$ifresult};
|
|
}
|
|
}
|
|
if ($augmenting_table &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$augmenting_table}) {
|
|
my $entry = $augmenting_table;
|
|
$entry =~ s/Table/Entry/g;
|
|
my $eoid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry}.'.';
|
|
my $eoidlen = length($eoid);
|
|
my @columns = map {
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}
|
|
} grep {
|
|
substr($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$_}, 0, $eoidlen) eq $eoid
|
|
} keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}};
|
|
foreach my $ifidx (@sortedindices) {
|
|
my $ifresult = $self->get_entries(
|
|
-startindex => $ifidx,
|
|
-endindex => $ifidx,
|
|
-columns => \@columns,
|
|
);
|
|
map { $result->{$_} = $ifresult->{$_} }
|
|
keys %{$ifresult};
|
|
}
|
|
}
|
|
# now we have numerical_oid+index => value
|
|
# needs to become symboic_oid => value
|
|
#my @indices =
|
|
# $self->get_indices($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry});
|
|
@entries = $self->make_symbolic($mib, $result, $indices);
|
|
@entries = map { $_->{indices} = shift @{$indices}; $_ } @entries;
|
|
}
|
|
} else {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib} &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$table}) {
|
|
$self->debug(sprintf "get_snmp_table_objects calls get_table %s",
|
|
$GLPlugin::SNMP::mibs_and_oids->{$mib}->{$table});
|
|
my $result = $self->get_table(
|
|
-baseoid => $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$table});
|
|
$self->debug(sprintf "get_snmp_table_objects get_table returns %d oids",
|
|
scalar(keys %{$result}));
|
|
# now we have numerical_oid+index => value
|
|
# needs to become symboic_oid => value
|
|
my @indices =
|
|
$self->get_indices(
|
|
-baseoid => $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$entry},
|
|
-oids => [keys %{$result}]);
|
|
$self->debug(sprintf "get_snmp_table_objects get_table returns %d indices",
|
|
scalar(@indices));
|
|
@entries = $self->make_symbolic($mib, $result, \@indices);
|
|
@entries = map { $_->{indices} = shift @indices; $_ } @entries;
|
|
}
|
|
}
|
|
@entries = map { $_->{flat_indices} = join(".", @{$_->{indices}}); $_ } @entries;
|
|
return @entries;
|
|
}
|
|
|
|
################################################################
|
|
# 3rd level functions. calling net::snmp-functions
|
|
#
|
|
sub get_request {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my @notcached = ();
|
|
foreach my $oid (@{$params{'-varbindlist'}}) {
|
|
$self->add_oidtrace($oid);
|
|
if (! exists $GLPlugin::SNMP::rawdata->{$oid}) {
|
|
push(@notcached, $oid);
|
|
}
|
|
}
|
|
if (! $self->opts->snmpwalk && (scalar(@notcached) > 0)) {
|
|
my %params = ();
|
|
if ($GLPlugin::SNMP::session->version() == 0) {
|
|
$params{-varbindlist} = \@notcached;
|
|
} elsif ($GLPlugin::SNMP::session->version() == 1) {
|
|
$params{-varbindlist} = \@notcached;
|
|
#$params{-nonrepeaters} = scalar(@notcached);
|
|
} elsif ($GLPlugin::SNMP::session->version() == 3) {
|
|
$params{-varbindlist} = \@notcached;
|
|
$params{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$params{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
my $result = $GLPlugin::SNMP::session->get_request(%params);
|
|
foreach my $key (%{$result}) {
|
|
$self->add_rawdata($key, $result->{$key});
|
|
}
|
|
}
|
|
my $result = {};
|
|
map { $result->{$_} = $GLPlugin::SNMP::rawdata->{$_} }
|
|
@{$params{'-varbindlist'}};
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries_get_bulk {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $result = {};
|
|
$self->debug(sprintf "get_entries_get_bulk %s", Data::Dumper::Dumper(\%params));
|
|
my %newparams = ();
|
|
$newparams{'-startindex'} = $params{'-startindex'}
|
|
if defined $params{'-startindex'};
|
|
$newparams{'-endindex'} = $params{'-endindex'}
|
|
if defined $params{'-endindex'};
|
|
$newparams{'-columns'} = $params{'-columns'};
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$newparams{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$newparams{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
$result = $GLPlugin::SNMP::session->get_entries(%newparams);
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries_get_next {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $result = {};
|
|
$self->debug(sprintf "get_entries_get_next %s", Data::Dumper::Dumper(\%params));
|
|
my %newparams = ();
|
|
$newparams{'-maxrepetitions'} = 0;
|
|
$newparams{'-startindex'} = $params{'-startindex'}
|
|
if defined $params{'-startindex'};
|
|
$newparams{'-endindex'} = $params{'-endindex'}
|
|
if defined $params{'-endindex'};
|
|
$newparams{'-columns'} = $params{'-columns'};
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$newparams{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$newparams{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
$result = $GLPlugin::SNMP::session->get_entries(%newparams);
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries_get_next_1index {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $result = {};
|
|
$self->debug(sprintf "get_entries_get_next_1index %s", Data::Dumper::Dumper(\%params));
|
|
my %newparams = ();
|
|
$newparams{'-startindex'} = $params{'-startindex'}
|
|
if defined $params{'-startindex'};
|
|
$newparams{'-endindex'} = $params{'-endindex'}
|
|
if defined $params{'-endindex'};
|
|
$newparams{'-columns'} = $params{'-columns'};
|
|
my %singleparams = ();
|
|
$singleparams{'-maxrepetitions'} = 0;
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$singleparams{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$singleparams{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
foreach my $index ($newparams{'-startindex'}..$newparams{'-endindex'}) {
|
|
foreach my $oid (@{$newparams{'-columns'}}) {
|
|
$singleparams{'-columns'} = [$oid];
|
|
$singleparams{'-startindex'} = $index;
|
|
$singleparams{'-endindex'} =$index;
|
|
my $singleresult = $GLPlugin::SNMP::session->get_entries(%singleparams);
|
|
foreach my $key (keys %{$singleresult}) {
|
|
$result->{$key} = $singleresult->{$key};
|
|
}
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries_get_simple {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $result = {};
|
|
$self->debug(sprintf "get_entries_get_simple %s", Data::Dumper::Dumper(\%params));
|
|
my %newparams = ();
|
|
$newparams{'-startindex'} = $params{'-startindex'}
|
|
if defined $params{'-startindex'};
|
|
$newparams{'-endindex'} = $params{'-endindex'}
|
|
if defined $params{'-endindex'};
|
|
$newparams{'-columns'} = $params{'-columns'};
|
|
my %singleparams = ();
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$singleparams{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$singleparams{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
foreach my $index ($newparams{'-startindex'}..$newparams{'-endindex'}) {
|
|
foreach my $oid (@{$newparams{'-columns'}}) {
|
|
$singleparams{'-varbindlist'} = [$oid.".".$index];
|
|
my $singleresult = $GLPlugin::SNMP::session->get_request(%singleparams);
|
|
foreach my $key (keys %{$singleresult}) {
|
|
$result->{$key} = $singleresult->{$key};
|
|
}
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
# [-startindex]
|
|
# [-endindex]
|
|
# -columns
|
|
my $result = {};
|
|
$self->debug(sprintf "get_entries %s", Data::Dumper::Dumper(\%params));
|
|
if (! $self->opts->snmpwalk) {
|
|
$result = $self->get_entries_get_bulk(%params);
|
|
if (! $result) {
|
|
if (scalar (@{$params{'-columns'}}) < 50 && $params{'-startindex'} eq $params{'-endindex'}) {
|
|
$result = $self->get_entries_get_simple(%params);
|
|
} else {
|
|
$result = $self->get_entries_get_next(%params);
|
|
}
|
|
if (! $result && $params{'-startindex'} !~ /\./) {
|
|
# compound indexes cannot continue, as these two methods iterate numerically
|
|
if ($GLPlugin::SNMP::session->error() =~ /tooBig/i) {
|
|
$result = $self->get_entries_get_next_1index(%params);
|
|
}
|
|
if (! $result) {
|
|
$result = $self->get_entries_get_simple(%params);
|
|
}
|
|
if (! $result) {
|
|
$self->debug(sprintf "nutzt nix\n");
|
|
}
|
|
}
|
|
}
|
|
foreach my $key (keys %{$result}) {
|
|
if (substr($key, -1) eq " ") {
|
|
my $value = $result->{$key};
|
|
delete $result->{$key};
|
|
$key =~ s/\s+$//g;
|
|
$result->{$key} = $value;
|
|
#
|
|
# warum?
|
|
#
|
|
# %newparams ist:
|
|
# '-columns' => [
|
|
# '1.3.6.1.2.1.2.2.1.8',
|
|
# '1.3.6.1.2.1.2.2.1.13',
|
|
# ...
|
|
# '1.3.6.1.2.1.2.2.1.16'
|
|
# ],
|
|
# '-startindex' => '2',
|
|
# '-endindex' => '2'
|
|
#
|
|
# und $result ist:
|
|
# ...
|
|
# '1.3.6.1.2.1.2.2.1.2.2' => 'Adaptive Security Appliance \'outside\' interface',
|
|
# '1.3.6.1.2.1.2.2.1.16.2 ' => 4281465004,
|
|
# '1.3.6.1.2.1.2.2.1.13.2' => 0,
|
|
# ...
|
|
#
|
|
# stinkstiefel!
|
|
#
|
|
}
|
|
$self->add_rawdata($key, $result->{$key});
|
|
}
|
|
} else {
|
|
my $preresult = $self->get_matching_oids(
|
|
-columns => $params{'-columns'});
|
|
foreach (keys %{$preresult}) {
|
|
$result->{$_} = $preresult->{$_};
|
|
}
|
|
my @sortedkeys = map { $_->[0] }
|
|
sort { $a->[1] cmp $b->[1] }
|
|
map { [$_,
|
|
join '', map { sprintf("%30d",$_) } split( /\./, $_)
|
|
] } keys %{$result};
|
|
my @to_del = ();
|
|
if ($params{'-startindex'}) {
|
|
foreach my $resoid (@sortedkeys) {
|
|
foreach my $oid (@{$params{'-columns'}}) {
|
|
my $poid = $oid.'.';
|
|
my $lpoid = length($poid);
|
|
if (substr($resoid, 0, $lpoid) eq $poid) {
|
|
my $oidpattern = $poid;
|
|
$oidpattern =~ s/\./\\./g;
|
|
if ($resoid =~ /^$oidpattern(.+)$/) {
|
|
if ($1 lt $params{'-startindex'}) {
|
|
push(@to_del, $oid.'.'.$1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($params{'-endindex'}) {
|
|
foreach my $resoid (@sortedkeys) {
|
|
foreach my $oid (@{$params{'-columns'}}) {
|
|
my $poid = $oid.'.';
|
|
my $lpoid = length($poid);
|
|
if (substr($resoid, 0, $lpoid) eq $poid) {
|
|
my $oidpattern = $poid;
|
|
$oidpattern =~ s/\./\\./g;
|
|
if ($resoid =~ /^$oidpattern(.+)$/) {
|
|
if ($1 gt $params{'-endindex'}) {
|
|
push(@to_del, $oid.'.'.$1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach (@to_del) {
|
|
delete $result->{$_};
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
sub get_entries_by_walk {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
if (! $self->opts->snmpwalk) {
|
|
$self->add_ok("if you get this crap working correctly, let me know");
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$params{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$params{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
$self->debug(sprintf "get_tree %s", Data::Dumper::Dumper(\%params));
|
|
my @baseoids = @{$params{-varbindlist}};
|
|
delete $params{-varbindlist};
|
|
if ($GLPlugin::SNMP::session->version() == 0) {
|
|
foreach my $baseoid (@baseoids) {
|
|
$params{-varbindlist} = [$baseoid];
|
|
while (my $result = $GLPlugin::SNMP::session->get_next_request(%params)) {
|
|
$params{-varbindlist} = [($GLPlugin::SNMP::session->var_bind_names)[0]];
|
|
}
|
|
}
|
|
} else {
|
|
$params{-maxrepetitions} = 200;
|
|
printf "bratta %s\n", Data::Dumper::Dumper(\@baseoids);
|
|
foreach my $baseoid (@baseoids) {
|
|
$params{-varbindlist} = [$baseoid];
|
|
while (my $result = $GLPlugin::SNMP::session->get_bulk_request(%params)) {
|
|
printf "hoi %s\n", Data::Dumper::Dumper($result);
|
|
my @names = $GLPlugin::SNMP::session->var_bind_names();
|
|
my @oids = $self->sort_oids(\@names);
|
|
$params{-varbindlist} = [pop @oids];
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return $self->get_matching_oids(
|
|
-columns => $params{-varbindlist});
|
|
}
|
|
}
|
|
|
|
sub get_table {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
$self->add_oidtrace($params{'-baseoid'});
|
|
if (! $self->opts->snmpwalk) {
|
|
my @notcached = ();
|
|
if ($GLPlugin::SNMP::session->version() == 3) {
|
|
$params{-contextengineid} = $self->opts->contextengineid if $self->opts->contextengineid;
|
|
$params{-contextname} = $self->opts->contextname if $self->opts->contextname;
|
|
}
|
|
$self->debug(sprintf "get_table %s", Data::Dumper::Dumper(\%params));
|
|
my $result = $GLPlugin::SNMP::session->get_table(%params);
|
|
$self->debug(sprintf "get_table returned %d oids", scalar(keys %{$result}));
|
|
if (scalar(keys %{$result}) == 0) {
|
|
$self->debug(sprintf "get_table error: %s",
|
|
$GLPlugin::SNMP::session->error());
|
|
$self->debug("get_table error: try fallback");
|
|
$params{'-maxrepetitions'} = 1;
|
|
$self->debug(sprintf "get_table %s", Data::Dumper::Dumper(\%params));
|
|
$result = $GLPlugin::SNMP::session->get_table(%params);
|
|
$self->debug(sprintf "get_table returned %d oids", scalar(keys %{$result}));
|
|
if (scalar(keys %{$result}) == 0) {
|
|
$self->debug(sprintf "get_table error: %s",
|
|
$GLPlugin::SNMP::session->error());
|
|
$self->debug("get_table error: no more fallbacks. Try --protocol 1");
|
|
}
|
|
}
|
|
# Drecksstinkstiefel Net::SNMP
|
|
# '1.3.6.1.2.1.2.2.1.22.4 ' => 'endOfMibView',
|
|
# '1.3.6.1.2.1.2.2.1.22.4' => '0.0',
|
|
foreach my $key (keys %{$result}) {
|
|
if (substr($key, -1) eq " ") {
|
|
my $value = $result->{$key};
|
|
delete $result->{$key};
|
|
(my $shortkey = $key) =~ s/\s+$//g;
|
|
if (! exists $result->{shortkey}) {
|
|
$result->{$shortkey} = $value;
|
|
}
|
|
$self->add_rawdata($key, $result->{$key}) if exists $result->{$key};
|
|
} else {
|
|
$self->add_rawdata($key, $result->{$key});
|
|
}
|
|
}
|
|
}
|
|
return $self->get_matching_oids(
|
|
-columns => [$params{'-baseoid'}]);
|
|
}
|
|
|
|
################################################################
|
|
# helper functions
|
|
#
|
|
sub valid_response {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $oid = shift;
|
|
my $index = shift;
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib} &&
|
|
exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$oid}) {
|
|
# make it numerical
|
|
my $oid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$oid};
|
|
if (defined $index) {
|
|
$oid .= '.'.$index;
|
|
}
|
|
my $result = $self->get_request(
|
|
-varbindlist => [$oid]
|
|
);
|
|
if (!defined($result) ||
|
|
! defined $result->{$oid} ||
|
|
$result->{$oid} eq 'noSuchInstance' ||
|
|
$result->{$oid} eq 'noSuchObject' ||
|
|
$result->{$oid} eq 'endOfMibView') {
|
|
return undef;
|
|
} else {
|
|
$self->add_rawdata($oid, $result->{$oid});
|
|
return $result->{$oid};
|
|
}
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
# make_symbolic
|
|
# mib is the name of a mib (must be in mibs_and_oids)
|
|
# result is a hash-key oid->value
|
|
# indices is a array ref of array refs. [[1],[2],...] or [[1,0],[1,1],[2,0]..
|
|
sub make_symbolic {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $result = shift;
|
|
my $indices = shift;
|
|
my @entries = ();
|
|
if (! wantarray && ref(\$result) eq "SCALAR" && ref(\$indices) eq "SCALAR") {
|
|
# $self->make_symbolic('CISCO-IETF-NAT-MIB', 'cnatProtocolStatsName', $self->{cnatProtocolStatsName});
|
|
my $oid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$result};
|
|
$result = { $oid => $self->{$result} };
|
|
$indices = [[]];
|
|
}
|
|
foreach my $index (@{$indices}) {
|
|
# skip [], [[]], [[undef]]
|
|
if (ref($index) eq "ARRAY") {
|
|
if (scalar(@{$index}) == 0) {
|
|
next;
|
|
} elsif (!defined $index->[0]) {
|
|
next;
|
|
}
|
|
}
|
|
my $mo = {};
|
|
my $idx = join('.', @{$index}); # index can be multi-level
|
|
foreach my $symoid
|
|
(keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}}) {
|
|
my $oid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid};
|
|
if (ref($oid) ne 'HASH') {
|
|
my $fulloid = $oid . '.'.$idx;
|
|
if (exists $result->{$fulloid}) {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}) {
|
|
if (ref($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}) eq 'HASH') {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}->{$result->{$fulloid}}) {
|
|
$mo->{$symoid} = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}->{$result->{$fulloid}};
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$fulloid};
|
|
}
|
|
} elsif ($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'} =~ /^OID::(.*)/) {
|
|
my $othermib = $1;
|
|
my $value_which_is_a_oid = $result->{$fulloid};
|
|
$value_which_is_a_oid =~ s/^\.//g;
|
|
my @result = grep { $GLPlugin::SNMP::mibs_and_oids->{$othermib}->{$_} eq $value_which_is_a_oid } keys %{$GLPlugin::SNMP::mibs_and_oids->{$othermib}};
|
|
if (scalar(@result)) {
|
|
$mo->{$symoid} = $result[0];
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$fulloid};
|
|
}
|
|
} elsif ($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'} =~ /^(.*?)::(.*)/) {
|
|
my $mib = $1;
|
|
my $definition = $2;
|
|
if (exists $GLPlugin::SNMP::definitions->{$mib} && exists $GLPlugin::SNMP::definitions->{$mib}->{$definition}
|
|
&& exists $GLPlugin::SNMP::definitions->{$mib}->{$definition}->{$result->{$fulloid}}) {
|
|
$mo->{$symoid} = $GLPlugin::SNMP::definitions->{$mib}->{$definition}->{$result->{$fulloid}};
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$fulloid};
|
|
}
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$fulloid};
|
|
# oder $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}?
|
|
}
|
|
} else {
|
|
$mo->{$symoid} = $result->{$fulloid};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
push(@entries, $mo);
|
|
}
|
|
if (@{$indices} and scalar(@{$indices}) == 1 and !defined $indices->[0]->[0]) {
|
|
my $mo = {};
|
|
foreach my $symoid
|
|
(keys %{$GLPlugin::SNMP::mibs_and_oids->{$mib}}) {
|
|
my $oid = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid};
|
|
if (ref($oid) ne 'HASH') {
|
|
if (exists $result->{$oid}) {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}) {
|
|
if (ref($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}) eq 'HASH') {
|
|
if (exists $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}->{$result->{$oid}}) {
|
|
$mo->{$symoid} = $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}->{$result->{$oid}};
|
|
push(@entries, $mo);
|
|
}
|
|
} elsif ($GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'} =~ /^(.*?)::(.*)/) {
|
|
my $mib = $1;
|
|
my $definition = $2;
|
|
if (exists $GLPlugin::SNMP::definitions->{$mib} && exists $GLPlugin::SNMP::definitions->{$mib}->{$definition}
|
|
&& exists $GLPlugin::SNMP::definitions->{$mib}->{$definition}->{$result->{$oid}}) {
|
|
$mo->{$symoid} = $GLPlugin::SNMP::definitions->{$mib}->{$definition}->{$result->{$oid}};
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$oid};
|
|
}
|
|
} else {
|
|
$mo->{$symoid} = 'unknown_'.$result->{$oid};
|
|
# oder $GLPlugin::SNMP::mibs_and_oids->{$mib}->{$symoid.'Definition'}?
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
push(@entries, $mo) if keys %{$mo};
|
|
}
|
|
if (wantarray) {
|
|
return @entries;
|
|
} else {
|
|
foreach my $entry (@entries) {
|
|
foreach my $key (keys %{$entry}) {
|
|
$self->{$key} = $entry->{$key};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub sort_oids {
|
|
my $self = shift;
|
|
my $oids = shift || [];
|
|
my @sortedkeys = map { $_->[0] }
|
|
sort { $a->[1] cmp $b->[1] }
|
|
map { [$_,
|
|
join '', map { sprintf("%30d",$_) } split( /\./, $_)
|
|
] } @{$oids};
|
|
return @sortedkeys;
|
|
}
|
|
|
|
sub get_matching_oids {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $result = {};
|
|
$self->debug(sprintf "get_matching_oids %s", Data::Dumper::Dumper(\%params));
|
|
foreach my $oid (@{$params{'-columns'}}) {
|
|
my $oidpattern = $oid;
|
|
$oidpattern =~ s/\./\\./g;
|
|
map { $result->{$_} = $GLPlugin::SNMP::rawdata->{$_} }
|
|
grep /^$oidpattern(?=\.|$)/, keys %{$GLPlugin::SNMP::rawdata};
|
|
}
|
|
$self->debug(sprintf "get_matching_oids returns %d from %d oids",
|
|
scalar(keys %{$result}), scalar(keys %{$GLPlugin::SNMP::rawdata}));
|
|
return $result;
|
|
}
|
|
|
|
sub get_indices {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
# -baseoid : entry
|
|
# find all oids beginning with $entry
|
|
# then skip one field for the sequence
|
|
# then read the next numindices fields
|
|
my $entrypat = $params{'-baseoid'};
|
|
$entrypat =~ s/\./\\\./g;
|
|
my @indices = map {
|
|
/^$entrypat\.\d+\.(.*)/ && $1;
|
|
} grep {
|
|
/^$entrypat/
|
|
} keys %{$GLPlugin::SNMP::rawdata};
|
|
my %seen = ();
|
|
my @o = map {[split /\./]} sort grep !$seen{$_}++, @indices;
|
|
return @o;
|
|
}
|
|
|
|
# this flattens a n-dimensional array and returns the absolute position
|
|
# of the element at position idx1,idx2,...,idxn
|
|
# element 1,2 in table 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 is at pos 6
|
|
sub get_number {
|
|
my $self = shift;
|
|
my $indexlists = shift; #, zeiger auf array aus [1, 2]
|
|
my @element = @_;
|
|
my $dimensions = scalar(@{$indexlists->[0]});
|
|
my @sorted = ();
|
|
my $number = 0;
|
|
if ($dimensions == 1) {
|
|
@sorted =
|
|
sort { $a->[0] <=> $b->[0] } @{$indexlists};
|
|
} elsif ($dimensions == 2) {
|
|
@sorted =
|
|
sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @{$indexlists};
|
|
} elsif ($dimensions == 3) {
|
|
@sorted =
|
|
sort { $a->[0] <=> $b->[0] ||
|
|
$a->[1] <=> $b->[1] ||
|
|
$a->[2] <=> $b->[2] } @{$indexlists};
|
|
}
|
|
foreach (@sorted) {
|
|
if ($dimensions == 1) {
|
|
if ($_->[0] == $element[0]) {
|
|
last;
|
|
}
|
|
} elsif ($dimensions == 2) {
|
|
if ($_->[0] == $element[0] && $_->[1] == $element[1]) {
|
|
last;
|
|
}
|
|
} elsif ($dimensions == 3) {
|
|
if ($_->[0] == $element[0] &&
|
|
$_->[1] == $element[1] &&
|
|
$_->[2] == $element[2]) {
|
|
last;
|
|
}
|
|
}
|
|
$number++;
|
|
}
|
|
return ++$number;
|
|
}
|
|
|
|
################################################################
|
|
# caching functions
|
|
#
|
|
sub set_rawdata {
|
|
my $self = shift;
|
|
$GLPlugin::SNMP::rawdata = shift;
|
|
}
|
|
|
|
sub add_rawdata {
|
|
my $self = shift;
|
|
my $oid = shift;
|
|
my $value = shift;
|
|
$GLPlugin::SNMP::rawdata->{$oid} = $value;
|
|
}
|
|
|
|
sub rawdata {
|
|
my $self = shift;
|
|
return $GLPlugin::SNMP::rawdata;
|
|
}
|
|
|
|
sub add_oidtrace {
|
|
my $self = shift;
|
|
my $oid = shift;
|
|
$self->debug("cache: ".$oid);
|
|
push(@{$GLPlugin::SNMP::oidtrace}, $oid);
|
|
}
|
|
|
|
# $self->update_entry_cache(0, $mib, $table, $key_attr);
|
|
# my @indices = $self->get_cache_indices();
|
|
sub get_cache_indices {
|
|
my $self = shift;
|
|
my $mib = shift;
|
|
my $table = shift;
|
|
my $key_attr = shift;
|
|
if (ref($key_attr) ne "ARRAY") {
|
|
$key_attr = [$key_attr];
|
|
}
|
|
my $cache = sprintf "%s_%s_%s_cache",
|
|
$mib, $table, join('#', @{$key_attr});
|
|
my @indices = ();
|
|
foreach my $key (keys %{$self->{$cache}}) {
|
|
my ($descr, $index) = split('-//-', $key, 2);
|
|
if ($self->opts->name) {
|
|
if ($self->opts->regexp) {
|
|
my $pattern = $self->opts->name;
|
|
if ($descr =~ /$pattern/i) {
|
|
push(@indices, $self->{$cache}->{$key});
|
|
}
|
|
} else {
|
|
if ($self->opts->name =~ /^\d+$/) {
|
|
if ($index == 1 * $self->opts->name) {
|
|
push(@indices, [1 * $self->opts->name]);
|
|
}
|
|
} else {
|
|
if (lc $descr eq lc $self->opts->name) {
|
|
push(@indices, $self->{$cache}->{$key});
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
push(@indices, $self->{$cache}->{$key});
|
|
}
|
|
}
|
|
return @indices;
|
|
return map { join('.', ref($_) eq "ARRAY" ? @{$_} : $_) } @indices;
|
|
}
|
|
|
|
|
|
package GLPlugin::SNMP::CSF;
|
|
#our @ISA = qw(GLPlugin::SNMP);
|
|
use Digest::MD5 qw(md5_hex);
|
|
use strict;
|
|
|
|
sub create_statefile {
|
|
my $self = shift;
|
|
my %params = @_;
|
|
my $extension = "";
|
|
$extension .= $params{name} ? '_'.$params{name} : '';
|
|
if ($self->opts->community) {
|
|
$extension .= md5_hex($self->opts->community);
|
|
}
|
|
$extension =~ s/\//_/g;
|
|
$extension =~ s/\(/_/g;
|
|
$extension =~ s/\)/_/g;
|
|
$extension =~ s/\*/_/g;
|
|
$extension =~ s/\s/_/g;
|
|
if ($self->opts->snmpwalk && ! $self->opts->hostname) {
|
|
return sprintf "%s/%s_%s%s", $self->statefilesdir(),
|
|
'snmpwalk.file'.md5_hex($self->opts->snmpwalk),
|
|
$self->opts->mode, lc $extension;
|
|
} elsif ($self->opts->snmpwalk && $self->opts->hostname eq "walkhost") {
|
|
return sprintf "%s/%s_%s%s", $self->statefilesdir(),
|
|
'snmpwalk.file'.md5_hex($self->opts->snmpwalk),
|
|
$self->opts->mode, lc $extension;
|
|
} else {
|
|
return sprintf "%s/%s_%s%s", $self->statefilesdir(),
|
|
$self->opts->hostname, $self->opts->mode, lc $extension;
|
|
}
|
|
}
|
|
|
|
package GLPlugin::SNMP::Item;
|
|
our @ISA = qw(GLPlugin::SNMP::CSF GLPlugin::Item GLPlugin::SNMP);
|
|
use strict;
|
|
|
|
|
|
package GLPlugin::SNMP::TableItem;
|
|
our @ISA = qw(GLPlugin::SNMP::CSF GLPlugin::TableItem GLPlugin::SNMP);
|
|
use strict;
|
|
|
|
sub ensure_index {
|
|
my $self = shift;
|
|
my $key = shift;
|
|
$self->{$key} ||= $self->{flat_indices};
|
|
}
|
|
|
|
sub unhex_ip {
|
|
my $self = shift;
|
|
my $value = shift;
|
|
if ($value && $value =~ /^0x(\w{8})/) {
|
|
$value = join(".", unpack "C*", pack "H*", $1);
|
|
} elsif ($value && $value =~ /^0x(\w{2} \w{2} \w{2} \w{2})/) {
|
|
$value = $1;
|
|
$value =~ s/ //g;
|
|
$value = join(".", unpack "C*", pack "H*", $value);
|
|
} elsif ($value && unpack("H8", $value) =~ /(\w{2})(\w{2})(\w{2})(\w{2})/) {
|
|
$value = join(".", map { hex($_) } ($1, $2, $3, $4));
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
sub unhex_mac {
|
|
my $self = shift;
|
|
my $value = shift;
|
|
if ($value && $value =~ /^0x(\w{12})/) {
|
|
$value = join(".", unpack "C*", pack "H*", $1);
|
|
} elsif ($value && $value =~ /^0x(\w{2}\s*\w{2}\s*\w{2}\s*\w{2}\s*\w{2}\s*\w{2})/) {
|
|
$value = $1;
|
|
$value =~ s/ //g;
|
|
$value = join(":", unpack "C*", pack "H*", $value);
|
|
} elsif ($value && unpack("H12", $value) =~ /(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})/) {
|
|
$value = join(":", map { hex($_) } ($1, $2, $3, $4, $5, $6));
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
|