This commit is contained in:
Quentin Garnier 2014-01-29 17:58:57 +01:00
parent 217ed3c7b6
commit 08ba9bc852
12 changed files with 896 additions and 533 deletions

View File

@ -0,0 +1,116 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::blade;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
sub check {
my ($self) = @_;
$self->{components}->{blades} = {name => 'blades', total => 0};
$self->{output}->output_add(long_msg => "Checking blades");
return if ($self->check_exclude('blades'));
my $oid_cpqRackServerBladePresent = '.1.3.6.1.4.1.232.22.2.4.1.1.1.12';
my $oid_cpqRackServerBladeIndex = '.1.3.6.1.4.1.232.22.2.4.1.1.1.3';
my $oid_cpqRackServerBladeName = '.1.3.6.1.4.1.232.22.2.4.1.1.1.4';
my $oid_cpqRackServerBladePartNumber = '.1.3.6.1.4.1.232.22.2.4.1.1.1.6';
my $oid_cpqRackServerBladeSparePartNumber = '.1.3.6.1.4.1.232.22.2.4.1.1.1.7';
my $oid_cpqRackServerBladeProductId = '.1.3.6.1.4.1.232.22.2.4.1.1.1.17';
my $oid_cpqRackServerBladeStatus = '.1.3.6.1.4.1.232.22.2.4.1.1.1.21'; # v2
my $oid_cpqRackServerBladeFaultDiagnosticString = '.1.3.6.1.4.1.232.22.2.4.1.1.1.24'; # v2
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackServerBladePresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackServerBladeIndex . "." . $oid_end, $oid_cpqRackServerBladeName . "." . $oid_end,
$oid_cpqRackServerBladePartNumber . "." . $oid_end, $oid_cpqRackServerBladeSparePartNumber . "." . $oid_end,
$oid_cpqRackServerBladeProductId . "." . $oid_end,
$oid_cpqRackServerBladeStatus . "." . $oid_end, $oid_cpqRackServerBladeFaultDiagnosticString . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $blade_index = $result->{$oid_cpqRackServerBladeIndex . '.' . $_};
my $blade_status = defined($result->{$oid_cpqRackServerBladeStatus . '.' . $_}) ? $result->{$oid_cpqRackServerBladeStatus . '.' . $_} : '';
my $blade_name = $result->{$oid_cpqRackServerBladeName . '.' . $_};
my $blade_part = $result->{$oid_cpqRackServerBladePartNumber . '.' . $_};
my $blade_spare = $result->{$oid_cpqRackServerBladeSparePartNumber . '.' . $_};
my $blade_productid = $result->{$oid_cpqRackServerBladeProductId . '.' . $_};
my $blade_diago = defined($result->{$oid_cpqRackServerBladeFaultDiagnosticString . '.' . $_}) ? $result->{$oid_cpqRackServerBladeFaultDiagnosticString . '.' . $_} : '';
$self->{components}->{blades}->{total}++;
if ($blade_status eq '') {
$self->{output}->output_add(long_msg => sprintf("Skipping Blade %d (%s, %s). Cant get status.",
$blade_index, $blade_name, $blade_productid));
next;
}
$self->{output}->output_add(long_msg => sprintf("Blade %d (%s, %s) status is %s [part: %s, spare: %s]%s.",
$blade_index, $blade_name, $blade_productid,
${$conditions{$blade_status}}[0],
$blade_part, $blade_spare,
($blade_diago ne '') ? " (Diagnostic '$blade_diago')" : ''
));
if ($blade_status != 2) {
$self->{output}->output_add(severity => ${$conditions{$blade_status}}[1],
short_msg => sprintf("Blade %d (%s, %s) status is %s",
$blade_index, $blade_name, $blade_productid,
${$conditions{$blade_status}}[0]
));
}
}
}
1;

View File

@ -0,0 +1,70 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::enclosure;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
sub check {
my ($self) = @_;
my $oid_cpqRackCommonEnclosurePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.1.1.5.1';
my $oid_cpqRackCommonEnclosureSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.1.1.6.1';
my $oid_cpqRackCommonEnclosureSerialNum = '.1.3.6.1.4.1.232.22.2.3.1.1.1.7.1';
my $oid_cpqRackCommonEnclosureFWRev = '.1.3.6.1.4.1.232.22.2.3.1.1.1.8.1';
my $oid_cpqRackCommonEnclosureCondition = '.1.3.6.1.4.1.232.22.2.3.1.1.1.16.1';
my $result = $self->{snmp}->get_leef(oids => [$oid_cpqRackCommonEnclosurePartNumber, $oid_cpqRackCommonEnclosureSparePartNumber,
$oid_cpqRackCommonEnclosureSerialNum, $oid_cpqRackCommonEnclosureFWRev,
$oid_cpqRackCommonEnclosureCondition], nothing_quit => 1);
$self->{output}->output_add(long_msg => sprintf("Enclosure overall health condition is %s [part: %s, spare: %s, sn: %s, fw: %s].",
${$conditions{$result->{$oid_cpqRackCommonEnclosureCondition}}}[0],
$result->{$oid_cpqRackCommonEnclosurePartNumber},
$result->{$oid_cpqRackCommonEnclosureSparePartNumber},
$result->{$oid_cpqRackCommonEnclosureSerialNum},
$result->{$oid_cpqRackCommonEnclosureFWRev}));
if ($result->{$oid_cpqRackCommonEnclosureCondition} != 2) {
$self->{output}->output_add(severity => ${$conditions{$result->{$oid_cpqRackCommonEnclosureCondition}}}[1],
short_msg => sprintf("Enclosure overall health condition is %s", ${$conditions{$result->{$oid_cpqRackCommonEnclosureCondition}}}[0]));
}
}
1;

View File

@ -0,0 +1,96 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::fan;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
sub check {
my ($self) = @_;
$self->{components}->{fans} = {name => 'fans', total => 0};
$self->{output}->output_add(long_msg => "Checking fans");
return if ($self->check_exclude('fans'));
my $oid_cpqRackCommonEnclosureFanPresent = '.1.3.6.1.4.1.232.22.2.3.1.3.1.8';
my $oid_cpqRackCommonEnclosureFanIndex = '.1.3.6.1.4.1.232.22.2.3.1.3.1.3';
my $oid_cpqRackCommonEnclosureFanPartNumber = '.1.3.6.1.4.1.232.22.2.3.1.3.1.6';
my $oid_cpqRackCommonEnclosureFanSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.3.1.7';
my $oid_cpqRackCommonEnclosureFanCondition = '.1.3.6.1.4.1.232.22.2.3.1.3.1.11';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureFanPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackCommonEnclosureFanIndex . "." . $oid_end, $oid_cpqRackCommonEnclosureFanPartNumber . "." . $oid_end,
$oid_cpqRackCommonEnclosureFanSparePartNumber . "." . $oid_end, $oid_cpqRackCommonEnclosureFanCondition . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $fan_index = $result->{$oid_cpqRackCommonEnclosureFanIndex . '.' . $_};
my $fan_condition = $result->{$oid_cpqRackCommonEnclosureFanCondition . '.' . $_};
my $fan_part = $result->{$oid_cpqRackCommonEnclosureFanPartNumber . '.' . $_};
my $fan_spare = $result->{$oid_cpqRackCommonEnclosureFanSparePartNumber . '.' . $_};
$self->{components}->{fans}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan %d condition is %s [part: %s, spare: %s].",
$fan_index, ${$conditions{$fan_condition}}[0],
$fan_part, $fan_spare));
if ($fan_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$fan_condition}}[1],
short_msg => sprintf("Fan %d condition is %s", $fan_index, ${$conditions{$fan_condition}}[0]));
}
}
}
1;

View File

@ -0,0 +1,97 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::fuse;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
sub check {
my ($self) = @_;
$self->{components}->{fuses} = {name => 'fuses', total => 0};
$self->{output}->output_add(long_msg => "Checking fuse");
return if ($self->check_exclude('fuse'));
my $oid_cpqRackCommonEnclosureFusePresent = '.1.3.6.1.4.1.232.22.2.3.1.4.1.6';
my $oid_cpqRackCommonEnclosureFuseIndex = '.1.3.6.1.4.1.232.22.2.3.1.4.1.3';
my $oid_cpqRackCommonEnclosureFuseEnclosureName = '.1.3.6.1.4.1.232.22.2.3.1.4.1.4';
my $oid_cpqRackCommonEnclosureFuseLocation = '.1.3.6.1.4.1.232.22.2.3.1.4.1.5';
my $oid_cpqRackCommonEnclosureFuseCondition = '.1.3.6.1.4.1.232.22.2.3.1.4.1.7';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureFusePresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackCommonEnclosureFuseIndex . "." . $oid_end, $oid_cpqRackCommonEnclosureFuseEnclosureName . "." . $oid_end,
$oid_cpqRackCommonEnclosureFuseLocation . "." . $oid_end, $oid_cpqRackCommonEnclosureFuseCondition . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $fuse_index = $result->{$oid_cpqRackCommonEnclosureFuseIndex . '.' . $_};
my $fuse_name = $result->{$oid_cpqRackCommonEnclosureFuseEnclosureName . '.' . $_};
my $fuse_location = $result->{$oid_cpqRackCommonEnclosureFuseLocation . '.' . $_};
my $fuse_condition = $result->{$oid_cpqRackCommonEnclosureFuseCondition . '.' . $_};
$self->{components}->{fuses}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fuse %d status is %s [name: %s, location: %s].",
$fuse_index, ${$conditions{$fuse_condition}}[0],
$fuse_name, $fuse_location));
if ($fuse_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$fuse_condition}}[1],
short_msg => sprintf("Fuse %d status is %s",
$fuse_index, ${$conditions{$fuse_condition}}[0]));
}
}
}
1;

View File

@ -0,0 +1,98 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::manager;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %map_role = (
1 => 'Standby',
2 => 'Active',
);
sub check {
my ($self, %options) = @_;
$self->{components}->{managers} = {name => 'managers', total => 0};
return if ($self->check_exclude('managers'));
# No check if OK
if ((!defined($options{force}) || $options{force} != 1) && $self->{output}->is_status(compare => 'ok', litteral => 1)) {
return ;
}
$self->{output}->output_add(long_msg => "Checking managers");
my $oid_cpqRackCommonEnclosureManagerIndex = '.1.3.6.1.4.1.232.22.2.3.1.6.1.3';
my $oid_cpqRackCommonEnclosureManagerPartNumber = '.1.3.6.1.4.1.232.22.2.3.1.6.1.6';
my $oid_cpqRackCommonEnclosureManagerSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.6.1.7';
my $oid_cpqRackCommonEnclosureManagerSerialNum = '.1.3.6.1.4.1.232.22.2.3.1.6.1.8';
my $oid_cpqRackCommonEnclosureManagerRole = '.1.3.6.1.4.1.232.22.2.3.1.6.1.9';
my $oid_cpqRackCommonEnclosureManagerCondition = '.1.3.6.1.4.1.232.22.2.3.1.6.1.12';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureManagerIndex);
return if (scalar(keys %$result) <= 0);
$self->{snmp}->load(oids => [$oid_cpqRackCommonEnclosureManagerPartNumber, $oid_cpqRackCommonEnclosureManagerSparePartNumber,
$oid_cpqRackCommonEnclosureManagerSerialNum, $oid_cpqRackCommonEnclosureManagerRole,
$oid_cpqRackCommonEnclosureManagerCondition],
instances => [keys %$result]);
my $result2 = $self->{snmp}->get_leef();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
$key =~ /(\d+)$/;
my $instance = $1;
my $man_part = $result2->{$oid_cpqRackCommonEnclosureManagerPartNumber . '.' . $instance};
my $man_spare = $result2->{$oid_cpqRackCommonEnclosureManagerSparePartNumber . '.' . $instance};
my $man_serial = $result2->{$oid_cpqRackCommonEnclosureManagerSerialNum . '.' . $instance};
my $man_role = $result2->{$oid_cpqRackCommonEnclosureManagerRole . '.' . $instance};
my $man_condition = $result2->{$oid_cpqRackCommonEnclosureManagerCondition . '.' . $instance};
$self->{components}->{managers}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Enclosure management module %d is %s, status is %s [serial: %s, part: %s, spare: %s].",
$instance, ${$conditions{$man_condition}}[0], $map_role{$man_role},
$man_serial, $man_part, $man_spare));
if ($man_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$man_condition}}[1],
short_msg => sprintf("Enclosure management module %d is %s, status is %s",
$instance, ${$conditions{$man_condition}}[0], $map_role{$man_role}));
}
}
}
1;

View File

@ -0,0 +1,101 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::network;
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
my %device_type = (
1 => 'noconnect',
2 => 'network',
3 => 'fibrechannel',
4 => 'sas',
5 => 'inifiband',
6 => 'pciexpress',
);
sub check {
my ($self) = @_;
$self->{components}->{network} = {name => 'network connectors', total => 0};
$self->{output}->output_add(long_msg => "Checking network connectors");
return if ($self->check_exclude('network'));
my $oid_cpqRackNetConnectorPresent = '.1.3.6.1.4.1.232.22.2.6.1.1.1.13';
my $oid_cpqRackNetConnectorIndex = '.1.3.6.1.4.1.232.22.2.6.1.1.1.3';
my $oid_cpqRackNetConnectorModel = '.1.3.6.1.4.1.232.22.2.6.1.1.1.6';
my $oid_cpqRackNetConnectorSerialNum = '.1.3.6.1.4.1.232.22.2.6.1.1.1.7';
my $oid_cpqRackNetConnectorPartNumber = '.1.3.6.1.4.1.232.22.2.6.1.1.1.8';
my $oid_cpqRackNetConnectorSparePartNumber = '.1.3.6.1.4.1.232.22.2.6.1.1.1.9';
my $oid_cpqRackNetConnectorDeviceType = '.1.3.6.1.4.1.232.22.2.6.1.1.1.17';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackNetConnectorPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackNetConnectorIndex . "." . $oid_end, $oid_cpqRackNetConnectorModel . "." . $oid_end,
$oid_cpqRackNetConnectorSerialNum . "." . $oid_end, $oid_cpqRackNetConnectorPartNumber . "." . $oid_end,
$oid_cpqRackNetConnectorSparePartNumber . "." . $oid_end, $oid_cpqRackNetConnectorDeviceType . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $nc_index = $result->{$oid_cpqRackNetConnectorIndex . '.' . $_};
my $nc_model = $result->{$oid_cpqRackNetConnectorModel . '.' . $_};
my $nc_serial = $result->{$oid_cpqRackNetConnectorSerialNum . '.' . $_};
my $nc_part = $result->{$oid_cpqRackNetConnectorPartNumber . '.' . $_};
my $nc_spare = $result->{$oid_cpqRackNetConnectorSparePartNumber . '.' . $_};
my $nc_device = $result->{$oid_cpqRackNetConnectorDeviceType . '.' . $_};
$self->{components}->{network}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Network Connector %d (%s) type '%s' is present [serial: %s, part: %s, spare: %s].",
$nc_index, $nc_model,
$device_type{$nc_device},
$nc_serial, $nc_part, $nc_spare
));
}
}
1;

View File

@ -0,0 +1,161 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::psu;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
my %psu_status_map = (
1 => 'noError',
2 => 'generalFailure',
3 => 'bistFailure',
4 => 'fanFailure',
5 => 'tempFailure',
6 => 'interlockOpen',
7 => 'epromFailed',
8 => 'vrefFailed',
9 => 'dacFailed',
10 => 'ramTestFailed',
11 => 'voltageChannelFailed',
12 => 'orringdiodeFailed',
13 => 'brownOut',
14 => 'giveupOnStartup',
15 => 'nvramInvalid',
16 => 'calibrationTableInvalid',
);
my %inputline_status_map = (
1 => 'noError',
2 => 'lineOverVoltage',
3 => 'lineUnderVoltage',
4 => 'lineHit',
5 => 'brownOut',
6 => 'linePowerLoss',
);
sub check {
my ($self) = @_;
# We dont check 'cpqRackPowerEnclosureTable' (the overall power system status)
# We check 'cpqRackPowerSupplyTable' (unitary)
$self->{components}->{psu} = {name => 'power supplies', total => 0};
$self->{output}->output_add(long_msg => "Checking power supplies");
return if ($self->check_exclude('psu'));
my $oid_cpqRackPowerSupplyPresent = '.1.3.6.1.4.1.232.22.2.5.1.1.1.16';
my $oid_cpqRackPowerSupplyIndex = '.1.3.6.1.4.1.232.22.2.5.1.1.1.3';
my $oid_cpqRackPowerSupplySerialNum = '.1.3.6.1.4.1.232.22.2.5.1.1.1.5';
my $oid_cpqRackPowerSupplyPartNumber = '.1.3.6.1.4.1.232.22.2.5.1.1.1.6';
my $oid_cpqRackPowerSupplySparePartNumber = '.1.3.6.1.4.1.232.22.2.5.1.1.1.7';
my $oid_cpqRackPowerSupplyStatus = '.1.3.6.1.4.1.232.22.2.5.1.1.1.14';
my $oid_cpqRackPowerSupplyInputLineStatus = '.1.3.6.1.4.1.232.22.2.5.1.1.1.15';
my $oid_cpqRackPowerSupplyCondition = '.1.3.6.1.4.1.232.22.2.5.1.1.1.17';
my $oid_cpqRackPowerSupplyCurPwrOutput = '.1.3.6.1.4.1.232.22.2.5.1.1.1.10'; # Watts
my $oid_cpqRackPowerSupplyIntakeTemp = '.1.3.6.1.4.1.232.22.2.5.1.1.1.12';
my $oid_cpqRackPowerSupplyExhaustTemp = '.1.3.6.1.4.1.232.22.2.5.1.1.1.13';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackPowerSupplyPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackPowerSupplyIndex . "." . $oid_end, $oid_cpqRackPowerSupplySerialNum . "." . $oid_end,
$oid_cpqRackPowerSupplyPartNumber . "." . $oid_end, $oid_cpqRackPowerSupplySparePartNumber . "." . $oid_end,
$oid_cpqRackPowerSupplyStatus . "." . $oid_end, $oid_cpqRackPowerSupplyInputLineStatus . "." . $oid_end,
$oid_cpqRackPowerSupplyCondition . "." . $oid_end, $oid_cpqRackPowerSupplyCurPwrOutput . "." . $oid_end,
$oid_cpqRackPowerSupplyIntakeTemp . "." . $oid_end, $oid_cpqRackPowerSupplyExhaustTemp . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
my $total_watts = 0;
foreach (@oids_end) {
my $psu_index = $result->{$oid_cpqRackPowerSupplyIndex . '.' . $_};
my $psu_status = $result->{$oid_cpqRackPowerSupplyStatus . '.' . $_};
my $psu_serial = $result->{$oid_cpqRackPowerSupplySerialNum . '.' . $_};
my $psu_part = $result->{$oid_cpqRackPowerSupplyPartNumber . '.' . $_};
my $psu_spare = $result->{$oid_cpqRackPowerSupplySparePartNumber . '.' . $_};
my $psu_inputlinestatus = $result->{$oid_cpqRackPowerSupplyInputLineStatus . '.' . $_};
my $psu_condition = $result->{$oid_cpqRackPowerSupplyCondition . '.' . $_};
my $psu_pwrout = $result->{$oid_cpqRackPowerSupplyCurPwrOutput . '.' . $_};
my $psu_intemp = $result->{$oid_cpqRackPowerSupplyIntakeTemp . '.' . $_};
my $psu_exhtemp = $result->{$oid_cpqRackPowerSupplyExhaustTemp . '.' . $_};
$total_watts += $psu_pwrout;
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("PSU %d status is %s [serial: %s, part: %s, spare: %s] (input line status %s) (status %s).",
$psu_index, ${$conditions{$psu_condition}}[0],
$psu_serial, $psu_part, $psu_spare,
$inputline_status_map{$psu_inputlinestatus},
$psu_status_map{$psu_status}
));
if ($psu_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$psu_condition}}[1],
short_msg => sprintf("PSU %d status is %s",
$psu_index, ${$conditions{$psu_condition}}[0]));
}
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_power", unit => 'W',
value => $psu_pwrout);
if (defined($psu_intemp) && $psu_intemp != -1) {
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_temp_intake", unit => 'C',
value => $psu_intemp);
}
if (defined($psu_exhtemp) && $psu_exhtemp != -1) {
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_temp_exhaust", unit => 'C',
value => $psu_exhtemp);
}
}
$self->{output}->perfdata_add(label => "total_power", unit => 'W',
value => $total_watts);
}
1;

View File

@ -0,0 +1,110 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package hardware::server::hpbladechassis::mode::components::temperature;
my %conditions = (
1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL'],
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
my %map_temp_type = (
1 => 'other',
5 => 'blowout',
9 => 'caution',
15 => 'critical',
);
sub check {
my ($self) = @_;
$self->{components}->{temperatures} = {name => 'temperatures', total => 0};
$self->{output}->output_add(long_msg => "Checking temperatures");
return if ($self->check_exclude('temperatures'));
my $oid_cpqRackCommonEnclosureTempSensorIndex = '.1.3.6.1.4.1.232.22.2.3.1.2.1.3';
my $oid_cpqRackCommonEnclosureTempSensorEnclosureName = '.1.3.6.1.4.1.232.22.2.3.1.2.1.4';
my $oid_cpqRackCommonEnclosureTempLocation = '.1.3.6.1.4.1.232.22.2.3.1.2.1.5';
my $oid_cpqRackCommonEnclosureTempCurrent = '.1.3.6.1.4.1.232.22.2.3.1.2.1.6';
my $oid_cpqRackCommonEnclosureTempThreshold = '.1.3.6.1.4.1.232.22.2.3.1.2.1.7';
my $oid_cpqRackCommonEnclosureTempCondition = '.1.3.6.1.4.1.232.22.2.3.1.2.1.8';
my $oid_cpqRackCommonEnclosureTempType = '.1.3.6.1.4.1.232.22.2.3.1.2.1.9';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureTempSensorIndex);
return if (scalar(keys %$result) <= 0);
my $result2 = $self->{snmp}->get_leef(oids => [$oid_cpqRackCommonEnclosureTempSensorEnclosureName,
$oid_cpqRackCommonEnclosureTempLocation,
$oid_cpqRackCommonEnclosureTempCurrent, $oid_cpqRackCommonEnclosureTempThreshold,
$oid_cpqRackCommonEnclosureTempCondition, $oid_cpqRackCommonEnclosureTempType],
instances => [keys %$result]);
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
$key =~ /(\d+)$/;
my $temp_index = $1;
my $temp_name = $result->{$oid_cpqRackCommonEnclosureTempSensorEnclosureName . '.' . $temp_index};
my $temp_location = $result->{$oid_cpqRackCommonEnclosureTempLocation . '.' . $temp_index};
my $temp_current = $result->{$oid_cpqRackCommonEnclosureTempCurrent . '.' . $temp_index};
my $temp_threshold = $result->{$oid_cpqRackCommonEnclosureTempThreshold . '.' . $temp_index};
my $temp_condition = $result->{$oid_cpqRackCommonEnclosureTempCondition . '.' . $temp_index};
my $temp_type = $result->{$oid_cpqRackCommonEnclosureTempType . '.' . $temp_index};
$self->{components}->{temperatures}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature %d status is %s [name: %s, location: %s] (value = %s, threshold = %s%s).",
$temp_index, ${$conditions{$temp_condition}}[0],
$temp_name, $temp_location,
$temp_current, $temp_threshold,
defined($map_temp_type{$temp_type}) ? ", status type = " . $map_temp_type{$temp_type} : ''));
if ($temp_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$temp_condition}}[1],
short_msg => sprintf("Temperature %d status is %s",
$temp_index, ${$conditions{$temp_condition}}[0]));
}
$self->{output}->perfdata_add(label => "temp_" . $temp_index, unit => 'C',
value => $temp_current,
warning => $temp_threshold);
}
}
1;

View File

@ -39,58 +39,14 @@ use base qw(centreon::plugins::mode);
use strict;
use warnings;
my %conditions = (1 => ['other', 'CRITICAL'],
2 => ['ok', 'OK'],
3 => ['degraded', 'WARNING'],
4 => ['failed', 'CRITICAL']);
my %present_map = (1 => 'other',
2 => 'absent',
3 => 'present',
4 => 'Weird!!!', # for blades it can return 4, which is NOT spesified in MIB
);
my %device_type = (1 => 'noconnect',
2 => 'network',
3 => 'fibrechannel',
4 => 'sas',
5 => 'inifiband',
6 => 'pciexpress'
);
my %psu_status = (1 => 'noError',
2 => 'generalFailure',
3 => 'bistFailure',
4 => 'fanFailure',
5 => 'tempFailure',
6 => 'interlockOpen',
7 => 'epromFailed',
8 => 'vrefFailed',
9 => 'dacFailed',
10 => 'ramTestFailed',
11 => 'voltageChannelFailed',
12 => 'orringdiodeFailed',
13 => 'brownOut',
14 => 'giveupOnStartup',
15 => 'nvramInvalid',
16 => 'calibrationTableInvalid',
);
my %inputline_status = (1 => 'noError',
2 => 'lineOverVoltage',
3 => 'lineUnderVoltage',
4 => 'lineHit',
5 => 'brownOut',
6 => 'linePowerLoss',
);
my %map_role = (1 => 'Standby',
2 => 'Active',
);
my %map_has = (1 => 'false',
2 => 'true',
);
my %map_temp_type = (1 => 'other',
5 => 'blowout',
9 => 'caution',
15 => 'critical',
);
use hardware::server::hpbladechassis::mode::components::enclosure;
use hardware::server::hpbladechassis::mode::components::manager;
use hardware::server::hpbladechassis::mode::components::fan;
use hardware::server::hpbladechassis::mode::components::blade;
use hardware::server::hpbladechassis::mode::components::network;
use hardware::server::hpbladechassis::mode::components::psu;
use hardware::server::hpbladechassis::mode::components::temperature;
use hardware::server::hpbladechassis::mode::components::fuse;
sub new {
my ($class, %options) = @_;
@ -102,7 +58,7 @@ sub new {
{
"exclude" => { name => 'exclude' },
});
$self->{components} = {};
return $self;
}
@ -116,494 +72,34 @@ sub run {
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
$self->{components_fans} = 0;
$self->{components_blades} = 0;
$self->{components_nc} = 0;
$self->{components_psu} = 0;
$self->{components_temperatures} = 0;
$self->{components_fuse} = 0;
hardware::server::hpbladechassis::mode::components::enclosure::check($self);
hardware::server::hpbladechassis::mode::components::manager::check($self);
hardware::server::hpbladechassis::mode::components::fan::check($self);
hardware::server::hpbladechassis::mode::components::blade::check($self);
hardware::server::hpbladechassis::mode::components::network::check($self);
hardware::server::hpbladechassis::mode::components::psu::check($self);
hardware::server::hpbladechassis::mode::components::temperature::check($self);
hardware::server::hpbladechassis::mode::components::fuse::check($self);
$self->check_enclosure_status();
$self->check_managers();
$self->check_fans();
$self->check_blades();
$self->check_iom();
$self->check_psu();
$self->check_temperatures();
$self->check_fuse();
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (keys %{$self->{components}}) {
$total_components += $self->{components}->{$comp}->{total};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %d components [%d fans, %d blades, %d network connectors, %d psu, %d temperatures, %d fuses] are ok.",
($self->{components_fans} + $self->{components_blades} + $self->{components_nc} + $self->{components_psu} + $self->{components_temperatures} + $self->{components_fuse}),
$self->{components_fans}, $self->{components_blades}, $self->{components_nc}, $self->{components_psu}, $self->{components_temperatures}, $self->{components_fuse}));
short_msg => sprintf("All %s components [%s] are ok.",
$total_components,
$display_by_component
));
$self->{output}->display();
$self->{output}->exit();
}
sub check_enclosure_status {
my ($self) = @_;
my $oid_cpqRackCommonEnclosurePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.1.1.5.1';
my $oid_cpqRackCommonEnclosureSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.1.1.6.1';
my $oid_cpqRackCommonEnclosureSerialNum = '.1.3.6.1.4.1.232.22.2.3.1.1.1.7.1';
my $oid_cpqRackCommonEnclosureFWRev = '.1.3.6.1.4.1.232.22.2.3.1.1.1.8.1';
my $oid_cpqRackCommonEnclosureCondition = '.1.3.6.1.4.1.232.22.2.3.1.1.1.16.1';
my $oid_cpqRackCommonEnclosureHasServerBlades = '.1.3.6.1.4.1.232.22.2.3.1.1.1.17.1';
my $oid_cpqRackCommonEnclosureHasPowerSupplies = '.1.3.6.1.4.1.232.22.2.3.1.1.1.18.1';
my $oid_cpqRackCommonEnclosureHasNetConnectors = '.1.3.6.1.4.1.232.22.2.3.1.1.1.19.1';
my $oid_cpqRackCommonEnclosureHasTempSensors = '.1.3.6.1.4.1.232.22.2.3.1.1.1.20.1';
my $oid_cpqRackCommonEnclosureHasFans = '.1.3.6.1.4.1.232.22.2.3.1.1.1.21.1';
my $oid_cpqRackCommonEnclosureHasFuses = '.1.3.6.1.4.1.232.22.2.3.1.1.1.22.1';
#my $oid_cpqRackServerBladeHasManagementDevice = '.1.3.6.1.4.1.232.22.2.4.1.1.1.29.1';
$self->{global_results} = $self->{snmp}->get_leef(oids => [$oid_cpqRackCommonEnclosurePartNumber, $oid_cpqRackCommonEnclosureSparePartNumber,
$oid_cpqRackCommonEnclosureSerialNum, $oid_cpqRackCommonEnclosureFWRev,
$oid_cpqRackCommonEnclosureCondition, $oid_cpqRackCommonEnclosureHasServerBlades,
$oid_cpqRackCommonEnclosureHasPowerSupplies, $oid_cpqRackCommonEnclosureHasNetConnectors,
$oid_cpqRackCommonEnclosureHasTempSensors, $oid_cpqRackCommonEnclosureHasFans,
$oid_cpqRackCommonEnclosureHasFuses], nothing_quit => 1);
$self->{output}->output_add(long_msg => sprintf("Enclosure overall health condition is %s [part: %s, spare: %s, sn: %s, fw: %s].",
${$conditions{$self->{global_results}->{$oid_cpqRackCommonEnclosureCondition}}}[0],
$self->{global_results}->{$oid_cpqRackCommonEnclosurePartNumber},
$self->{global_results}->{$oid_cpqRackCommonEnclosureSparePartNumber},
$self->{global_results}->{$oid_cpqRackCommonEnclosureSerialNum},
$self->{global_results}->{$oid_cpqRackCommonEnclosureFWRev}));
if ($self->{global_results}->{$oid_cpqRackCommonEnclosureCondition} != 2) {
$self->{output}->output_add(severity => ${$conditions{$self->{global_results}->{$oid_cpqRackCommonEnclosureCondition}}}[1],
short_msg => sprintf("Enclosure overall health condition is %s", ${$conditions{$self->{global_results}->{$oid_cpqRackCommonEnclosureCondition}}}[0]));
}
}
sub check_managers {
my ($self) = @_;
#my $oid_cpqRackServerBladeHasManagementDevice = '.1.3.6.1.4.1.232.22.2.4.1.1.1.29.1';
#if (defined($map_has{$global_results->{$oid_cpqRackServerBladeHasManagementDevice}}) &&
# $map_has{$global_results->{$oid_cpqRackServerBladeHasManagementDevice}} =~ /^false$/i) {
# output_add(long_msg => sprintf("Skipping Managers: enclosure doesnt contain managers."));
# return ;
#}
return if ($self->check_exclude('managers'));
# No check if OK
if ($self->{output}->is_status(compare => 'ok', litteral => 1)) {
return ;
}
$self->{output}->output_add(long_msg => "Checking managers");
my $oid_cpqRackCommonEnclosureManagerIndex = '.1.3.6.1.4.1.232.22.2.3.1.6.1.3';
my $oid_cpqRackCommonEnclosureManagerPartNumber = '.1.3.6.1.4.1.232.22.2.3.1.6.1.6';
my $oid_cpqRackCommonEnclosureManagerSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.6.1.7';
my $oid_cpqRackCommonEnclosureManagerSerialNum = '.1.3.6.1.4.1.232.22.2.3.1.6.1.8';
my $oid_cpqRackCommonEnclosureManagerRole = '.1.3.6.1.4.1.232.22.2.3.1.6.1.9';
my $oid_cpqRackCommonEnclosureManagerCondition = '.1.3.6.1.4.1.232.22.2.3.1.6.1.12';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureManagerIndex);
return if (scalar(keys %$result) <= 0);
$self->{snmp}->load(oids => [$oid_cpqRackCommonEnclosureManagerPartNumber, $oid_cpqRackCommonEnclosureManagerSparePartNumber,
$oid_cpqRackCommonEnclosureManagerSerialNum, $oid_cpqRackCommonEnclosureManagerRole,
$oid_cpqRackCommonEnclosureManagerCondition],
instances => [keys %$result]);
my $result2 = $self->{snmp}->get_leef();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
$key =~ /(\d+)$/;
my $instance = $1;
my $man_part = $result2->{$oid_cpqRackCommonEnclosureManagerPartNumber . '.' . $instance};
my $man_spare = $result2->{$oid_cpqRackCommonEnclosureManagerSparePartNumber . '.' . $instance};
my $man_serial = $result2->{$oid_cpqRackCommonEnclosureManagerSerialNum . '.' . $instance};
my $man_role = $result2->{$oid_cpqRackCommonEnclosureManagerRole . '.' . $instance};
my $man_condition = $result2->{$oid_cpqRackCommonEnclosureManagerCondition . '.' . $instance};
$self->{output}->output_add(long_msg => sprintf("Enclosure management module %d is %s, status is %s [serial: %s, part: %s, spare: %s].",
$instance, ${$conditions{$man_condition}}[0], $map_role{$man_role},
$man_serial, $man_part, $man_spare));
if ($man_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$man_condition}}[1],
short_msg => sprintf("Enclosure management module %d is %s, status is %s",
$instance, ${$conditions{$man_condition}}[0], $map_role{$man_role}));
}
}
}
sub check_fans {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking fans");
return if ($self->check_exclude('fans'));
my $oid_cpqRackCommonEnclosureHasFans = '.1.3.6.1.4.1.232.22.2.3.1.1.1.21.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasFans}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasFans}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping Fans: enclosure cannot house fans (??!!).");
return ;
}
my $oid_cpqRackCommonEnclosureFanPresent = '.1.3.6.1.4.1.232.22.2.3.1.3.1.8';
my $oid_cpqRackCommonEnclosureFanIndex = '.1.3.6.1.4.1.232.22.2.3.1.3.1.3';
my $oid_cpqRackCommonEnclosureFanPartNumber = '.1.3.6.1.4.1.232.22.2.3.1.3.1.6';
my $oid_cpqRackCommonEnclosureFanSparePartNumber = '.1.3.6.1.4.1.232.22.2.3.1.3.1.7';
my $oid_cpqRackCommonEnclosureFanCondition = '.1.3.6.1.4.1.232.22.2.3.1.3.1.11';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureFanPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackCommonEnclosureFanIndex . "." . $oid_end, $oid_cpqRackCommonEnclosureFanPartNumber . "." . $oid_end,
$oid_cpqRackCommonEnclosureFanSparePartNumber . "." . $oid_end, $oid_cpqRackCommonEnclosureFanCondition . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $fan_index = $result->{$oid_cpqRackCommonEnclosureFanIndex . '.' . $_};
my $fan_condition = $result->{$oid_cpqRackCommonEnclosureFanCondition . '.' . $_};
my $fan_part = $result->{$oid_cpqRackCommonEnclosureFanPartNumber . '.' . $_};
my $fan_spare = $result->{$oid_cpqRackCommonEnclosureFanSparePartNumber . '.' . $_};
$self->{components_fans}++;
$self->{output}->output_add(long_msg => sprintf("Fan %d condition is %s [part: %s, spare: %s].",
$fan_index, ${$conditions{$fan_condition}}[0],
$fan_part, $fan_spare));
if ($fan_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$fan_condition}}[1],
short_msg => sprintf("Fan %d condition is %s", $fan_index, ${$conditions{$fan_condition}}[0]));
}
}
}
sub check_blades {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking blades");
return if ($self->check_exclude('blades'));
my $oid_cpqRackCommonEnclosureHasServerBlades = '.1.3.6.1.4.1.232.22.2.3.1.1.1.17.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasServerBlades}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasServerBlades}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping Blades: enclosure cannot house blades (??!!).");
return ;
}
my $oid_cpqRackServerBladePresent = '.1.3.6.1.4.1.232.22.2.4.1.1.1.12';
my $oid_cpqRackServerBladeIndex = '.1.3.6.1.4.1.232.22.2.4.1.1.1.3';
my $oid_cpqRackServerBladeName = '.1.3.6.1.4.1.232.22.2.4.1.1.1.4';
my $oid_cpqRackServerBladePartNumber = '.1.3.6.1.4.1.232.22.2.4.1.1.1.6';
my $oid_cpqRackServerBladeSparePartNumber = '.1.3.6.1.4.1.232.22.2.4.1.1.1.7';
my $oid_cpqRackServerBladeProductId = '.1.3.6.1.4.1.232.22.2.4.1.1.1.17';
my $oid_cpqRackServerBladeStatus = '.1.3.6.1.4.1.232.22.2.4.1.1.1.21'; # v2
my $oid_cpqRackServerBladeFaultDiagnosticString = '.1.3.6.1.4.1.232.22.2.4.1.1.1.24'; # v2
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackServerBladePresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackServerBladeIndex . "." . $oid_end, $oid_cpqRackServerBladeName . "." . $oid_end,
$oid_cpqRackServerBladePartNumber . "." . $oid_end, $oid_cpqRackServerBladeSparePartNumber . "." . $oid_end,
$oid_cpqRackServerBladeProductId . "." . $oid_end,
$oid_cpqRackServerBladeStatus . "." . $oid_end, $oid_cpqRackServerBladeFaultDiagnosticString . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $blade_index = $result->{$oid_cpqRackServerBladeIndex . '.' . $_};
my $blade_status = defined($result->{$oid_cpqRackServerBladeStatus . '.' . $_}) ? $result->{$oid_cpqRackServerBladeStatus . '.' . $_} : '';
my $blade_name = $result->{$oid_cpqRackServerBladeName . '.' . $_};
my $blade_part = $result->{$oid_cpqRackServerBladePartNumber . '.' . $_};
my $blade_spare = $result->{$oid_cpqRackServerBladeSparePartNumber . '.' . $_};
my $blade_productid = $result->{$oid_cpqRackServerBladeProductId . '.' . $_};
my $blade_diago = defined($result->{$oid_cpqRackServerBladeFaultDiagnosticString . '.' . $_}) ? $result->{$oid_cpqRackServerBladeFaultDiagnosticString . '.' . $_} : '';
$self->{components_blades}++;
if ($blade_status eq '') {
$self->{output}->output_add(long_msg => sprintf("Skipping Blade %d (%s, %s). Cant get status.",
$blade_index, $blade_name, $blade_productid));
next;
}
$self->{output}->output_add(long_msg => sprintf("Blade %d (%s, %s) status is %s [part: %s, spare: %s]%s.",
$blade_index, $blade_name, $blade_productid,
${$conditions{$blade_status}}[0],
$blade_part, $blade_spare,
($blade_diago ne '') ? " (Diagnostic '$blade_diago')" : ''
));
if ($blade_status != 2) {
$self->{output}->output_add(severity => ${$conditions{$blade_status}}[1],
short_msg => sprintf("Blade %d (%s, %s) status is %s",
$blade_index, $blade_name, $blade_productid,
${$conditions{$blade_status}}[0]
));
}
}
}
sub check_iom {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking network connectors");
return if ($self->check_exclude('network'));
my $oid_cpqRackCommonEnclosureHasNetConnectors = '.1.3.6.1.4.1.232.22.2.3.1.1.1.19.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasNetConnectors}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasNetConnectors}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping Network Connectors: enclosure cannot house network connectors (??!!).");
return ;
}
my $oid_cpqRackNetConnectorPresent = '.1.3.6.1.4.1.232.22.2.6.1.1.1.13';
my $oid_cpqRackNetConnectorIndex = '.1.3.6.1.4.1.232.22.2.6.1.1.1.3';
my $oid_cpqRackNetConnectorModel = '.1.3.6.1.4.1.232.22.2.6.1.1.1.6';
my $oid_cpqRackNetConnectorSerialNum = '.1.3.6.1.4.1.232.22.2.6.1.1.1.7';
my $oid_cpqRackNetConnectorPartNumber = '.1.3.6.1.4.1.232.22.2.6.1.1.1.8';
my $oid_cpqRackNetConnectorSparePartNumber = '.1.3.6.1.4.1.232.22.2.6.1.1.1.9';
my $oid_cpqRackNetConnectorDeviceType = '.1.3.6.1.4.1.232.22.2.6.1.1.1.17';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackNetConnectorPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackNetConnectorIndex . "." . $oid_end, $oid_cpqRackNetConnectorModel . "." . $oid_end,
$oid_cpqRackNetConnectorSerialNum . "." . $oid_end, $oid_cpqRackNetConnectorPartNumber . "." . $oid_end,
$oid_cpqRackNetConnectorSparePartNumber . "." . $oid_end, $oid_cpqRackNetConnectorDeviceType . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $nc_index = $result->{$oid_cpqRackNetConnectorIndex . '.' . $_};
my $nc_model = $result->{$oid_cpqRackNetConnectorModel . '.' . $_};
my $nc_serial = $result->{$oid_cpqRackNetConnectorSerialNum . '.' . $_};
my $nc_part = $result->{$oid_cpqRackNetConnectorPartNumber . '.' . $_};
my $nc_spare = $result->{$oid_cpqRackNetConnectorSparePartNumber . '.' . $_};
my $nc_device = $result->{$oid_cpqRackNetConnectorDeviceType . '.' . $_};
$self->{components_nc}++;
$self->{output}->output_add(long_msg => sprintf("Network Connector %d (%s) type '%s' is present [serial: %s, part: %s, spare: %s].",
$nc_index, $nc_model,
$device_type{$nc_device},
$nc_serial, $nc_part, $nc_spare
));
}
}
sub check_psu {
my ($self) = @_;
# We dont check 'cpqRackPowerEnclosureTable' (the overall power system status)
# We check 'cpqRackPowerSupplyTable' (unitary)
$self->{output}->output_add(long_msg => "Checking power supplies");
return if ($self->check_exclude('psu'));
my $oid_cpqRackCommonEnclosureHasPowerSupplies = '.1.3.6.1.4.1.232.22.2.3.1.1.1.18.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasPowerSupplies}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasPowerSupplies}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping PSU: enclosure cannot house power supplies (??!!).");
return ;
}
my $oid_cpqRackPowerSupplyPresent = '.1.3.6.1.4.1.232.22.2.5.1.1.1.16';
my $oid_cpqRackPowerSupplyIndex = '.1.3.6.1.4.1.232.22.2.5.1.1.1.3';
my $oid_cpqRackPowerSupplySerialNum = '.1.3.6.1.4.1.232.22.2.5.1.1.1.5';
my $oid_cpqRackPowerSupplyPartNumber = '.1.3.6.1.4.1.232.22.2.5.1.1.1.6';
my $oid_cpqRackPowerSupplySparePartNumber = '.1.3.6.1.4.1.232.22.2.5.1.1.1.7';
my $oid_cpqRackPowerSupplyStatus = '.1.3.6.1.4.1.232.22.2.5.1.1.1.14';
my $oid_cpqRackPowerSupplyInputLineStatus = '.1.3.6.1.4.1.232.22.2.5.1.1.1.15';
my $oid_cpqRackPowerSupplyCondition = '.1.3.6.1.4.1.232.22.2.5.1.1.1.17';
my $oid_cpqRackPowerSupplyCurPwrOutput = '.1.3.6.1.4.1.232.22.2.5.1.1.1.10'; # Watts
my $oid_cpqRackPowerSupplyIntakeTemp = '.1.3.6.1.4.1.232.22.2.5.1.1.1.12';
my $oid_cpqRackPowerSupplyExhaustTemp = '.1.3.6.1.4.1.232.22.2.5.1.1.1.13';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackPowerSupplyPresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackPowerSupplyIndex . "." . $oid_end, $oid_cpqRackPowerSupplySerialNum . "." . $oid_end,
$oid_cpqRackPowerSupplyPartNumber . "." . $oid_end, $oid_cpqRackPowerSupplySparePartNumber . "." . $oid_end,
$oid_cpqRackPowerSupplyStatus . "." . $oid_end, $oid_cpqRackPowerSupplyInputLineStatus . "." . $oid_end,
$oid_cpqRackPowerSupplyCondition . "." . $oid_end, $oid_cpqRackPowerSupplyCurPwrOutput . "." . $oid_end,
$oid_cpqRackPowerSupplyIntakeTemp . "." . $oid_end, $oid_cpqRackPowerSupplyExhaustTemp . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
my $total_watts = 0;
foreach (@oids_end) {
my $psu_index = $result->{$oid_cpqRackPowerSupplyIndex . '.' . $_};
my $psu_status = $result->{$oid_cpqRackPowerSupplyStatus . '.' . $_};
my $psu_serial = $result->{$oid_cpqRackPowerSupplySerialNum . '.' . $_};
my $psu_part = $result->{$oid_cpqRackPowerSupplyPartNumber . '.' . $_};
my $psu_spare = $result->{$oid_cpqRackPowerSupplySparePartNumber . '.' . $_};
my $psu_inputlinestatus = $result->{$oid_cpqRackPowerSupplyInputLineStatus . '.' . $_};
my $psu_condition = $result->{$oid_cpqRackPowerSupplyCondition . '.' . $_};
my $psu_pwrout = $result->{$oid_cpqRackPowerSupplyCurPwrOutput . '.' . $_};
my $psu_intemp = $result->{$oid_cpqRackPowerSupplyIntakeTemp . '.' . $_};
my $psu_exhtemp = $result->{$oid_cpqRackPowerSupplyExhaustTemp . '.' . $_};
$total_watts += $psu_pwrout;
$self->{components_psu}++;
$self->{output}->output_add(long_msg => sprintf("PSU %d status is %s [serial: %s, part: %s, spare: %s] (input line status %s) (status %s).",
$psu_index, ${$conditions{$psu_condition}}[0],
$psu_serial, $psu_part, $psu_spare,
$inputline_status{$psu_inputlinestatus},
$psu_status{$psu_status}
));
if ($psu_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$psu_condition}}[1],
short_msg => sprintf("PSU %d status is %s",
$psu_index, ${$conditions{$psu_condition}}[0]));
}
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_power", unit => 'W',
value => $psu_pwrout);
if (defined($psu_intemp) && $psu_intemp != -1) {
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_temp_intake", unit => 'C',
value => $psu_intemp);
}
if (defined($psu_exhtemp) && $psu_exhtemp != -1) {
$self->{output}->perfdata_add(label => "psu_" . $psu_index . "_temp_exhaust", unit => 'C',
value => $psu_exhtemp);
}
}
$self->{output}->perfdata_add(label => "total_power", unit => 'W',
value => $total_watts);
}
sub check_temperatures {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking temperatures");
return if ($self->check_exclude('temperatures'));
my $oid_cpqRackCommonEnclosureHasTempSensors = '.1.3.6.1.4.1.232.22.2.3.1.1.1.20.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasTempSensors}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasTempSensors}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping Temperatures: enclosure doesnt contain temperatures sensors.");
return ;
}
my $oid_cpqRackCommonEnclosureTempSensorIndex = '.1.3.6.1.4.1.232.22.2.3.1.2.1.3';
my $oid_cpqRackCommonEnclosureTempSensorEnclosureName = '.1.3.6.1.4.1.232.22.2.3.1.2.1.4';
my $oid_cpqRackCommonEnclosureTempLocation = '.1.3.6.1.4.1.232.22.2.3.1.2.1.5';
my $oid_cpqRackCommonEnclosureTempCurrent = '.1.3.6.1.4.1.232.22.2.3.1.2.1.6';
my $oid_cpqRackCommonEnclosureTempThreshold = '.1.3.6.1.4.1.232.22.2.3.1.2.1.7';
my $oid_cpqRackCommonEnclosureTempCondition = '.1.3.6.1.4.1.232.22.2.3.1.2.1.8';
my $oid_cpqRackCommonEnclosureTempType = '.1.3.6.1.4.1.232.22.2.3.1.2.1.9';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureTempSensorIndex);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
my $oid_end = $result->{$key};
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackCommonEnclosureTempSensorEnclosureName . "." . $oid_end, $oid_cpqRackCommonEnclosureTempLocation . "." . $oid_end,
$oid_cpqRackCommonEnclosureTempCurrent . "." . $oid_end, $oid_cpqRackCommonEnclosureTempThreshold . "." . $oid_end,
$oid_cpqRackCommonEnclosureTempCondition . "." . $oid_end, $oid_cpqRackCommonEnclosureTempType . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $temp_index = $_;
my $temp_name = $result->{$oid_cpqRackCommonEnclosureTempSensorEnclosureName . '.' . $_};
my $temp_location = $result->{$oid_cpqRackCommonEnclosureTempLocation . '.' . $_};
my $temp_current = $result->{$oid_cpqRackCommonEnclosureTempCurrent . '.' . $_};
my $temp_threshold = $result->{$oid_cpqRackCommonEnclosureTempThreshold . '.' . $_};
my $temp_condition = $result->{$oid_cpqRackCommonEnclosureTempCondition . '.' . $_};
my $temp_type = $result->{$oid_cpqRackCommonEnclosureTempType . '.' . $_};
$self->{components_temperatures}++;
$self->{output}->output_add(long_msg => sprintf("Temperature %d status is %s [name: %s, location: %s] (value = %s, threshold = %s%s).",
$temp_index, ${$conditions{$temp_condition}}[0],
$temp_name, $temp_location,
$temp_current, $temp_threshold,
defined($map_temp_type{$temp_type}) ? ", status type = " . $map_temp_type{$temp_type} : ''));
if ($temp_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$temp_condition}}[1],
short_msg => sprintf("Temperature %d status is %s",
$temp_index, ${$conditions{$temp_condition}}[0]));
}
$self->{output}->perfdata_add(label => "temp_" . $temp_index, unit => 'C',
value => $temp_current,
warning => $temp_threshold);
}
}
sub check_fuse {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking fuse");
return if ($self->check_exclude('fuse'));
my $oid_cpqRackCommonEnclosureHasFuses = '.1.3.6.1.4.1.232.22.2.3.1.1.1.22.1';
if (defined($map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasFuses}}) &&
$map_has{$self->{global_results}->{$oid_cpqRackCommonEnclosureHasFuses}} =~ /^false$/i) {
$self->{output}->output_add(long_msg => "Skipping Fuse: enclosure doesnt contain fuse.");
return ;
}
my $oid_cpqRackCommonEnclosureFusePresent = '.1.3.6.1.4.1.232.22.2.3.1.4.1.6';
my $oid_cpqRackCommonEnclosureFuseIndex = '.1.3.6.1.4.1.232.22.2.3.1.4.1.3';
my $oid_cpqRackCommonEnclosureFuseEnclosureName = '.1.3.6.1.4.1.232.22.2.3.1.4.1.4';
my $oid_cpqRackCommonEnclosureFuseLocation = '.1.3.6.1.4.1.232.22.2.3.1.4.1.5';
my $oid_cpqRackCommonEnclosureFuseCondition = '.1.3.6.1.4.1.232.22.2.3.1.4.1.7';
my $result = $self->{snmp}->get_table(oid => $oid_cpqRackCommonEnclosureFusePresent);
return if (scalar(keys %$result) <= 0);
my @get_oids = ();
my @oids_end = ();
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($present_map{$result->{$key}} ne 'present');
$key =~ /\.([0-9]+)$/;
my $oid_end = $1;
push @oids_end, $oid_end;
push @get_oids, $oid_cpqRackCommonEnclosureFuseIndex . "." . $oid_end, $oid_cpqRackCommonEnclosureFuseEnclosureName . "." . $oid_end,
$oid_cpqRackCommonEnclosureFuseLocation . "." . $oid_end, $oid_cpqRackCommonEnclosureFuseCondition . "." . $oid_end;
}
$result = $self->{snmp}->get_leef(oids => \@get_oids);
foreach (@oids_end) {
my $fuse_index = $result->{$oid_cpqRackCommonEnclosureFuseIndex . '.' . $_};
my $fuse_name = $result->{$oid_cpqRackCommonEnclosureFuseEnclosureName . '.' . $_};
my $fuse_location = $result->{$oid_cpqRackCommonEnclosureFuseLocation . '.' . $_};
my $fuse_condition = $result->{$oid_cpqRackCommonEnclosureFuseCondition . '.' . $_};
$self->{components_fuse}++;
$self->{output}->output_add(long_msg => sprintf("Fuse %d status is %s [name: %s, location: %s].",
$fuse_index, ${$conditions{$fuse_condition}}[0],
$fuse_name, $fuse_location));
if ($fuse_condition != 2) {
$self->{output}->output_add(severity => ${$conditions{$fuse_condition}}[1],
short_msg => sprintf("Fuse %d status is %s",
$fuse_index, ${$conditions{$fuse_condition}}[0]));
}
}
}
sub check_exclude {
my ($self, $section) = @_;

View File

@ -42,6 +42,12 @@ my %conditions = (
4 => ['failed', 'CRITICAL']
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
);
my %redundant_map = (
1 => 'other',
2 => 'not redundant',

View File

@ -42,6 +42,12 @@ my %conditions = (
4 => ['failed', 'CRITICAL']
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
);
my %redundant_map = (
1 => 'other',
2 => 'not redundant',

View File

@ -42,6 +42,12 @@ my %conditions = (
4 => ['failed', 'CRITICAL']
);
my %present_map = (
1 => 'other',
2 => 'absent',
3 => 'present',
);
my %redundant_map = (
1 => 'other',
2 => 'not redundant',