refactor huawei hmm (#1113)

This commit is contained in:
Colin Gagnaire 2018-08-24 16:05:51 +00:00 committed by Simon Bomm
parent f6c659b946
commit 729eec5c3e
18 changed files with 979 additions and 853 deletions

View File

@ -0,0 +1,130 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::blade;
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_numeric_check_section_option} = '^(cpu|temperature)$';
$self->{regexp_threshold_overload_check_section_option} = '^(cpu|disk|memory|mezz|raidcontroller)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
'default' => [
['normal', 'OK'],
['minor', 'WARNING'],
['major', 'CRITICAL'],
['critical', 'CRITICAL'],
],
};
$self->{components_path} = 'hardware::server::huawei::hmm::snmp::mode::components';
$self->{components_module} = ['cpu', 'disk', 'memory', 'mezz', 'raidcontroller', 'temperature'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"blade-id:s" => { name => 'blade_id' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (!defined($self->{option_results}->{blade_id}) || $self->{option_results}->{blade_id} eq '') {
$self->{output}->add_option_msg(short_msg => "Please set --blade-id option.");
$self->{output}->option_exit();
}
$self->{blade_id} = $self->{option_results}->{blade_id};
}
1;
__END__
=head1 MODE
Check blade components.
=over 8
=item B<--blade-id>
Set blade ID.
=item B<--component>
Which component to check (Default: '.*').
Can be: 'cpu', 'disk', 'memory', 'mezz', 'raidcontroller', 'temperature'.
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --filter=cpu)
Can also exclude specific instance: --filter=cpu,1
=item B<--no-component>
Return an error if no compenents are checked.
If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='cpu,CRITICAL,^(?!(ok)$)'
=item B<--warning>
Set warning threshold (syntax: type,regexp,threshold)
Example: --warning='temperature,.*,30'
=item B<--critical>
Set critical threshold (syntax: type,regexp,threshold)
Example: --critical='temperature,.*,40'
=back
=cut

View File

@ -0,0 +1,102 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::chassis;
use base qw(centreon::plugins::templates::hardware);
use strict;
use warnings;
sub set_system {
my ($self, %options) = @_;
$self->{regexp_threshold_overload_check_section_option} = '^(blade|fan|psu|switch)$';
$self->{cb_hook2} = 'snmp_execute';
$self->{thresholds} = {
'default' => [
['normal', 'OK'],
['minor', 'WARNING'],
['major', 'CRITICAL'],
['critical', 'CRITICAL'],
],
};
$self->{components_path} = 'hardware::server::huawei::hmm::snmp::mode::components';
$self->{components_module} = ['blade', 'fan', 'psu', 'switch'];
}
sub snmp_execute {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request});
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
1;
__END__
=head1 MODE
Check chassis components.
=over 8
=item B<--component>
Which component to check (Default: '.*').
Can be: 'blade', 'fan', 'psu', 'switch'.
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --filter=psu)
Can also exclude specific instance: --filter=psu,1
=item B<--no-component>
Return an error if no compenents are checked.
If total (with skipped) is 0. (Default: 'critical' returns).
=item B<--threshold-overload>
Set to overload default threshold values (syntax: section,[instance,]status,regexp)
It used before default thresholds (order stays).
Example: --threshold-overload='psu,CRITICAL,^(?!(ok)$)'
=back
=cut

View File

@ -1,51 +1,72 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::blade; package hardware::server::huawei::hmm::snmp::mode::components::blade;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my $mapping = {
mBladeLocation => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.2' },
mBladeHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.3', map => \%map_status },
};
my $oid_bladeManagementEntry = '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_bladeManagementEntry };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("0"=>"ok","1"=>"warning","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"critical","6"=>"critical","7"=>"critical"); $self->{output}->output_add(long_msg => "Checking blades");
my %eachStatus = ("0"=>"ok","1"=>"minor","2"=>"major","3"=>"major","4"=>"critical","5"=>"critical","6"=>"critical","7"=>"critical"); $self->{components}->{blade} = {name => 'blades', total => 0, skip => 0};
return if ($self->check_filter(section => 'blade'));
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum}; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeManagementEntry}})) {
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.8.0", $self->{option_results}->{bladeNum}; next if ($oid !~ /^$mapping->{mBladeHealth}->{oid}\.(.*)$/);
my $componentTemperatureOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2012.1.2.1", $self->{option_results}->{bladeNum}; my $instance = $1;
my $tmpShortMessage = ""; my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeManagementEntry}, instance => $instance);
my $tmpSeverity = "unknown";
my $result= $self->{snmp}->get_leef(oids =>[$componentPresentOid]); next if ($self->check_filter(section => 'blade', instance => $instance));
if (scalar(keys %$result) <= 0) $self->{components}->{blade}->{total}++;
{
$tmpShortMessage = $tmpShortMessage."Get blade info error."; $self->{output}->output_add(long_msg => sprintf("Blade '%s' status is '%s' [instance = %s]",
}else $result->{mBladeLocation}, $result->{mBladeHealth}, $instance,
{ ));
if ($result->{$componentPresentOid} eq "0")
{ my $exit = $self->get_severity(label => 'default', section => 'blade', value => $result->{mBladeHealth});
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum}; if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
}elsif ($result->{$componentPresentOid} eq "2") $self->{output}->output_add(severity => $exit,
{ short_msg => sprintf("Blade '%s' status is '%s'", $result->{mBladeLocation}, $result->{mBladeHealth}));
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$componentPresentOid} eq "1")
{
$result= $self->{snmp}->get_leef(oids =>[$componentStatusOid]);
$tmpSeverity = $statusHash{$result->{$componentStatusOid}};
$tmpShortMessage = $tmpShortMessage. "Blade".$self->{option_results}->{bladeNum}.":".$eachStatus{$result->{$componentStatusOid}};
$result = $self->{snmp}->get_leef(oids =>[$componentTemperatureOid] );
$tmpShortMessage = $tmpShortMessage." Temperature:".$result->{$componentTemperatureOid}."℃";
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
} }
} }
$self->{output}->output_add(severity => $tmpSeverity,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
} }
1; 1;

View File

@ -1,101 +1,101 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::cpu; package hardware::server::huawei::hmm::snmp::mode::components::cpu;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my %map_installation_status = (
0 => 'absence',
1 => 'presence',
2 => 'poweroff',
);
my $mapping = {
bladeCPUMark => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2006.1.2' },
bladeCPUPresent => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2006.1.4', map => \%map_installation_status },
bladeCPUHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2006.1.5', map => \%map_status },
bladeCPUTemperature => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2006.1.7' },
};
my $oid_bladeCPUTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2006.1';
sub load {
my ($self) = @_;
$oid_bladeCPUTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeCPUTable };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"unknown"); foreach my $entry (keys $mapping) {
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical","5"=>"unknown"); $mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
}
my $bladePresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum}; $self->{output}->output_add(long_msg => "Checking CPUs");
$self->{components}->{cpu} = {name => 'cpus', total => 0, skip => 0};
return if ($self->check_filter(section => 'cpu'));
my $tmpShortMessage = ""; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeCPUTable}})) {
my $componentStatus = "unknown"; next if ($oid !~ /^$mapping->{bladeCPUHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeCPUTable}, instance => $instance);
my $result= $self->{snmp}->get_leef(oids =>[$bladePresentOid]); next if ($self->check_filter(section => 'cpu', instance => $instance));
if (scalar(keys %$result) <= 0) next if ($result->{bladeCPUPresent} !~ /presence/);
{ $self->{components}->{cpu}->{total}++;
$tmpShortMessage = $tmpShortMessage."Get blade info error.";
}else
{
if ($result->{$bladePresentOid} eq "0")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "2")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "1")
{
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2006.1.4", $self->{option_results}->{bladeNum};
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2006.1.5", $self->{option_results}->{bladeNum};
my $componentMarkOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2006.1.2", $self->{option_results}->{bladeNum};
$self->{snmp}->{snmp_force_getnext} = 1; if (defined($result->{bladeCPUTemperature}) && $result->{bladeCPUTemperature} =~ /[0-9]/) {
my $result = $self->{snmp}->get_table(oid => $componentPresentOid); my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'cpu', instance => $instance, value => $result->{bladeCPUTemperature});
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."No cpu presence.";
}else
{
my $endKey;
my $temnameOid;
my $statusOid;
my $tmpMsg;
my $tmpresult;
my $totalPresent = 0;
my $totalComponent = 0;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$temnameOid = "";
$statusOid = "";
$tmpMsg = "";
$totalComponent++;
if ($v eq "1") # presence status: 0-not presence,1-presence
{
$totalPresent++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$temnameOid = $componentMarkOid.".".$endKey;
$statusOid = $componentStatusOid.".".$endKey;
$tmpresult = $self->{snmp}->get_leef(oids =>[$temnameOid]);
$tmpMsg = $tmpresult->{$temnameOid}.":"; if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$tmpresult = $self->{snmp}->get_leef(oids =>[$statusOid]); $self->{output}->output_add(severity => $exit,
$tmpMsg = $tmpMsg.$eachStatus{$tmpresult->{$statusOid}}." "; short_msg => sprintf("Cpu '%s' temperature is %s celsius degrees", $result->{bladeCPUMark}, $result->{bladeCPUTemperature}));
$tmpShortMessage = $tmpShortMessage.$tmpMsg; }
if($statusHash{$tmpresult->{$statusOid}} eq "critical") $self->{output}->perfdata_add(label => 'temperature_' . $result->{bladeCPUMark}, unit => 'C',
{ value => $result->{bladeCPUTemperature},
$componentStatus = "critical"; warning => $warn,
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical")) critical => $crit,
{ min => 0
$componentStatus = "warning"; );
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "ok") }
{
if ($componentStatus eq "unknown") $self->{output}->output_add(long_msg => sprintf("Cpu '%s' status is '%s' [instance = %s]",
{ $result->{bladeCPUMark}, $result->{bladeCPUHealth}, $instance,
$componentStatus = "ok"; ));
my $exit = $self->get_severity(label => 'default', section => 'Cpu', value => $result->{bladeCPUHealth});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Cpu '%s' status is '%s'", $result->{bladeCPUMark}, $result->{bladeCPUHealth}));
} }
} }
} }
}
$tmpShortMessage = "cpuPresence:".$totalPresent."\/".$totalComponent." ".$tmpShortMessage;
}
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
}
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage );
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,100 +1,85 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::disk; package hardware::server::huawei::hmm::snmp::mode::components::disk;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my %map_installation_status = (
0 => 'absence',
1 => 'presence',
2 => 'poweroff',
);
my $mapping = {
bladeDiskMark => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2009.1.2' },
bladeDiskPresent => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2009.1.4', map => \%map_installation_status },
bladeDiskHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2009.1.5', map => \%map_status },
};
my $oid_bladeDiskTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2009.1';
sub load {
my ($self) = @_;
$oid_bladeDiskTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeDiskTable };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"unknown"); foreach my $entry (keys $mapping) {
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical","5"=>"unknown"); $mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
my $bladePresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum};
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $result= $self->{snmp}->get_leef(oids =>[$bladePresentOid]);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."Get blade info error.";
}else
{
if ($result->{$bladePresentOid} eq "0")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "2")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "1")
{
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2009.1.4", $self->{option_results}->{bladeNum};
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2009.1.5", $self->{option_results}->{bladeNum};
my $componentMarkOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2009.1.2", $self->{option_results}->{bladeNum};
$self->{snmp}->{snmp_force_getnext} = 1;
my $result = $self->{snmp}->get_table(oid => $componentPresentOid);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."No disk presence.";
}else
{
my $endKey;
my $temnameOid;
my $statusOid;
my $tmpMsg;
my $tmpresult;
my $totalPresent = 0;
my $totalComponent = 0;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$temnameOid = "";
$statusOid = "";
$tmpMsg = "";
$totalComponent++;
if ($v eq "1") # presence status: 0-not presence,1-presence
{
$totalPresent++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$temnameOid = $componentMarkOid.".".$endKey;
$statusOid = $componentStatusOid.".".$endKey;
$tmpresult = $self->{snmp}->get_leef(oids =>[$temnameOid]);
$tmpMsg = $tmpresult->{$temnameOid}.":";
$tmpresult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg.$eachStatus{$tmpresult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpresult->{$statusOid}} eq "critical")
{
$componentStatus = "critical";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical"))
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
$self->{output}->output_add(long_msg => "Checking disks");
$self->{components}->{disk} = {name => 'disks', total => 0, skip => 0};
return if ($self->check_filter(section => 'disk'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeDiskTable}})) {
next if ($oid !~ /^$mapping->{bladeDiskHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeDiskTable}, instance => $instance);
next if ($self->check_filter(section => 'disk', instance => $instance));
next if ($result->{bladeDiskPresent} !~ /presence/);
$self->{components}->{disk}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Disk '%s' status is '%s' [instance = %s]",
$result->{bladeDiskMark}, $result->{bladeDiskHealth}, $instance,
));
my $exit = $self->get_severity(label => 'default', section => 'disk', value => $result->{bladeDiskHealth});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Disk '%s' status is '%s'", $result->{bladeDiskMark}, $result->{bladeDiskHealth}));
} }
} }
} }
$tmpShortMessage = "diskPresence:".$totalPresent."\/".$totalComponent." ".$tmpShortMessage;
}
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
}
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,70 +1,72 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::fan; package hardware::server::huawei::hmm::snmp::mode::components::fan;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my $mapping = {
mfanLocation => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.2' },
mfanHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.3', map => \%map_status },
};
my $oid_fanManagementEntry = '.1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_fanManagementEntry };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical"); $self->{output}->output_add(long_msg => "Checking fans");
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical"); $self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_filter(section => 'fan'));
my $fanStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.3"; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanManagementEntry}})) {
my $fanPresenceOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.3.2001.1.1"; next if ($oid !~ /^$mapping->{mfanHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_fanManagementEntry}, instance => $instance);
my $tmpShortMessage; next if ($self->check_filter(section => 'fan', instance => $instance));
my $componentStatus ="unknown"; $self->{components}->{fan}->{total}++;
$self->{snmp}->{snmp_force_getnext} = 1; $self->{output}->output_add(long_msg => sprintf("Fan '%s' status is '%s' [instance = %s]",
my $result = $self->{snmp}->get_table(oid => $fanPresenceOid); $result->{mfanLocation}, $result->{mfanHealth}, $instance,
if (scalar(keys %$result) <= 0) ));
{
$tmpShortMessage = $tmpShortMessage."No fan presence.";
}else
{
my $endKey;
my $statusOid;
my $tmpMsg;
my $tmpResult;
my $totalPresence = 0;
my $totalComponent = 14;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$statusOid = "";
$tmpMsg = "";
$totalPresence++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$tmpMsg = "Fan".$endKey.":";
$statusOid = $fanStatusOid.".".$endKey;
$tmpResult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg.$eachStatus{$tmpResult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpResult->{$statusOid}} eq "critical") my $exit = $self->get_severity(label => 'default', section => 'fan', value => $result->{mfanHealth});
{ if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$componentStatus = "critical"; $self->{output}->output_add(severity => $exit,
}elsif (($statusHash{$tmpResult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical")) short_msg => sprintf("Fan '%s' status is '%s'", $result->{mfanLocation}, $result->{mfanHealth}));
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpResult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
} }
} }
$tmpShortMessage = "fanPresence:".$totalPresence."\/".$totalComponent." ".$tmpShortMessage;
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,100 +1,85 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::memory; package hardware::server::huawei::hmm::snmp::mode::components::memory;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my %map_installation_status = (
0 => 'absence',
1 => 'presence',
2 => 'poweroff',
);
my $mapping = {
bladeMemoryMark => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2007.1.2' },
bladeMemoryPresent => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2007.1.4', map => \%map_installation_status },
bladeMemoryHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2007.1.5', map => \%map_status },
};
my $oid_bladeMemoryTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2007.1';
sub load {
my ($self) = @_;
$oid_bladeMemoryTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeMemoryTable };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"unknown"); foreach my $entry (keys $mapping) {
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical","5"=>"unknown"); $mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
my $bladePresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum};
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $result= $self->{snmp}->get_leef(oids =>[$bladePresentOid]);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."Get blade info error.";
}else
{
if ($result->{$bladePresentOid} eq "0")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "2")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "1")
{
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2007.1.4", $self->{option_results}->{bladeNum};
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2007.1.5", $self->{option_results}->{bladeNum};
my $componentMarkOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2007.1.2", $self->{option_results}->{bladeNum};
$self->{snmp}->{snmp_force_getnext} = 1;
my $result = $self->{snmp}->get_table(oid => $componentPresentOid);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."No memory presence.";
}else
{
my $endKey;
my $temnameOid;
my $statusOid;
my $tmpMsg;
my $tmpresult;
my $totalPresent = 0;
my $totalComponent = 0;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$temnameOid = "";
$statusOid = "";
$tmpMsg = "";
$totalComponent++;
if ($v eq "1") # presence status: 0-not presence,1-presence
{
$totalPresent++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$temnameOid = $componentMarkOid.".".$endKey;
$statusOid = $componentStatusOid.".".$endKey;
$tmpresult = $self->{snmp}->get_leef(oids =>[$temnameOid]);
$tmpMsg = $tmpresult->{$temnameOid}.":";
$tmpresult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg.$eachStatus{$tmpresult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpresult->{$statusOid}} eq "critical")
{
$componentStatus = "critical";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical"))
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
$self->{output}->output_add(long_msg => "Checking memory slots");
$self->{components}->{memory} = {name => 'memory slots', total => 0, skip => 0};
return if ($self->check_filter(section => 'memory'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeMemoryTable}})) {
next if ($oid !~ /^$mapping->{bladeMemoryHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeMemoryTable}, instance => $instance);
next if ($self->check_filter(section => 'memory', instance => $instance));
next if ($result->{bladeMemoryPresent} !~ /presence/);
$self->{components}->{memory}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Memory '%s' status is '%s' [instance = %s]",
$result->{bladeMemoryMark}, $result->{bladeMemoryHealth}, $instance,
));
my $exit = $self->get_severity(label => 'default', section => 'memory', value => $result->{bladeMemoryHealth});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Memory '%s' status is '%s'", $result->{bladeMemoryMark}, $result->{bladeMemoryHealth}));
} }
} }
} }
$tmpShortMessage = "memoryPresence:".$totalPresent."\/".$totalComponent." ".$tmpShortMessage;
}
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
}
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,100 +1,85 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::mezz; package hardware::server::huawei::hmm::snmp::mode::components::mezz;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my %map_installation_status = (
0 => 'absence',
1 => 'presence',
2 => 'poweroff',
);
my $mapping = {
bladeMezzMark => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2008.1.2' },
bladeMezzPresent => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2008.1.4', map => \%map_installation_status },
bladeMezzHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2008.1.5', map => \%map_status },
};
my $oid_bladeMezzTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2008.1';
sub load {
my ($self) = @_;
$oid_bladeMezzTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeMezzTable };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"unknown"); foreach my $entry (keys $mapping) {
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical","5"=>"unknown"); $mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
my $bladePresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum};
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $result= $self->{snmp}->get_leef(oids =>[$bladePresentOid]);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."Get blade info error.";
}else
{
if ($result->{$bladePresentOid} eq "0")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "2")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "1")
{
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2008.1.4", $self->{option_results}->{bladeNum};
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2008.1.5", $self->{option_results}->{bladeNum};
my $componentMarkOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2008.1.2", $self->{option_results}->{bladeNum};
$self->{snmp}->{snmp_force_getnext} = 1;
my $result = $self->{snmp}->get_table(oid => $componentPresentOid);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."No mezz presence.";
}else
{
my $endKey;
my $temnameOid;
my $statusOid;
my $tmpMsg;
my $tmpresult;
my $totalPresent = 0;
my $totalComponent = 0;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$temnameOid = "";
$statusOid = "";
$tmpMsg = "";
$totalComponent++;
if ($v eq "1") # presence status: 0-not presence,1-presence
{
$totalPresent++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$temnameOid = $componentMarkOid.".".$endKey;
$statusOid = $componentStatusOid.".".$endKey;
$tmpresult = $self->{snmp}->get_leef(oids =>[$temnameOid]);
$tmpMsg = $tmpresult->{$temnameOid}.":";
$tmpresult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg. $eachStatus{ $tmpresult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpresult->{$statusOid}} eq "critical")
{
$componentStatus = "critical";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical"))
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
$self->{output}->output_add(long_msg => "Checking mezz cards");
$self->{components}->{mezz} = {name => 'mezz cards', total => 0, skip => 0};
return if ($self->check_filter(section => 'mezz'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeMezzTable}})) {
next if ($oid !~ /^$mapping->{bladeMezzHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeMezzTable}, instance => $instance);
next if ($self->check_filter(section => 'mezz', instance => $instance));
next if ($result->{bladeMezzPresent} !~ /presence/);
$self->{components}->{mezz}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Mezz card '%s' status is '%s' [instance = %s]",
$result->{bladeMezzMark}, $result->{bladeMezzHealth}, $instance,
));
my $exit = $self->get_severity(label => 'default', section => 'mezz', value => $result->{bladeMezzHealth});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Mezz card '%s' status is '%s'", $result->{bladeMezzMark}, $result->{bladeMezzHealth}));
} }
} }
} }
$tmpShortMessage = "mezzPresence:".$totalPresent."\/".$totalComponent." ".$tmpShortMessage;
}
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
}
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,70 +1,72 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::psu; package hardware::server::huawei::hmm::snmp::mode::components::psu;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my $mapping = {
mpsuLocation => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.4.2001.1.2' },
mpsuHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.4.2001.1.3', map => \%map_status },
};
my $oid_psuManagementEntry = '.1.3.6.1.4.1.2011.2.82.1.82.100.4.2001.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_psuManagementEntry };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical"); $self->{output}->output_add(long_msg => "Checking power supplies");
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical"); $self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0};
return if ($self->check_filter(section => 'psu'));
my $psuPresenceOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.4.2001.1.1"; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_psuManagementEntry}})) {
my $psuStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.4.2001.1.3"; next if ($oid !~ /^$mapping->{mpsuHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_psuManagementEntry}, instance => $instance);
my $tmpShortMessage = ""; next if ($self->check_filter(section => 'psu', instance => $instance));
my $componentStatus = "unknown"; $self->{components}->{psu}->{total}++;
$self->{snmp}->{snmp_force_getnext} = 1; $self->{output}->output_add(long_msg => sprintf("Power supplies '%s' status is '%s' [instance = %s]",
my $result = $self->{snmp}->get_table(oid => $psuPresenceOid); $result->{mpsuLocation}, $result->{mpsuHealth}, $instance,
if (scalar(keys %$result) <= 0) ));
{
$tmpShortMessage = $tmpShortMessage."No psu presence.";
}else
{
my $endKey;
my $statusOid;
my $tmpMsg;
my $tmpResult;
my $totalPresence = 0;
my $totalComponent = 6;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$statusOid = "";
$tmpMsg = "";
$totalPresence++;
$k =~ /\.([0-9]+)$/;
$endKey = $1 ;
$tmpMsg = "Psu".$endKey.":";
$statusOid = $psuStatusOid.".".$endKey;
$tmpResult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg.$eachStatus{$tmpResult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpResult->{$statusOid}} eq "critical") my $exit = $self->get_severity(label => 'default', section => 'psu', value => $result->{mpsuHealth});
{ if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$componentStatus = "critical"; $self->{output}->output_add(severity => $exit,
}elsif (($statusHash{$tmpResult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical")) short_msg => sprintf("Power supplies '%s' status is '%s'", $result->{mpsuLocation}, $result->{mpsuHealth}));
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpResult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
} }
} }
$tmpShortMessage = "psuPresence:".$totalPresence."\/".$totalComponent." ".$tmpShortMessage;
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,105 +0,0 @@
package hardware::server::huawei::hmm::snmp::mode::components::raid;
use strict;
use warnings;
sub check {
my ($self) = @_;
my $bladePresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.6.0", $self->{option_results}->{bladeNum};
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $result= $self->{snmp}->get_leef(oids =>[$bladePresentOid]);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."Get blade info error.";
}else
{
if ($result->{$bladePresentOid} eq "0")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s not presence.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "2")
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status indeterminate.", $self->{option_results}->{bladeNum};
}elsif ($result->{$bladePresentOid} eq "1")
{
my $componentPresentOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2011.1.2", $self->{option_results}->{bladeNum};
my $componentStatusOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2011.1.7", $self->{option_results}->{bladeNum};
my $componentMarkOid = sprintf ".1.3.6.1.4.1.2011.2.82.1.82.4.%s.2011.1.3", $self->{option_results}->{bladeNum};
$self->{snmp}->{snmp_force_getnext} = 1;
my $result = $self->{snmp}->get_table(oid => $componentPresentOid);
if (scalar(keys %$result) <= 0)
{
$tmpShortMessage = $tmpShortMessage."No raid presence.";
}else
{
my $endKey;
my $temnameOid;
my $statusOid;
my $tmpMsg;
my $tmpResult;
my $totalPresent = 0;
my $totalComponent = 0;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$temnameOid = "";
$statusOid = "";
$tmpMsg = "";
$totalComponent++;
if ($v eq "2") # presence status: 1-not presence,2-presence
{
$totalPresent++;
$k =~ /\.([0-9]+)$/;
$endKey = $1 ;
$temnameOid = $componentMarkOid.".".$endKey;
$statusOid = $componentStatusOid.".".$endKey;
$tmpResult = $self->{snmp}->get_leef(oids =>[$temnameOid]);
$tmpMsg = $tmpResult->{$temnameOid}.":";
$tmpResult = $self->{snmp}->get_leef(oids =>[$statusOid]);
my $tmpStatus;
if ($tmpResult->{$statusOid} eq "-1"){
$tmpStatus = "unknown";
}elsif($tmpResult->{$statusOid} eq "1")
{
$tmpStatus = "ok";
}else
{
$tmpStatus = "warning";
}
$tmpMsg = $tmpMsg.$tmpStatus." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($tmpStatus eq "warning")
{
$componentStatus = "warning";
}elsif ($tmpStatus eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
}
}
}
}
$tmpShortMessage = "raidPresence:".$totalPresent."\/".$totalComponent." ".$tmpShortMessage;
}
}else
{
$tmpShortMessage = sprintf $tmpShortMessage."Blade%s status unknown.", $self->{option_results}->{bladeNum};
}
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1;

View File

@ -0,0 +1,84 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::raidcontroller;
use strict;
use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my %map_installation_status = (
1 => 'absent',
2 => 'present',
);
my $mapping = {
bladeRAIDControllerIndex => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2011.1.1' },
bladeRAIDControllerPresence => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2011.1.2', map => \%map_installation_status },
bladeRAIDControllerHealthState => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2011.1.7', map => \%map_status },
};
my $oid_bladeRAIDControllerTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2011.1';
sub load {
my ($self) = @_;
$oid_bladeRAIDControllerTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeRAIDControllerTable };
}
sub check {
my ($self) = @_;
foreach my $entry (keys $mapping) {
$mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
}
$self->{output}->output_add(long_msg => "Checking RAID controllers");
$self->{components}->{raidcontroller} = {name => 'raid controllers', total => 0, skip => 0};
return if ($self->check_filter(section => 'raidcontroller'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeRAIDControllerTable}})) {
next if ($oid !~ /^$mapping->{bladeRAIDControllerHealthState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeRAIDControllerTable}, instance => $instance);
next if ($self->check_filter(section => 'raidcontroller', instance => $instance));
next if ($result->{bladeRAIDControllerPresence} !~ /present/);
$self->{components}->{raidcontroller}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Raid controller '%s' status is '%s' [instance = %s]",
$result->{bladeRAIDControllerIndex}, $result->{bladeRAIDControllerHealthState}, $instance,
));
my $exit = $self->get_severity(label => 'default', section => 'raidcontroller', value => $result->{bladeRAIDControllerHealthState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Raid controller '%s' status is '%s'", $result->{bladeRAIDControllerIndex}, $result->{bladeRAIDControllerHealthState}));
}
}
}
1;

View File

@ -1,27 +0,0 @@
package hardware::server::huawei::hmm::snmp::mode::components::shelf;
use strict;
use warnings;
sub check {
my ($self) = @_;
my %statusHash = ("0"=>"ok","1"=>"warning","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"critical","6"=>"critical","7"=>"critical");
my $componentStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.2.5.0";
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $tmpResult;
$tmpResult = $self->{snmp}->get_leef(oids =>[$componentStatusOid]);
$componentStatus = $statusHash{$tmpResult->{$componentStatusOid}};
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1;

View File

@ -1,27 +0,0 @@
package hardware::server::huawei::hmm::snmp::mode::components::smm;
use strict;
use warnings;
sub check {
my ($self) = @_;
my %statusHash = ("0"=>"ok","1"=>"warning","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"critical","6"=>"critical","7"=>"critical");
my $componentStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.3.9.0";
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $tmpResult;
$tmpResult = $self->{snmp}->get_leef(oids =>[$componentStatusOid]);
$componentStatus = $statusHash{$tmpResult->{$componentStatusOid}};
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1;

View File

@ -1,71 +1,72 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::switch; package hardware::server::huawei::hmm::snmp::mode::components::switch;
use strict; use strict;
use warnings; use warnings;
my %map_status = (
1 => 'normal',
2 => 'minor',
3 => 'major',
4 => 'critical',
);
my $mapping = {
mSwiLocation => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.2.2001.1.2' },
mSwiHealth => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.100.2.2001.1.3', map => \%map_status },
};
my $oid_swiManagementEntry = '.1.3.6.1.4.1.2011.2.82.1.82.100.2.2001.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_swiManagementEntry };
}
sub check { sub check {
my ($self) = @_; my ($self) = @_;
my %statusHash = ("1"=>"ok","2"=>"warning","3"=>"warning","4"=>"critical"); $self->{output}->output_add(long_msg => "Checking switches");
my %eachStatus = ("1"=>"ok","2"=>"minor","3"=>"major","4"=>"critical"); $self->{components}->{swi} = {name => 'switches', total => 0, skip => 0};
return if ($self->check_filter(section => 'swi'));
my $switchPresenceOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.2.2001.1.1"; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_swiManagementEntry}})) {
my $switchStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.100.2.2001.1.3"; next if ($oid !~ /^$mapping->{mSwiHealth}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_swiManagementEntry}, instance => $instance);
my $tmpShortMessage = ""; next if ($self->check_filter(section => 'swi', instance => $instance));
my $componentStatus = "unknown"; $self->{components}->{swi}->{total}++;
$self->{snmp}->{snmp_force_getnext} = 1; $self->{output}->output_add(long_msg => sprintf("Switch '%s' status is '%s' [instance = %s]",
my $result = $self->{snmp}->get_table(oid => $switchPresenceOid); $result->{mSwiLocation}, $result->{mSwiHealth}, $instance,
if (scalar(keys %$result) <= 0) ));
{
$tmpShortMessage = $tmpShortMessage."No switch presence.";
}else
{
my $endKey;
my $statusOid;
my $tmpMsg;
my $tmpresult;
my $totalPresence = 0;
my $totalComponent = 4;
my $v;
foreach my $k ($self->{snmp}->oid_lex_sort(keys %$result))
{
$v = $result->{$k};
$endKey = "0";
$statusOid = "";
$tmpMsg = "";
$totalPresence++;
$k =~ /\.([0-9]+)$/;
$endKey = $1;
$tmpMsg = "Switch".$endKey.":";
$statusOid = $switchStatusOid.".".$endKey;
$tmpresult = $self->{snmp}->get_leef(oids =>[$statusOid]);
$tmpMsg = $tmpMsg.$eachStatus{$tmpresult->{$statusOid}}." ";
$tmpShortMessage = $tmpShortMessage.$tmpMsg;
if($statusHash{$tmpresult->{$statusOid}} eq "critical") my $exit = $self->get_severity(label => 'default', section => 'swi', value => $result->{mSwiHealth});
{ if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$componentStatus = "critical"; $self->{output}->output_add(severity => $exit,
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "warning" && ($componentStatus ne "critical")) short_msg => sprintf("Switch '%s' status is '%s'", $result->{mSwiLocation}, $result->{mSwiHealth}));
{
$componentStatus = "warning";
}elsif (($statusHash{$tmpresult->{$statusOid}}) eq "ok")
{
if ($componentStatus eq "unknown")
{
$componentStatus = "ok";
} }
} }
} }
$tmpShortMessage = "switchPresence:".$totalPresence."\/".$totalComponent." ".$tmpShortMessage;
}
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1; 1;

View File

@ -1,27 +0,0 @@
package hardware::server::huawei::hmm::snmp::mode::components::system;
use strict;
use warnings;
sub check {
my ($self) = @_;
my %statusHash = ("0"=>"ok","1"=>"warning","2"=>"warning","3"=>"warning","4"=>"critical","5"=>"critical","6"=>"critical","7"=>"critical");
my $componentStatusOid = ".1.3.6.1.4.1.2011.2.82.1.82.1.1.0";
my $tmpShortMessage = "";
my $componentStatus = "unknown";
my $tmpResult;
$tmpResult = $self->{snmp}->get_leef(oids =>[$componentStatusOid]);
$componentStatus = $statusHash{$tmpResult->{$componentStatusOid}};
$self->{output}->output_add(severity => $componentStatus,
short_msg => $tmpShortMessage);
$self->{output}->display();
$self->{output}->exit();
}
1;

View File

@ -0,0 +1,75 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::mode::components::temperature;
use strict;
use warnings;
my $mapping = {
bladeTemperatureIndex => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2012.1.1' },
bladeTemperatureReading => { oid => '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2012.1.2' },
};
my $oid_bladeTemperatureTable = '.1.3.6.1.4.1.2011.2.82.1.82.4.#.2012.1';
sub load {
my ($self) = @_;
$oid_bladeTemperatureTable =~ s/#/$self->{blade_id}/;
push @{$self->{request}}, { oid => $oid_bladeTemperatureTable };
}
sub check {
my ($self) = @_;
foreach my $entry (keys $mapping) {
$mapping->{$entry}->{oid} =~ s/#/$self->{blade_id}/;
}
$self->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0};
return if ($self->check_filter(section => 'temperature'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_bladeTemperatureTable}})) {
next if ($oid !~ /^$mapping->{oid_bladeTemperatureTable}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_bladeTemperatureTable}, instance => $instance);
next if ($self->check_filter(section => 'temperature', instance => $instance));
$self->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature '%s' is '%s' celsius degrees [instance = %s]",
$result->{bladeTemperatureIndex}, $result->{bladeTemperatureReading}, $instance,
));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{bladeTemperatureReading});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Temperature '%s' is '%s' celsius degrees", $result->{bladeTemperatureIndex}, $result->{bladeTemperatureReading}));
}
$self->{output}->perfdata_add(label => 'temperature_' . $result->{bladeTemperatureIndex}, unit => 'C',
value => $result->{bladeTemperatureReading},
warning => $warn,
critical => $crit
);
}
}
1;

View File

@ -1,81 +0,0 @@
package hardware::server::huawei::hmm::snmp::mode::hardwares;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use hardware::server::huawei::hmm::snmp::mode::components::blade;
use hardware::server::huawei::hmm::snmp::mode::components::switch;
use hardware::server::huawei::hmm::snmp::mode::components::shelf;
use hardware::server::huawei::hmm::snmp::mode::components::smm;
use hardware::server::huawei::hmm::snmp::mode::components::system;
use hardware::server::huawei::hmm::snmp::mode::components::cpu;
use hardware::server::huawei::hmm::snmp::mode::components::fan;
use hardware::server::huawei::hmm::snmp::mode::components::raid;
use hardware::server::huawei::hmm::snmp::mode::components::memory;
use hardware::server::huawei::hmm::snmp::mode::components::psu;
use hardware::server::huawei::hmm::snmp::mode::components::disk;
use hardware::server::huawei::hmm::snmp::mode::components::mezz;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"component:s" => { name => 'component', default => 'system' },
"bladeNum:s" => { name => 'bladeNum', default => '0' },
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
if ($self->{option_results}->{component} eq 'system') {
hardware::server::huawei::hmm::snmp::mode::components::system::check($self);
} elsif ($self->{option_results}->{component} eq 'cpu') {
hardware::server::huawei::hmm::snmp::mode::components::cpu::check($self);
} elsif ($self->{option_results}->{component} eq 'fan') {
hardware::server::huawei::hmm::snmp::mode::components::fan::check($self);
} elsif ($self->{option_results}->{component} eq 'raid') {
hardware::server::huawei::hmm::snmp::mode::components::raid::check($self);
} elsif ($self->{option_results}->{component} eq 'memory') {
hardware::server::huawei::hmm::snmp::mode::components::memory::check($self);
} elsif ($self->{option_results}->{component} eq 'psu') {
hardware::server::huawei::hmm::snmp::mode::components::psu::check($self);
} elsif ($self->{option_results}->{component} eq 'disk') {
hardware::server::huawei::hmm::snmp::mode::components::disk::check($self);
} elsif ($self->{option_results}->{component} eq 'blade') {
hardware::server::huawei::hmm::snmp::mode::components::blade::check($self);
} elsif ($self->{option_results}->{component} eq 'shelf') {
hardware::server::huawei::hmm::snmp::mode::components::shelf::check($self);
} elsif ($self->{option_results}->{component} eq 'smm') {
hardware::server::huawei::hmm::snmp::mode::components::smm::check($self);
} elsif ($self->{option_results}->{component} eq 'switch') {
hardware::server::huawei::hmm::snmp::mode::components::switch::check($self);
} elsif ($self->{option_results}->{component} eq 'mezz') {
hardware::server::huawei::hmm::snmp::mode::components::mezz::check($self);
} else {
$self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'.");
$self->{output}->option_exit();
}
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__

View File

@ -1,3 +1,22 @@
#
# Copyright 2018 Centreon (http://www.centreon.com/)
#
# Centreon is a full-fledged industry-strength solution that meets
# the needs in IT infrastructure and application monitoring for
# service performance.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package hardware::server::huawei::hmm::snmp::plugin; package hardware::server::huawei::hmm::snmp::plugin;
@ -12,17 +31,19 @@ sub new {
$self->{version} = '1.0'; $self->{version} = '1.0';
%{$self->{modes}} = ( %{$self->{modes}} = (
'hardwares' => 'hardware::server::huawei::hmm::snmp::mode::hardwares', 'blade' => 'hardware::server::huawei::hmm::snmp::mode::blade',
'chassis' => 'hardware::server::huawei::hmm::snmp::mode::chassis',
); );
return $self; return $self;
} }
1;
__END__
1;
__END__
=head1 PLUGIN DESCRIPTION =head1 PLUGIN DESCRIPTION
Check HUAWEI servers in SNMP. Check Huawei Management Module in SNMP.
=cut =cut