+ update: refactoring with hardware template class

This commit is contained in:
garnier-quentin 2016-01-08 16:39:50 +01:00
parent 8ea10bda11
commit 9def083885
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'; my $oid_wlsxSysExtFanEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.17.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtFanEntry }; push @{$self->{request}}, { oid => $oid_wlsxSysExtFanEntry };
} }
sub check { sub check {
@ -45,14 +45,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans"); $self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtFanEntry}})) {
next if ($oid !~ /^$mapping->{sysExtFanStatus}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{sysExtFanStatus}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtFanEntry}, instance => $instance); 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->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan '%s' status is %s [instance: %s].", $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'; my $oid_wlsxSysExtCardEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.16.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtCardEntry }; push @{$self->{request}}, { oid => $oid_wlsxSysExtCardEntry };
} }
sub check { sub check {
@ -65,14 +65,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking modules"); $self->{output}->output_add(long_msg => "Checking modules");
$self->{components}->{module} = {name => 'modules', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtCardEntry}})) {
next if ($oid !~ /^$mapping->{sysExtCardStatus}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{sysExtCardStatus}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtCardEntry}, instance => $instance); 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->{components}->{module}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Module '%s/%s' status is %s [instance: %s].", $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'; my $oid_wlsxSysExtPowerSupplyEntry = '.1.3.6.1.4.1.14823.2.2.1.2.1.18.1.2';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_wlsxSysExtPowerSupplyEntry }; push @{$self->{request}}, { oid => $oid_wlsxSysExtPowerSupplyEntry };
} }
sub check { sub check {
@ -45,14 +45,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies"); $self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}})) {
next if ($oid !~ /^$mapping->{sysExtPowerSupplyStatus}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{sysExtPowerSupplyStatus}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxSysExtPowerSupplyEntry}, instance => $instance); 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->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is %s [instance: %s].", $self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is %s [instance: %s].",

View File

@ -20,12 +20,19 @@
package centreon::common::aruba::snmp::mode::hardware; package centreon::common::aruba::snmp::mode::hardware;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
my $thresholds = { sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(fan|psu|module)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
fan => [ fan => [
['active', 'OK'], ['active', 'OK'],
['inactive', 'CRITICAL'], ['inactive', 'CRITICAL'],
@ -40,148 +47,30 @@ my $thresholds = {
], ],
}; };
$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 { sub new {
my ($class, %options) = @_; 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; bless $self, $class;
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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; 1;
__END__ __END__
@ -197,10 +86,10 @@ Check hardware (modules, fans, power supplies).
Which component to check (Default: '.*'). Which component to check (Default: '.*').
Can be: 'fan', 'psu', 'module'. Can be: 'fan', 'psu', 'module'.
=item B<--exclude> =item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=fan,module) Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can also exclude specific instance: --exclude=fan#1#2#,module#1#,psu Can also exclude specific instance: --filter=fan,1
=item B<--no-component> =item B<--no-component>
@ -209,7 +98,7 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload> =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). It used before default thresholds (order stays).
Example: --threshold-overload='fan,OK,inactive' 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'; my $oid_rlEnvMonFanStatusEntry = '.1.3.6.1.4.1.9.6.1.101.83.1.1.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_rlEnvMonFanStatusEntry }; push @{$self->{request}}, { oid => $oid_rlEnvMonFanStatusEntry };
} }
sub check { sub check {
@ -49,14 +49,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans"); $self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fan', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_rlEnvMonFanStatusEntry}})) {
next if ($oid !~ /^$mapping->{rlEnvMonFanState}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{rlEnvMonFanState}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_rlEnvMonFanStatusEntry}, instance => $instance); 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) { if ($result->{rlEnvMonFanState} =~ /notPresent/i) {
$self->absent_problem(section => 'fan', instance => $instance); $self->absent_problem(section => 'fan', instance => $instance);
next; 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'; my $oid_rlEnvMonSupplyStatusEntry = '.1.3.6.1.4.1.9.6.1.101.83.1.2.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_rlEnvMonSupplyStatusEntry }; push @{$self->{request}}, { oid => $oid_rlEnvMonSupplyStatusEntry };
} }
sub check { sub check {
@ -49,14 +49,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies"); $self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psu', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_rlEnvMonSupplyStatusEntry}})) {
next if ($oid !~ /^$mapping->{rlEnvMonSupplyState}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{rlEnvMonSupplyState}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_rlEnvMonSupplyStatusEntry}, instance => $instance); 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) { if ($result->{rlEnvMonSupplyState} =~ /notPresent/i) {
$self->absent_problem(section => 'psu', instance => $instance); $self->absent_problem(section => 'psu', instance => $instance);
next; next;

View File

@ -20,12 +20,19 @@
package centreon::common::cisco::smallbusiness::snmp::mode::environment; package centreon::common::cisco::smallbusiness::snmp::mode::environment;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
my $thresholds = { sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(fan|psu)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
fan => [ fan => [
['normal', 'OK'], ['normal', 'OK'],
['notPresent', 'OK'], ['notPresent', 'OK'],
@ -44,165 +51,30 @@ my $thresholds = {
], ],
}; };
$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 { sub new {
my ($class, %options) = @_; 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; bless $self, $class;
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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; 1;
__END__ __END__
@ -218,10 +90,10 @@ Check environment (Fans, Power supplies).
Which component to check (Default: '.*'). Which component to check (Default: '.*').
Can be: 'fan', 'psu'. Can be: 'fan', 'psu'.
=item B<--exclude> =item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=psu) Exclude some parts (comma seperated list) (Example: --filter=psu)
Can also exclude specific instance: --exclude='psu#0#' Can also exclude specific instance: --filter=psu,0
=item B<--absent-problem> =item B<--absent-problem>
@ -235,7 +107,7 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload> =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). It used before default thresholds (order stays).
Example: --threshold-overload='fan,CRITICAL,^(?!(normal)$)' Example: --threshold-overload='fan,CRITICAL,^(?!(normal)$)'

View File

@ -42,9 +42,9 @@ my $mapping = {
}; };
sub load { 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} }; { oid => $mapping->{mseries}->{OperStatus}->{oid} }, { oid => $mapping->{zseries}->{OperStatus}->{oid} };
} }

View File

@ -50,9 +50,9 @@ my $mapping = {
}; };
sub load { 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} }; { 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'; my $oid_deviceSensorValueEntry = '.1.3.6.1.4.1.3417.2.1.1.1.1.1';
sub load { 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} }; { oid => $mapping->{mseries}->{Temp}->{oid} };
} }

View File

@ -20,13 +20,20 @@
package centreon::common::force10::snmp::mode::hardware; package centreon::common::force10::snmp::mode::hardware;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
use centreon::plugins::misc;
my $thresholds = { 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 => [ fan => [
['up', 'OK'], ['up', 'OK'],
['absent', 'OK'], ['absent', 'OK'],
@ -46,6 +53,17 @@ my $thresholds = {
], ],
}; };
$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 { sub new {
my ($class, %options) = @_; my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options); my $self = $class->SUPER::new(package => __PACKAGE__, %options);
@ -54,240 +72,11 @@ sub new {
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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; 1;
__END__ __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'; my $oid_chassisSystemLedAlarm = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.7';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisSystemLedAlarm }; push @{$self->{request}}, { oid => $oid_chassisSystemLedAlarm };
} }
sub check { sub check {
@ -38,7 +38,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis alarm"); $self->{output}->output_add(long_msg => "Checking chassis alarm");
$self->{components}->{ca} = {name => 'chassis alarm', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemLedAlarm}}) {
$oid =~ /^$oid_chassisSystemLedAlarm\.(.*)$/; $oid =~ /^$oid_chassisSystemLedAlarm\.(.*)$/;
@ -46,7 +46,7 @@ sub check {
my $instance = $array_name; my $instance = $array_name;
my $ca_state = $self->{results}->{$oid_chassisSystemLedAlarm}->{$oid}; 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->{components}->{ca}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis alarm '%s' is %s.", $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'; my $oid_arrayFanEntry_speed = '.1.3.6.1.4.1.35897.1.2.2.3.18.1.3';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayFanEntry_speed }; push @{$self->{request}}, { oid => $oid_arrayFanEntry_speed };
} }
sub check { sub check {
@ -38,7 +38,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans"); $self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_arrayFanEntry_speed}}) {
$oid =~ /^$oid_arrayFanEntry_speed\.(.*)$/; $oid =~ /^$oid_arrayFanEntry_speed\.(.*)$/;
@ -46,7 +46,7 @@ sub check {
my $instance = $array_name . '-' . $fan_name; my $instance = $array_name . '-' . $fan_name;
my $fan_state = $self->{results}->{$oid_arrayFanEntry_speed}->{$oid}; 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 && next if ($fan_state =~ /Absent/i &&
$self->absent_problem(section => 'fan', instance => $instance)); $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'; my $oid_portState = '.1.3.6.1.4.1.35897.1.2.1.10.1.8';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_globalTargetFcEntry }; push @{$self->{request}}, { oid => $oid_globalTargetFcEntry };
} }
sub check { sub check {
@ -41,7 +41,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking global fc"); $self->{output}->output_add(long_msg => "Checking global fc");
$self->{components}->{gfc} = {name => 'global fc', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_globalTargetFcEntry}}) {
next if ($oid !~ /^$oid_wwn\.(.*)$/); next if ($oid !~ /^$oid_wwn\.(.*)$/);
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)")); $self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)"));
next; next;
} }
next if ($self->check_exclude(section => 'gfc', instance => $wwn)); next if ($self->check_filter(section => 'gfc', instance => $wwn));
$self->{components}->{gfc}->{total}++; $self->{components}->{gfc}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Global FC '%s' is %s.", $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'; my $oid_portState = '.1.3.6.1.4.1.35897.1.2.1.6.1.7';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_localTargetFcEntry }; push @{$self->{request}}, { oid => $oid_localTargetFcEntry };
} }
sub check { sub check {
@ -41,7 +41,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking local fc"); $self->{output}->output_add(long_msg => "Checking local fc");
$self->{components}->{lfc} = {name => 'local fc', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_localTargetFcEntry}}) {
next if ($oid !~ /^$oid_wwn\.(.*)$/); next if ($oid !~ /^$oid_wwn\.(.*)$/);
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)")); $self->{output}->output_add(long_msg => sprintf("Skipping instance '$wwn' (not enable)"));
next; next;
} }
next if ($self->check_exclude(section => 'lfc', instance => $wwn)); next if ($self->check_filter(section => 'lfc', instance => $wwn));
$self->{components}->{lfc}->{total}++; $self->{components}->{lfc}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Local FC '%s' is %s.", $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'; my $oid_chassisSystemPowerPSUB = '.1.3.6.1.4.1.35897.1.2.2.3.17.1.18';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisSystemPowerPSUA }; push @{$self->{request}}, { oid => $oid_chassisSystemPowerPSUA }, { oid => $oid_chassisSystemPowerPSUB };
push @{$options{request}}, { oid => $oid_chassisSystemPowerPSUB };
} }
sub psu { sub psu {
@ -45,7 +44,7 @@ sub psu {
my $psu_state = $options{value}; 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 && return if ($psu_state =~ /Absent/i &&
$self->absent_problem(section => 'psu', instance => $instance)); $self->absent_problem(section => 'psu', instance => $instance));
@ -64,7 +63,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power supplies"); $self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psus', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemPowerPSUA}}) {
psu($self, oid => $oid, oid_short => $oid_chassisSystemPowerPSUA, value => $self->{results}->{$oid_chassisSystemPowerPSUA}->{$oid}, 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'; my $oid_arrayVimmEntry_temp = '.1.3.6.1.4.1.35897.1.2.2.3.16.1.12';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayVimmEntry_temp }; push @{$self->{request}}, { oid => $oid_arrayVimmEntry_temp }, { oid => $oid_chassisSystemTempAmbient },
push @{$options{request}}, { oid => $oid_chassisSystemTempAmbient }; { oid => $oid_chassisSystemTempController };
push @{$options{request}}, { oid => $oid_chassisSystemTempController };
} }
sub temperature { sub temperature {
@ -47,7 +46,7 @@ sub temperature {
my $temperature = $options{value}; 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->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature '%s' is %s degree centigrade.", $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->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_chassisSystemTempAmbient}}) {
temperature($self, oid => $oid, oid_short => $oid_chassisSystemTempAmbient, value => $self->{results}->{$oid_chassisSystemTempAmbient}->{$oid}, 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 { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_arrayVimmEntry_present }; push @{$self->{request}}, { oid => $oid_arrayVimmEntry_present }, { oid => $oid_arrayVimmEntry_failed };
push @{$options{request}}, { oid => $oid_arrayVimmEntry_failed };
} }
sub check { sub check {
@ -50,7 +49,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking vimms"); $self->{output}->output_add(long_msg => "Checking vimms");
$self->{components}->{vimm} = {name => 'vimms', total => 0, skip => 0}; $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}}) { foreach my $oid (keys %{$self->{results}->{$oid_arrayVimmEntry_present}}) {
next if ($oid !~ /^$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 ($dummy, $array_name, $vimm_name) = $self->convert_index(value => $1);
my $instance = $array_name . '-' . $vimm_name; 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 && next if ($map_vimm_present{$present} =~ /Absent/i &&
$self->absent_problem(section => 'vimm', instance => $instance)); $self->absent_problem(section => 'vimm', instance => $instance));

View File

@ -20,13 +20,24 @@
package centreon::common::violin::snmp::mode::hardware; package centreon::common::violin::snmp::mode::hardware;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
use centreon::plugins::misc;
my $thresholds = { my $thresholds = {
};
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 => [ vimm => [
['not failed', 'OK'], ['not failed', 'OK'],
['failed', 'CRITICAL'], ['failed', 'CRITICAL'],
@ -69,6 +80,17 @@ my $thresholds = {
], ],
}; };
$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 { sub new {
my ($class, %options) = @_; my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options); my $self = $class->SUPER::new(package => __PACKAGE__, %options);
@ -77,201 +99,11 @@ sub new {
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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 { sub convert_index {
my ($self, %options) = @_; my ($self, %options) = @_;
@ -306,15 +138,15 @@ Check components (Fans, Power Supplies, Temperatures, Chassis alarm, vimm, globa
Which component to check (Default: '.*'). Which component to check (Default: '.*').
Can be: 'psu', 'fan', 'ca', 'vimm', 'lfc', 'gfc', 'temperature'. Can be: 'psu', 'fan', 'ca', 'vimm', 'lfc', 'gfc', 'temperature'.
=item B<--exclude> =item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=psu) Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can also exclude specific instance: --exclude='psu#41239F00647-A#' Can also exclude specific instance: --filter=fan,41239F00647-A
=item B<--absent-problem> =item B<--absent-problem>
Return an error if an entity is not 'present' (default is skipping) (comma seperated list) 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> =item B<--no-component>
@ -323,19 +155,19 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload> =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). It used before default thresholds (order stays).
Example: --threshold-overload='gfc,CRITICAL,^(?!(Online)$)' Example: --threshold-overload='gfc,CRITICAL,^(?!(Online)$)'
=item B<--warning> =item B<--warning>
Set warning threshold for temperatures (syntax: regexp,treshold) Set warning threshold for temperatures (syntax: type,regexp,threshold)
Example: --warning='41239F00647-vimm46,20' --warning='41239F00647-vimm5.*,30' Example: --warning='temperature,41239F00647-vimm46,20' --warning='temperature,41239F00647-vimm5.*,30'
=item B<--critical> =item B<--critical>
Set critical threshold for temperatures (syntax: regexp,treshold) Set critical threshold for temperatures (syntax: type,regexp,threshold)
Example: --critical='41239F00647-vimm46,25' --warning='41239F00647-vimm5.*,35' Example: --critical='temperature,.*,25' --warning='temperature,.*,35'
=back =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'; my $oid_cucsComputeBladeDn = '.1.3.6.1.4.1.9.9.719.1.9.2.1.2';
sub load { 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 }; { oid => $mapping2->{cucsComputeBladeOperState}->{oid} }, { oid => $oid_cucsComputeBladeDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blades"); $self->{output}->output_add(long_msg => "Checking blades");
$self->{components}->{blade} = {name => 'blades', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsComputeBladeDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsComputeBladeOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("blade '%s' state is '%s' [presence: %s].",
$blade_dn, $result2->{cucsComputeBladeOperState}, $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'; my $oid_cucsEquipmentChassisDn = '.1.3.6.1.4.1.9.9.719.1.15.7.1.2';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $mapping1->{cucsEquipmentChassisOperState}->{oid} }, push @{$self->{request}}, { oid => $mapping1->{cucsEquipmentChassisOperState}->{oid} },
{ oid => $oid_cucsEquipmentChassisDn }; { oid => $oid_cucsEquipmentChassisDn };
} }
@ -43,7 +43,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis"); $self->{output}->output_add(long_msg => "Checking chassis");
$self->{components}->{chassis} = {name => 'chassis', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentChassisDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -52,7 +52,7 @@ sub check {
my $result = $self->{snmp}->map_instance(mapping => $mapping1, results => $self->{results}->{$mapping1->{cucsEquipmentChassisOperState}->{oid}}, instance => $instance); 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->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}++; $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'; my $oid_cucsProcessorUnitDn = '.1.3.6.1.4.1.9.9.719.1.41.9.1.2';
sub load { 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 }; { oid => $mapping2->{cucsProcessorUnitOperState}->{oid} }, { oid => $oid_cucsProcessorUnitDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking cpus"); $self->{output}->output_add(long_msg => "Checking cpus");
$self->{components}->{cpu} = {name => 'cpus', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsProcessorUnitDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsProcessorUnitOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("cpu '%s' state is '%s' [presence: %s].",
$cpu_dn, $result2->{cucsProcessorUnitOperState}, $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'; my $oid_cucsEquipmentFanDn = '.1.3.6.1.4.1.9.9.719.1.15.12.1.2';
sub load { 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 }; { oid => $mapping2->{cucsEquipmentFanOperState}->{oid} }, { oid => $oid_cucsEquipmentFanDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fans"); $self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentFanDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentFanOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("fan '%s' state is '%s' [presence: %s].",
$fan_dn, $result2->{cucsEquipmentFanOperState}, $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'; my $oid_cucsEquipmentFexDn = '.1.3.6.1.4.1.9.9.719.1.15.19.1.2';
sub load { 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 }; { oid => $mapping2->{cucsEquipmentFexOperState}->{oid} }, { oid => $oid_cucsEquipmentFexDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fabric extenders"); $self->{output}->output_add(long_msg => "Checking fabric extenders");
$self->{components}->{fex} = {name => 'fabric extenders', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentFexDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentFexOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("Fabric extender '%s' state is '%s' [presence: %s].",
$fex_dn, $result2->{cucsEquipmentFexOperState}, $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'; my $oid_cucsEquipmentIOCardDn = '.1.3.6.1.4.1.9.9.719.1.15.30.1.2';
sub load { 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 }; { oid => $mapping2->{cucsEquipmentIOCardOperState}->{oid} }, { oid => $oid_cucsEquipmentIOCardDn };
} }
@ -46,7 +46,7 @@ sub check {
# In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB' # In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB'
$self->{output}->output_add(long_msg => "Checking io cards"); $self->{output}->output_add(long_msg => "Checking io cards");
$self->{components}->{iocard} = {name => 'io cards', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentIOCardDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentIOCardOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("IO cards '%s' state is '%s' [presence: %s].",
$iocard_dn, $result2->{cucsEquipmentIOCardOperState}, $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'; my $oid_cucsStorageLocalDiskDn = '.1.3.6.1.4.1.9.9.719.1.45.4.1.2';
sub load { 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 }; { oid => $mapping2->{cucsStorageLocalDiskOperability}->{oid} }, { oid => $oid_cucsStorageLocalDiskDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking local disks"); $self->{output}->output_add(long_msg => "Checking local disks");
$self->{components}->{localdisk} = {name => 'local disks', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsStorageLocalDiskDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -55,7 +55,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsStorageLocalDiskOperability}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("local disk '%s' state is '%s' [presence: %s].",
$localdisk_dn, $result2->{cucsStorageLocalDiskOperability}, $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'; my $oid_cucsMemoryUnitDn = '.1.3.6.1.4.1.9.9.719.1.30.11.1.2';
sub load { 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 }; { oid => $mapping2->{cucsMemoryUnitOperState}->{oid} }, { oid => $oid_cucsMemoryUnitDn };
} }
@ -45,7 +45,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking memories"); $self->{output}->output_add(long_msg => "Checking memories");
$self->{components}->{memory} = {name => 'memories', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsMemoryUnitDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsMemoryUnitOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("memory '%s' state is '%s' [presence: %s].",
$memory_dn, $result2->{cucsMemoryUnitOperState}, $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'; my $oid_cucsEquipmentPsuDn = '.1.3.6.1.4.1.9.9.719.1.15.56.1.2';
sub load { 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 }; { oid => $mapping2->{cucsEquipmentPsuOperState}->{oid} }, { oid => $oid_cucsEquipmentPsuDn };
} }
@ -46,7 +46,7 @@ sub check {
# In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB' # In MIB 'CISCO-UNIFIED-COMPUTING-EQUIPMENT-MIB'
$self->{output}->output_add(long_msg => "Checking power supplies"); $self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psus', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_cucsEquipmentPsuDn}})) {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
@ -56,7 +56,7 @@ sub check {
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{cucsEquipmentPsuOperState}->{oid}}, instance => $instance); 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->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].", $self->{output}->output_add(long_msg => sprintf("power supply '%s' state is '%s' [presence: %s].",
$psu_dn, $result2->{cucsEquipmentPsuOperState}, $psu_dn, $result2->{cucsEquipmentPsuOperState},

View File

@ -20,194 +20,45 @@
package hardware::server::cisco::ucs::mode::equipment; package hardware::server::cisco::ucs::mode::equipment;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
use hardware::server::cisco::ucs::mode::components::resources qw($thresholds); 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 { sub new {
my ($class, %options) = @_; 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; bless $self, $class;
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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; 1;
__END__ __END__
@ -223,10 +74,10 @@ Check Hardware (Fans, Power supplies, chassis, io cards, blades, fabric extender
Which component to check (Default: '.*'). Which component to check (Default: '.*').
Can be: 'fan', 'psu', 'chassis', 'iocard', 'blade', 'fex', 'cpu', 'memory', 'localdisk'. 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) Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu)
Can be specific or global: --exclude=fan#/sys/chassis-7/fan-module-1-7/fan-1# Can also exclude specific instance: --filter=fan,/sys/chassis-7/fan-module-1-7/fan-1
=item B<--absent-problem> =item B<--absent-problem>

View File

@ -40,9 +40,9 @@ my $oids = {
}; };
sub load { 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 { sub check {
@ -50,7 +50,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking ambient"); $self->{output}->output_add(long_msg => "Checking ambient");
$self->{components}->{ambient} = {name => 'ambient', total => 0, skip => 0}; $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 @sensors = ('mm', 'frontpanel', 'frontpanel2');
my $label = 'bladecenter'; my $label = 'bladecenter';
@ -68,7 +68,7 @@ sub check {
} }
my $value = $1; 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->{components}->{ambient}->{total}++;
$self->{output}->output_add(long_msg => sprintf("ambient '%s' is %s degree centigrade.", $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'; my $oid_bladeSystemStatusEntry = '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1';
sub load { 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 { sub check {
@ -69,14 +69,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blades"); $self->{output}->output_add(long_msg => "Checking blades");
$self->{components}->{blade} = {name => 'blades', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeSystemStatusEntry}})) {
next if ($oid !~ /^$mapping->{bladeExists}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{bladeExists}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeSystemStatusEntry}, instance => $instance); 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) { if ($result->{bladeExists} =~ /false/i) {
$self->{output}->output_add(long_msg => "skipping blade '" . $instance . "' : not exits"); $self->{output}->output_add(long_msg => "skipping blade '" . $instance . "' : not exits");
next; next;

View File

@ -45,9 +45,9 @@ my $entry_controller_state = '30';
my $count = 4; my $count = 4;
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_blowers }; push @{$self->{request}}, { oid => $oid_blowers };
} }
sub check { sub check {
@ -55,7 +55,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking blowers"); $self->{output}->output_add(long_msg => "Checking blowers");
$self->{components}->{blower} = {name => 'blowers', total => 0, skip => 0}; $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++) { for (my $i = 0; $i < $count; $i++) {
my $instance = $i + 1; 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 $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; 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 && next if ($blower_speed =~ /No Blower/i &&
$self->absent_problem(section => 'blower', instance => $instance)); $self->absent_problem(section => 'blower', instance => $instance));
$self->{components}->{blower}->{total}++; $self->{components}->{blower}->{total}++;
@ -94,7 +94,7 @@ sub check {
next if (!defined($ctrl_state)); 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 && next if ($ctrl_state =~ /notPresent/i &&
$self->absent_problem(section => 'blowerctrl', instance => $instance)); $self->absent_problem(section => 'blowerctrl', instance => $instance));
$self->{output}->output_add(long_msg => sprintf("Blower controller '%s' state is %s.", $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'; my $oid_chassisFansEntry = '.1.3.6.1.4.1.2.3.51.2.2.3.50.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_chassisFansEntry }; push @{$self->{request}}, { oid => $oid_chassisFansEntry };
} }
sub check { sub check {
@ -48,14 +48,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis fan"); $self->{output}->output_add(long_msg => "Checking chassis fan");
$self->{components}->{chassisfan} = {name => 'chassis fan', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_chassisFansEntry}})) {
next if ($oid !~ /^$mapping->{chassisFanState}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{chassisFanState}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_chassisFansEntry}, instance => $instance); 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->{components}->{chassisfan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis fan '%s' is %s rpm [status: %s, instance: %s]", $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 { 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 { sub check {
@ -74,7 +74,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking chassis status"); $self->{output}->output_add(long_msg => "Checking chassis status");
$self->{components}->{chassisstatus} = {name => 'chassis-status', total => 0, skip => 0}; $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}) { foreach my $name (sort keys %{$oids}) {
if (!defined($self->{results}->{$oid_mmBistAndChassisStatus}->{$oids->{$name}})) { 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}}}; 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->{components}->{chassisstatus}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis status '%s' state is %s", $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'; my $oid_fanPackEntry = '.1.3.6.1.4.1.2.3.51.2.2.6.1.1';
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_fanPackEntry }; push @{$self->{request}}, { oid => $oid_fanPackEntry };
} }
sub check { sub check {
@ -53,7 +53,7 @@ sub check {
$self->{output}->output_add(long_msg => "Checking fanpack"); $self->{output}->output_add(long_msg => "Checking fanpack");
$self->{components}->{fanpack} = {name => 'fanpacks', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanPackEntry}})) {
next if ($oid !~ /^$mapping->{fanPackState}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{fanPackState}->{oid}\.(.*)$/);
@ -64,7 +64,7 @@ sub check {
$self->{output}->output_add(long_msg => "skipping fanpack '" . $instance . "' : not exits"); $self->{output}->output_add(long_msg => "skipping fanpack '" . $instance . "' : not exits");
next; next;
} }
next if ($self->check_exclude(section => 'fanpack', instance => $instance)); next if ($self->check_filter(section => 'fanpack', instance => $instance));
$self->{components}->{fanpack}->{total}++; $self->{components}->{fanpack}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fanpack '%s' is %s rpm [status: %s, instance: %s]", $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'; my $oid_powerModuleHealthEntry = '.1.3.6.1.4.1.2.3.51.2.2.4.1.1';
sub load { 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 { sub check {
@ -54,14 +54,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking power modules"); $self->{output}->output_add(long_msg => "Checking power modules");
$self->{components}->{powermodule} = {name => 'power modules', total => 0, skip => 0}; $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}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_powerModuleHealthEntry}})) {
next if ($oid !~ /^$mapping->{powerModuleState}->{oid}\.(.*)$/); next if ($oid !~ /^$mapping->{powerModuleState}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_powerModuleHealthEntry}, instance => $instance); 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 && next if ($result->{powerModuleExists} =~ /No/i &&
$self->absent_problem(section => 'powermodule', instance => $instance)); $self->absent_problem(section => 'powermodule', instance => $instance));
$self->{components}->{powermodule}->{total}++; $self->{components}->{powermodule}->{total}++;

View File

@ -36,9 +36,9 @@ my $mapping = {
}; };
sub load { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $mapping->{smHealthState}->{oid} }; push @{$self->{request}}, { oid => $mapping->{smHealthState}->{oid} };
} }
sub check { sub check {
@ -46,14 +46,14 @@ sub check {
$self->{output}->output_add(long_msg => "Checking switch module"); $self->{output}->output_add(long_msg => "Checking switch module");
$self->{components}->{switchmodule} = {name => 'switch modules', total => 0, skip => 0}; $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}}})) { foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{smHealthState}->{oid}}})) {
$oid =~ /^$mapping->{smHealthState}->{oid}\.(.*)/; $oid =~ /^$mapping->{smHealthState}->{oid}\.(.*)/;
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{smHealthState}->{oid}}, instance => $instance); 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->{components}->{switchmodule}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Switch module '%s' status is %s [instance: %s]", $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 { sub load {
my (%options) = @_; my ($self) = @_;
push @{$options{request}}, { oid => $oid_systemHealthStat }; push @{$self->{request}}, { oid => $oid_systemHealthStat };
} }
sub check { sub check {
@ -44,7 +44,10 @@ sub check {
$self->{output}->output_add(long_msg => "Checking system health"); $self->{output}->output_add(long_msg => "Checking system health");
$self->{components}->{systemhealth} = {name => 'system-health', total => 0, skip => 0}; $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'}}; my $value = $map_systemhealth_state{$self->{results}->{$oid_systemHealthStat}->{$oid_systemHealthStat . '.0'}};
$self->{components}->{systemhealth}->{total}++; $self->{components}->{systemhealth}->{total}++;

View File

@ -20,12 +20,19 @@
package hardware::server::ibm::bladecenter::snmp::mode::hardware; package hardware::server::ibm::bladecenter::snmp::mode::hardware;
use base qw(centreon::plugins::mode); use base qw(centreon::plugins::templates::hardware);
use strict; use strict;
use warnings; use warnings;
my $thresholds = { 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 => [ chassisstatus => [
['testSucceeded', 'OK'], ['testSucceeded', 'OK'],
['testFailed', 'CRITICAL'], ['testFailed', 'CRITICAL'],
@ -89,6 +96,17 @@ my $thresholds = {
], ],
}; };
$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 { sub new {
my ($class, %options) = @_; my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options); my $self = $class->SUPER::new(package => __PACKAGE__, %options);
@ -97,210 +115,11 @@ sub new {
$self->{version} = '1.0'; $self->{version} = '1.0';
$options{options}->add_options(arguments => $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; 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; 1;
__END__ __END__
@ -317,15 +136,15 @@ Which component to check (Default: 'all').
Can be: 'ambient', 'powermodule', 'fanpack', 'chassisfan', Can be: 'ambient', 'powermodule', 'fanpack', 'chassisfan',
'blower', 'blade', 'systemhealth', 'chassisstatus', 'switchmodule'. 'blower', 'blade', 'systemhealth', 'chassisstatus', 'switchmodule'.
=item B<--exclude> =item B<--filter>
Exclude some parts (comma seperated list) (Example: --exclude=blower,powermodule) Exclude some parts (comma seperated list) (Example: --filter=blower --filter=powermodule)
Can also exclude specific instance: --exclude=blower#1#,powermodule#2# Can also exclude specific instance: --filter=blower,1
=item B<--absent-problem> =item B<--absent-problem>
Return an error if an entity is not 'notAvailable' (default is skipping) (comma seperated list) 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> =item B<--no-component>
@ -334,18 +153,18 @@ If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload> =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). It used before default thresholds (order stays).
Example: --threshold-overload='blade,OK,unknown' Example: --threshold-overload='blade,OK,unknown'
=item B<--warning> =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' Example: --warning='ambient,mm,30' --warning='ambient,frontpanel,35'
=item B<--critical> =item B<--critical>
Set critical threshold for temperatures (syntax: type,regexp,treshold) Set critical threshold (syntax: type,regexp,threshold)
Example: --critical='blower,1,50' Example: --critical='blower,1,50'
=back =back