+ update: refactoring with hardware template class

This commit is contained in:
garnier-quentin 2016-01-08 16:39:50 +01:00
parent 46666073ae
commit 18318462c4
39 changed files with 444 additions and 1392 deletions

View File

@ -35,9 +35,9 @@ my $mapping = {
my $oid_wlsxSysExtFanEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtFanEntry };
push @{$self->{request}}, { oid => $oid_wlsxSysExtFanEntry };
}
sub check {
@ -45,14 +45,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fan'));
return if ($self->check_filter(section => 'fan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtFanEntry}})) {
next if ($oid !~ /^$mapping->{sysExtFanStatus}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtFanEntry}, instance => $instance);
next if ($self->check_exclude(section => 'fan', instance => $instance));
next if ($self->check_filter(section => 'fan', instance => $instance));
$self->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan '%s' status is %s [instance: %s].",

View File

@ -55,9 +55,9 @@ my $mapping = {
my $oid_wlsxSysExtCardEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtCardEntry };
push @{$self->{request}}, { oid => $oid_wlsxSysExtCardEntry };
}
sub check {
@ -65,14 +65,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking modules");
$self->{components}->{module} = {name => 'modules', total => 0, skip => 0};
return if ($self->check_exclude(section => 'module'));
return if ($self->check_filter(section => 'module'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtCardEntry}})) {
next if ($oid !~ /^$mapping->{sysExtCardStatus}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtCardEntry}, instance => $instance);
next if ($self->check_exclude(section => 'module', instance => $instance));
next if ($self->check_filter(section => 'module', instance => $instance));
$self->{components}->{module}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Module '%s/%s' status is %s [instance: %s].",

View File

@ -35,9 +35,9 @@ my $mapping = {
my $oid_wlsxSysExtPowerSupplyEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtPowerSupplyEntry };
push @{$self->{request}}, { oid => $oid_wlsxSysExtPowerSupplyEntry };
}
sub check {
@ -45,14 +45,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0};
return if ($self->check_exclude(section => 'psu'));
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}})) {
next if ($oid !~ /^$mapping->{sysExtPowerSupplyStatus}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}, instance => $instance);
next if ($self->check_exclude(section => 'psu', instance => $instance));
next if ($self->check_filter(section => 'psu', instance => $instance));
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is %s [instance: %s].",

View File

@ -20,168 +20,57 @@
package centreon::common::aruba::snmp::mode::hardware;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
my $thresholds = {
fan => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
psu => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
module => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
};
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(fan|psu|module)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
fan => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
psu => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
module => [
['active', 'OK'],
['inactive', 'CRITICAL'],
],
};
$self->{components_path} = 'centreon::common::aruba::snmp::mode::components';
$self->{components_module} = ['fan', 'psu', 'module'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_performance => 1, no_absent => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"exclude:s" => { name => 'exclude' },
"component:s" => { name => 'component', default => '.*' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
{
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $status, $filter) = ($1, $2, $3);
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status};
}
}
sub run {
my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('fan', 'psu', 'module');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::aruba::snmp::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::aruba::snmp::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s].",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked.');
}
$self->{output}->display();
$self->{output}->exit();
}
sub check_exclude {
my ($self, %options) = @_;
if (defined($options{instance})) {
if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) {
$self->{components}->{$options{section}}->{skip}++;
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
} elsif (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$options{section}(\s|,|$)/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
}
return 0;
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i) {
$status = $_->{status};
return $status;
}
}
}
foreach (@{$thresholds->{$options{section}}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
@ -197,10 +86,10 @@ Check hardware (modules, fans, power supplies).
Which component to check (Default: '.*').
Can be: 'fan', 'psu', 'module'.
=item B<--exclude>
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=fan,module)
Can also exclude specific instance: --exclude=fan#1#2#,module#1#,psu
Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can also exclude specific instance: --filter=fan,1
=item B<--no-component>
@ -209,7 +98,7 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,status,regexp)
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='fan,OK,inactive'

View File

@ -39,9 +39,9 @@ my $mapping = {
my $oid_rlEnvMonFanStatusEntry = '.1.3.6.1.4.1.9.6.1.101.83.1.1.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_rlEnvMonFanStatusEntry };
push @{$self->{request}}, { oid => $oid_rlEnvMonFanStatusEntry };
}
sub check {
@ -49,14 +49,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fan', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fan'));
return if ($self->check_filter(section => 'fan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_rlEnvMonFanStatusEntry}})) {
next if ($oid !~ /^$mapping->{rlEnvMonFanState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_rlEnvMonFanStatusEntry}, instance => $instance);
next if ($self->check_exclude(section => 'fan', instance => $instance));
next if ($self->check_filter(section => 'fan', instance => $instance));
if ($result->{rlEnvMonFanState} =~ /notPresent/i) {
$self->absent_problem(section => 'fan', instance => $instance);
next;

View File

@ -39,9 +39,9 @@ my $mapping = {
my $oid_rlEnvMonSupplyStatusEntry = '.1.3.6.1.4.1.9.6.1.101.83.1.2.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_rlEnvMonSupplyStatusEntry };
push @{$self->{request}}, { oid => $oid_rlEnvMonSupplyStatusEntry };
}
sub check {
@ -49,14 +49,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psu', total => 0, skip => 0};
return if ($self->check_exclude(section => 'psu'));
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_rlEnvMonSupplyStatusEntry}})) {
next if ($oid !~ /^$mapping->{rlEnvMonSupplyState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_rlEnvMonSupplyStatusEntry}, instance => $instance);
next if ($self->check_exclude(section => 'psu', instance => $instance));
next if ($self->check_filter(section => 'psu', instance => $instance));
if ($result->{rlEnvMonSupplyState} =~ /notPresent/i) {
$self->absent_problem(section => 'psu', instance => $instance);
next;

View File

@ -20,189 +20,61 @@
package centreon::common::cisco::smallbusiness::snmp::mode::environment;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
my $thresholds = {
fan => [
['normal', 'OK'],
['notPresent', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notFunctioning', 'CRITICAL'],
],
psu => [
['normal', 'OK'],
['notPresent', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notFunctioning', 'CRITICAL'],
],
};
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(fan|psu)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
fan => [
['normal', 'OK'],
['notPresent', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notFunctioning', 'CRITICAL'],
],
psu => [
['normal', 'OK'],
['notPresent', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notFunctioning', 'CRITICAL'],
],
};
$self->{components_path} = 'centreon::common::cisco::smallbusiness::snmp::mode::components';
$self->{components_module} = ['psu', 'fan'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_performance => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"exclude:s" => { name => 'exclude' },
"component:s" => { name => 'component', default => '.*' },
"absent-problem:s" => { name => 'absent' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
{
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $status, $filter) = ($1, $2, $3);
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status};
}
}
sub run {
my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('psu', 'fan');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::cisco::smallbusiness::snmp::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::cisco::smallbusiness::snmp::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s]",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked');
}
$self->{output}->display();
$self->{output}->exit();
}
sub check_exclude {
my ($self, %options) = @_;
if (defined($options{instance})) {
if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) {
$self->{components}->{$options{section}}->{skip}++;
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
} elsif (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$options{section}(\s|,|$)/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
}
return 0;
}
sub absent_problem {
my ($self, %options) = @_;
if (defined($self->{option_results}->{absent}) &&
$self->{option_results}->{absent} =~ /(^|\s|,)($options{section}(\s*,|$)|${options{section}}[^,]*#\Q$options{instance}\E#)/) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Component '%s' instance '%s' is not present",
$options{section}, $options{instance}));
}
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance (not present)"));
$self->{components}->{$options{section}}->{skip}++;
return 1;
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i) {
$status = $_->{status};
return $status;
}
}
}
foreach (@{$thresholds->{$options{section}}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
@ -218,10 +90,10 @@ Check environment (Fans, Power supplies).
Which component to check (Default: '.*').
Can be: 'fan', 'psu'.
=item B<--exclude>
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=psu)
Can also exclude specific instance: --exclude='psu#0#'
Exclude some parts (comma seperated list) (Example: --filter=psu)
Can also exclude specific instance: --filter=psu,0
=item B<--absent-problem>
@ -235,7 +107,7 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,status,regexp)
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='fan,CRITICAL,^(?!(normal)$)'

View File

@ -42,9 +42,9 @@ my $mapping = {
};
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping->{sseries}->{OperStatus}->{oid} },
push @{$self->{request}}, { oid => $mapping->{sseries}->{OperStatus}->{oid} },
{ oid => $mapping->{mseries}->{OperStatus}->{oid} }, { oid => $mapping->{zseries}->{OperStatus}->{oid} };
}

View File

@ -50,9 +50,9 @@ my $mapping = {
};
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping->{sseries}->{OperStatus}->{oid} },
push @{$self->{request}}, { oid => $mapping->{sseries}->{OperStatus}->{oid} },
{ oid => $mapping->{mseries}->{OperStatus}->{oid} }, { oid => $mapping->{zseries}->{OperStatus}->{oid} };
}

View File

@ -34,9 +34,9 @@ my $mapping = {
my $oid_deviceSensorValueEntry = '.1.3.6.1.4.1.3417.2.1.1.1.1.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping->{sseries}->{Temp}->{oid} },
push @{$self->{request}}, { oid => $mapping->{sseries}->{Temp}->{oid} },
{ oid => $mapping->{mseries}->{Temp}->{oid} };
}

View File

@ -20,31 +20,49 @@
package centreon::common::force10::snmp::mode::hardware;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
use centreon::plugins::misc;
my $thresholds = {
fan => [
['up', 'OK'],
['absent', 'OK'],
['down', 'CRITICAL'],
],
psu => [
['up', 'OK'],
['absent', 'OK'],
['down', 'CRITICAL'],
['normal', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notPresent', 'OK'],
['notFunctioning', 'CRITICAL'],
],
};
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(psu|fan)$';
$self->{regexp_threshold_numeric_check_section_option} = '^(temperature)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
fan => [
['up', 'OK'],
['absent', 'OK'],
['down', 'CRITICAL'],
],
psu => [
['up', 'OK'],
['absent', 'OK'],
['down', 'CRITICAL'],
['normal', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['shutdown', 'CRITICAL'],
['notPresent', 'OK'],
['notFunctioning', 'CRITICAL'],
],
};
$self->{components_path} = 'centreon::common::force10::snmp::mode::components';
$self->{components_module} = ['fan', 'psu', 'temperature'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
@ -53,241 +71,12 @@ sub new {
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"filter:s@" => { name => 'filter' },
"absent-problem:s@" => { name => 'absent_problem' },
"component:s" => { name => 'component', default => '.*' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
"warning:s@" => { name => 'warning' },
"critical:s@" => { name => 'critical' },
{
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{filter} = [];
foreach my $val (@{$self->{option_results}->{filter}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
push @{$self->{filter}}, { filter => $values[0], instance => $values[1] };
}
$self->{absent_problem} = [];
foreach my $val (@{$self->{option_results}->{absent_problem}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
push @{$self->{absent_problem}}, { filter => $values[0], instance => $values[1] };
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
if (scalar(@values) < 3) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $instance, $status, $filter);
if (scalar(@values) == 3) {
($section, $status, $filter) = @values;
$instance = '.*';
} else {
($section, $instance, $status, $filter) = @values;
}
if ($section !~ /^psu|fan$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'.");
$self->{output}->option_exit();
}
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance };
}
$self->{numeric_threshold} = {};
foreach my $option (('warning', 'critical')) {
foreach my $val (@{$self->{option_results}->{$option}}) {
next if (!defined($val) || $val eq '');
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $instance, $value) = ($1, $2, $3);
if ($section !~ /^temperature$/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "'.");
$self->{output}->option_exit();
}
my $position = 0;
if (defined($self->{numeric_threshold}->{$section})) {
$position = scalar(@{$self->{numeric_threshold}->{$section}});
}
if (($self->{perfdata}->threshold_validate(label => $option . '-' . $section . '-' . $position, value => $value)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong $option threshold '" . $value . "'.");
$self->{output}->option_exit();
}
$self->{numeric_threshold}->{$section} = [] if (!defined($self->{numeric_threshold}->{$section}));
push @{$self->{numeric_threshold}->{$section}}, { label => $option . '-' . $section . '-' . $position, threshold => $option, instance => $instance };
}
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('fan', 'psu', 'temperature');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::force10::snmp::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::force10::snmp::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s].",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked.');
}
$self->{output}->display();
$self->{output}->exit();
}
sub absent_problem {
my ($self, %options) = @_;
foreach (@{$self->{absent_problem}}) {
if ($options{section} =~ /$_->{filter}/) {
if (!defined($_->{instance}) || $options{instance} =~ /$_->{instance}/) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Component '%s' instance '%s' is not present",
$options{section}, $options{instance}));
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance (not present)"));
$self->{components}->{$options{section}}->{skip}++;
return 1;
}
}
}
return 0;
}
sub check_filter {
my ($self, %options) = @_;
foreach (@{$self->{filter}}) {
if ($options{section} =~ /$_->{filter}/) {
if (!defined($options{instance}) && !defined($_->{instance})) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
} elsif (defined($options{instance}) && $options{instance} =~ /$_->{instance}/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
}
}
return 0;
}
sub get_severity_numeric {
my ($self, %options) = @_;
my $status = 'OK'; # default
my $thresholds = { warning => undef, critical => undef };
my $checked = 0;
if (defined($self->{numeric_threshold}->{$options{section}})) {
my $exits = [];
foreach (@{$self->{numeric_threshold}->{$options{section}}}) {
if ($options{instance} =~ /$_->{instance}/) {
push @{$exits}, $self->{perfdata}->threshold_check(value => $options{value}, threshold => [ { label => $_->{label}, exit_litteral => $_->{threshold} } ]);
$thresholds->{$_->{threshold}} = $self->{perfdata}->get_perfdata_for_output(label => $_->{label});
$checked = 1;
}
}
$status = $self->{output}->get_most_critical(status => $exits) if (scalar(@{$exits}) > 0);
}
return ($status, $thresholds->{warning}, $thresholds->{critical}, $checked);
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i &&
(!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) {
$status = $_->{status};
return $status;
}
}
}
my $label = defined($options{label}) ? $options{label} : $options{section};
foreach (@{$thresholds->{$label}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__

View File

@ -28,9 +28,9 @@ use warnings;
my $oid_chassisSystemLedAlarm = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.7';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisSystemLedAlarm };
push @{$self->{request}}, { oid => $oid_chassisSystemLedAlarm };
}
sub check {
@ -38,7 +38,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis alarm");
$self->{components}->{ca} = {name => 'chassis alarm', total => 0, skip => 0};
return if ($self->check_exclude(section => 'ca'));
return if ($self->check_filter(section => 'ca'));
foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemLedAlarm}}) {
$oid =~ /^$oid_chassisSystemLedAlarm\.(.*)$/;
@ -46,7 +46,7 @@ sub check {
my $instance = $array_name;
my $ca_state = $self->{results}->{$oid_chassisSystemLedAlarm}->{$oid};
next if ($self->check_exclude(section => 'ca', instance => $instance));
next if ($self->check_filter(section => 'ca', instance => $instance));
$self->{components}->{ca}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis alarm '%s' is %s.",

View File

@ -28,9 +28,9 @@ use warnings;
my $oid_arrayFanEntry_speed = '.1.3.6.1.4.1.35897.1.2.2.3.18.1.3';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayFanEntry_speed };
push @{$self->{request}}, { oid => $oid_arrayFanEntry_speed };
}
sub check {
@ -38,7 +38,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fan'));
return if ($self->check_filter(section => 'fan'));
foreach my $oid (keys %{$self->{results}->{$oid_arrayFanEntry_speed}}) {
$oid =~ /^$oid_arrayFanEntry_speed\.(.*)$/;
@ -46,7 +46,7 @@ sub check {
my $instance = $array_name . '-' . $fan_name;
my $fan_state = $self->{results}->{$oid_arrayFanEntry_speed}->{$oid};
next if ($self->check_exclude(section => 'fan', instance => $instance));
next if ($self->check_filter(section => 'fan', instance => $instance));
next if ($fan_state =~ /Absent/i &&
$self->absent_problem(section => 'fan', instance => $instance));

View File

@ -31,9 +31,9 @@ my $oid_enable = '.1.3.6.1.4.1.35897.1.2.1.10.1.4';
my $oid_portState = '.1.3.6.1.4.1.35897.1.2.1.10.1.8';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_globalTargetFcEntry };
push @{$self->{request}}, { oid => $oid_globalTargetFcEntry };
}
sub check {
@ -41,7 +41,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking global fc");
$self->{components}->{gfc} = {name => 'global fc', total => 0, skip => 0};
return if ($self->check_exclude(section => 'gfc'));
return if ($self->check_filter(section => 'gfc'));
foreach my $oid (keys %{$self->{results}->{$oid_globalTargetFcEntry}}) {
next if ($oid !~ /^$oid_wwn\.(.*)$/);
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)"));
next;
}
next if ($self->check_exclude(section => 'gfc', instance => $wwn));
next if ($self->check_filter(section => 'gfc', instance => $wwn));
$self->{components}->{gfc}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Global FC '%s' is %s.",

View File

@ -31,9 +31,9 @@ my $oid_enable = '.1.3.6.1.4.1.35897.1.2.1.6.1.3';
my $oid_portState = '.1.3.6.1.4.1.35897.1.2.1.6.1.7';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_localTargetFcEntry };
push @{$self->{request}}, { oid => $oid_localTargetFcEntry };
}
sub check {
@ -41,7 +41,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking local fc");
$self->{components}->{lfc} = {name => 'local fc', total => 0, skip => 0};
return if ($self->check_exclude(section => 'lfc'));
return if ($self->check_filter(section => 'lfc'));
foreach my $oid (keys %{$self->{results}->{$oid_localTargetFcEntry}}) {
next if ($oid !~ /^$oid_wwn\.(.*)$/);
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)"));
next;
}
next if ($self->check_exclude(section => 'lfc', instance => $wwn));
next if ($self->check_filter(section => 'lfc', instance => $wwn));
$self->{components}->{lfc}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Local FC '%s' is %s.",

View File

@ -29,10 +29,9 @@ my $oid_chassisSystemPowerPSUA = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.17';
my $oid_chassisSystemPowerPSUB = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.18';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisSystemPowerPSUA };
push @{$options{request}}, { oid => $oid_chassisSystemPowerPSUB };
push @{$self->{request}}, { oid => $oid_chassisSystemPowerPSUA }, { oid => $oid_chassisSystemPowerPSUB };
}
sub psu {
@ -45,7 +44,7 @@ sub psu {
my $psu_state = $options{value};
return if ($self->check_exclude(section => 'psu', instance => $instance));
return if ($self->check_filter(section => 'psu', instance => $instance));
return if ($psu_state =~ /Absent/i &&
$self->absent_problem(section => 'psu', instance => $instance));
@ -64,7 +63,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psus', total => 0, skip => 0};
return if ($self->check_exclude(section => 'psu'));
return if ($self->check_filter(section => 'psu'));
foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemPowerPSUA}}) {
psu($self, oid => $oid, oid_short => $oid_chassisSystemPowerPSUA, value => $self->{results}->{$oid_chassisSystemPowerPSUA}->{$oid},

View File

@ -30,11 +30,10 @@ my $oid_chassisSystemTempController = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.21';
my $oid_arrayVimmEntry_temp = '.1.3.6.1.4.1.35897.1.2.2.3.16.1.12';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayVimmEntry_temp };
push @{$options{request}}, { oid => $oid_chassisSystemTempAmbient };
push @{$options{request}}, { oid => $oid_chassisSystemTempController };
push @{$self->{request}}, { oid => $oid_arrayVimmEntry_temp }, { oid => $oid_chassisSystemTempAmbient },
{ oid => $oid_chassisSystemTempController };
}
sub temperature {
@ -47,7 +46,7 @@ sub temperature {
my $temperature = $options{value};
return if ($self->check_exclude(section => 'temperature', instance => $instance));
return if ($self->check_filter(section => 'temperature', instance => $instance));
$self->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature '%s' is %s degree centigrade.",
@ -68,7 +67,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0};
return if ($self->check_exclude(section => 'temperature'));
return if ($self->check_filter(section => 'temperature'));
foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemTempAmbient}}) {
temperature($self, oid => $oid, oid_short => $oid_chassisSystemTempAmbient, value => $self->{results}->{$oid_chassisSystemTempAmbient}->{$oid},

View File

@ -39,10 +39,9 @@ my %map_vimm_present = (
);
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayVimmEntry_present };
push @{$options{request}}, { oid => $oid_arrayVimmEntry_failed };
push @{$self->{request}}, { oid => $oid_arrayVimmEntry_present }, { oid => $oid_arrayVimmEntry_failed };
}
sub check {
@ -50,7 +49,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking vimms");
$self->{components}->{vimm} = {name => 'vimms', total => 0, skip => 0};
return if ($self->check_exclude(section => 'vimm'));
return if ($self->check_filter(section => 'vimm'));
foreach my $oid (keys %{$self->{results}->{$oid_arrayVimmEntry_present}}) {
next if ($oid !~ /^$oid_arrayVimmEntry_present\.(.*)$/);
@ -59,7 +58,7 @@ sub check {
my ($dummy, $array_name, $vimm_name) = $self->convert_index(value => $1);
my $instance = $array_name . '-' . $vimm_name;
next if ($self->check_exclude(section => 'vimm', instance => $instance));
next if ($self->check_filter(section => 'vimm', instance => $instance));
next if ($map_vimm_present{$present} =~ /Absent/i &&
$self->absent_problem(section => 'vimm', instance => $instance));

View File

@ -20,55 +20,77 @@
package centreon::common::violin::snmp::mode::hardware;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
use centreon::plugins::misc;
my $thresholds = {
vimm => [
['not failed', 'OK'],
['failed', 'CRITICAL'],
],
ca => [
['ON', 'CRITICAL'],
['OFF', 'OK'],
],
psu => [
['OFF', 'CRITICAL'],
['Absent', 'OK'],
['ON', 'OK'],
],
fan => [
['OFF', 'CRITICAL'],
['Absent', 'OK'],
['Low', 'OK'],
['Medium', 'OK'],
['High', 'WARNING'],
],
gfc => [
['Online', 'OK'],
['Unconfigured', 'OK'],
['Unknown', 'UNKNOWN'],
['Not\s*Supported', 'WARNING'],
['Dead', 'CRITICAL'],
['Lost', 'CRITICAL'],
['Failover\s*Failed', 'CRITICAL'],
['Failover', 'WARNING'],
],
lfc => [
['Online', 'OK'],
['Unconfigured', 'OK'],
['Unknown', 'UNKNOWN'],
['Not\s*Supported', 'WARNING'],
['Dead', 'CRITICAL'],
['Lost', 'CRITICAL'],
['Failover\s*Failed', 'CRITICAL'],
['Failover', 'WARNING'],
],
};
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(vimm|ca|psu|fan|gfc|lfc)$';
$self->{regexp_threshold_numeric_check_section_option} = '^(temperature)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
vimm => [
['not failed', 'OK'],
['failed', 'CRITICAL'],
],
ca => [
['ON', 'CRITICAL'],
['OFF', 'OK'],
],
psu => [
['OFF', 'CRITICAL'],
['Absent', 'OK'],
['ON', 'OK'],
],
fan => [
['OFF', 'CRITICAL'],
['Absent', 'OK'],
['Low', 'OK'],
['Medium', 'OK'],
['High', 'WARNING'],
],
gfc => [
['Online', 'OK'],
['Unconfigured', 'OK'],
['Unknown', 'UNKNOWN'],
['Not\s*Supported', 'WARNING'],
['Dead', 'CRITICAL'],
['Lost', 'CRITICAL'],
['Failover\s*Failed', 'CRITICAL'],
['Failover', 'WARNING'],
],
lfc => [
['Online', 'OK'],
['Unconfigured', 'OK'],
['Unknown', 'UNKNOWN'],
['Not\s*Supported', 'WARNING'],
['Dead', 'CRITICAL'],
['Lost', 'CRITICAL'],
['Failover\s*Failed', 'CRITICAL'],
['Failover', 'WARNING'],
],
};
$self->{components_path} = 'centreon::common::violin::snmp::mode::components';
$self->{components_module} = ['ca', 'psu', 'fan', 'vimm', 'temperature', 'gfc', 'lfc'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
@ -76,202 +98,12 @@ sub new {
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"exclude:s" => { name => 'exclude' },
"component:s" => { name => 'component', default => '.*' },
"absent-problem:s" => { name => 'absent' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
"warning:s@" => { name => 'warning' },
"critical:s@" => { name => 'critical' },
{
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $status, $filter) = ($1, $2, $3);
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status};
}
$self->{numeric_threshold} = {};
foreach my $option (('warning', 'critical')) {
foreach my $val (@{$self->{option_results}->{$option}}) {
if ($val !~ /^(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $regexp, $value) = ('temperature', $1, $2);
my $position = 0;
if (defined($self->{numeric_threshold}->{$section})) {
$position = scalar(@{$self->{numeric_threshold}->{$section}});
}
if (($self->{perfdata}->threshold_validate(label => $option . '-' . $section . '-' . $position, value => $value)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong $option threshold '" . $value . "'.");
$self->{output}->option_exit();
}
$self->{numeric_threshold}->{$section} = [] if (!defined($self->{numeric_threshold}->{$section}));
push @{$self->{numeric_threshold}->{$section}}, { label => $option . '-' . $section . '-' . $position, threshold => $option, regexp => $regexp };
}
}
}
sub run {
my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('ca', 'psu', 'fan', 'vimm', 'temperature', 'gfc', 'lfc');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::violin::snmp::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "centreon::common::violin::snmp::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s].",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked.');
}
$self->{output}->display();
$self->{output}->exit();
}
sub check_exclude {
my ($self, %options) = @_;
if (defined($options{instance})) {
if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) {
$self->{components}->{$options{section}}->{skip}++;
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
} elsif (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$options{section}(\s|,|$)/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
}
return 0;
}
sub absent_problem {
my ($self, %options) = @_;
if (defined($self->{option_results}->{absent}) &&
$self->{option_results}->{absent} =~ /(^|\s|,)($options{section}(\s*,|$)|${options{section}}[^,]*#\Q$options{instance}\E#)/) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Component '%s' instance '%s' is not present",
$options{section}, $options{instance}));
}
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance (not present)"));
$self->{components}->{$options{section}}->{skip}++;
return 1;
}
sub get_severity_numeric {
my ($self, %options) = @_;
my $status = 'OK'; # default
my $thresholds = { warning => undef, critical => undef };
if (defined($self->{numeric_threshold}->{$options{section}})) {
my $exits = [];
foreach (@{$self->{numeric_threshold}->{$options{section}}}) {
if ($options{instance} =~ /$_->{regexp}/) {
push @{$exits}, $self->{perfdata}->threshold_check(value => $options{value}, threshold => [ { label => $_->{label}, exit_litteral => $_->{threshold} } ]);
$thresholds->{$_->{threshold}} = $self->{perfdata}->get_perfdata_for_output(label => $_->{label});
}
}
$status = $self->{output}->get_most_critical(status => $exits) if (scalar(@{$exits}) > 0);
}
return ($status, $thresholds->{warning}, $thresholds->{critical});
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i) {
$status = $_->{status};
return $status;
}
}
}
foreach (@{$thresholds->{$options{section}}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
sub convert_index {
my ($self, %options) = @_;
@ -306,15 +138,15 @@ Check components (Fans, Power Supplies, Temperatures, Chassis alarm, vimm, globa
Which component to check (Default: '.*').
Can be: 'psu', 'fan', 'ca', 'vimm', 'lfc', 'gfc', 'temperature'.
=item B<--exclude>
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=psu)
Can also exclude specific instance: --exclude='psu#41239F00647-A#'
Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can also exclude specific instance: --filter=fan,41239F00647-A
=item B<--absent-problem>
Return an error if an entity is not 'present' (default is skipping) (comma seperated list)
Can be specific or global: --absent-problem=fan#41239F00647-fan02#
Can be specific or global: --absent-problem=fan,41239F00647-fan02
=item B<--no-component>
@ -323,19 +155,19 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,status,regexp)
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='gfc,CRITICAL,^(?!(Online)$)'
=item B<--warning>
Set warning threshold for temperatures (syntax: regexp,treshold)
Example: --warning='41239F00647-vimm46,20' --warning='41239F00647-vimm5.*,30'
Set warning threshold for temperatures (syntax: type,regexp,threshold)
Example: --warning='temperature,41239F00647-vimm46,20' --warning='temperature,41239F00647-vimm5.*,30'
=item B<--critical>
Set critical threshold for temperatures (syntax: regexp,treshold)
Example: --critical='41239F00647-vimm46,25' --warning='41239F00647-vimm5.*,35'
Set critical threshold for temperatures (syntax: type,regexp,threshold)
Example: --critical='temperature,.*,25' --warning='temperature,.*,35'
=back

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsComputeBladeDn = '.1.3.6.1.4.1.9.9.719.1.9.2.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsComputeBladePresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsComputeBladePresence}->{oid} },
{ oid => $mapping2->{cucsComputeBladeOperState}->{oid} }, { oid => $oid_cucsComputeBladeDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blades");
$self->{components}->{blade} = {name => 'blades', total => 0, skip => 0};
return if ($self->check_exclude(section => 'blade'));
return if ($self->check_filter(section => 'blade'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsComputeBladeDn}})) {
$oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsComputeBladeOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'blade', instance => $blade_dn));
next if ($self->check_exclude(section => 'blade', instance => $blade_dn));
next if ($self->check_filter(section => 'blade', instance => $blade_dn));
$self->{output}->output_add(long_msg => sprintf("blade '%s' state is '%s' [presence: %s].",
$blade_dn, $result2->{cucsComputeBladeOperState},

View File

@ -32,9 +32,9 @@ my $mapping1 = {
my $oid_cucsEquipmentChassisDn = '.1.3.6.1.4.1.9.9.719.1.15.7.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentChassisOperState}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentChassisOperState}->{oid} },
{ oid => $oid_cucsEquipmentChassisDn };
}
@ -43,7 +43,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis");
$self->{components}->{chassis} = {name => 'chassis', total => 0, skip => 0};
return if ($self->check_exclude(section => 'chassis'));
return if ($self->check_filter(section => 'chassis'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentChassisDn}})) {
$oid =~ /\.(\d+)$/;
@ -52,7 +52,7 @@ sub check {
my $result = $self->{snmp}->map_instance(mapping => $mapping1, results => $self->{results}->{$mapping1->{cucsEquipmentChassisOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'chassis', instance => $chassis_dn));
next if ($self->check_exclude(section => 'chassis', instance => $chassis_dn));
next if ($self->check_filter(section => 'chassis', instance => $chassis_dn));
$self->{components}->{chassis}->{total}++;

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsProcessorUnitDn = '.1.3.6.1.4.1.9.9.719.1.41.9.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsProcessorUnitPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsProcessorUnitPresence}->{oid} },
{ oid => $mapping2->{cucsProcessorUnitOperState}->{oid} }, { oid => $oid_cucsProcessorUnitDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking cpus");
$self->{components}->{cpu} = {name => 'cpus', total => 0, skip => 0};
return if ($self->check_exclude(section => 'cpu'));
return if ($self->check_filter(section => 'cpu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsProcessorUnitDn}})) {
$oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsProcessorUnitOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'cpu', instance => $cpu_dn));
next if ($self->check_exclude(section => 'cpu', instance => $cpu_dn));
next if ($self->check_filter(section => 'cpu', instance => $cpu_dn));
$self->{output}->output_add(long_msg => sprintf("cpu '%s' state is '%s' [presence: %s].",
$cpu_dn, $result2->{cucsProcessorUnitOperState},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsEquipmentFanDn = '.1.3.6.1.4.1.9.9.719.1.15.12.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentFanPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentFanPresence}->{oid} },
{ oid => $mapping2->{cucsEquipmentFanOperState}->{oid} }, { oid => $oid_cucsEquipmentFanDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fan'));
return if ($self->check_filter(section => 'fan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentFanDn}})) {
$oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentFanOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'fan', instance => $fan_dn));
next if ($self->check_exclude(section => 'fan', instance => $fan_dn));
next if ($self->check_filter(section => 'fan', instance => $fan_dn));
$self->{output}->output_add(long_msg => sprintf("fan '%s' state is '%s' [presence: %s].",
$fan_dn, $result2->{cucsEquipmentFanOperState},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsEquipmentFexDn = '.1.3.6.1.4.1.9.9.719.1.15.19.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentFexPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentFexPresence}->{oid} },
{ oid => $mapping2->{cucsEquipmentFexOperState}->{oid} }, { oid => $oid_cucsEquipmentFexDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fabric extenders");
$self->{components}->{fex} = {name => 'fabric extenders', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fex'));
return if ($self->check_filter(section => 'fex'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentFexDn}})) {
$oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentFexOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'fex', instance => $fex_dn));
next if ($self->check_exclude(section => 'fex', instance => $fex_dn));
next if ($self->check_filter(section => 'fex', instance => $fex_dn));
$self->{output}->output_add(long_msg => sprintf("Fabric extender '%s' state is '%s' [presence: %s].",
$fex_dn, $result2->{cucsEquipmentFexOperState},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsEquipmentIOCardDn = '.1.3.6.1.4.1.9.9.719.1.15.30.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentIOCardPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentIOCardPresence}->{oid} },
{ oid => $mapping2->{cucsEquipmentIOCardOperState}->{oid} }, { oid => $oid_cucsEquipmentIOCardDn };
}
@ -46,7 +46,7 @@ sub check {
# In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB'
$self->{output}->output_add(long_msg => "Checking io cards");
$self->{components}->{iocard} = {name => 'io cards', total => 0, skip => 0};
return if ($self->check_exclude(section => 'iocard'));
return if ($self->check_filter(section => 'iocard'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentIOCardDn}})) {
$oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentIOCardOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'iocard', instance => $iocard_dn));
next if ($self->check_exclude(section => 'iocard', instance => $iocard_dn));
next if ($self->check_filter(section => 'iocard', instance => $iocard_dn));
$self->{output}->output_add(long_msg => sprintf("IO cards '%s' state is '%s' [presence: %s].",
$iocard_dn, $result2->{cucsEquipmentIOCardOperState},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsStorageLocalDiskDn = '.1.3.6.1.4.1.9.9.719.1.45.4.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsStorageLocalDiskPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsStorageLocalDiskPresence}->{oid} },
{ oid => $mapping2->{cucsStorageLocalDiskOperability}->{oid} }, { oid => $oid_cucsStorageLocalDiskDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking local disks");
$self->{components}->{localdisk} = {name => 'local disks', total => 0, skip => 0};
return if ($self->check_exclude(section => 'localdisk'));
return if ($self->check_filter(section => 'localdisk'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsStorageLocalDiskDn}})) {
$oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsStorageLocalDiskOperability}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'localdisk', instance => $localdisk_dn));
next if ($self->check_exclude(section => 'localdisk', instance => $localdisk_dn));
next if ($self->check_filter(section => 'localdisk', instance => $localdisk_dn));
$self->{output}->output_add(long_msg => sprintf("local disk '%s' state is '%s' [presence: %s].",
$localdisk_dn, $result2->{cucsStorageLocalDiskOperability},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsMemoryUnitDn = '.1.3.6.1.4.1.9.9.719.1.30.11.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsMemoryUnitPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsMemoryUnitPresence}->{oid} },
{ oid => $mapping2->{cucsMemoryUnitOperState}->{oid} }, { oid => $oid_cucsMemoryUnitDn };
}
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking memories");
$self->{components}->{memory} = {name => 'memories', total => 0, skip => 0};
return if ($self->check_exclude(section => 'memory'));
return if ($self->check_filter(section => 'memory'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsMemoryUnitDn}})) {
$oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsMemoryUnitOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'memory', instance => $memory_dn));
next if ($self->check_exclude(section => 'memory', instance => $memory_dn));
next if ($self->check_filter(section => 'memory', instance => $memory_dn));
$self->{output}->output_add(long_msg => sprintf("memory '%s' state is '%s' [presence: %s].",
$memory_dn, $result2->{cucsMemoryUnitOperState},

View File

@ -34,9 +34,9 @@ my $mapping2 = {
my $oid_cucsEquipmentPsuDn = '.1.3.6.1.4.1.9.9.719.1.15.56.1.2';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentPsuPresence}->{oid} },
push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentPsuPresence}->{oid} },
{ oid => $mapping2->{cucsEquipmentPsuOperState}->{oid} }, { oid => $oid_cucsEquipmentPsuDn };
}
@ -46,7 +46,7 @@ sub check {
# In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB'
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psus', total => 0, skip => 0};
return if ($self->check_exclude(section => 'psu'));
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentPsuDn}})) {
$oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentPsuOperState}->{oid}}, instance => $instance);
next if ($self->absent_problem(section => 'psu', instance => $psu_dn));
next if ($self->check_exclude(section => 'psu', instance => $psu_dn));
next if ($self->check_filter(section => 'psu', instance => $psu_dn));
$self->{output}->output_add(long_msg => sprintf("power supply '%s' state is '%s' [presence: %s].",
$psu_dn, $result2->{cucsEquipmentPsuOperState},

View File

@ -20,194 +20,45 @@
package hardware::server::cisco::ucs::mode::equipment;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
use hardware::server::cisco::ucs::mode::components::resources qw($thresholds);
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(fan|psu|chassis|iocard|blade|fex|cpu|memory|localdisk)\.(presence|operability|overall_status)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = $thresholds;
$self->{components_path} = 'hardware::server::cisco::ucs::mode::components';
$self->{components_module} = ['fan', 'psu', 'chassis', 'iocard', 'blade', 'fex', 'cpu', 'memory', 'localdisk'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_performance => 1);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"exclude:s" => { name => 'exclude' },
"absent-problem:s@" => { name => 'absent_problem' },
"component:s" => { name => 'component', default => '.*' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
{
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{absent_problem} = [];
foreach my $val (@{$self->{option_results}->{absent_problem}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
push @{$self->{absent_problem}}, { filter => $values[0], instance => $values[1] };
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
if (scalar(@values) < 3) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $instance, $status, $filter);
if (scalar(@values) == 3) {
($section, $status, $filter) = @values;
$instance = '.*';
} else {
($section, $instance, $status, $filter) = @values;
}
if ($section !~ /^(fan|psu|chassis|iocard|blade|fex|cpu|memory|localdisk)\.(presence|operability|overall_status)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'.");
$self->{output}->option_exit();
}
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance };
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('fan', 'psu', 'chassis', 'iocard', 'blade', 'fex', 'cpu', 'memory', 'localdisk');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "hardware::server::cisco::ucs::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "hardware::server::cisco::ucs::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s].",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked.');
}
$self->{output}->display();
$self->{output}->exit();
}
sub absent_problem {
my ($self, %options) = @_;
foreach (@{$self->{absent_problem}}) {
if ($options{section} =~ /$_->{filter}/) {
if (!defined($_->{instance}) || $options{instance} =~ /$_->{instance}/) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Component '%s' instance '%s' is not present",
$options{section}, $options{instance}));
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance (not present)"));
$self->{components}->{$options{section}}->{skip}++;
return 1;
}
}
}
return 0;
}
sub check_exclude {
my ($self, %options) = @_;
if (defined($options{instance})) {
if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) {
$self->{components}->{$options{section}}->{skip}++;
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
} elsif (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$options{section}(\s|,|$)/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
}
return 0;
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i &&
(!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) {
$status = $_->{status};
return $status;
}
}
}
my $label = defined($options{label}) ? $options{label} : $options{section};
foreach (@{$thresholds->{$label}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
@ -223,10 +74,10 @@ Check Hardware (Fans, Power supplies, chassis, io cards, blades, fabric extender
Which component to check (Default: '.*').
Can be: 'fan', 'psu', 'chassis', 'iocard', 'blade', 'fex', 'cpu', 'memory', 'localdisk'.
=item B<--exclude>
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=fan)
Can be specific or global: --exclude=fan#/sys/chassis-7/fan-module-1-7/fan-1#
Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can also exclude specific instance: --filter=fan,/sys/chassis-7/fan-module-1-7/fan-1
=item B<--absent-problem>

View File

@ -40,9 +40,9 @@ my $oids = {
};
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_temperature, end => $oid_end };
push @{$self->{request}}, { oid => $oid_temperature, end => $oid_end };
}
sub check {
@ -50,7 +50,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking ambient");
$self->{components}->{ambient} = {name => 'ambient', total => 0, skip => 0};
return if ($self->check_exclude(section => 'ambient'));
return if ($self->check_filter(section => 'ambient'));
my @sensors = ('mm', 'frontpanel', 'frontpanel2');
my $label = 'bladecenter';
@ -68,7 +68,7 @@ sub check {
}
my $value = $1;
next if ($self->check_exclude(section => 'ambient', instance => $temp));
next if ($self->check_filter(section => 'ambient', instance => $temp));
$self->{components}->{ambient}->{total}++;
$self->{output}->output_add(long_msg => sprintf("ambient '%s' is %s degree centigrade.",

View File

@ -59,9 +59,9 @@ my $mapping = {
my $oid_bladeSystemStatusEntry = '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_bladeSystemStatusEntry, start => $mapping->{bladeId}->{oid}, end => $mapping->{bladeName}->{oid} };
push @{$self->{request}}, { oid => $oid_bladeSystemStatusEntry, start => $mapping->{bladeId}->{oid}, end => $mapping->{bladeName}->{oid} };
}
sub check {
@ -69,14 +69,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blades");
$self->{components}->{blade} = {name => 'blades', total => 0, skip => 0};
return if ($self->check_exclude(section => 'blade'));
return if ($self->check_filter(section => 'blade'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeSystemStatusEntry}})) {
next if ($oid !~ /^$mapping->{bladeExists}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeSystemStatusEntry}, instance => $instance);
next if ($self->check_exclude(section => 'blade', instance => $result->{bladeId}));
next if ($self->check_filter(section => 'blade', instance => $result->{bladeId}));
if ($result->{bladeExists} =~ /false/i) {
$self->{output}->output_add(long_msg => "skipping blade '" . $instance . "' : not exits");
next;

View File

@ -45,9 +45,9 @@ my $entry_controller_state = '30';
my $count = 4;
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_blowers };
push @{$self->{request}}, { oid => $oid_blowers };
}
sub check {
@ -55,7 +55,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blowers");
$self->{components}->{blower} = {name => 'blowers', total => 0, skip => 0};
return if ($self->check_exclude(section => 'blower'));
return if ($self->check_filter(section => 'blower'));
for (my $i = 0; $i < $count; $i++) {
my $instance = $i + 1;
@ -64,7 +64,7 @@ sub check {
my $blower_speed = defined($self->{results}->{$oid_blowers}->{$oid_blowers . '.' . ($entry_blower_speed + $i) . '.0'}) ? $self->{results}->{$oid_blowers}->{$oid_blowers . '.' . ($entry_blower_speed + $i) . '.0'} : 'unknown';
my $ctrl_state = defined($self->{results}->{$oid_blowers}->{$oid_blowers . '.' . ($entry_controller_state + $i) . '.0'}) ? $map_controller_state{$self->{results}->{$oid_blowers}->{$oid_blowers . '.' . ($entry_controller_state + $i) . '.0'}} : undef;
next if ($self->check_exclude(section => 'blower', instance => $instance));
next if ($self->check_filter(section => 'blower', instance => $instance));
next if ($blower_speed =~ /No Blower/i &&
$self->absent_problem(section => 'blower', instance => $instance));
$self->{components}->{blower}->{total}++;
@ -94,7 +94,7 @@ sub check {
next if (!defined($ctrl_state));
next if ($self->check_exclude(section => 'blowerctrl', instance => $instance));
next if ($self->check_filter(section => 'blowerctrl', instance => $instance));
next if ($ctrl_state =~ /notPresent/i &&
$self->absent_problem(section => 'blowerctrl', instance => $instance));
$self->{output}->output_add(long_msg => sprintf("Blower controller '%s' state is %s.",

View File

@ -38,9 +38,9 @@ my $mapping = {
my $oid_chassisFansEntry = '.1.3.6.1.4.1.2.3.51.2.2.3.50.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisFansEntry };
push @{$self->{request}}, { oid => $oid_chassisFansEntry };
}
sub check {
@ -48,14 +48,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis fan");
$self->{components}->{chassisfan} = {name => 'chassis fan', total => 0, skip => 0};
return if ($self->check_exclude(section => 'chassisfan'));
return if ($self->check_filter(section => 'chassisfan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_chassisFansEntry}})) {
next if ($oid !~ /^$mapping->{chassisFanState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_chassisFansEntry}, instance => $instance);
next if ($self->check_exclude(section => 'chassisfan', instance => $instance));
next if ($self->check_filter(section => 'chassisfan', instance => $instance));
$self->{components}->{chassisfan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis fan '%s' is %s rpm [status: %s, instance: %s]",

View File

@ -64,9 +64,9 @@ my %map_test_state = (
);
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_mmBistAndChassisStatus, end => $oid_bistLogicalNetworkLink };
push @{$self->{request}}, { oid => $oid_mmBistAndChassisStatus, end => $oid_bistLogicalNetworkLink };
}
sub check {
@ -74,7 +74,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis status");
$self->{components}->{chassisstatus} = {name => 'chassis-status', total => 0, skip => 0};
return if ($self->check_exclude(section => 'chassisstatus'));
return if ($self->check_filter(section => 'chassisstatus'));
foreach my $name (sort keys %{$oids}) {
if (!defined($self->{results}->{$oid_mmBistAndChassisStatus}->{$oids->{$name}})) {
@ -84,7 +84,7 @@ sub check {
}
my $value = $map_test_state{$self->{results}->{$oid_mmBistAndChassisStatus}->{$oids->{$name}}};
next if ($self->check_exclude(section => 'chassisstatus', instance => $name));
next if ($self->check_filter(section => 'chassisstatus', instance => $name));
$self->{components}->{chassisstatus}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis status '%s' state is %s",

View File

@ -43,9 +43,9 @@ my $mapping = {
my $oid_fanPackEntry = '.1.3.6.1.4.1.2.3.51.2.2.6.1.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_fanPackEntry };
push @{$self->{request}}, { oid => $oid_fanPackEntry };
}
sub check {
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fanpack");
$self->{components}->{fanpack} = {name => 'fanpacks', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fanpack'));
return if ($self->check_filter(section => 'fanpack'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanPackEntry}})) {
next if ($oid !~ /^$mapping->{fanPackState}->{oid}\.(.*)$/);
@ -64,7 +64,7 @@ sub check {
$self->{output}->output_add(long_msg => "skipping fanpack '" . $instance . "' : not exits");
next;
}
next if ($self->check_exclude(section => 'fanpack', instance => $instance));
next if ($self->check_filter(section => 'fanpack', instance => $instance));
$self->{components}->{fanpack}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fanpack '%s' is %s rpm [status: %s, instance: %s]",

View File

@ -44,9 +44,9 @@ my $mapping = {
my $oid_powerModuleHealthEntry = '.1.3.6.1.4.1.2.3.51.2.2.4.1.1';
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_powerModuleHealthEntry, start => $mapping->{powerModuleExists}->{oid} };
push @{$self->{request}}, { oid => $oid_powerModuleHealthEntry, start => $mapping->{powerModuleExists}->{oid} };
}
sub check {
@ -54,14 +54,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power modules");
$self->{components}->{powermodule} = {name => 'power modules', total => 0, skip => 0};
return if ($self->check_exclude(section => 'powermodule'));
return if ($self->check_filter(section => 'powermodule'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_powerModuleHealthEntry}})) {
next if ($oid !~ /^$mapping->{powerModuleState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_powerModuleHealthEntry}, instance => $instance);
next if ($self->check_exclude(section => 'powermodule', instance => $instance));
next if ($self->check_filter(section => 'powermodule', instance => $instance));
next if ($result->{powerModuleExists} =~ /No/i &&
$self->absent_problem(section => 'powermodule', instance => $instance));
$self->{components}->{powermodule}->{total}++;

View File

@ -36,9 +36,9 @@ my $mapping = {
};
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $mapping->{smHealthState}->{oid} };
push @{$self->{request}}, { oid => $mapping->{smHealthState}->{oid} };
}
sub check {
@ -46,14 +46,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking switch module");
$self->{components}->{switchmodule} = {name => 'switch modules', total => 0, skip => 0};
return if ($self->check_exclude(section => 'switchmodule'));
return if ($self->check_filter(section => 'switchmodule'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{smHealthState}->{oid}}})) {
$oid =~ /^$mapping->{smHealthState}->{oid}\.(.*)/;
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{smHealthState}->{oid}}, instance => $instance);
next if ($self->check_exclude(section => 'switchmodule', instance => $instance));
next if ($self->check_filter(section => 'switchmodule', instance => $instance));
$self->{components}->{switchmodule}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Switch module '%s' status is %s [instance: %s]",

View File

@ -34,9 +34,9 @@ my %map_systemhealth_state = (
);
sub load {
my (%options) = @_;
my ($self) = @_;
push @{$options{request}}, { oid => $oid_systemHealthStat };
push @{$self->{request}}, { oid => $oid_systemHealthStat };
}
sub check {
@ -44,8 +44,11 @@ sub check {
$self->{output}->output_add(long_msg => "Checking system health");
$self->{components}->{systemhealth} = {name => 'system-health', total => 0, skip => 0};
return if ($self->check_exclude(section => 'systemhealth'));
return if ($self->check_filter(section => 'systemhealth'));
return if (!defined($self->{results}->{$oid_systemHealthStat}->{$oid_systemHealthStat . '.0'}) ||
!defined($map_systemhealth_state{$self->{results}->{$oid_systemHealthStat}->{$oid_systemHealthStat . '.0'}}));
my $value = $map_systemhealth_state{$self->{results}->{$oid_systemHealthStat}->{$oid_systemHealthStat . '.0'}};
$self->{components}->{systemhealth}->{total}++;

View File

@ -20,74 +20,92 @@
package hardware::server::ibm::bladecenter::snmp::mode::hardware;
use base qw(centreon::plugins::mode);
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
my $thresholds = {
chassisstatus => [
['testSucceeded', 'OK'],
['testFailed', 'CRITICAL'],
],
systemhealth => [
['normal', 'OK'],
['systemLevel', 'WARNING'],
['nonCritical', 'WARNING'],
['critical', 'CRITICAL'],
],
powermodule => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['notAvailable', 'UNKNOWN'],
],
fanpack => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
chassisfan => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blower => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
switchmodule => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blowerctrl => [
['unknown', 'UNKNOWN'],
['operational', 'OK'],
['flashing', 'WARNING'],
['communicationError', 'CRITICAL'],
['notPresent', 'UNKNOWN'],
],
blade => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['kernelMode', 'WARNING'],
['discovering', 'WARNING'],
['commError', 'CRITICAL'],
['noPower', 'WARNING'],
['flashing', 'WARNING'],
['initFailure', 'CRITICAL'],
['insufficientPower', 'CRITICAL'],
['powerDenied', 'CRITICAL'],
],
};
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_numeric_check_section_option} = '^(blower|ambient|fanpack|chassisfan)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
chassisstatus => [
['testSucceeded', 'OK'],
['testFailed', 'CRITICAL'],
],
systemhealth => [
['normal', 'OK'],
['systemLevel', 'WARNING'],
['nonCritical', 'WARNING'],
['critical', 'CRITICAL'],
],
powermodule => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['notAvailable', 'UNKNOWN'],
],
fanpack => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
chassisfan => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blower => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
switchmodule => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blowerctrl => [
['unknown', 'UNKNOWN'],
['operational', 'OK'],
['flashing', 'WARNING'],
['communicationError', 'CRITICAL'],
['notPresent', 'UNKNOWN'],
],
blade => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['critical', 'CRITICAL'],
['kernelMode', 'WARNING'],
['discovering', 'WARNING'],
['commError', 'CRITICAL'],
['noPower', 'WARNING'],
['flashing', 'WARNING'],
['initFailure', 'CRITICAL'],
['insufficientPower', 'CRITICAL'],
['powerDenied', 'CRITICAL'],
],
};
$self->{components_path} = 'hardware::server::ibm::bladecenter::snmp::mode::components';
$self->{components_module} = ['ambient', 'powermodule', 'blade', 'blower', 'fanpack', 'chassisfan', 'systemhealth', 'chassisstatus', 'switchmodule'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
@ -96,211 +114,12 @@ sub new {
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"exclude:s" => { name => 'exclude' },
"absent-problem:s" => { name => 'absent' },
"component:s" => { name => 'component', default => '.*' },
"no-component:s" => { name => 'no_component' },
"threshold-overload:s@" => { name => 'threshold_overload' },
"warning:s@" => { name => 'warning' },
"critical:s@" => { name => 'critical' },
{
});
$self->{product_name} = undef;
$self->{serial} = undef;
$self->{romversion} = undef;
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $status, $filter) = ($1, $2, $3);
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status};
}
$self->{numeric_threshold} = {};
foreach my $option (('warning', 'critical')) {
foreach my $val (@{$self->{option_results}->{$option}}) {
if ($val !~ /^(.*?),(.*?),(.*)$/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $regexp, $value) = ($1, $2, $3);
if ($section !~ /(blower|ambient|fanpack|chassisfan)/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "' (type must be: blower, fanpack, chassisfan or ambient).");
$self->{output}->option_exit();
}
my $position = 0;
if (defined($self->{numeric_threshold}->{$section})) {
$position = scalar(@{$self->{numeric_threshold}->{$section}});
}
if (($self->{perfdata}->threshold_validate(label => $option . '-' . $section . '-' . $position, value => $value)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong $option threshold '" . $value . "'.");
$self->{output}->option_exit();
}
$self->{numeric_threshold}->{$section} = [] if (!defined($self->{numeric_threshold}->{$section}));
push @{$self->{numeric_threshold}->{$section}}, { label => $option . '-' . $section . '-' . $position, threshold => $option, regexp => $regexp };
}
}
}
sub run {
my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('ambient', 'powermodule', 'blade', 'blower', 'fanpack', 'chassisfan', 'systemhealth', 'chassisstatus', 'switchmodule');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "hardware::server::ibm::bladecenter::snmp::mode::components::$_";
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $mod_name,
error_msg => "Cannot load module '$mod_name'.");
my $func = $mod_name->can('load');
$func->(request => $snmp_request);
}
}
if (scalar(@{$snmp_request}) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{results} = $self->{snmp}->get_multiple_table(oids => $snmp_request);
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "hardware::server::ibm::bladecenter::snmp::mode::components::$_";
my $func = $mod_name->can('check');
$func->($self);
}
}
my $total_components = 0;
my $display_by_component = '';
my $display_by_component_append = '';
foreach my $comp (sort(keys %{$self->{components}})) {
# Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
my $count_by_components = $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $count_by_components . ' ' . $self->{components}->{$comp}->{name};
$display_by_component_append = ', ';
}
$self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All %s components are ok [%s].",
$total_components,
$display_by_component)
);
if (defined($self->{option_results}->{no_component}) && $total_components == 0) {
$self->{output}->output_add(severity => $self->{no_components},
short_msg => 'No components are checked.');
}
$self->{output}->display();
$self->{output}->exit();
}
sub check_exclude {
my ($self, %options) = @_;
if (defined($options{instance})) {
if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)${options{section}}[^,]*#\Q$options{instance}\E#/) {
$self->{components}->{$options{section}}->{skip}++;
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance."));
return 1;
}
} elsif (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$options{section}(\s|,|$)/) {
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section."));
return 1;
}
return 0;
}
sub absent_problem {
my ($self, %options) = @_;
if (defined($self->{option_results}->{absent}) &&
$self->{option_results}->{absent} =~ /(^|\s|,)($options{section}(\s*,|$)|${options{section}}[^,]*#\Q$options{instance}\E#)/) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Component '%s' instance '%s' is not present",
$options{section}, $options{instance}));
}
$self->{output}->output_add(long_msg => sprintf("Skipping $options{section} section $options{instance} instance (not present)"));
$self->{components}->{$options{section}}->{skip}++;
return 1;
}
sub get_severity_numeric {
my ($self, %options) = @_;
my $status = 'OK'; # default
my $thresholds = { warning => undef, critical => undef };
my $checked = 0;
if (defined($self->{numeric_threshold}->{$options{section}})) {
my $exits = [];
foreach (@{$self->{numeric_threshold}->{$options{section}}}) {
if ($options{instance} =~ /$_->{regexp}/) {
push @{$exits}, $self->{perfdata}->threshold_check(value => $options{value}, threshold => [ { label => $_->{label}, exit_litteral => $_->{threshold} } ]);
$thresholds->{$_->{threshold}} = $self->{perfdata}->get_perfdata_for_output(label => $_->{label});
$checked = 1;
}
}
$status = $self->{output}->get_most_critical(status => $exits) if (scalar(@{$exits}) > 0);
}
return ($status, $thresholds->{warning}, $thresholds->{critical}, $checked);
}
sub get_severity {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i) {
$status = $_->{status};
return $status;
}
}
}
foreach (@{$thresholds->{$options{section}}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
@ -317,15 +136,15 @@ Which component to check (Default: 'all').
Can be: 'ambient', 'powermodule', 'fanpack', 'chassisfan',
'blower', 'blade', 'systemhealth', 'chassisstatus', 'switchmodule'.
=item B<--exclude>
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=blower,powermodule)
Can also exclude specific instance: --exclude=blower#1#,powermodule#2#
Exclude some parts (comma seperated list) (Example: --filter=blower --filter=powermodule)
Can also exclude specific instance: --filter=blower,1
=item B<--absent-problem>
Return an error if an entity is not 'notAvailable' (default is skipping) (comma seperated list)
Can be specific or global: --absent-problem=powermodule#2#
Can be specific or global: --absent-problem=powermodule,2
=item B<--no-component>
@ -334,18 +153,18 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,status,regexp)
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='blade,OK,unknown'
=item B<--warning>
Set warning threshold for temperatures (syntax: type,regexp,treshold)
Set warning threshold (syntax: type,regexp,threshold)
Example: --warning='ambient,mm,30' --warning='ambient,frontpanel,35'
=item B<--critical>
Set critical threshold for temperatures (syntax: type,regexp,treshold)
Set critical threshold (syntax: type,regexp,threshold)
Example: --critical='blower,1,50'
=back