Merge remote-tracking branch 'upstream/master' into CloudAmazon

This commit is contained in:
David Sabatié 2015-11-20 14:11:31 +01:00
commit 336f5f6611
80 changed files with 4309 additions and 344 deletions

View File

@ -0,0 +1,132 @@
#
# Copyright 2015 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 apps::biztalk::sql::mode::rlocationdisabled;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
"filter-location:s" => { name => 'filter_location' },
"filter-application:s" => { name => 'filter_application' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical}. "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
# $options{sql} = sqlmode object
$self->{sql} = $options{sql};
my $query = q{
SELECT RL.Name, RL.Disabled, APP.nvcName
FROM BizTalkMgmtDb.dbo.adm_ReceiveLocation AS RL WITH(NOLOCK)
INNER JOIN BizTalkMgmtDb.dbo.bts_receiveport AS RP WITH(NOLOCK)
ON RL.ReceivePortId = RP.nID
INNER JOIN BizTalkMgmtDb.dbo.bts_application AS APP WITH(NOLOCK)
ON RP.nApplicationID = APP.nID WHERE RL.[Disabled] = -1
};
$self->{sql}->connect();
$self->{sql}->query(query => $query);
my $count = 0;
while ((my $row = $self->{sql}->fetchrow_hashref())) {
if (defined($self->{option_results}->{filter_location}) && $self->{option_results}->{filter_location} ne '' &&
$row->{Name} !~ /$self->{option_results}->{filter_location}/) {
$self->{output}->output_add(long_msg => "Skipping '" . $row->{Name} . "': no matching filter location.", debug => 1);
next;
}
if (defined($self->{option_results}->{filter_application}) && $self->{option_results}->{filter_application} ne '' &&
$row->{nvcName} !~ /$self->{option_results}->{filter_application}/) {
$self->{output}->output_add(long_msg => "Skipping '" . $row->{nvcName} . "': no matching filter application.", debug => 1);
next;
}
$self->{output}->output_add(long_msg => "'" . $row->{Name} . "' of application '" . $row->{nvcName} . "'");
$count++;
}
my $exit = $self->{perfdata}->threshold_check(value => $count, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("%d receive locations are disabled", $count));
$self->{output}->perfdata_add(label => 'count',
value => $count,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check the number of biztalk received locations disabled.
The mode should be used with mssql plugin and dyn-mode option.
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=item B<--filter-location>
Filter by location (regexp can be used).
=item B<--filter-application>
Filter by application (regexp can be used).
=back
=cut

View File

@ -59,20 +59,20 @@ sub run {
$self->{connector} = $options{custom}; $self->{connector} = $options{custom};
$self->{request} = [ $self->{request} = [
{ mbean => "com.merethis.studio:name=statistics,type=session" } { mbean => "com.centreon.studio:name=statistics,type=session" }
]; ];
my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0); my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0);
my $exit = $self->{perfdata}->threshold_check(value => $result->{"com.merethis.studio:name=statistics,type=session"}->{AverageEventQueueSize}, my $exit = $self->{perfdata}->threshold_check(value => $result->{"com.centreon.studio:name=statistics,type=session"}->{AverageEventQueueSize},
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]); threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]);
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => sprintf("Average event queue size : %d", short_msg => sprintf("Average event queue size : %d",
$result->{"com.merethis.studio:name=statistics,type=session"}->{AverageEventQueueSize})); $result->{"com.centreon.studio:name=statistics,type=session"}->{AverageEventQueueSize}));
$self->{output}->perfdata_add(label => 'events', $self->{output}->perfdata_add(label => 'events',
value => $result->{"com.merethis.studio:name=statistics,type=session"}->{AverageEventQueueSize}, value => $result->{"com.centreon.studio:name=statistics,type=session"}->{AverageEventQueueSize},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0); min => 0);

View File

@ -78,7 +78,7 @@ sub run {
$self->{connector} = $options{custom}; $self->{connector} = $options{custom};
$self->{request} = [ $self->{request} = [
{ mbean => "com.merethis.studio:name=statistics,type=whatsup" } { mbean => "com.centreon.studio.map:name=statistics,type=whatsup" }
]; ];
my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0); my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0);
@ -94,10 +94,10 @@ sub run {
} }
foreach my $type ('EventCount', 'EventTypeCreate', 'EventTypeUpdate', 'EventTypeRemove') { foreach my $type ('EventCount', 'EventTypeCreate', 'EventTypeUpdate', 'EventTypeRemove') {
$new_datas->{$type} = $result->{"com.merethis.studio:name=statistics,type=whatsup"}->{$type}->{andIncrement}; $new_datas->{$type} = $result->{"com.centreon.studio.map:name=statistics,type=whatsup"}->{$type}->{andIncrement};
my $old_val = $self->{statefile_cache}->get(name => $type); my $old_val = $self->{statefile_cache}->get(name => $type);
next if (!defined($old_val) || $result->{"com.merethis.studio:name=statistics,type=whatsup"}->{$type}->{andIncrement} < $old_val); next if (!defined($old_val) || $result->{"com.centreon.studio.map:name=statistics,type=whatsup"}->{$type}->{andIncrement} < $old_val);
my $value = int(($result->{"com.merethis.studio:name=statistics,type=whatsup"}->{$type}->{andIncrement} - $old_val) / ($new_datas->{last_timestamp} - $old_timestamp)); my $value = int(($result->{"com.centreon.studio.map:name=statistics,type=whatsup"}->{$type}->{andIncrement} - $old_val) / ($new_datas->{last_timestamp} - $old_timestamp));
$self->{output}->perfdata_add(label => $type, $self->{output}->perfdata_add(label => $type,
value => $value, value => $value,

View File

@ -59,22 +59,22 @@ sub run {
$self->{connector} = $options{custom}; $self->{connector} = $options{custom};
$self->{request} = [ $self->{request} = [
{ mbean => "com.merethis.map:name=BusinessGate,type=repo" } { mbean => "com.centreon.studio.map:name=BusinessGate,type=repo" }
]; ];
my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 1); my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 1);
my $gates = $result->{"com.merethis.map:name=BusinessGate,type=repo"}->{LoadedModelCount}; my $gates = $result->{"com.centreon.studio.map:name=BusinessGate,type=repo"}->{LoadedModelCount};
my $exit = $self->{perfdata}->threshold_check(value => $gates, my $exit = $self->{perfdata}->threshold_check(value => $gates,
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]); threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]);
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => sprintf("Business gates opened : %d", short_msg => sprintf("Business gates opened : %d",
$result->{"com.merethis.map:name=BusinessGate,type=repo"}->{LoadedModelCount})); $result->{"com.centreon.studio.map:name=BusinessGate,type=repo"}->{LoadedModelCount}));
$self->{output}->perfdata_add(label => 'gates', $self->{output}->perfdata_add(label => 'gates',
value => $result->{"com.merethis.map:name=BusinessGate,type=repo"}->{LoadedModelCount}, value => $result->{"com.centreon.studio.map:name=BusinessGate,type=repo"}->{LoadedModelCount},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0); min => 0);

View File

@ -59,20 +59,20 @@ sub run {
$self->{connector} = $options{custom}; $self->{connector} = $options{custom};
$self->{request} = [ $self->{request} = [
{ mbean => "com.merethis.studio:name=statistics,type=session" } { mbean => "com.centreon.studio:name=statistics,type=session" }
]; ];
my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0); my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 0);
my $exit = $self->{perfdata}->threshold_check(value => $result->{"com.merethis.studio:name=statistics,type=session"}->{SessionCount}, my $exit = $self->{perfdata}->threshold_check(value => $result->{"com.centreon.studio:name=statistics,type=session"}->{SessionCount},
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]); threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning'} ]);
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => sprintf("Current sessions : %d", short_msg => sprintf("Current sessions : %d",
$result->{"com.merethis.studio:name=statistics,type=session"}->{SessionCount})); $result->{"com.centreon.studio:name=statistics,type=session"}->{SessionCount}));
$self->{output}->perfdata_add(label => 'sessions', $self->{output}->perfdata_add(label => 'sessions',
value => $result->{"com.merethis.studio:name=statistics,type=session"}->{SessionCount}, value => $result->{"com.centreon.studio:name=statistics,type=session"}->{SessionCount},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0); min => 0);

View File

@ -50,29 +50,6 @@ my $thresholds = {
], ],
}; };
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 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);
@ -127,8 +104,7 @@ sub run {
my $result = $self->{snmp}->get_table(oid => $oid_bgpPeerTable, nothing_quit => 1); my $result = $self->{snmp}->get_table(oid => $oid_bgpPeerTable, nothing_quit => 1);
if (defined $self->{option_results}->{peer}) { if (defined($self->{option_results}->{peer})) {
my $bgpPeerState = $result->{$oid_bgpPeerState . '.' . $self->{option_results}->{peer}}; my $bgpPeerState = $result->{$oid_bgpPeerState . '.' . $self->{option_results}->{peer}};
my $bgpPeerAdminStatus = $result->{$oid_bgpPeerAdminStatus . '.' . $self->{option_results}->{peer}}; my $bgpPeerAdminStatus = $result->{$oid_bgpPeerAdminStatus . '.' . $self->{option_results}->{peer}};
my $bgpPeerRemoteAs = $result->{$oid_bgpPeerRemoteAs . '.' . $self->{option_results}->{peer}}; my $bgpPeerRemoteAs = $result->{$oid_bgpPeerRemoteAs . '.' . $self->{option_results}->{peer}};
@ -136,29 +112,28 @@ sub run {
my $bgpLocalInfos = $result->{$oid_bgpPeerLocalAddr . '.' . $self->{option_results}->{peer}} . ':' . $result->{$oid_bgpPeerLocalPort . '.' . $self->{option_results}->{peer}}; my $bgpLocalInfos = $result->{$oid_bgpPeerLocalAddr . '.' . $self->{option_results}->{peer}} . ':' . $result->{$oid_bgpPeerLocalPort . '.' . $self->{option_results}->{peer}};
my $bgpRemoteInfos = $result->{$oid_bgpPeerRemoteAddr. '.' . $self->{option_results}->{peer}} . ':' . $result->{$oid_bgpPeerRemotePort . '.' . $self->{option_results}->{peer}}; my $bgpRemoteInfos = $result->{$oid_bgpPeerRemoteAddr. '.' . $self->{option_results}->{peer}} . ':' . $result->{$oid_bgpPeerRemotePort . '.' . $self->{option_results}->{peer}};
$self->{output}->output_add(severity => 'OK', $self->{output}->output_add(severity => 'OK',
short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s]", $self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState} , $bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime)); short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s]",
$self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState},
$bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime));
if ($bgpPeerAdminStatus < 2) { if ($bgpPeerAdminStatus < 2) {
$self->{output}->output_add(severity => 'CRITICAL', $self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Peer '%s' AdminState is '%s' Remote AS: %s Remote Addr: %s", short_msg => sprintf("Peer '%s' AdminState is '%s' Remote AS: %s Remote Addr: %s",
$self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $bgpPeerRemoteAs, $bgpRemoteInfos) $self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $bgpPeerRemoteAs, $bgpRemoteInfos)
); );
} elsif ($bgpPeerState != 6) {
my $exit = $self->get_severity(section => 'peers', value => $map_peer_state{$bgpPeerState});
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s]", $self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime));
}
} else { } else {
my $exit = $self->get_severity(section => 'peers', value => $map_peer_state{$bgpPeerState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s]",
$self->{option_results}->{peer}, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime));
}
}
} else {
$self->{output}->output_add(severity => 'OK', $self->{output}->output_add(severity => 'OK',
short_msg => sprintf("All BGP peers are in an OK state")); short_msg => sprintf("All BGP peers are in an OK state"));
foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) {
next if ($key !~ /^$oid_bgpPeerState\.(.*)$/); next if ($key !~ /^$oid_bgpPeerState\.(.*)$/);
my $instance = $1; my $instance = $1;
next if ($instance eq '0.0.0.0'); next if ($instance eq '0.0.0.0');
@ -172,27 +147,49 @@ sub run {
if ($bgpPeerAdminStatus < 2) { if ($bgpPeerAdminStatus < 2) {
$self->{output}->output_add(severity => 'CRITICAL', $self->{output}->output_add(severity => 'CRITICAL',
short_msg => sprintf("Peer '%s' AdminState is '%s' Remote AS: %s Remote Addr: %s \n", short_msg => sprintf("Peer '%s' AdminState is '%s' Remote AS: %s Remote Addr: %s",
$instance, $map_admin_state{$bgpPeerAdminStatus}, $bgpPeerRemoteAs, $instance, $map_admin_state{$bgpPeerAdminStatus}, $bgpPeerRemoteAs,
$bgpRemoteInfos)); $bgpRemoteInfos));
} elsif ($bgpPeerState != 6) { } else {
my $exit = $self->get_severity(section => 'peers', value => $map_peer_state{$bgpPeerState}); my $exit = $self->get_severity(section => 'peers', value => $map_peer_state{$bgpPeerState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s] \n", $instance, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime)); short_msg => sprintf("Peer %s AdminState=%s Connection=%s [Remote Addr:%s AS:%d] [Last Update %d s]",
$instance, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpRemoteInfos, $bgpPeerRemoteAs, $bgpPeerInUpdateElpasedTime));
}
} }
$self->{output}->output_add(long_msg => sprintf("Peer:%s Local:%s Remote:%s AS:%d AdminState:'%s' Connection:'%s' Last Update:%d sec \n", $instance, $bgpLocalInfos, $bgpRemoteInfos, $bgpPeerRemoteAs, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpPeerInUpdateElpasedTime)); $self->{output}->output_add(long_msg => sprintf("Peer:%s Local:%s Remote:%s AS:%d AdminState:'%s' Connection:'%s' Last Update:%d sec",
$instance, $bgpLocalInfos, $bgpRemoteInfos, $bgpPeerRemoteAs, $map_admin_state{$bgpPeerAdminStatus}, $map_peer_state{$bgpPeerState}, $bgpPeerInUpdateElpasedTime));
} }
} }
$self->{output}->display(); $self->{output}->display();
$self->{output}->exit(); $self->{output}->exit();
} }
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__

View File

@ -98,8 +98,12 @@ sub run {
$self->{output}->perfdata_add(label => "time", unit => 's', $self->{output}->perfdata_add(label => "time", unit => 's',
value => sprintf('%.3f', $timeelapsed), value => sprintf('%.3f', $timeelapsed),
min => 0);
$self->{output}->perfdata_add(label => "entries",
value => $num_entries,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical')); critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->display(); $self->{output}->display();
$self->{output}->exit(); $self->{output}->exit();

View File

@ -0,0 +1,129 @@
#
# Copyright 2015 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 apps::protocols::ntp::mode::offset;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use Net::NTP;
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 =>
{
"ntp-host:s" => { name => 'ntp_host' },
"port:s" => { name => 'port', default => 123 },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
"timeout:s" => { name => 'timeout', default => 30 },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{ntp_host})) {
$self->{output}->add_option_msg(short_msg => "Please set the ntp-host option");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
my %ntp;
eval {
$Net::NTP::TIMEOUT = $self->{option_results}->{timeout};
%ntp = get_ntp_response($self->{option_results}->{ntp_host}, $self->{option_results}->{port});
};
if ($@) {
$self->{output}->output_add(severity => 'CRITICAL',
short_msg => "Couldn't connect to ntp server: " . $@);
$self->{output}->display();
$self->{output}->exit();
}
my $localtime = time();
my $offset = ($ntp{'Receive Timestamp'} - $ntp{'Originate Timestamp'}) + ($ntp{'Transmit Timestamp'} - $localtime) / 2);
my $exit = $self->{perfdata}->threshold_check(value => $offset,
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Offset: %.3fs", $offset));
$self->{output}->output_add(long_msg => sprintf("Host has an offset of %.5fs with its time server reference %s", $offset, $self->{option_results}->{ntp_host}));
$self->{output}->perfdata_add(label => "time", unit => 's',
value => sprintf('%.3f', $offset),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'));
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check Ntp server response.
=over 8
=item B<--ntp-host>
Ntp server address or FQDN
=item B<--port>
Port used (Default: 123)
=item B<--timeout>
Threshold for NTP timeout
=item B<--warning>
Threshold warning in seconds
=item B<--critical>
Threshold critical in seconds (e.g @10:10 means CRITICAL if offset is not between -10 and +10 seconds)
=back
=cut

View File

@ -33,6 +33,7 @@ sub new {
$self->{version} = '0.1'; $self->{version} = '0.1';
%{$self->{modes}} = ( %{$self->{modes}} = (
'response-time' => 'apps::protocols::ntp::mode::responsetime', 'response-time' => 'apps::protocols::ntp::mode::responsetime',
'offset' => 'apps::protocols::ntp::mode::offset',
); );
return $self; return $self;

View File

@ -208,11 +208,11 @@ Threshold warning in days (Days before expiration, eg: '60:' for 60 days before)
Threshold critical in days (Days before expiration, eg: '30:' for 30 days before) Threshold critical in days (Days before expiration, eg: '30:' for 30 days before)
=item B<--subject> =item B<--subjectname>
Subject Name pattern Subject Name pattern
=item B<--issuer> =item B<--issuername>
Issuer Name pattern Issuer Name pattern

View File

@ -55,6 +55,8 @@ sub new {
"vsphere-password:s@" => { name => 'vsphere_password' }, "vsphere-password:s@" => { name => 'vsphere_password' },
"container:s@" => { name => 'container' }, "container:s@" => { name => 'container' },
"timeout:s@" => { name => 'timeout' }, "timeout:s@" => { name => 'timeout' },
"sampling-period:s@" => { name => 'sampling_period' },
"time-shift:s@" => { name => 'time_shift' },
}); });
} }
$options{options}->add_help(package => __PACKAGE__, sections => 'CONNECTOR OPTIONS', once => 1); $options{options}->add_help(package => __PACKAGE__, sections => 'CONNECTOR OPTIONS', once => 1);
@ -105,6 +107,8 @@ sub check_options {
$self->{vsphere_address} = (defined($self->{option_results}->{vsphere_address})) ? shift(@{$self->{option_results}->{vsphere_address}}) : undef; $self->{vsphere_address} = (defined($self->{option_results}->{vsphere_address})) ? shift(@{$self->{option_results}->{vsphere_address}}) : undef;
$self->{vsphere_username} = (defined($self->{option_results}->{vsphere_username})) ? shift(@{$self->{option_results}->{vsphere_username}}) : undef; $self->{vsphere_username} = (defined($self->{option_results}->{vsphere_username})) ? shift(@{$self->{option_results}->{vsphere_username}}) : undef;
$self->{vsphere_password} = (defined($self->{option_results}->{vsphere_password})) ? shift(@{$self->{option_results}->{vsphere_password}}) : undef; $self->{vsphere_password} = (defined($self->{option_results}->{vsphere_password})) ? shift(@{$self->{option_results}->{vsphere_password}}) : undef;
$self->{sampling_period} = (defined($self->{option_results}->{sampling_period})) ? shift(@{$self->{option_results}->{sampling_period}}) : undef;
$self->{time_shift} = (defined($self->{option_results}->{sampling_period})) ? shift(@{$self->{option_results}->{time_shift}}) : 0;
$self->{connector_port} = 5700 if ($self->{connector_port} eq ''); $self->{connector_port} = 5700 if ($self->{connector_port} eq '');
$self->{container} = 'default' if ($self->{container} eq ''); $self->{container} = 'default' if ($self->{container} eq '');
@ -198,6 +202,8 @@ sub run {
$self->{json_send}->{vsphere_address} = $self->{vsphere_address}; $self->{json_send}->{vsphere_address} = $self->{vsphere_address};
$self->{json_send}->{vsphere_username} = $self->{vsphere_username}; $self->{json_send}->{vsphere_username} = $self->{vsphere_username};
$self->{json_send}->{vsphere_password} = $self->{vsphere_password}; $self->{json_send}->{vsphere_password} = $self->{vsphere_password};
$self->{json_send}->{sampling_period} = $self->{sampling_period};
$self->{json_send}->{time_shift} = $self->{time_shift};
# Init # Init
my $context = zmq_init(); my $context = zmq_init();
@ -288,6 +294,15 @@ Password of vpshere/ESX connection (with --vsphere-address).
Set global execution timeout (Default: 50) Set global execution timeout (Default: 50)
=item B<--sampling-period>
Choose the sampling period (can change the default sampling for counters).
Should be not different than 300 or 20.
=item B<--time-shift>
Can shift the time. We the following option you can average X counters values (default: 0).
=back =back
=head1 DESCRIPTION =head1 DESCRIPTION

View File

@ -161,7 +161,7 @@ sub run {
$self->manage_selection(); $self->manage_selection();
my $multiple = 1; my $multiple = 1;
if (scalar(keys %{$self->{ap_selected}}) == 1) { if (scalar(keys %{$self->{ap_selected}}) <= 1) {
$multiple = 0; $multiple = 0;
} }
@ -234,15 +234,19 @@ my $mapping3 = {
bsnAPAdminStatus => { oid => '.1.3.6.1.4.1.14179.2.2.1.1.37', map => \%map_admin_status }, bsnAPAdminStatus => { oid => '.1.3.6.1.4.1.14179.2.2.1.1.37', map => \%map_admin_status },
}; };
my $oid_agentInventoryMachineModel = '.1.3.6.1.4.1.14179.1.1.1.3';
sub manage_selection { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{ap_selected} = {}; $self->{ap_selected} = {};
$self->{results} = $self->{snmp}->get_multiple_table(oids => [ { oid => $mapping->{bsnAPName}->{oid} }, $self->{results} = $self->{snmp}->get_multiple_table(oids => [ { oid => $oid_agentInventoryMachineModel },
{ oid => $mapping->{bsnAPName}->{oid} },
{ oid => $mapping2->{bsnAPOperationStatus}->{oid} }, { oid => $mapping2->{bsnAPOperationStatus}->{oid} },
{ oid => $mapping3->{bsnAPAdminStatus}->{oid} }, { oid => $mapping3->{bsnAPAdminStatus}->{oid} },
], ],
nothing_quit => 1); nothing_quit => 1);
$self->{output}->output_add(long_msg => "Model: " . $self->{results}->{$oid_agentInventoryMachineModel}->{$oid_agentInventoryMachineModel . '.0'});
foreach my $oid (keys %{$self->{results}->{ $mapping->{bsnAPName}->{oid} }}) { foreach my $oid (keys %{$self->{results}->{ $mapping->{bsnAPName}->{oid} }}) {
$oid =~ /^$mapping->{bsnAPName}->{oid}\.(.*)$/; $oid =~ /^$mapping->{bsnAPName}->{oid}\.(.*)$/;
my $instance = $1; my $instance = $1;
@ -251,7 +255,7 @@ sub manage_selection {
my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{ $mapping3->{bsnAPAdminStatus}->{oid} }, instance => $instance); my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{ $mapping3->{bsnAPAdminStatus}->{oid} }, instance => $instance);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$result->{bsnAPName} !~ /$self->{option_results}->{filter_name}/) { $result->{bsnAPName} !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "Skipping '" . $result->{bsnAPName} . "': no matching filter."); $self->{output}->output_add(long_msg => "Skipping '" . $result->{bsnAPName} . "': no matching filter.", debug => 1);
next; next;
} }
@ -260,8 +264,8 @@ sub manage_selection {
} }
if (scalar(keys %{$self->{ap_selected}}) <= 0) { if (scalar(keys %{$self->{ap_selected}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No entry found."); $self->{output}->output_add(severity => 'OK',
$self->{output}->option_exit(); short_msg => 'No AP associated (can be: slave wireless controller or your filter)');
} }
} }

View File

@ -221,16 +221,20 @@ my $mapping2 = {
bsnMobileStationSsid => { oid => '.1.3.6.1.4.1.14179.2.1.4.1.7' }, bsnMobileStationSsid => { oid => '.1.3.6.1.4.1.14179.2.1.4.1.7' },
}; };
my $oid_agentInventoryMachineModel = '.1.3.6.1.4.1.14179.1.1.1.3';
sub manage_selection { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{global} = { total => 0, total_idle => 0, total_aaapending => 0, total_authenticated => 0, $self->{global} = { total => 0, total_idle => 0, total_aaapending => 0, total_authenticated => 0,
total_associated => 0, total_powersave => 0, total_disassociated => 0, total_associated => 0, total_powersave => 0, total_disassociated => 0,
total_tobedeleted => 0, total_probing => 0, total_blacklisted => 0}; total_tobedeleted => 0, total_probing => 0, total_blacklisted => 0};
$self->{results} = $self->{snmp}->get_multiple_table(oids => [ { oid => $mapping->{bsnMobileStationStatus}->{oid} }, $self->{results} = $self->{snmp}->get_multiple_table(oids => [ { oid => $oid_agentInventoryMachineModel },
{ oid => $mapping->{bsnMobileStationStatus}->{oid} },
{ oid => $mapping2->{bsnMobileStationSsid}->{oid} }, { oid => $mapping2->{bsnMobileStationSsid}->{oid} },
], ],
nothing_quit => 1); nothing_quit => 1);
$self->{output}->output_add(long_msg => "Model: " . $self->{results}->{$oid_agentInventoryMachineModel}->{$oid_agentInventoryMachineModel . '.0'});
foreach my $oid (keys %{$self->{results}->{ $mapping->{bsnMobileStationStatus}->{oid} }}) { foreach my $oid (keys %{$self->{results}->{ $mapping->{bsnMobileStationStatus}->{oid} }}) {
$oid =~ /^$mapping->{bsnMobileStationStatus}->{oid}\.(.*)$/; $oid =~ /^$mapping->{bsnMobileStationStatus}->{oid}\.(.*)$/;
my $instance = $1; my $instance = $1;

View File

@ -55,11 +55,11 @@ my $maps_counters = {
], ],
} }
}, },
'003_nsr' => { set => { '003_snr' => { set => {
key_values => [ { name => 'apSignalToNoiseRatio' }, { name => 'bssid' }, ], key_values => [ { name => 'apSignalToNoiseRatio' }, { name => 'bssid' }, ],
output_template => 'Signal to noise ratio : %d', output_template => 'Signal to noise ratio : %d',
perfdatas => [ perfdatas => [
{ label => 'nsr', value => 'apSignalToNoiseRatio_absolute', template => '%d', { label => 'snr', value => 'apSignalToNoiseRatio_absolute', template => '%d',
label_extra_instance => 1, instance_use => 'bssid_absolute' }, label_extra_instance => 1, instance_use => 'bssid_absolute' },
], ],
} }

View File

@ -396,7 +396,7 @@ sub manage_selection {
my $total_timeticks = 0; my $total_timeticks = 0;
foreach my $oid (keys %{$self->{results}->{$oid_wlsxUserEntry}}) { foreach my $oid (keys %{$self->{results}->{$oid_wlsxUserEntry}}) {
$oid =~ /^$mapping->{nUserAuthenticationMethod}->{oid}\.(.*)$/; next if ($oid !~ /^$mapping->{nUserAuthenticationMethod}->{oid}\.(.*)$/);
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxUserEntry}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_wlsxUserEntry}, instance => $instance);
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{nUserApBSSID}->{oid}}, instance => $instance); my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{nUserApBSSID}->{oid}}, instance => $instance);

View File

@ -73,10 +73,12 @@ sub check {
$result->{ciscoEnvMonVoltageStatusDescr}, $result->{ciscoEnvMonVoltageState})); $result->{ciscoEnvMonVoltageStatusDescr}, $result->{ciscoEnvMonVoltageState}));
} }
$result->{ciscoEnvMonVoltageStatusValue} = $result->{ciscoEnvMonVoltageStatusValue} / 1000;
my ($exit2, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'voltage', instance => $instance, value => $result->{ciscoEnvMonVoltageStatusValue}); my ($exit2, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'voltage', instance => $instance, value => $result->{ciscoEnvMonVoltageStatusValue});
if ($checked == 0) { if ($checked == 0) {
my $warn_th = undef; my $warn_th = undef;
my $crit_th = $result->{ciscoEnvMonVoltageThresholdLow} . ':' . $result->{ciscoEnvMonVoltageThresholdHigh}; my $crit_th = (defined($result->{ciscoEnvMonVoltageThresholdLow}) ? sprintf("%.3f", $result->{ciscoEnvMonVoltageThresholdLow}) : 0) . ':' .
(defined($result->{ciscoEnvMonVoltageThresholdHigh}) ? sprintf("%.3f", $result->{ciscoEnvMonVoltageThresholdHigh}) : '');
$self->{perfdata}->threshold_validate(label => 'warning-voltage-instance-' . $instance, value => $warn_th); $self->{perfdata}->threshold_validate(label => 'warning-voltage-instance-' . $instance, value => $warn_th);
$self->{perfdata}->threshold_validate(label => 'critical-voltage-instance-' . $instance, value => $crit_th); $self->{perfdata}->threshold_validate(label => 'critical-voltage-instance-' . $instance, value => $crit_th);
$warn = $self->{perfdata}->get_perfdata_for_output(label => 'warning-voltage-instance-' . $instance); $warn = $self->{perfdata}->get_perfdata_for_output(label => 'warning-voltage-instance-' . $instance);
@ -84,10 +86,10 @@ sub check {
} }
if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) { if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit2, $self->{output}->output_add(severity => $exit2,
short_msg => sprintf("Voltage '%s' is %s V", $result->{ciscoEnvMonVoltageStatusDescr}, $result->{ciscoEnvMonVoltageStatusValue})); short_msg => sprintf("Voltage '%s' is %.3f V", $result->{ciscoEnvMonVoltageStatusDescr}, $result->{ciscoEnvMonVoltageStatusValue}));
} }
$self->{output}->perfdata_add(label => "voltage_" . $result->{ciscoEnvMonVoltageStatusDescr}, unit => 'V', $self->{output}->perfdata_add(label => "voltage_" . $result->{ciscoEnvMonVoltageStatusDescr}, unit => 'V',
value => $result->{ciscoEnvMonVoltageStatusValue}, value => sprintf("%.3f", $result->{ciscoEnvMonVoltageStatusValue}),
warning => $warn, warning => $warn,
critical => $crit); critical => $crit);
} }

View File

@ -73,6 +73,26 @@ sub check_options {
} }
} }
sub check_nexus_cpu {
my ($self, %options) = @_;
if (!defined($self->{results}->{$options{oid}}->{$options{oid} . '.0'})) {
return 0;
}
my $cpu = $self->{results}->{$options{oid}}->{$options{oid} . '.0'};
my $exit = $self->{perfdata}->threshold_check(value => $cpu,
threshold => [ { label => 'crit5m', exit_litteral => 'critical' }, { label => 'warn5m', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("CPU Usage : %s %%", $cpu));
$self->{output}->perfdata_add(label => "cpu", unit => '%',
value => $cpu,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn5m'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit5m'),
min => 0, max => 100);
return 1;
}
sub check_table_cpu { sub check_table_cpu {
my ($self, %options) = @_; my ($self, %options) = @_;
@ -113,21 +133,21 @@ sub check_table_cpu {
} }
if (defined($cpu5sec)) { if (defined($cpu5sec)) {
$self->{output}->perfdata_add(label => "cpu_" . $instance . "_5s", $self->{output}->perfdata_add(label => "cpu_" . $instance . "_5s", unit => '%',
value => $cpu5sec, value => $cpu5sec,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn5s'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn5s'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit5s'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit5s'),
min => 0, max => 100); min => 0, max => 100);
} }
if (defined($cpu1min)) { if (defined($cpu1min)) {
$self->{output}->perfdata_add(label => "cpu_" . $instance . "_1m", $self->{output}->perfdata_add(label => "cpu_" . $instance . "_1m", unit => '%',
value => $cpu1min, value => $cpu1min,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn1m'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn1m'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit1m'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit1m'),
min => 0, max => 100); min => 0, max => 100);
} }
if (defined($cpu5min)) { if (defined($cpu5min)) {
$self->{output}->perfdata_add(label => "cpu_" . $instance . "_5m", $self->{output}->perfdata_add(label => "cpu_" . $instance . "_5m", unit => '%',
value => $cpu5min, value => $cpu5min,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn5m'), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn5m'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit5m'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit5m'),
@ -157,13 +177,17 @@ sub run {
my $oid_busyPer = '.1.3.6.1.4.1.9.2.1.56'; # .0 in reality my $oid_busyPer = '.1.3.6.1.4.1.9.2.1.56'; # .0 in reality
my $oid_avgBusy1 = '.1.3.6.1.4.1.9.2.1.57'; # .0 in reality my $oid_avgBusy1 = '.1.3.6.1.4.1.9.2.1.57'; # .0 in reality
my $oid_avgBusy5 = '.1.3.6.1.4.1.9.2.1.58'; # .0 in reality my $oid_avgBusy5 = '.1.3.6.1.4.1.9.2.1.58'; # .0 in reality
# Cisco Nexus
my $oid_cseSysCPUUtilization = '.1.3.6.1.4.1.9.9.305.1.1.1'; # .0 in reality
$self->{results} = $self->{snmp}->get_multiple_table(oids => [ $self->{results} = $self->{snmp}->get_multiple_table(oids => [
{ oid => $oid_cpmCPUTotalEntry, { oid => $oid_cpmCPUTotalEntry,
start => $oid_cpmCPUTotal5sec, end => $oid_cpmCPUTotal5minRev start => $oid_cpmCPUTotal5sec, end => $oid_cpmCPUTotal5minRev
}, },
{ oid => $oid_lcpu, { oid => $oid_lcpu,
start => $oid_busyPer, end => $oid_avgBusy5 }], start => $oid_busyPer, end => $oid_avgBusy5 },
{ oid => $oid_cseSysCPUUtilization },
],
nothing_quit => 1); nothing_quit => 1);
$self->{output}->output_add(severity => 'OK', $self->{output}->output_add(severity => 'OK',
@ -173,9 +197,11 @@ sub run {
&& !$self->check_table_cpu(entry => $oid_cpmCPUTotalEntry, sec5 => $oid_cpmCPUTotal5sec, min1 => $oid_cpmCPUTotal1min, min5 => $oid_cpmCPUTotal5min) && !$self->check_table_cpu(entry => $oid_cpmCPUTotalEntry, sec5 => $oid_cpmCPUTotal5sec, min1 => $oid_cpmCPUTotal1min, min5 => $oid_cpmCPUTotal5min)
&& !$self->check_table_cpu(entry => $oid_lcpu, sec5 => $oid_busyPer, min1 => $oid_avgBusy1, min5 => $oid_avgBusy5) && !$self->check_table_cpu(entry => $oid_lcpu, sec5 => $oid_busyPer, min1 => $oid_avgBusy1, min5 => $oid_avgBusy5)
) { ) {
if (!$self->check_nexus_cpu(oid => $oid_cseSysCPUUtilization)) {
$self->{output}->output_add(severity => 'UNKNOWN', $self->{output}->output_add(severity => 'UNKNOWN',
short_msg => sprintf("Cannot find CPU informations.")); short_msg => sprintf("Cannot find CPU informations."));
} }
}
$self->{output}->display(); $self->{output}->display();
$self->{output}->exit(); $self->{output}->exit();
@ -187,17 +213,19 @@ __END__
=head1 MODE =head1 MODE
Check cpu usage (CISCO-PROCESS-MIB). Check cpu usage (CISCO-PROCESS-MIB and CISCO-SYSTEM-EXT-MIB).
=over 8 =over 8
=item B<--warning> =item B<--warning>
Threshold warning in percent (5s,1min,5min). Threshold warning in percent (5s,1min,5min).
Used 5min threshold when you have only 'cpu' metric.
=item B<--critical> =item B<--critical>
Threshold critical in percent (5s,1min,5min). Threshold critical in percent (5s,1min,5min).
Used 5min threshold when you have only 'cpu' metric.
=back =back

View File

@ -29,7 +29,9 @@ use FindBin;
use Pod::Usage; use Pod::Usage;
use Pod::Find qw(pod_where); use Pod::Find qw(pod_where);
my %handlers = ('DIE' => {}); my %handlers = (DIE => {});
my $global_version = 20151110;
sub new { sub new {
my $class = shift; my $class = shift;
@ -242,6 +244,10 @@ sub run {
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
if (!defined($self->{plugin}) || $self->{plugin} eq '') { if (!defined($self->{plugin}) || $self->{plugin} eq '') {
if (defined($self->{version})) {
$self->{output}->add_option_msg(short_msg => "Global Version: " . $global_version);
$self->{output}->option_exit(nolabel => 1);
}
$self->{output}->add_option_msg(short_msg => "Need to specify '--plugin' option."); $self->{output}->add_option_msg(short_msg => "Need to specify '--plugin' option.");
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
@ -285,7 +291,7 @@ Print available plugins.
=item B<--version> =item B<--version>
Print plugin version. Print global version.
=item B<--help> =item B<--help>

View File

@ -42,7 +42,7 @@ sub new {
'custommode:s' => { name => 'custommode_name' }, 'custommode:s' => { name => 'custommode_name' },
'list-custommode' => { name => 'list_custommode' }, 'list-custommode' => { name => 'list_custommode' },
'multiple' => { name => 'multiple' }, 'multiple' => { name => 'multiple' },
'sanity-options' => { name => 'sanity_options' }, 'sanity-options' => { name => 'sanity_options' }, # keep it for 6 month before remove it
} }
); );
$self->{version} = '1.0'; $self->{version} = '1.0';
@ -66,6 +66,15 @@ sub new {
return $self; return $self;
} }
sub load_custom_mode {
my ($self, %options) = @_;
$self->is_custommode(custommode => $self->{custommode_name});
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $self->{custom_modes}{$self->{custommode_name}},
error_msg => "Cannot load module --custommode.");
$self->{custommode_current} = $self->{custom_modes}{$self->{custommode_name}}->new(options => $self->{options}, output => $self->{output}, mode => $self->{custommode_name});
}
sub init { sub init {
my ($self, %options) = @_; my ($self, %options) = @_;
# $options{version} = string version # $options{version} = string version
@ -84,18 +93,16 @@ sub init {
if (defined($self->{list_custommode})) { if (defined($self->{list_custommode})) {
$self->list_custommode(); $self->list_custommode();
} }
if (defined($self->{sanity_options})) {
$self->{options}->set_sanity(); $self->{options}->set_sanity();
}
# Output HELP # Output HELP
$self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS'); $self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS');
if (defined($self->{custommode_name}) && $self->{custommode_name} ne '') { if (defined($self->{custommode_name}) && $self->{custommode_name} ne '') {
$self->is_custommode(custommode => $self->{custommode_name}); $self->load_custom_mode();
centreon::plugins::misc::mymodule_load(output => $self->{output}, module => $self->{custom_modes}{$self->{custommode_name}}, } elsif (scalar(keys %{$self->{custom_modes}}) == 1) {
error_msg => "Cannot load module --custommode."); $self->{custommode_name} = (keys(%{$self->{custom_modes}}))[0];
$self->{custommode_current} = $self->{custom_modes}{$self->{custommode_name}}->new(options => $self->{options}, output => $self->{output}, mode => $self->{custommode_name}); $self->load_custom_mode();
} else { } else {
$self->{output}->add_option_msg(short_msg => "Need to specify '--custommode'."); $self->{output}->add_option_msg(short_msg => "Need to specify '--custommode'.");
$self->{output}->option_exit(); $self->{output}->option_exit();
@ -255,10 +262,6 @@ Check minimal version of mode. If not, unknown error.
Display plugin version. Display plugin version.
=item B<--sanity-options>
Check unknown options (for debug purpose).
=item B<--custommode> =item B<--custommode>
Choose a custom mode. Choose a custom mode.

View File

@ -39,7 +39,7 @@ sub new {
'dyn-mode:s' => { name => 'dynmode_name' }, 'dyn-mode:s' => { name => 'dynmode_name' },
'list-mode' => { name => 'list_mode' }, 'list-mode' => { name => 'list_mode' },
'mode-version:s' => { name => 'mode_version' }, 'mode-version:s' => { name => 'mode_version' },
'sanity-options' => { name => 'sanity_options' }, 'sanity-options' => { name => 'sanity_options' }, # keep it for 6 month before remove it
} }
); );
$self->{version} = '1.0'; $self->{version} = '1.0';
@ -74,9 +74,7 @@ sub init {
if (defined($self->{list_mode})) { if (defined($self->{list_mode})) {
$self->list_mode(); $self->list_mode();
} }
if (defined($self->{sanity_options})) {
$self->{options}->set_sanity(); $self->{options}->set_sanity();
}
# Output HELP # Output HELP
$self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS'); $self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS');
@ -200,10 +198,6 @@ Check minimal version of mode. If not, unknown error.
Display plugin version. Display plugin version.
=item B<--sanity-options>
Check unknown options (for debug purpose).
=back =back
=head1 DESCRIPTION =head1 DESCRIPTION

View File

@ -41,7 +41,7 @@ sub new {
'dyn-mode:s' => { name => 'dynmode_name' }, 'dyn-mode:s' => { name => 'dynmode_name' },
'list-mode' => { name => 'list_mode' }, 'list-mode' => { name => 'list_mode' },
'mode-version:s' => { name => 'mode_version' }, 'mode-version:s' => { name => 'mode_version' },
'sanity-options' => { name => 'sanity_options' }, 'sanity-options' => { name => 'sanity_options' }, # keep it for 6 month before remove it
} }
); );
$self->{version} = '1.0'; $self->{version} = '1.0';
@ -76,9 +76,7 @@ sub init {
if (defined($self->{list_mode})) { if (defined($self->{list_mode})) {
$self->list_mode(); $self->list_mode();
} }
if (defined($self->{sanity_options})) {
$self->{options}->set_sanity(); $self->{options}->set_sanity();
}
# Output HELP # Output HELP
$self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS'); $self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS');
@ -208,10 +206,6 @@ Check minimal version of mode. If not, unknown error.
Display plugin version. Display plugin version.
=item B<--sanity-options>
Check unknown options (for debug purpose).
=back =back
=head1 DESCRIPTION =head1 DESCRIPTION

View File

@ -43,7 +43,7 @@ sub new {
'sqlmode:s' => { name => 'sqlmode_name', default => 'dbi' }, 'sqlmode:s' => { name => 'sqlmode_name', default => 'dbi' },
'list-sqlmode' => { name => 'list_sqlmode' }, 'list-sqlmode' => { name => 'list_sqlmode' },
'multiple' => { name => 'multiple' }, 'multiple' => { name => 'multiple' },
'sanity-options' => { name => 'sanity_options' }, 'sanity-options' => { name => 'sanity_options' }, # keep it for 6 month before remove it
} }
); );
$self->{version} = '1.0'; $self->{version} = '1.0';
@ -85,9 +85,7 @@ sub init {
if (defined($self->{list_sqlmode})) { if (defined($self->{list_sqlmode})) {
$self->list_sqlmode(); $self->list_sqlmode();
} }
if (defined($self->{sanity_options})) {
$self->{options}->set_sanity(); $self->{options}->set_sanity();
}
# Output HELP # Output HELP
$self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS'); $self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS');
@ -261,10 +259,6 @@ Check minimal version of mode. If not, unknown error.
Display plugin version. Display plugin version.
=item B<--sanity-options>
Check unknown options (for debug purpose).
=item B<--sqlmode> =item B<--sqlmode>
Choose a sql mode (Default: "dbi"). Choose a sql mode (Default: "dbi").

View File

@ -41,7 +41,7 @@ sub new {
'dyn-mode:s' => { name => 'dynmode_name' }, 'dyn-mode:s' => { name => 'dynmode_name' },
'list-mode' => { name => 'list_mode' }, 'list-mode' => { name => 'list_mode' },
'mode-version:s' => { name => 'mode_version' }, 'mode-version:s' => { name => 'mode_version' },
'sanity-options' => { name => 'sanity_options' }, 'sanity-options' => { name => 'sanity_options' }, # keep it for 6 month before remove it
} }
); );
$self->{version} = '1.0'; $self->{version} = '1.0';
@ -76,9 +76,7 @@ sub init {
if (defined($self->{list_mode})) { if (defined($self->{list_mode})) {
$self->list_mode(); $self->list_mode();
} }
if (defined($self->{sanity_options})) {
$self->{options}->set_sanity(); $self->{options}->set_sanity();
}
# Output HELP # Output HELP
$self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS'); $self->{options}->add_help(package => 'centreon::plugins::output', sections => 'OUTPUT OPTIONS');
@ -204,10 +202,6 @@ Check minimal version of mode. If not, unknown error.
Display plugin version. Display plugin version.
=item B<--sanity-options>
Check unknown options (for debug purpose).
=back =back
=head1 DESCRIPTION =head1 DESCRIPTION

View File

@ -23,7 +23,6 @@ package cloud::aws::custom::awscli;
use strict; use strict;
use warnings; use warnings;
use JSON; use JSON;
use Data::Dumper;
use centreon::plugins::misc; use centreon::plugins::misc;
sub new { sub new {
@ -53,15 +52,10 @@ sub new {
"sudo" => { name => 'sudo' }, "sudo" => { name => 'sudo' },
} ); } );
} }
$options{options}->add_help( $options{options}->add_help(package => __PACKAGE__, sections => 'AWSCLI OPTIONS', once => 1);
package => __PACKAGE__,
sections => 'AWSCLI OPTIONS',
once => 1
);
$self->{output} = $options{output}; $self->{output} = $options{output};
$self->{mode} = $options{mode}; $self->{mode} = $options{mode};
return $self; return $self;
} }
@ -78,8 +72,6 @@ sub set_options {
sub set_defaults { sub set_defaults {
my ( $self, %options ) = @_; my ( $self, %options ) = @_;
# options{default}
# Manage default value # Manage default value
foreach ( keys %{ $options{default} } ) { foreach ( keys %{ $options{default} } ) {
if ( $_ eq $self->{mode} ) { if ( $_ eq $self->{mode} ) {
@ -130,8 +122,7 @@ sub execReq {
); );
my @return = split /\n/, $self->{stdout}; my @return = split /\n/, $self->{stdout};
$jsoncontent = $json->encode( [@return] ); $jsoncontent = $json->encode( [@return] );
} } else {
else {
$jsoncontent = centreon::plugins::misc::execute( $jsoncontent = centreon::plugins::misc::execute(
output => $self->{output}, output => $self->{output},
options => $self->{option_results}, options => $self->{option_results},

View File

@ -25,18 +25,17 @@ use base qw(centreon::plugins::mode);
use strict; use strict;
use warnings; use warnings;
use centreon::plugins::misc; use centreon::plugins::misc;
use Data::Dumper;
use POSIX; use POSIX;
use JSON; use JSON;
use Module::Load; use Module::Load;
my $CloudwatchMetrics = { my $CloudwatchMetrics = {
'cpu' => "cloud::aws::mode::metrics::ec2instancecpu", cpu => "cloud::aws::mode::metrics::ec2instancecpu",
'traffic' => "cloud::aws::mode::metrics::ec2instancenetwork", traffic => "cloud::aws::mode::metrics::ec2instancenetwork",
'cpucreditusage' => "cloud::aws::mode::metrics::ec2instancecpucreditusage", cpucreditusage => "cloud::aws::mode::metrics::ec2instancecpucreditusage",
'cpucreditbalance' => "cloud::aws::mode::metrics::ec2instancecpucreditbalance", cpucreditbalance => "cloud::aws::mode::metrics::ec2instancecpucreditbalance",
'bucketsize' => "cloud::aws::mode::metrics::s3bucketsize", bucketsize => "cloud::aws::mode::metrics::s3bucketsize",
'rdscpu' => "cloud::aws::mode::metrics::rdsinstancecpu", rdscpu => "cloud::aws::mode::metrics::rdsinstancecpu",
}; };
my $StatisticsType = "Average,Minimum,Maximum,Sum,SampleCount"; my $StatisticsType = "Average,Minimum,Maximum,Sum,SampleCount";

View File

@ -75,17 +75,15 @@ sub manage_selection {
# includeallinstances # includeallinstances
if (defined($self->{option_results}->{includeallinstances})) { if (defined($self->{option_results}->{includeallinstances})) {
$self->{option_results}->{includeallinstances} = JSON::false; $self->{option_results}->{includeallinstances} = JSON::false;
} } else {
else {
$self->{option_results}->{includeallinstances} = JSON::true; $self->{option_results}->{includeallinstances} = JSON::true;
} }
# states # states
if ($self->{option_results}->{state} eq 'all') { if ($self->{option_results}->{state} eq 'all') {
@{ $self->{option_results}->{statetab} } = keys(%EC2_instance_states); @{$self->{option_results}->{statetab} } = keys %EC2_instance_states;
} } else {
else { @{$self->{option_results}->{statetab}} = split /,/, $self->{option_results}->{state};
@{ $self->{option_results}->{statetab} } = split( /,/, $self->{option_results}->{state} );
foreach my $curstate (@{$self->{option_results}->{statetab}}) { foreach my $curstate (@{$self->{option_results}->{statetab}}) {
if (!grep { /^$curstate$/ } keys(%EC2_instance_states)) { if (!grep { /^$curstate$/ } keys(%EC2_instance_states)) {
$self->{output}->add_option_msg(severity => 'UNKNOWN', short_msg => "The state doesn't exist."); $self->{output}->add_option_msg(severity => 'UNKNOWN', short_msg => "The state doesn't exist.");
@ -96,7 +94,7 @@ sub manage_selection {
# exclusions # exclusions
if (defined($self->{option_results}->{exclude})) { if (defined($self->{option_results}->{exclude})) {
my @excludetab = split( /,/, $self->{option_results}->{exclude} ); my @excludetab = split /,/, $self->{option_results}->{exclude};
my %array1 = map { $_ => 1 } @excludetab; my %array1 = map { $_ => 1 } @excludetab;
@{$self->{option_results}->{statetab}} = grep { not $array1{$_} } @{$self->{option_results}->{statetab}}; @{$self->{option_results}->{statetab}} = grep { not $array1{$_} } @{$self->{option_results}->{statetab}};
} }
@ -116,7 +114,7 @@ sub manage_selection {
# InstanceIds # InstanceIds
if (defined($self->{option_results}->{instanceid})) { if (defined($self->{option_results}->{instanceid})) {
my @InstanceIds = split(/,/, $self->{option_results}->{instanceid}); my @InstanceIds = split(/,/, $self->{option_results}->{instanceid});
@{$apiRequest->{json}{'InstanceIds'}} = @InstanceIds; @{$apiRequest->{json}{InstanceIds}} = @InstanceIds;
} }
# Requesting API # Requesting API
@ -124,9 +122,9 @@ sub manage_selection {
$self->{command_return} = $awsapi->execReq($apiRequest); $self->{command_return} = $awsapi->execReq($apiRequest);
# Compute data # Compute data
$self->{option_results}->{instancecount}->{'total'} = '0'; $self->{option_results}->{instancecount}->{total} = 0;
foreach my $curstate (@{$self->{option_results}->{statetab}}) { foreach my $curstate (@{$self->{option_results}->{statetab}}) {
$self->{option_results}->{instancecount}->{$curstate} = '0'; $self->{option_results}->{instancecount}->{$curstate} = 0;
} }
foreach my $l (@{$self->{command_return}->{InstanceStatuses}}) { foreach my $l (@{$self->{command_return}->{InstanceStatuses}}) {
$self->{result}->{instance}->{$l->{InstanceId}} = $l->{InstanceState}->{Name}; $self->{result}->{instance}->{$l->{InstanceId}} = $l->{InstanceState}->{Name};
@ -139,7 +137,7 @@ sub manage_selection {
$self->{option_results}->{instancecount}->{$curstate}++; $self->{option_results}->{instancecount}->{$curstate}++;
} }
} }
$self->{option_results}->{instancecount}->{'total'}++; $self->{option_results}->{instancecount}->{total}++;
} }
} }
@ -165,7 +163,7 @@ sub run {
); );
# Most critical state # Most critical state
if ( $self->{option_results}->{instancecount}->{$curstate} != '0' ) { if ($self->{option_results}->{instancecount}->{$curstate} != 0) {
$exit_code = $EC2_instance_states{$curstate}; $exit_code = $EC2_instance_states{$curstate};
$exit_code = $self->{output}->get_most_critical(status => [ $exit_code, $old_status ]); $exit_code = $self->{output}->get_most_critical(status => [ $exit_code, $old_status ]);
$old_status = $exit_code; $old_status = $exit_code;
@ -175,7 +173,7 @@ sub run {
# Output message # Output message
$self->{output}->output_add( $self->{output}->output_add(
severity => $exit_code, severity => $exit_code,
short_msg => sprintf( "Total instances: %s", $self->{option_results}->{instancecount}->{'total'} ) short_msg => sprintf("Total instances: %s", $self->{option_results}->{instancecount}->{total})
); );
$self->{output}->display(); $self->{output}->display();

View File

@ -46,34 +46,24 @@ sub new
return $self; return $self;
} }
sub check_options sub check_options {
{
my ($self, %options) = @_; my ($self, %options) = @_;
$self->SUPER::init(%options); $self->SUPER::init(%options);
} }
sub api_request sub api_request {
{
my ($self, %options) = @_; my ($self, %options) = @_;
@{$self->{option_results}->{servicetab}} =
split(/,/, $self->{option_results}->{service}); @{$self->{option_results}->{servicetab}} = split( /,/, $self->{option_results}->{service} );
foreach my $service (@{$self->{option_results}->{servicetab}}) foreach my $service (@{$self->{option_results}->{servicetab}}) {
{ $self->{result}->{count}->{$service} = 0;
$self->{result}->{count}->{$service} = '0'; if ($service eq 'EC2') {
if ($service eq 'EC2')
{
$self->EC2(%options); $self->EC2(%options);
} } elsif ($service eq 'S3') {
elsif ($service eq 'S3')
{
$self->S3(%options); $self->S3(%options);
} } elsif ($service eq 'RDS') {
elsif ($service eq 'RDS')
{
$self->RDS(%options); $self->RDS(%options);
} } else {
else
{
$self->{output}->add_option_msg(short_msg => "Service $service doesn't exists" ); $self->{output}->add_option_msg(short_msg => "Service $service doesn't exists" );
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
@ -104,19 +94,18 @@ sub EC2
$self->{command_return} = $awsapi->execReq($apiRequest); $self->{command_return} = $awsapi->execReq($apiRequest);
# Compute data # Compute data
foreach my $instance (@{$self->{command_return}->{Reservations}}) foreach my $instance (@{$self->{command_return}->{Reservations}}) {
{ foreach my $tags (@{$instance->{Instances}[0]->{Tags}}) {
foreach my $tags (@{$instance->{Instances}[0]->{Tags}}) if ($tags->{Key} eq 'Name') {
{
if ($tags->{Key} eq 'Name')
{
$instance->{Instances}[0]->{Name} = $tags->{Value}; $instance->{Instances}[0]->{Name} = $tags->{Value};
} }
} }
$self->{result}->{'EC2'}->{$instance->{Instances}[0]->{InstanceId}} = { $self->{result}->{'EC2'}->{$instance->{Instances}[0]->{InstanceId}} =
'State' => $instance->{Instances}[0]->{State}->{Name}, {
'Name' => $instance->{Instances}[0]->{Name} State => $instance->{Instances}[0]->{State}->{Name},
Name => $instance->{Instances}[0]->{Name}
}; };
$self->{result}->{count}->{'EC2'}++; $self->{result}->{count}->{'EC2'}++;
} }
} }
@ -136,9 +125,8 @@ sub S3
$self->{command_return} = $awsapi->execReq($apiRequest); $self->{command_return} = $awsapi->execReq($apiRequest);
# Exec command # Exec command
foreach my $line (@{$self->{command_return}}) foreach my $line (@{$self->{command_return}}) {
{ my ($date, $time, $name) = split / /, $line;
my ($date, $time, $name) = split(/ /, $line);
my $creationdate = $date . " " . $time; my $creationdate = $date . " " . $time;
push(@buckets, { Name => $name, CreationDate => $creationdate }); push(@buckets, { Name => $name, CreationDate => $creationdate });
} }
@ -165,19 +153,18 @@ sub RDS
$self->{command_return} = $awsapi->execReq($apiRequest); $self->{command_return} = $awsapi->execReq($apiRequest);
# Compute data # Compute data
foreach my $dbinstance (@{$self->{command_return}->{DBInstances}}) foreach my $dbinstance (@{$self->{command_return}->{DBInstances}}) {
{
$self->{result}->{'RDS'}->{$dbinstance->{DBInstanceIdentifier}} = { $self->{result}->{'RDS'}->{$dbinstance->{DBInstanceIdentifier}} = {
'State' => $dbinstance->{DBInstanceStatus}, State => $dbinstance->{DBInstanceStatus},
'Name' => $dbinstance->{DBInstanceIdentifier} Name => $dbinstance->{DBInstanceIdentifier}
}; };
$self->{result}->{count}->{'RDS'}++; $self->{result}->{count}->{RDS}++;
} }
} }
sub disco_format sub disco_format {
{
my ($self, %options) = @_; my ($self, %options) = @_;
my $names = [ 'name', 'id', 'state', 'service' ]; my $names = [ 'name', 'id', 'state', 'service' ];
$self->{output}->add_disco_format( elements => $names ); $self->{output}->add_disco_format( elements => $names );
} }
@ -186,10 +173,8 @@ sub disco_show
{ {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->api_request(%options); $self->api_request(%options);
foreach my $service (@Disco_service_tab) foreach my $service (@Disco_service_tab) {
{ foreach my $device (keys %{$self->{result}->{$service}}) {
foreach my $device (keys %{$self->{result}->{$service}})
{
$self->{output}->add_disco_entry( $self->{output}->add_disco_entry(
name => $self->{result}->{$service}->{$device}->{Name}, name => $self->{result}->{$service}->{$device}->{Name},
id => $device, id => $device,
@ -206,15 +191,15 @@ sub run
$self->api_request(%options); $self->api_request(%options);
# Send formated data to Centreon # Send formated data to Centreon
foreach my $service (@{$self->{option_results}->{servicetab}}) foreach my $service (@{$self->{option_results}->{servicetab}}) {
{
$self->{output}->output_add(long_msg => sprintf("AWS service: %s", $service)); $self->{output}->output_add(long_msg => sprintf("AWS service: %s", $service));
foreach my $device (keys %{$self->{result}->{$service}}) foreach my $device (keys %{$self->{result}->{$service}}) {
{
my $output = $device . " ["; my $output = $device . " [";
foreach my $value (sort(keys %{$self->{result}->{$service}->{$device}})) foreach my $value (sort(keys %{$self->{result}->{$service}->{$device}})) {
{ $output =
$output = $output . $value . " = " . $self->{result}->{$service}->{$device}->{$value} . ", "; $output
. $value . " = "
. $self->{result}->{$service}->{$device}->{$value} . ", ";
} }
$output =~ s/, $//; $output =~ s/, $//;
$output = $output . "]"; $output = $output . "]";

View File

@ -557,15 +557,6 @@ The mapping between 'snmpwalk' options and "centreon-plugins" options:
Miscellaneous Miscellaneous
------------- -------------
I use an option but it doesn't seem to work
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Before opening a ticket on the github, please use the option ``--sanity-options``. It checks if you have misspell an option:
::
$ perl centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=traffic --hostname=127.0.0.1 --snmp-version=2c --snmp-community=public --interface='.*' --name --regex --verbose --skip --skip-speed0 --sanity-options
Unknown option: regex
I get the error: "UNKNOWN: Need to specify '--custommode'." I get the error: "UNKNOWN: Need to specify '--custommode'."
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -557,15 +557,6 @@ L'association entre les options 'snmpwalk' et les options "centreon-plugins" :
Divers Divers
------ ------
J'utilise une options mais il semblerait qu'elle ne fonctionne pas
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Avant d'ouvrir un ticket sur github, utilisez l'option ``--sanity-options``. Cela vérifie si vous avez mal orthographié une option :
::
$ perl centreon_plugins.pl --plugin=os::linux::snmp::plugin --mode=traffic --hostname=127.0.0.1 --snmp-version=2c --snmp-community=public --interface='.*' --name --regex --verbose --skip --skip-speed0 --sanity-options
Unknown option: regex
J'ai l'erreur: "UNKNOWN: Need to specify '--custommode'." J'ai l'erreur: "UNKNOWN: Need to specify '--custommode'."
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -93,6 +93,7 @@ sub check {
my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{$mapping3->{batteryPredictedCapicity}->{oid}}, instance => $instance); my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{$mapping3->{batteryPredictedCapicity}->{oid}}, instance => $instance);
my $result4 = $self->{snmp}->map_instance(mapping => $mapping4, results => $self->{results}->{$mapping4->{batteryLearnState}->{oid}}, instance => $instance); my $result4 = $self->{snmp}->map_instance(mapping => $mapping4, results => $self->{results}->{$mapping4->{batteryLearnState}->{oid}}, instance => $instance);
$result4->{batteryLearnState} = defined($result4->{batteryLearnState}) ? $result4->{batteryLearnState} : '-'; $result4->{batteryLearnState} = defined($result4->{batteryLearnState}) ? $result4->{batteryLearnState} : '-';
$result3->{batteryPredictedCapicity} = defined($result3->{batteryPredictedCapicity}) ? $result3->{batteryPredictedCapicity} : '-';
next if ($self->check_exclude(section => 'cachebattery', instance => $instance)); next if ($self->check_exclude(section => 'cachebattery', instance => $instance));

View File

@ -83,6 +83,7 @@ sub check {
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_channelEntry}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_channelEntry}, instance => $instance);
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{channelComponentStatus}->{oid}}, instance => $instance); my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $self->{results}->{$mapping2->{channelComponentStatus}->{oid}}, instance => $instance);
my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{$mapping3->{channelBusType}->{oid}}, instance => $instance); my $result3 = $self->{snmp}->map_instance(mapping => $mapping3, results => $self->{results}->{$mapping3->{channelBusType}->{oid}}, instance => $instance);
$result3->{channelBusType} = defined($result3->{channelBusType}) ? $result3->{channelBusType} : '-';
next if ($self->check_exclude(section => 'connector', instance => $instance)); next if ($self->check_exclude(section => 'connector', instance => $instance));

View File

@ -85,7 +85,8 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Cpu '%s' status is '%s' [instance: %s, manufacturer name: %s, brand name: %s, state: %s, speed: %s]", $self->{output}->output_add(long_msg => sprintf("Cpu '%s' status is '%s' [instance: %s, manufacturer name: %s, brand name: %s, state: %s, speed: %s]",
$instance, $result->{processorDeviceStatus}, $instance, $instance, $result->{processorDeviceStatus}, $instance,
$result2->{processorDeviceManufacturerName}, $result4->{processorDeviceBrandName}, $result2->{processorDeviceManufacturerName},
defined($result4->{processorDeviceBrandName}) ? $result4->{processorDeviceBrandName} : '-',
$result2->{processorDeviceStatusState}, $result3->{processorDeviceCurrentSpeed} $result2->{processorDeviceStatusState}, $result3->{processorDeviceCurrentSpeed}
)); ));
my $exit = $self->get_severity(section => 'cpu', value => $result->{processorDeviceStatus}); my $exit = $self->get_severity(section => 'cpu', value => $result->{processorDeviceStatus});

View File

@ -107,7 +107,8 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Physical Disk '%s' status is '%s' [instance: %s, state: %s, spare state: %s, smart alert: %s]", $self->{output}->output_add(long_msg => sprintf("Physical Disk '%s' status is '%s' [instance: %s, state: %s, spare state: %s, smart alert: %s]",
$result->{arrayDiskName}, $result4->{arrayDiskComponentStatus}, $instance, $result->{arrayDiskName}, $result4->{arrayDiskComponentStatus}, $instance,
$result2->{arrayDiskState}, $result3->{arrayDiskSpareState}, $result5->{arrayDiskSmartAlertIndication} $result2->{arrayDiskState}, $result3->{arrayDiskSpareState},
defined($result5->{arrayDiskSmartAlertIndication}) ? $result5->{arrayDiskSmartAlertIndication} : '-'
)); ));
my $exit = $self->get_severity(section => 'physicaldisk', value => $result4->{arrayDiskComponentStatus}); my $exit = $self->get_severity(section => 'physicaldisk', value => $result4->{arrayDiskComponentStatus});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
@ -116,6 +117,7 @@ sub check {
$result->{arrayDiskName}, $result4->{arrayDiskComponentStatus})); $result->{arrayDiskName}, $result4->{arrayDiskComponentStatus}));
} }
if (defined($result5->{arrayDiskSmartAlertIndication})) {
$exit = $self->get_severity(section => 'physicaldisk_smartalert', value => $result5->{arrayDiskSmartAlertIndication}); $exit = $self->get_severity(section => 'physicaldisk_smartalert', value => $result5->{arrayDiskSmartAlertIndication});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
@ -124,5 +126,6 @@ sub check {
} }
} }
} }
}
1; 1;

View File

@ -100,7 +100,8 @@ sub check {
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is '%s' [instance: %s, location: %s, type: %s, output watts: %s, state: %s, configuration error: %s]", $self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is '%s' [instance: %s, location: %s, type: %s, output watts: %s, state: %s, configuration error: %s]",
$instance, $result->{powerSupplyStatus}, $instance, $instance, $result->{powerSupplyStatus}, $instance,
$result->{powerSupplyLocationName}, $result->{powerSupplyType}, $result->{powerSupplyOutputWatts}, $result->{powerSupplyLocationName}, $result->{powerSupplyType},
defined($result->{powerSupplyOutputWatts}) ? $result->{powerSupplyOutputWatts} : '-',
$result2->{powerSupplySensorState}, $result2->{powerSupplyConfigurationErrorType} $result2->{powerSupplySensorState}, $result2->{powerSupplyConfigurationErrorType}
)); ));
my $exit = $self->get_severity(section => 'psu', value => $result->{powerSupplyStatus}); my $exit = $self->get_severity(section => 'psu', value => $result->{powerSupplyStatus});

View File

@ -23,18 +23,26 @@ package hardware::server::ibm::bladecenter::snmp::mode::components::ambient;
use strict; use strict;
use warnings; use warnings;
# In MIB 'mmblade.mib'
my $oid_temperature = '.1.3.6.1.4.1.2.3.51.2.2.1'; my $oid_temperature = '.1.3.6.1.4.1.2.3.51.2.2.1';
my $oid_end = '.1.3.6.1.4.1.2.3.51.2.2.1.5';
my $oid_rearLEDCardTempMax = '.1.3.6.1.4.1.2.3.51.2.2.1.5.3.0';
# In MIB 'mmblade.mib' and 'cme.mib'
my $oids = { my $oids = {
bladecenter => {
mm => '.1.3.6.1.4.1.2.3.51.2.2.1.1.2.0', mm => '.1.3.6.1.4.1.2.3.51.2.2.1.1.2.0',
frontpanel => '.1.3.6.1.4.1.2.3.51.2.2.1.5.1.0', frontpanel => '.1.3.6.1.4.1.2.3.51.2.2.1.5.1.0',
frontpanel2 => '.1.3.6.1.4.1.2.3.51.2.2.1.5.2.0', frontpanel2 => '.1.3.6.1.4.1.2.3.51.2.2.1.5.2.0',
},
pureflex => {
ambient => '.1.3.6.1.4.1.2.3.51.2.2.1.5.1.0', # rearLEDCardTempAvg
}
}; };
sub load { sub load {
my (%options) = @_; my (%options) = @_;
push @{$options{request}}, { oid => $oid_temperature }; push @{$options{request}}, { oid => $oid_temperature, end => $oid_end };
} }
sub check { sub check {
@ -44,9 +52,16 @@ sub check {
$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_exclude(section => 'ambient'));
foreach my $temp (('mm', 'frontpanel', 'frontpanel2')) { my @sensors = ('mm', 'frontpanel', 'frontpanel2');
if (!defined($self->{results}->{$oid_temperature}->{$oids->{$temp}}) || my $label = 'bladecenter';
$self->{results}->{$oid_temperature}->{$oids->{$temp}} !~ /([0-9\.]+)/) { if (defined($self->{results}->{$oid_temperature}->{$oid_rearLEDCardTempMax})) {
@sensors = ('ambient');
$label = 'pureflex';
}
foreach my $temp (@sensors) {
if (!defined($self->{results}->{$oid_temperature}->{$oids->{$label}->{$temp}}) ||
$self->{results}->{$oid_temperature}->{$oids->{$label}->{$temp}} !~ /([0-9\.]+)/) {
$self->{output}->output_add(long_msg => sprintf("skip ambient '%s': no values", $self->{output}->output_add(long_msg => sprintf("skip ambient '%s': no values",
$temp)); $temp));
next; next;

View File

@ -48,7 +48,7 @@ my %map_blade_power_state = (
4 => 'hibernate', 4 => 'hibernate',
); );
# In MIB 'CPQSTDEQ-MIB.mib' # In MIB 'mmblade.mib' and 'cme.mib'
my $mapping = { my $mapping = {
bladeId => { oid => '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2' }, bladeId => { oid => '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2' },
bladeExists => { oid => '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3', map => \%map_blade_exists }, bladeExists => { oid => '.1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3', map => \%map_blade_exists },
@ -77,8 +77,10 @@ sub check {
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_exclude(section => 'blade', instance => $result->{bladeId}));
next if ($result->{bladeExists} =~ /No/i && if ($result->{bladeExists} =~ /false/i) {
$self->absent_problem(section => 'blade', instance => $result->{bladeId})); $self->{output}->output_add(long_msg => "skipping blade '" . $instance . "' : not exits");
next;
}
$self->{components}->{blade}->{total}++; $self->{components}->{blade}->{total}++;
if ($result->{bladePowerState} =~ /off/) { if ($result->{bladePowerState} =~ /off/) {

View File

@ -0,0 +1,86 @@
#
# Copyright 2015 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::ibm::bladecenter::snmp::mode::components::chassisfan;
use strict;
use warnings;
my %map_state = (
0 => 'unknown',
1 => 'good',
2 => 'warning',
3 => 'bad',
);
# In MIB 'mmblade.mib' and 'cme.mib'
my $mapping = {
chassisFanState => { oid => '.1.3.6.1.4.1.2.3.51.2.2.3.50.1.4', map => \%map_state },
chassisFanSpeedRPM => { oid => '.1.3.6.1.4.1.2.3.51.2.2.3.50.1.5' },
};
my $oid_chassisFansEntry = '.1.3.6.1.4.1.2.3.51.2.2.3.50.1';
sub load {
my (%options) = @_;
push @{$options{request}}, { oid => $oid_chassisFansEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking chassis fan");
$self->{components}->{chassisfan} = {name => 'chassis fan', total => 0, skip => 0};
return if ($self->check_exclude(section => 'chassisfan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_chassisFansEntry}})) {
next if ($oid !~ /^$mapping->{chassisFanState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_chassisFansEntry}, instance => $instance);
next if ($self->check_exclude(section => 'chassisfan', instance => $instance));
$self->{components}->{chassisfan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Chassis fan '%s' is %s rpm [status: %s, instance: %s]",
$instance, $result->{chassisFanSpeedRPM}, $result->{chassisFanState},
$instance));
my $exit = $self->get_severity(section => 'chassisfan', value => $result->{chassisFanState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Chassis fan '%s' status is %s",
$instance, $result->{chassisFanState}));
}
if (defined($result->{chassisFanSpeedRPM}) && $result->{chassisFanSpeedRPM} =~ /[0-9]/) {
my ($exit2, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'chassisfan', instance => $instance, value => $result->{chassisFanSpeedRPM});
if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit2,
short_msg => sprintf("Chassis fan '%s' speed is %s rpm", $instance, $result->{chassisFanSpeedRPM}));
}
$self->{output}->perfdata_add(label => "chassisfan_" . $instance, unit => 'rpm',
value => $result->{chassisFanSpeedRPM},
warning => $warn,
critical => $crit,
min => 0);
}
}
}
1;

View File

@ -23,7 +23,7 @@ package hardware::server::ibm::bladecenter::snmp::mode::components::chassisstatu
use strict; use strict;
use warnings; use warnings;
# In MIB 'mmblade.mib' # In MIB 'mmblade.mib' and 'cme.mib'
my $oid_mmBistAndChassisStatus = '.1.3.6.1.4.1.2.3.51.2.2.5.2'; my $oid_mmBistAndChassisStatus = '.1.3.6.1.4.1.2.3.51.2.2.5.2';
my $oid_bistLogicalNetworkLink = '.1.3.6.1.4.1.2.3.51.2.2.5.2.30.0'; my $oid_bistLogicalNetworkLink = '.1.3.6.1.4.1.2.3.51.2.2.5.2.30.0';
my $oids = { my $oids = {

View File

@ -0,0 +1,95 @@
#
# Copyright 2015 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::ibm::bladecenter::snmp::mode::components::fanpack;
use strict;
use warnings;
my %map_state = (
0 => 'unknown',
1 => 'good',
2 => 'warning',
3 => 'bad',
);
my %map_exists = (
0 => 'false',
1 => 'true',
);
# In MIB 'mmblade.mib' and 'cme.mib'
my $mapping = {
fanPackExists => { oid => '.1.3.6.1.4.1.2.3.51.2.2.6.1.1.2', map => \%map_exists },
fanPackState => { oid => '.1.3.6.1.4.1.2.3.51.2.2.6.1.1.3', map => \%map_state },
fanPackAverageSpeedRPM => { oid => '.1.3.6.1.4.1.2.3.51.2.2.6.1.1.6' },
};
my $oid_fanPackEntry = '.1.3.6.1.4.1.2.3.51.2.2.6.1.1';
sub load {
my (%options) = @_;
push @{$options{request}}, { oid => $oid_fanPackEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking fanpack");
$self->{components}->{fanpack} = {name => 'fanpacks', total => 0, skip => 0};
return if ($self->check_exclude(section => 'fanpack'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanPackEntry}})) {
next if ($oid !~ /^$mapping->{fanPackState}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_fanPackEntry}, instance => $instance);
if ($result->{fanPackExists} =~ /false/i) {
$self->{output}->output_add(long_msg => "skipping fanpack '" . $instance . "' : not exits");
next;
}
next if ($self->check_exclude(section => 'fanpack', instance => $instance));
$self->{components}->{fanpack}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fanpack '%s' is %s rpm [status: %s, instance: %s]",
$instance, $result->{fanPackAverageSpeedRPM}, $result->{fanPackState},
$instance));
my $exit = $self->get_severity(section => 'fanpack', value => $result->{fanPackState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fanpack '%s' status is %s",
$instance, $result->{fanPackState}));
}
if (defined($result->{fanPackAverageSpeedRPM}) && $result->{fanPackAverageSpeedRPM} =~ /[0-9]/) {
my ($exit2, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fanpack', instance => $instance, value => $result->{fanPackAverageSpeedRPM});
if (!$self->{output}->is_status(value => $exit2, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit2,
short_msg => sprintf("Fanpack '%s' speed is %s rpm", $instance, $result->{fanPackAverageSpeedRPM}));
}
$self->{output}->perfdata_add(label => "fanpack_" . $instance, unit => 'rpm',
value => $result->{fanPackAverageSpeedRPM},
warning => $warn,
critical => $crit,
min => 0);
}
}
}
1;

View File

@ -35,7 +35,7 @@ my %map_pw_exists = (
1 => 'true', 1 => 'true',
); );
# In MIB 'CPQSTDEQ-MIB.mib' # In MIB 'mmblade.mib' and 'cme.mib'
my $mapping = { my $mapping = {
powerModuleExists => { oid => '.1.3.6.1.4.1.2.3.51.2.2.4.1.1.2', map => \%map_pw_exists }, powerModuleExists => { oid => '.1.3.6.1.4.1.2.3.51.2.2.4.1.1.2', map => \%map_pw_exists },
powerModuleState => { oid => '.1.3.6.1.4.1.2.3.51.2.2.4.1.1.3', map => \%map_pw_state }, powerModuleState => { oid => '.1.3.6.1.4.1.2.3.51.2.2.4.1.1.3', map => \%map_pw_state },

View File

@ -0,0 +1,71 @@
#
# Copyright 2015 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::ibm::bladecenter::snmp::mode::components::switchmodule;
use strict;
use warnings;
my %map_state = (
0 => 'unknown',
1 => 'good',
2 => 'warning',
3 => 'bad',
);
# In MIB 'mmblade.mib' and 'cme.mib'
my $mapping = {
smHealthState => { oid => '.1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15', map => \%map_state },
};
sub load {
my (%options) = @_;
push @{$options{request}}, { oid => $mapping->{smHealthState}->{oid} };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking switch module");
$self->{components}->{switchmodule} = {name => 'switch modules', total => 0, skip => 0};
return if ($self->check_exclude(section => 'switchmodule'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{smHealthState}->{oid}}})) {
$oid =~ /^$mapping->{smHealthState}->{oid}\.(.*)/;
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{smHealthState}->{oid}}, instance => $instance);
next if ($self->check_exclude(section => 'switchmodule', instance => $instance));
$self->{components}->{switchmodule}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Switch module '%s' status is %s [instance: %s]",
$instance, $result->{smHealthState},
$instance));
my $exit = $self->get_severity(section => 'switchmodule', value => $result->{smHealthState});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Switch module '%s' status is %s",
$instance, $result->{smHealthState}));
}
}
}
1;

View File

@ -23,7 +23,7 @@ package hardware::server::ibm::bladecenter::snmp::mode::components::systemhealth
use strict; use strict;
use warnings; use warnings;
# In MIB 'mmblade.mib' # In MIB 'mmblade.mib' and 'cme.mib'
my $oid_systemHealthStat = '.1.3.6.1.4.1.2.3.51.2.2.7.1'; my $oid_systemHealthStat = '.1.3.6.1.4.1.2.3.51.2.2.7.1';
my %map_systemhealth_state = ( my %map_systemhealth_state = (

View File

@ -42,12 +42,30 @@ my $thresholds = {
['warning', 'WARNING'], ['warning', 'WARNING'],
['notAvailable', 'UNKNOWN'], ['notAvailable', 'UNKNOWN'],
], ],
fanpack => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
chassisfan => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blower => [ blower => [
['unknown', 'UNKNOWN'], ['unknown', 'UNKNOWN'],
['good', 'OK'], ['good', 'OK'],
['warning', 'WARNING'], ['warning', 'WARNING'],
['bad', 'CRITICAL'], ['bad', 'CRITICAL'],
], ],
switchmodule => [
['unknown', 'UNKNOWN'],
['good', 'OK'],
['warning', 'WARNING'],
['bad', 'CRITICAL'],
],
blowerctrl => [ blowerctrl => [
['unknown', 'UNKNOWN'], ['unknown', 'UNKNOWN'],
['operational', 'OK'], ['operational', 'OK'],
@ -132,8 +150,8 @@ sub check_options {
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
my ($section, $regexp, $value) = ($1, $2, $3); my ($section, $regexp, $value) = ($1, $2, $3);
if ($section !~ /(blower|ambient)/) { if ($section !~ /(blower|ambient|fanpack|chassisfan)/) {
$self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "' (type must be: blower or ambient)."); $self->{output}->add_option_msg(short_msg => "Wrong $option option '" . $val . "' (type must be: blower, fanpack, chassisfan or ambient).");
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
my $position = 0; my $position = 0;
@ -156,7 +174,7 @@ sub run {
$self->{snmp} = $options{snmp}; $self->{snmp} = $options{snmp};
my $snmp_request = []; my $snmp_request = [];
my @components = ('ambient', 'powermodule', 'blade', 'blower', 'systemhealth', 'chassisstatus'); my @components = ('ambient', 'powermodule', 'blade', 'blower', 'fanpack', 'chassisfan', 'systemhealth', 'chassisstatus', 'switchmodule');
foreach (@components) { foreach (@components) {
if (/$self->{option_results}->{component}/) { if (/$self->{option_results}->{component}/) {
my $mod_name = "hardware::server::ibm::bladecenter::snmp::mode::components::$_"; my $mod_name = "hardware::server::ibm::bladecenter::snmp::mode::components::$_";
@ -289,14 +307,15 @@ __END__
=head1 MODE =head1 MODE
Check Hardware (Ambient temperatures, Blowers, Power modules, Blades, System Health, Chassis status). Check Hardware (Ambient temperatures, Blowers, Power modules, Blades, System Health, Chassis status, Fanpack).
=over 8 =over 8
=item B<--component> =item B<--component>
Which component to check (Default: 'all'). Which component to check (Default: 'all').
Can be: 'ambient', 'powermodule', 'blower', 'blade', 'systemhealth', 'chassisstatus'. Can be: 'ambient', 'powermodule', 'fanpack', 'chassisfan',
'blower', 'blade', 'systemhealth', 'chassisstatus', 'switchmodule'.
=item B<--exclude> =item B<--exclude>

View File

@ -44,6 +44,6 @@ __END__
=head1 PLUGIN DESCRIPTION =head1 PLUGIN DESCRIPTION
Check IBM Chassis BladeCenter (H, HT, T) in SNMP. Check IBM Chassis BladeCenter (H, HT, T, Pureflex) in SNMP.
=cut =cut

View File

@ -0,0 +1,74 @@
#
# Copyright 2015 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 network::3com::snmp::mode::components::fan;
use strict;
use warnings;
my %map_status = (
1 => 'active',
2 => 'deactive',
3 => 'not-install',
4 => 'unsupport',
);
# In MIB 'a3com-huawei-splat-devm'
my $mapping = {
hwDevMFanStatus => { oid => '.1.3.6.1.4.1.43.45.1.2.23.1.9.1.1.1.2', map => \%map_status },
};
my $oid_hwdevMFanStatusEntry = '.1.3.6.1.4.1.43.45.1.2.23.1.9.1.1.1';
sub load {
my (%options) = @_;
push @{$options{request}}, { oid => $oid_hwdevMFanStatusEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking fans");
$self->{components}->{fan} = {name => 'fans', total => 0, skip => 0};
return if ($self->check_filter(section => 'fan'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_hwdevMFanStatusEntry}})) {
next if ($oid !~ /^$mapping->{hwDevMFanStatus}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_hwdevMFanStatusEntry}, instance => $instance);
next if ($result->{hwDevMFanStatus} =~ /not-install/i &&
$self->absent_problem(section => 'fan', instance => $instance));
next if ($self->check_filter(section => 'fan', instance => $instance));
$self->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan '%s' status is '%s' [instance: %s]",
$instance, $result->{hwDevMFanStatus},
$instance));
my $exit = $self->get_severity(section => 'fan', value => $result->{hwDevMFanStatus});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fan '%s' status is %s",
$instance, $result->{hwDevMFanStatus}));
}
}
}
1;

View File

@ -0,0 +1,74 @@
#
# Copyright 2015 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 network::3com::snmp::mode::components::psu;
use strict;
use warnings;
my %map_status = (
1 => 'active',
2 => 'deactive',
3 => 'not-install',
4 => 'unsupport',
);
# In MIB 'a3com-huawei-splat-devm'
my $mapping = {
hwDevMPowerStatus => { oid => '.1.3.6.1.4.1.43.45.1.2.23.1.9.1.2.1.2', map => \%map_status },
};
my $oid_hwdevMPowerStatusEntry = '.1.3.6.1.4.1.43.45.1.2.23.1.9.1.2.1';
sub load {
my (%options) = @_;
push @{$options{request}}, { oid => $oid_hwdevMPowerStatusEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'psus', total => 0, skip => 0};
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_hwdevMPowerStatusEntry}})) {
next if ($oid !~ /^$mapping->{hwDevMPowerStatus}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_hwdevMPowerStatusEntry}, instance => $instance);
next if ($result->{hwDevMPowerStatus} =~ /not-install/i &&
$self->absent_problem(section => 'psu', instance => $instance));
next if ($self->check_filter(section => 'psu', instance => $instance));
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is '%s' [instance: %s]",
$instance, $result->{hwDevMPowerStatus},
$instance));
my $exit = $self->get_severity(section => 'psu', value => $result->{hwDevMPowerStatus});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Power supply '%s' status is %s",
$instance, $result->{hwDevMPowerStatus}));
}
}
}
1;

View File

@ -0,0 +1,229 @@
#
# Copyright 2015 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 network::3com::snmp::mode::cpu;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $instance_mode;
my $maps_counters = {
cpu => {
'000_5s' => {
set => {
key_values => [ { name => 'usage_5s' }, { name => 'display' } ],
output_template => '%s %% (5sec)', output_error_template => "%s (5sec)",
perfdatas => [
{ label => 'cpu_5s', value => 'usage_5s_absolute', template => '%d',
unit => '%', min => 0, max => 100 },
],
},
},
'001_1m' => {
set => {
key_values => [ { name => 'usage_1m' }, { name => 'display' } ],
output_template => '%s %% (1m)', output_error_template => "%s (1min)",
perfdatas => [
{ label => 'cpu_1m', value => 'usage_1m_absolute', template => '%d',
unit => '%', min => 0, max => 100 },
],
},
},
'002_5m' => {
set => {
key_values => [ { name => 'usage_5m' }, { name => 'display' } ],
output_template => '%s %% (5min)', output_error_template => "%s (5min)",
perfdatas => [
{ label => 'cpu_5m', value => 'usage_5m_absolute', template => '%d',
unit => '%', min => 0, max => 100 },
],
},
},
}
};
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 =>
{
});
foreach my $key (('cpu')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('cpu')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
$instance_mode = $self;
}
sub run_instances {
my ($self, %options) = @_;
my $multiple = 1;
if (scalar(keys %{$self->{cpu}}) == 1) {
$multiple = 0;
}
if ($multiple == 1) {
$self->{output}->output_add(severity => 'OK',
short_msg => 'All CPU usages are ok');
}
foreach my $id (sort keys %{$self->{cpu}}) {
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits = ();
foreach (sort keys %{$maps_counters->{cpu}}) {
my $obj = $maps_counters->{cpu}->{$_}->{obj};
$obj->set(instance => $id);
my ($value_check) = $obj->execute(values => $self->{cpu}->{$id});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata(extra_instance => $multiple);
}
my $prefix = "CPU Usage ";
if ($multiple == 1) {
$prefix = sprintf("CPU '%s' Usage ", $self->{cpu}->{$id}->{display});
}
$self->{output}->output_add(long_msg => "${prefix}$long_msg");
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "${prefix}$short_msg"
);
}
if ($multiple == 0) {
$self->{output}->output_add(short_msg => "${prefix}$long_msg");
}
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
$self->run_instances();
$self->{output}->display();
$self->{output}->exit();
}
my $mapping = {
hwCpuCostRate => { oid => '.1.3.6.1.4.1.43.45.1.6.1.1.1.2' },
hwCpuCostRatePer1Min => { oid => '.1.3.6.1.4.1.43.45.1.6.1.1.1.3' },
hwCpuCostRatePer5Min => { oid => '.1.3.6.1.4.1.43.45.1.6.1.1.1.4' },
};
sub manage_selection {
my ($self, %options) = @_;
# a3com-huawei-splat-devm.mib
my $oid_hwCpuEntry = '.1.3.6.1.4.1.43.45.1.6.1.1.1';
my $results = $options{snmp}->get_table(oid => $oid_hwCpuEntry, nothing_quit => 1);
$self->{cpu} = {};
foreach my $oid (keys %{$results}) {
next if ($oid !~ /^$mapping->{hwCpuCostRatePer5Min}->{oid}\.(.*)/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results, instance => $instance);
$self->{cpu}->{$instance} = { display => $instance,
usage_5s => $result->{hwCpuCostRate},
usage_1m => $result->{hwCpuCostRatePer1Min},
usage_5m => $result->{hwCpuCostRatePer5Min},
};
}
if (scalar(keys %{$self->{cpu}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No entry found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check cpu usages.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: '5s', '1m', '5m'.
=item B<--critical-*>
Threshold critical.
Can be: '5s', '1m', '5m'.
=back
=cut

View File

@ -0,0 +1,275 @@
#
# Copyright 2015 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 network::3com::snmp::mode::hardware;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::misc;
my $thresholds = {
fan => [
['active', 'OK'],
['deactive', 'CRITICAL'],
['not-install', 'OK'],
['unsupport', 'WARNING'],
],
psu => [
['active', 'OK'],
['deactive', 'CRITICAL'],
['not-install', 'OK'],
['unsupport', 'WARNING'],
],
};
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 =>
{
"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' },
});
$self->{components} = {};
$self->{no_components} = undef;
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (defined($self->{option_results}->{no_component})) {
if ($self->{option_results}->{no_component} ne '') {
$self->{no_components} = $self->{option_results}->{no_component};
} else {
$self->{no_components} = 'critical';
}
}
$self->{filter} = [];
foreach my $val (@{$self->{option_results}->{filter}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
push @{$self->{filter}}, { filter => $values[0], instance => $values[1] };
}
$self->{absent_problem} = [];
foreach my $val (@{$self->{option_results}->{absent_problem}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
push @{$self->{absent_problem}}, { filter => $values[0], instance => $values[1] };
}
$self->{overload_th} = {};
foreach my $val (@{$self->{option_results}->{threshold_overload}}) {
next if (!defined($val) || $val eq '');
my @values = split (/,/, $val);
if (scalar(@values) < 3) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'.");
$self->{output}->option_exit();
}
my ($section, $instance, $status, $filter);
if (scalar(@values) == 3) {
($section, $status, $filter) = @values;
$instance = '.*';
} else {
($section, $instance, $status, $filter) = @values;
}
if ($section !~ /^psu|fan$/) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload section '" . $val . "'.");
$self->{output}->option_exit();
}
if ($self->{output}->is_litteral_status(status => $status) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'.");
$self->{output}->option_exit();
}
$self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section}));
push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status, instance => $instance };
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
my $snmp_request = [];
my @components = ('psu', 'fan');
foreach (@components) {
if (/$self->{option_results}->{component}/) {
my $mod_name = "network::3com::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 = "network::3com::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 {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i &&
(!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) {
$status = $_->{status};
return $status;
}
}
}
my $label = defined($options{label}) ? $options{label} : $options{section};
foreach (@{$thresholds->{$label}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
=head1 MODE
Check Hardware (Power Supply, Fan).
=over 8
=item B<--component>
Which component to check (Default: '.*').
Can be: 'fan', 'psu'.
=item B<--filter>
Exclude some parts (comma seperated list) (Example: --filter=fan)
Can also exclude specific instance: --filter=fan,1
=item B<--absent-problem>
Return an error if an entity is not 'present' (default is skipping) (comma seperated list)
Can be specific or global: --absent-problem=fan,2
=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='fan,CRITICAL,^(?!(active)$)'
=back
=cut

View File

@ -0,0 +1,250 @@
#
# Copyright 2015 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 network::3com::snmp::mode::memory;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $instance_mode;
my $maps_counters = {
mem => {
'000_usage' => {
set => {
key_values => [ { name => 'display' }, { name => 'total' }, { name => 'used' } ],
closure_custom_calc => \&custom_usage_calc,
closure_custom_output => \&custom_usage_output,
closure_custom_perfdata => \&custom_usage_perfdata,
closure_custom_threshold_check => \&custom_usage_threshold,
},
},
}
};
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
if (!defined($options{extra_instance}) || $options{extra_instance} != 0) {
$extra_label .= '_' . $self->{result_values}->{display};
}
$self->{output}->perfdata_add(label => 'used' . $extra_label, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my $msg = sprintf("Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$total_size_value . " " . $total_size_unit,
$total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used},
$total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'};
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
return 0;
}
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 =>
{
});
foreach my $key (('mem')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('mem')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
$instance_mode = $self;
}
sub run_instances {
my ($self, %options) = @_;
my $multiple = 1;
if (scalar(keys %{$self->{mem}}) == 1) {
$multiple = 0;
}
if ($multiple == 1) {
$self->{output}->output_add(severity => 'OK',
short_msg => 'All memory usages are ok');
}
foreach my $id (sort keys %{$self->{mem}}) {
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits = ();
foreach (sort keys %{$maps_counters->{mem}}) {
my $obj = $maps_counters->{mem}->{$_}->{obj};
$obj->set(instance => $id);
my ($value_check) = $obj->execute(values => $self->{mem}->{$id});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata(extra_instance => $multiple);
}
my $prefix = '';
if ($multiple == 1) {
$prefix = sprintf("Memory '%s' ", $self->{mem}->{$id}->{display});
}
$self->{output}->output_add(long_msg => "${prefix}$long_msg");
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "${prefix}$short_msg"
);
}
if ($multiple == 0) {
$self->{output}->output_add(short_msg => "${prefix}$long_msg");
}
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
$self->run_instances();
$self->{output}->display();
$self->{output}->exit();
}
my $mapping = {
hwMemSize => { oid => '.1.3.6.1.4.1.43.45.1.6.1.2.1.1.2' },
hwMemFree => { oid => '.1.3.6.1.4.1.43.45.1.6.1.2.1.1.3' },
};
sub manage_selection {
my ($self, %options) = @_;
# a3com-huawei-splat-devm.mib
my $oid_hwMemEntry = '.1.3.6.1.4.1.43.45.1.6.1.2.1.1';
my $results = $options{snmp}->get_table(oid => $oid_hwMemEntry, nothing_quit => 1);
$self->{mem} = {};
foreach my $oid (keys %{$results}) {
next if ($oid !~ /^$mapping->{hwMemSize}->{oid}\.(.*)/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results, instance => $instance);
my $total = $result->{hwMemSize};
my $used = $result->{hwMemSize} - $result->{hwMemFree};
$self->{mem}->{$instance} = { display => $instance, used => $used, total => $total };
}
if (scalar(keys %{$self->{mem}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No entry found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check memory usages.
=over 8
=item B<--warning-usage>
Threshold warning (in percent).
=item B<--critical-usage>
Threshold critical (in percent).
=back
=cut

View File

@ -0,0 +1,52 @@
#
# Copyright 2015 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 network::3com::snmp::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_snmp);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'cpu' => 'network::3com::snmp::mode::cpu',
'hardware' => 'network::3com::snmp::mode::hardware',
'interfaces' => 'snmp_standard::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'memory' => 'network::3com::snmp::mode::memory',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check 3com equipment (old legacy. Maybe you should use 'network::h3c' plugin) in SNMP.
=cut

View File

@ -118,7 +118,8 @@ sub component {
# Skipping short msg when no components # Skipping short msg when no components
next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0); next if ($self->{components}->{$comp}->{total} == 0 && $self->{components}->{$comp}->{skip} == 0);
$total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip}; $total_components += $self->{components}->{$comp}->{total} + $self->{components}->{$comp}->{skip};
$display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . '/' . $self->{components}->{$comp}->{skip} . ' ' . $self->{components}->{$comp}->{name}; 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 = ', '; $display_by_component_append = ', ';
} }

View File

@ -61,7 +61,7 @@ sub check {
my $instance = $1; my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_deviceDiskValueEntry}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_deviceDiskValueEntry}, instance => $instance);
next if ($result->{deviceDiskStatus} !~ /notpresent/i && next if ($result->{deviceDiskStatus} =~ /notpresent/i &&
$self->absent_problem(section => 'disk', instance => $instance)); $self->absent_problem(section => 'disk', instance => $instance));
next if ($self->check_filter(section => 'disk', instance => $instance)); next if ($self->check_filter(section => 'disk', instance => $instance));
$self->{components}->{disk}->{total}++; $self->{components}->{disk}->{total}++;
@ -72,7 +72,7 @@ sub check {
my $exit = $self->get_severity(section => 'disk', value => $result->{deviceDiskStatus}); my $exit = $self->get_severity(section => 'disk', value => $result->{deviceDiskStatus});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => sprintf("Sensor '%s' operational status is %s", short_msg => sprintf("Disk '%s' status is %s",
$result->{deviceDiskSerialN}, $result->{deviceDiskStatus})); $result->{deviceDiskSerialN}, $result->{deviceDiskStatus}));
} }
} }

View File

@ -0,0 +1,189 @@
#
# Copyright 2015 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 network::citrix::netscaler::common::mode::connections;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $maps_counters = {
global => {
'000_active' => { set => {
key_values => [ { name => 'active' } ],
output_template => 'Active Server TCP connections : %s',
perfdatas => [
{ label => 'active_server', value => 'active_absolute', template => '%s',
unit => 'con', min => 0 },
],
}
},
'001_server' => { set => {
key_values => [ { name => 'server' } ],
output_template => 'Server TCP connections : %s',
perfdatas => [
{ label => 'server', value => 'server_absolute', template => '%s',
unit => 'con', min => 0 },
],
}
},
'002_client' => { set => {
key_values => [ { name => 'client' } ],
output_template => 'Client TCP connections : %s',
perfdatas => [
{ label => 'client', value => 'client_absolute', template => '%s',
unit => 'con', min => 0 },
],
}
},
},
};
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 =>
{
});
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output},
perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
}
sub run_global {
my ($self, %options) = @_;
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits;
foreach (sort keys %{$maps_counters->{global}}) {
my $obj = $maps_counters->{global}->{$_}->{obj};
$obj->set(instance => 'global');
my ($value_check) = $obj->execute(values => $self->{global});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata();
}
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "$short_msg"
);
} else {
$self->{output}->output_add(short_msg => "$long_msg");
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->manage_selection();
$self->run_global();
$self->{output}->display();
$self->{output}->exit();
}
sub manage_selection {
my ($self, %options) = @_;
$self->{global} = { client => 0, server => 0, active => 0 };
my $oid_tcpCurServerConn = '.1.3.6.1.4.1.5951.4.1.1.46.1.0';
my $oid_tcpCurClientConn = '.1.3.6.1.4.1.5951.4.1.1.46.2.0';
my $oid_tcpActiveServerConn = '.1.3.6.1.4.1.5951.4.1.1.46.8.0';
my $result = $self->{snmp}->get_leef(oids => [$oid_tcpCurServerConn, $oid_tcpCurClientConn, $oid_tcpActiveServerConn ], nothing_quit => 1);
$self->{global}->{client} = $result->{$oid_tcpCurClientConn};
$self->{global}->{server} = $result->{$oid_tcpCurServerConn};
$self->{global}->{active} = $result->{$oid_tcpActiveServerConn};
}
1;
__END__
=head1 MODE
Check connections usage (Client, Server, ActiveServer) (NS-ROOT-MIBv2).
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'server', 'active', 'client'.
=item B<--critical-*>
Threshold critical.
Can be: 'server', 'active', 'client'.
=back
=cut

View File

@ -42,6 +42,7 @@ sub new {
'list-vservers' => 'network::citrix::netscaler::common::mode::listvservers', 'list-vservers' => 'network::citrix::netscaler::common::mode::listvservers',
'vserver-status' => 'network::citrix::netscaler::common::mode::vserverstatus', 'vserver-status' => 'network::citrix::netscaler::common::mode::vserverstatus',
'memory' => 'network::citrix::netscaler::common::mode::memory', 'memory' => 'network::citrix::netscaler::common::mode::memory',
'connections' => 'network::citrix::netscaler::common::mode::connections',
); );
return $self; return $self;

View File

@ -0,0 +1,100 @@
#
# Copyright 2015 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 network::digi::portserverts::snmp::mode::cpu;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
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 =>
{
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
# Between 0 and 255 (don't know why you can value over 100)
my $oid_processorCurrentUtilization = '.1.3.6.1.4.1.332.11.5.3.3.21.11.0';
my $result = $self->{snmp}->get_leef(oids => [$oid_processorCurrentUtilization], nothing_quit => 1);
my $exit = $self->{perfdata}->threshold_check(value => $result->{$oid_processorCurrentUtilization},
threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("CPU Usage : %.2f", $result->{$oid_processorCurrentUtilization}));
$self->{output}->perfdata_add(label => "cpu",
value => $result->{$oid_processorCurrentUtilization},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0);
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check current processor usage.
=over 8
=item B<--warning>
Threshold warning.
=item B<--critical>
Threshold critical.
=back
=cut

View File

@ -0,0 +1,204 @@
#
# Copyright 2015 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 network::digi::portserverts::snmp::mode::memory;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $maps_counters = {
global => {
'000_usage' => { set => {
key_values => [ { name => 'free' }, { name => 'total' } ],
closure_custom_calc => \&custom_usage_calc,
closure_custom_output => \&custom_usage_output,
closure_custom_perfdata => \&custom_usage_perfdata,
closure_custom_threshold_check => \&custom_usage_threshold,
}
},
},
};
sub custom_usage_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => 'used', unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my $msg = sprintf("Memory Usage Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$total_size_value . " " . $total_size_unit,
$total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used},
$total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_total'} - $options{new_datas}->{$self->{instance} . '_free'};
$self->{result_values}->{free} = $options{new_datas}->{$self->{instance} . '_free'};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
return 0;
}
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 =>
{
});
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
}
sub run {
my ($self, %options) = @_;
$self->{snmp} = $options{snmp};
$self->manage_selection();
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits;
foreach (sort keys %{$maps_counters->{global}}) {
my $obj = $maps_counters->{global}->{$_}->{obj};
use Data::Dumper;
Data::Dumper::Dumper($obj);
$obj->set(instance => 'global');
my ($value_check) = $obj->execute(values => $self->{global});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata();
}
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "$short_msg"
);
} else {
$self->{output}->output_add(short_msg => "$long_msg");
}
$self->{output}->display();
$self->{output}->exit();
}
sub manage_selection {
my ($self, %options) = @_;
my $oid_memoryTotalMemory = '.1.3.6.1.4.1.332.11.5.3.3.22.11.0';
my $oid_memoryAvailable = '.1.3.6.1.4.1.332.11.5.3.3.22.12.0';
my $result = $self->{snmp}->get_leef(oids => [$oid_memoryTotalMemory, $oid_memoryAvailable],
nothing_quit => 1);
$self->{global} = { free => $result->{$oid_memoryAvailable}, total => $result->{$oid_memoryTotalMemory} };
}
1;
__END__
=head1 MODE
Check memory usage.
=over 8
=item B<--warning-usage>
Threshold warning (in percent).
=item B<--critical-usage>
Threshold critical (in percent).
=back
=cut

View File

@ -0,0 +1,52 @@
#
# Copyright 2015 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 network::digi::portserverts::snmp::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_snmp);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
# $options->{options} = options object
$self->{version} = '1.0';
%{$self->{modes}} = (
'cpu' => 'network::digi::portserverts::snmp::mode::cpu',
'interfaces' => 'snmp_standard::mode::interfaces',
'list-interfaces' => 'snmp_standard::mode::listinterfaces',
'memory' => 'network::digi::portserverts::snmp::mode::memory',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Digi PortServer TS equipments in SNMP.
=cut

View File

@ -48,7 +48,7 @@ my $maps_counters = {
}, },
'002_30secs' => { set => { '002_30secs' => { set => {
key_values => [ { name => 'extremeCpuMonitorSystemUtilization30secs' }, { name => 'num' }, ], key_values => [ { name => 'extremeCpuMonitorSystemUtilization30secs' }, { name => 'num' }, ],
output_template => '10 seconds : %.2f %%', output_template => '30 seconds : %.2f %%',
perfdatas => [ perfdatas => [
{ label => 'cpu_30secs', value => 'extremeCpuMonitorSystemUtilization30secs_absolute', template => '%.2f', { label => 'cpu_30secs', value => 'extremeCpuMonitorSystemUtilization30secs_absolute', template => '%.2f',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' }, min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' },
@ -57,7 +57,7 @@ my $maps_counters = {
}, },
'003_1min' => { set => { '003_1min' => { set => {
key_values => [ { name => 'extremeCpuMonitorSystemUtilization1min' }, { name => 'num' }, ], key_values => [ { name => 'extremeCpuMonitorSystemUtilization1min' }, { name => 'num' }, ],
output_template => '10 seconds : %.2f %%', output_template => '1 minute : %.2f %%',
perfdatas => [ perfdatas => [
{ label => 'cpu_1min', value => 'extremeCpuMonitorSystemUtilization1min_absolute', template => '%.2f', { label => 'cpu_1min', value => 'extremeCpuMonitorSystemUtilization1min_absolute', template => '%.2f',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' }, min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' },
@ -66,7 +66,7 @@ my $maps_counters = {
}, },
'004_5min' => { set => { '004_5min' => { set => {
key_values => [ { name => 'extremeCpuMonitorSystemUtilization5mins' }, { name => 'num' }, ], key_values => [ { name => 'extremeCpuMonitorSystemUtilization5mins' }, { name => 'num' }, ],
output_template => '10 seconds : %.2f %%', output_template => '5 minutes : %.2f %%',
perfdatas => [ perfdatas => [
{ label => 'cpu_5min', value => 'extremeCpuMonitorSystemUtilization5mins_absolute', template => '%.2f', { label => 'cpu_5min', value => 'extremeCpuMonitorSystemUtilization5mins_absolute', template => '%.2f',
min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' }, min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'num_absolute' },

View File

@ -52,7 +52,6 @@ my $maps_counters = {
}, },
}; };
sub custom_threshold_output { sub custom_threshold_output {
my ($self, %options) = @_; my ($self, %options) = @_;

View File

@ -57,6 +57,7 @@ sub check {
foreach my $instance (sort $self->get_instance_class(class => { $options{component_class} => 1 })) { foreach my $instance (sort $self->get_instance_class(class => { $options{component_class} => 1 })) {
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance);
next if (!defined($result->{EntityExtErrorStatus}));
next if ($self->check_exclude(section => $options{component}, instance => $instance)); next if ($self->check_exclude(section => $options{component}, instance => $instance));
if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) { if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) {
$self->absent_problem(section => $options{component}, instance => $instance); $self->absent_problem(section => $options{component}, instance => $instance);

View File

@ -45,6 +45,7 @@ sub check {
foreach my $instance (sort $self->get_instance_class(class => { 7 => 1 })) { foreach my $instance (sort $self->get_instance_class(class => { 7 => 1 })) {
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance);
next if (!defined($result->{EntityExtErrorStatus}));
next if ($self->check_exclude(section => 'fan', instance => $instance)); next if ($self->check_exclude(section => 'fan', instance => $instance));
if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) { if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) {
$self->absent_problem(section => 'fan', instance => $instance); $self->absent_problem(section => 'fan', instance => $instance);

View File

@ -45,6 +45,7 @@ sub check {
foreach my $instance (sort $self->get_instance_class(class => { 6 => 1 }) ) { foreach my $instance (sort $self->get_instance_class(class => { 6 => 1 }) ) {
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance);
next if (!defined($result->{EntityExtErrorStatus}));
next if ($self->check_exclude(section => 'psu', instance => $instance)); next if ($self->check_exclude(section => 'psu', instance => $instance));
if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) { if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) {
$self->absent_problem(section => 'psu', instance => $instance); $self->absent_problem(section => 'psu', instance => $instance);

View File

@ -58,6 +58,7 @@ sub check {
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance); my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$self->{branch} . '.19'}, instance => $instance);
my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $results, instance => $instance); my $result2 = $self->{snmp}->map_instance(mapping => $mapping2, results => $results, instance => $instance);
next if (!defined($result->{EntityExtErrorStatus}));
next if ($self->check_exclude(section => 'sensor', instance => $instance)); next if ($self->check_exclude(section => 'sensor', instance => $instance));
if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) { if ($result->{EntityExtErrorStatus} =~ /entityAbsent/i) {
$self->absent_problem(section => 'sensor', instance => $instance); $self->absent_problem(section => 'sensor', instance => $instance);

View File

@ -34,7 +34,9 @@ sub new {
$options{options}->add_options(arguments => $options{options}->add_options(arguments =>
{ {
"warning:s" => { name => 'warning', }, "warning:s" => { name => 'warning', },
"warning-failed:s" => { name => 'warning_failed', },
"critical:s" => { name => 'critical', }, "critical:s" => { name => 'critical', },
"critical-failed:s" => { name => 'critical_failed', },
}); });
return $self; return $self;
@ -52,6 +54,14 @@ sub check_options {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit(); $self->{output}->option_exit();
} }
if (($self->{perfdata}->threshold_validate(label => 'warning-failed', value => $self->{option_results}->{warning_failed})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-failed threshold '" . $self->{option_results}->{warning_failed} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-failed', value => $self->{option_results}->{critical_failed})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-failed threshold '" . $self->{option_results}->{critical_failed} . "'.");
$self->{output}->option_exit();
}
} }
sub run { sub run {
@ -61,26 +71,40 @@ sub run {
my $oid_nsResSessAllocate = '.1.3.6.1.4.1.3224.16.3.2.0'; my $oid_nsResSessAllocate = '.1.3.6.1.4.1.3224.16.3.2.0';
my $oid_nsResSessMaxium = '.1.3.6.1.4.1.3224.16.3.3.0'; my $oid_nsResSessMaxium = '.1.3.6.1.4.1.3224.16.3.3.0';
my $oid_nsResSessFailed = '.1.3.6.1.4.1.3224.16.3.4.0';
my $result = $self->{snmp}->get_leef(oids => [$oid_nsResSessAllocate, $oid_nsResSessMaxium], nothing_quit => 1); my $result = $self->{snmp}->get_leef(oids => [$oid_nsResSessAllocate, $oid_nsResSessMaxium, $oid_nsResSessFailed], nothing_quit => 1);
my $spu_done = 0; my $spu_done = 0;
my $cp_total = $result->{$oid_nsResSessMaxium}; my $cp_total = $result->{$oid_nsResSessMaxium};
my $cp_used = $result->{$oid_nsResSessAllocate}; my $cp_used = $result->{$oid_nsResSessAllocate};
my $cp_failed = $result->{$oid_nsResSessFailed};
my $prct_used = $cp_used * 100 / $cp_total; my $prct_used = $cp_used * 100 / $cp_total;
my $prct_failed = $cp_failed * 100 / $cp_total;
$spu_done = 1; $spu_done = 1;
my $exit_code = $self->{perfdata}->threshold_check(value => $prct_used,
my $exit_used = $self->{perfdata}->threshold_check(value => $prct_used,
threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit_code, my $exit_failed = $self->{perfdata}->threshold_check(value => $prct_failed,
threshold => [ { label => 'critical-failed', 'exit_litteral' => 'critical' }, { label => 'warning-failed', exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit_used,
short_msg => sprintf("%.2f%% of the sessions limit reached (%d of max. %d)", short_msg => sprintf("%.2f%% of the sessions limit reached (%d of max. %d)",
$prct_used, $cp_used, $cp_total)); $prct_used, $cp_used, $cp_total));
$self->{output}->output_add(severity => $exit_failed,
short_msg => sprintf("%.2f%% of failed sessions (%d of max. %d)",
$prct_failed, $cp_failed, $cp_total));
$self->{output}->perfdata_add(label => 'sessions', $self->{output}->perfdata_add(label => 'sessions',
value => $cp_used, value => $cp_used,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $cp_total, cast_int => 1), warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $cp_total, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $cp_total, cast_int => 1), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $cp_total, cast_int => 1),
min => 0, max => $cp_total); min => 0, max => $cp_total);
$self->{output}->perfdata_add(label => 'sessions_failed',
value => $cp_failed,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-failed', total => $cp_total, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-failed', total => $cp_total, cast_int => 1),
min => 0, max => $cp_total);
if ($spu_done == 0) { if ($spu_done == 0) {
$self->{output}->add_option_msg(short_msg => "Cannot check sessions usage (no total values)."); $self->{output}->add_option_msg(short_msg => "Cannot check sessions usage (no total values).");
@ -95,19 +119,25 @@ sub run {
__END__ __END__
=head1 MODE Check Juniper sessions usage and failed sessions (NETSCREEN-RESOURCE-MIB).
Check Juniper sessions usage (NETSCREEN-RESOURCE-MIB).
=over 8 =over 8
=item B<--warning> =item B<--warning>
Threshold warning in percent. Threshold warning (percentage).
=item B<--critical> =item B<--critical>
Threshold critical in percent. Threshold critical (percentage).
=item B<--warning-failed>
Threshold warning on failed sessions (percentage).
=item B<--critical-failed>
Threshold critical in failed sessions (percentage).
=back =back

View File

@ -46,10 +46,13 @@ sub new {
"command-options:s" => { name => 'command_options', default => '' }, "command-options:s" => { name => 'command_options', default => '' },
"error-type:s" => { name => 'error_type' }, "error-type:s" => { name => 'error_type' },
"error-class:s" => { name => 'error_class' }, "error-class:s" => { name => 'error_class' },
"error-id:s" => { name => 'error_id' },
"retention:s" => { name => 'retention' }, "retention:s" => { name => 'retention' },
"timezone:s" => { name => 'timezone' }, "timezone:s" => { name => 'timezone' },
"description" => { name => 'description' }, "description" => { name => 'description' },
"filter-resource:s" => { name => 'filter_resource' }, "filter-resource:s" => { name => 'filter_resource' },
"filter-id:s" => { name => 'filter_id' },
"exclude-id:s" => { name => 'exclude_id' },
}); });
$self->{result} = {}; $self->{result} = {};
return $self; return $self;
@ -58,6 +61,11 @@ sub new {
sub check_options { sub check_options {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->SUPER::init(%options); $self->SUPER::init(%options);
if (defined($self->{option_results}->{exclude_id}) && defined($self->{option_results}->{error_id})) {
$self->{output}->add_option_msg(short_msg => "Please use --error-id OR --exclude-id, these options are mutually exclusives");
$self->{output}->option_exit();
}
} }
sub manage_selection { sub manage_selection {
@ -70,6 +78,12 @@ sub manage_selection {
if (defined($self->{option_results}->{error_class})){ if (defined($self->{option_results}->{error_class})){
$extra_options .= ' -d '.$self->{option_results}->{error_class}; $extra_options .= ' -d '.$self->{option_results}->{error_class};
} }
if (defined($self->{option_results}->{error_id}) && $self->{option_results}->{error_id} ne ''){
$extra_options.= ' -j '.$self->{option_results}->{error_id};
}
if (defined($self->{option_results}->{exclude_id}) && $self->{option_results}->{exclude_id} ne ''){
$extra_options.= ' -k '.$self->{option_results}->{exclude_id};
}
if (defined($self->{option_results}->{retention}) && $self->{option_results}->{retention} ne ''){ if (defined($self->{option_results}->{retention}) && $self->{option_results}->{retention} ne ''){
my $retention = time() - $self->{option_results}->{retention}; my $retention = time() - $self->{option_results}->{retention};
if (defined($self->{option_results}->{timezone})){ if (defined($self->{option_results}->{timezone})){
@ -126,7 +140,7 @@ sub run {
$self->manage_selection(); $self->manage_selection();
$self->{output}->output_add(severity => 'OK', $self->{output}->output_add(severity => 'OK',
short_msg => sprintf("No error found since %s seconds%s.", $extra_message)); short_msg => sprintf("No error found%s.", $extra_message));
my $total_error = 0; my $total_error = 0;
foreach my $errpt_error (sort(keys %{$self->{result}})) { foreach my $errpt_error (sort(keys %{$self->{result}})) {
@ -138,7 +152,8 @@ sub run {
next if (defined($self->{option_results}->{filter_resource}) && $self->{option_results}->{filter_resource} ne '' && next if (defined($self->{option_results}->{filter_resource}) && $self->{option_results}->{filter_resource} ne '' &&
$resource_name !~ /$self->{option_results}->{filter_resource}/); $resource_name !~ /$self->{option_results}->{filter_resource}/);
next if (defined($self->{option_results}->{filter_id}) && $self->{option_results}->{filter_id} ne '' &&
$identifier !~ /$self->{option_results}->{filter_id}/);
$total_error++; $total_error++;
if (defined($self->{option_results}->{description})) { if (defined($self->{option_results}->{description})) {
$self->{output}->output_add(long_msg => sprintf("Error '%s' Date: %s ResourceName: %s Description: %s", $identifier, $self->{output}->output_add(long_msg => sprintf("Error '%s' Date: %s ResourceName: %s Description: %s", $identifier,
@ -213,19 +228,29 @@ Filter error type separated by a coma (INFO, PEND, PERF, PERM, TEMP, UNKN).
Filter error class ('H' for hardware, 'S' for software, '0' for errlogger, 'U' for undetermined). Filter error class ('H' for hardware, 'S' for software, '0' for errlogger, 'U' for undetermined).
=item B<--error-id>
Filter specific error code (can be a comma separated list).
=item B<--retention> =item B<--retention>
Retention time of errors in seconds. Retention time of errors in seconds.
=item B<--description> =item B<--verbose>
Print error description in output. Print error description in long output. [ Error 'CODE' Date: Timestamp ResourceName: RsrcName Description: Desc ]
=item B<--filter-resource> =item B<--filter-resource>
Filter resource (can use a regexp). Filter resource (can use a regexp).
Set =item B<--filter-id>
Filter error code (can use a regexp).
=item B<--exclude-id>
Filter on specific error code (can be a comma separated list).
=back =back

View File

@ -117,6 +117,29 @@ my $maps_counters = {
} }
}, },
}, },
sum => {
'000_sum-read-write' => { set => {
key_values => [ { name => 'sum_read_write', diff => 1 } ],
per_second => 1,
output_template => 'R+W I/O : %s %s/s', output_error_template => "R+W I/O : %s",
output_change_bytes => 1,
perfdatas => [
{ label => 'sum_read_write', value => 'sum_read_write_per_second', template => '%d',
unit => 'B/s', min => 0 },
],
}
},
'001_sum-read-write-iops' => { set => {
key_values => [ { name => 'sum_read_write_iops', diff => 1 } ],
per_second => 1,
output_template => 'R+W IOPs : %.2f', output_error_template => "R+W IOPs : %s",
perfdatas => [
{ label => 'sum_read_write_iops', value => 'sum_read_write_iops_per_second', template => '%.2f',
unit => 'iops', min => 0 },
],
}
},
},
}; };
my $oid_diskIODevice = '.1.3.6.1.4.1.2021.13.15.1.1.2'; my $oid_diskIODevice = '.1.3.6.1.4.1.2021.13.15.1.1.2';
@ -142,7 +165,7 @@ sub new {
$self->{device_id_selected} = {}; $self->{device_id_selected} = {};
$self->{statefile_value} = centreon::plugins::statefile->new(%options); $self->{statefile_value} = centreon::plugins::statefile->new(%options);
foreach my $key (('total', 'disk')) { foreach my $key (('total', 'disk', 'sum')) {
foreach (keys %{$maps_counters->{$key}}) { foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/; my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) { if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
@ -165,7 +188,7 @@ sub check_options {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->SUPER::init(%options); $self->SUPER::init(%options);
foreach my $key (('total', 'disk')) { foreach my $key (('total', 'disk', 'sum')) {
foreach (keys %{$maps_counters->{$key}}) { foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
} }
@ -209,16 +232,57 @@ sub check_total {
my $exit = $self->{output}->get_most_critical(status => [ @exits ]); my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit, $self->{output}->output_add(severity => $exit,
short_msg => "Total $short_msg" short_msg => "All devices [$short_msg]"
); );
} else { } else {
$self->{output}->output_add(short_msg => "Total $long_msg"); $self->{output}->output_add(short_msg => "All devices [$long_msg]");
}
}
sub check_sum {
my ($self, %options) = @_;
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits = ();
foreach (sort keys %{$maps_counters->{sum}}) {
my $obj = $maps_counters->{sum}->{$_}->{obj};
$obj->set(instance => 'sum');
my ($value_check) = $obj->execute(values => $self->{sum_global},
new_datas => $self->{new_datas});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata();
}
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "Server overall [$short_msg]"
);
} else {
$self->{output}->output_add(short_msg => "Server overall [$long_msg]");
} }
} }
sub run { sub run {
my ($self, %options) = @_; my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp}; $self->{snmp} = $options{snmp};
$self->{hostname} = $self->{snmp}->get_hostname(); $self->{hostname} = $self->{snmp}->get_hostname();
$self->{snmp_port} = $self->{snmp}->get_port(); $self->{snmp_port} = $self->{snmp}->get_port();
@ -241,6 +305,7 @@ sub run {
if ($multiple == 1) { if ($multiple == 1) {
$self->check_total(); $self->check_total();
$self->check_sum();
$self->{output}->output_add(severity => 'OK', $self->{output}->output_add(severity => 'OK',
short_msg => 'All devices are ok.'); short_msg => 'All devices are ok.');
} }
@ -288,6 +353,7 @@ sub run {
} }
} }
$self->{statefile_value}->write(data => $self->{new_datas}); $self->{statefile_value}->write(data => $self->{new_datas});
$self->{output}->display(); $self->{output}->display();
$self->{output}->exit(); $self->{output}->exit();
@ -314,12 +380,20 @@ sub add_result {
$self->{device_id_selected}->{$options{instance}}->{write_iops} = $self->{results}->{$oid_diskIOWrites}->{$oid_diskIOWrites . '.' . $options{instance}}; $self->{device_id_selected}->{$options{instance}}->{write_iops} = $self->{results}->{$oid_diskIOWrites}->{$oid_diskIOWrites . '.' . $options{instance}};
$self->{global}->{total_write_iops} += $self->{device_id_selected}->{$options{instance}}->{write_iops}; $self->{global}->{total_write_iops} += $self->{device_id_selected}->{$options{instance}}->{write_iops};
} }
if ($self->{global}->{total_read} && $self->{global}->{total_write}) {
$self->{sum_global}->{sum_read_write} = $self->{global}->{total_read} + $self->{global}->{total_write};
}
if ($self->{global}->{total_read_iops} && $self->{global}->{total_write_iops}) {
$self->{sum_global}->{sum_read_write_iops} = $self->{global}->{total_read_iops} + $self->{global}->{total_write_iops};
}
} }
sub manage_selection { sub manage_selection {
my ($self, %options) = @_; my ($self, %options) = @_;
$self->{global} = { total_read => 0, total_write => 0, total_read_iops => 0, total_write_iops => 0 }; $self->{global} = { total_read => 0, total_write => 0, total_read_iops => 0, total_write_iops => 0 };
$self->{sum_global} = { sum_read_write => 0, sum_read_write_iops => 0 };
$self->{results} = $self->{snmp}->get_multiple_table(oids => [ $self->{results} = $self->{snmp}->get_multiple_table(oids => [
{ oid => $oid_diskIODevice }, { oid => $oid_diskIODevice },
{ oid => $oid_diskIOReads }, { oid => $oid_diskIOReads },
@ -340,7 +414,7 @@ sub manage_selection {
$oid =~ /\.(\d+)$/; $oid =~ /\.(\d+)$/;
my $instance = $1; my $instance = $1;
my $filter_name = $self->{results}->{$oid_diskIODevice}->{$oid}; my $filter_name = $self->{results}->{$oid_diskIODevice}->{$oid};
if (!defined($self->{option_results}->{device})) { if (!defined($self->{option_results}->{device}) || $self->{option_results}->{device} eq '') {
$self->add_result(instance => $instance); $self->add_result(instance => $instance);
next; next;
} }
@ -400,13 +474,15 @@ Check read/write I/O disks (bytes per secondes, IOPs).
Threshold warning. Threshold warning.
Can be: 'read', 'write', 'read-iops', 'write-iops', Can be: 'read', 'write', 'read-iops', 'write-iops',
'total-read', 'total-write', 'total-read-iops', 'total-write-iops'. 'total-read', 'total-write', 'total-read-iops', 'total-write-iops',
'sum-read-write', 'sum-read-write-iops'.
=item B<--critical-*> =item B<--critical-*>
Threshold critical. Threshold critical.
Can be: 'read', 'write', 'read-iops', 'write-iops', Can be: 'read', 'write', 'read-iops', 'write-iops',
'total-read', 'total-write', 'total-read-iops', 'total-write-iops'. 'total-read', 'total-write', 'total-read-iops', 'total-write-iops',
'sum-read-write', 'sum-read-write-iops'.
=item B<--device> =item B<--device>

View File

@ -35,6 +35,7 @@ sub new {
'numeric-value' => 'snmp_standard::mode::numericvalue', 'numeric-value' => 'snmp_standard::mode::numericvalue',
'string-value' => 'snmp_standard::mode::stringvalue', 'string-value' => 'snmp_standard::mode::stringvalue',
'dynamic-command' => 'snmp_standard::mode::dynamiccommand', 'dynamic-command' => 'snmp_standard::mode::dynamiccommand',
'uptime' => 'snmp_standard::mode::uptime',
); );
return $self; return $self;
@ -46,6 +47,6 @@ __END__
=head1 PLUGIN DESCRIPTION =head1 PLUGIN DESCRIPTION
Check SNMP values (string, numeric or execute commands). Check SNMP values (string, numeric or execute commands) or standard (uptime).
=cut =cut

View File

@ -0,0 +1,231 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::custom::xtremioapi;
use strict;
use warnings;
use centreon::plugins::http;
use JSON;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
# $options{options} = options object
# $options{output} = output object
# $options{exit_value} = integer
# $options{noptions} = integer
if (!defined($options{output})) {
print "Class Custom: Need to specify 'output' argument.\n";
exit 3;
}
if (!defined($options{options})) {
$options{output}->add_option_msg(short_msg => "Class Custom: Need to specify 'options' argument.");
$options{output}->option_exit();
}
if (!defined($options{noptions})) {
$options{options}->add_options(arguments =>
{
"hostname:s@" => { name => 'hostname', },
"xtremio-username:s@" => { name => 'xtremio_username', },
"xtremio-password:s@" => { name => 'xtremio_password', },
"proxyurl:s@" => { name => 'proxyurl', },
"timeout:s@" => { name => 'timeout', },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
# Method to manage multiples
sub set_options {
my ($self, %options) = @_;
# options{options_result}
$self->{option_results} = $options{option_results};
}
# Method to manage multiples
sub set_defaults {
my ($self, %options) = @_;
# options{default}
# Manage default value
foreach (keys %{$options{default}}) {
if ($_ eq $self->{mode}) {
for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) {
foreach my $opt (keys %{$options{default}->{$_}[$i]}) {
if (!defined($self->{option_results}->{$opt}[$i])) {
$self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt};
}
}
}
}
}
}
sub check_options {
my ($self, %options) = @_;
# # return 1 = ok still hostname
# # return 0 = no hostname left
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef;
$self->{xtremio_username} = (defined($self->{option_results}->{xtremio_username})) ? shift(@{$self->{option_results}->{xtremio_username}}) : '';
$self->{xtremio_password} = (defined($self->{option_results}->{xtremio_password})) ? shift(@{$self->{option_results}->{xtremio_password}}) : '';
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10;
$self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef;
if (!defined($self->{hostname})) {
$self->{output}->add_option_msg(short_msg => "Need to specify hostname option.");
$self->{output}->option_exit();
}
if (!defined($self->{xtremio_username}) || !defined($self->{xtremio_password})) {
$self->{output}->add_option_msg(short_msg => "Need to specify --xtremio-username and --xtremio-password options.");
$self->{output}->option_exit();
}
if (!defined($self->{hostname}) ||
scalar(@{$self->{option_results}->{hostname}}) == 0) {
return 0;
}
return 1;
}
sub build_options_for_httplib {
my ($self, %options) = @_;
$self->{option_results}->{hostname} = $self->{xtremio_username}.':'.$self->{xtremio_password}.'@'.$self->{hostname};
$self->{option_results}->{timeout} = $self->{timeout};
$self->{option_results}->{port} = 443;
$self->{option_results}->{proto} = 'https';
$self->{option_results}->{proxyurl} = $self->{proxyurl};
}
sub settings {
my ($self, %options) = @_;
$self->build_options_for_httplib();
$self->{http}->set_options(%{$self->{option_results}});
}
sub get_items {
my ($self, %options) = @_;
$self->settings();
if (defined($options{obj}) && $options{obj} ne '') {
$options{url} .= $options{obj} . '/';
}
my $response = $self->{http}->request(url_path => $options{url});
my $decoded;
eval {
$decoded = decode_json($response);
};
if ($@) {
$self->{output}->add_option_msg(short_msg => "Cannot decode json response");
$self->{output}->option_exit();
}
my @items;
foreach my $context (@{$decoded->{$options{obj}}}) {
push @items,$context->{name};
}
return @items;
}
sub get_details {
my ($self, %options) = @_;
$self->settings();
if ((defined($options{obj}) && $options{obj} ne '') && (defined($options{name}) && $options{name} ne '')) {
$options{url} .= $options{obj} . '/?name=' . $options{name} ;
}
my $response = $self->{http}->request(url_path => $options{url});
my $decoded;
eval {
$decoded = decode_json($response);
};
if ($@) {
$self->{output}->add_option_msg(short_msg => "Cannot decode json response");
$self->{output}->option_exit();
}
return $decoded->{content};
}
1;
__END__
=head1 NAME
XREMIO REST API
=head1 SYNOPSIS
Xtremio Rest API custom mode
=head1 REST API OPTIONS
=over 8
=item B<--hostname>
Xtremio hostname.
=item B<--xtremio-username>
Xtremio username.
=item B<--xtremio-password>
Xtremio password.
=item B<--proxyurl>
Proxy URL if any
=item B<--timeout>
Set HTTP timeout
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -0,0 +1,216 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::mode::clusterhealth;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
my $thresholds = {
'consistency-state' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'free-ud-ssd-space-level' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'shared-memory-efficiency-level' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'free-ud-ssd-space-level' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'vaai-tp-limit-crossing' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'shared-memory-in-use-ratio-level' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
'sys-health-state' => [
['healthy', 'OK'],
['.*', 'CRITICAL'],
],
};
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"filter:s@" => { name => 'filter' },
"threshold-overload:s@" => { name => 'threshold_overload' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
$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->{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 (!defined $thresholds->{$section}) {
$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) = @_;
my $xtremio = $options{custom};
my $urlbase = '/api/json/types/';
my @items = $xtremio->get_items(url => $urlbase,
obj => 'clusters');
my @sensors = ('consistency-state','shared-memory-efficiency-level','free-ud-ssd-space-level',
'vaai-tp-limit-crossing', 'shared-memory-in-use-ratio-level', 'sys-health-state');
$self->{output}->output_add(severity => 'OK',
short_msg => 'Health is OK');
foreach my $item (@items) {
next if ($self->check_filter(section => 'cluster', instance => $item));
my $details = $xtremio->get_details(url => $urlbase,
obj => 'clusters',
name => $item);
foreach my $sensor (@sensors) {
$self->{output}->output_add(long_msg => sprintf("Sensor '%s' state is '%s'",
$sensor, $details->{$sensor}));
my $exit = $self->get_severity(section => $sensor, value => $details->{$sensor});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Sensor '%s' state is '%s'",
$sensor, $details->{$sensor}));
}
}
}
$self->{output}->display();
$self->{output}->exit();
}
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 {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i &&
(!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) {
$status = $_->{status};
return $status;
}
}
}
my $label = defined($options{label}) ? $options{label} : $options{section};
foreach (@{$thresholds->{$label}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
=head1 MODE
Check cluster health indicators ('consistency-state','shared-memory-efficiency-level','free-ud-ssd-space-level', 'vaai-tp-limit-crossing', 'shared-memory-in-use-ratio-level', 'sys-health-state');
=over 8
=item B<--filter>
Filter some parts (comma seperated list)
Can also exclude specific instance: --filter=cluster,CLUSTER-NAME
=item B<--threshold-overload>
Overload a specific threshold, e.g --threshold-overload="consistency-state,Xtremio,CRITICAL,healthy"
=back
=cut

View File

@ -0,0 +1,148 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::mode::ssdendurance;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"filter:s@" => { name => 'filter' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
$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] };
}
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
my $xtremio = $options{custom};
my $urlbase = '/api/json/types/';
my @items = $xtremio->get_items(url => $urlbase,
obj => 'ssds');
$self->{output}->output_add(severity => 'OK',
short_msg => 'All SSDs Endurance are OK');
foreach my $item (@items) {
next if ($self->check_filter(section => 'ssds', instance => $item));
my $details = $xtremio->get_details(url => $urlbase,
obj => 'ssds',
name => $item);
$self->{output}->output_add(long_msg => sprintf("SSD '%s' endurance remaining is %i%%",
$item, $details->{'percent-endurance-remaining'}));
my $exit = $self->{perfdata}->threshold_check(value => $details->{'percent-endurance-remaining'},
threshold => [ { label => 'warning', exit_litteral => 'warning' }, { label => 'critical', exit_litteral => 'critical' } ]);
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("SSD '%s' endurance is %i%%",
$item, $details->{'percent-endurance-remaining'}));
}
$self->{output}->perfdata_add(label => $item . "_endurance", unit => '%',
value => $details->{'percent-endurance-remaining'},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0, max => 100);
}
$self->{output}->display();
$self->{output}->exit();
}
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;
}
1;
__END__
=head1 MODE
Check SSDs endurance level (100% is the best value)
=over 8
=item B<--filter>
Filter some parts (comma seperated list)
Can also exclude specific instance: --filter=ssds,SSD-NAME-NUMBER
=item B<--warning>
Warning trigger for SSD endurance
=item B<--critical>
Critical trigger for SSD endurance
=back
=cut

View File

@ -0,0 +1,217 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::mode::ssdiops;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $maps_counters = {
ssd => {
'000_global' => { set => {
key_values => [ { name => 'global_iops' }, { name => 'display' }, ],
output_template => 'Global IOPs : %s',
perfdatas => [
{ label => 'global_iops', value => 'global_iops_absolute', template => '%s',
min => 0, unit => 'iops', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
'001_read' => { set => {
key_values => [ { name => 'read_iops' }, { name => 'display' }, ],
output_template => 'Read IOPs : %s',
perfdatas => [
{ label => 'read_iops', value => 'read_iops_absolute', template => '%s',
min => 0, unit => 'iops', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
'002_write' => { set => {
key_values => [ { name => 'write_iops' }, { name => 'display' }, ],
output_template => 'Write IOPs : %s',
perfdatas => [
{ label => 'write_iops', value => 'write_iops_absolute', template => '%s',
min => 0, unit => 'iops', label_extra_instance => 1, instance_use => 'display_absolute' },
],
}
},
},
};
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 =>
{
"filter-name:s" => { name => 'filter_name' },
});
foreach my $key (('ssd')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('ssd')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
}
sub run {
my ($self, %options) = @_;
$self->{xtremio} = $options{custom};
$self->manage_selection();
my $multiple = 1;
if (scalar(keys %{$self->{ssd}}) == 1) {
$multiple = 0;
}
if ($multiple == 1) {
$self->{output}->output_add(severity => 'OK',
short_msg => 'All SSDs usages are ok');
}
foreach my $id (sort keys %{$self->{ssd}}) {
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits = ();
foreach (sort keys %{$maps_counters->{ssd}}) {
my $obj = $maps_counters->{ssd}->{$_}->{obj};
$obj->set(instance => $id);
my ($value_check) = $obj->execute(values => $self->{ssd}->{$id});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata(extra_instance => $multiple);
}
$self->{output}->output_add(long_msg => "SSD '" . $self->{ssd}->{$id}->{display} . "' Usage $long_msg");
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "SSD '" . $self->{ssd}->{$id}->{display} . "' Usage $short_msg"
);
}
if ($multiple == 0) {
$self->{output}->output_add(short_msg => "SSD '" . $self->{ssd}->{$id}->{display} . "' Usage $long_msg");
}
}
$self->{output}->display();
$self->{output}->exit();
}
sub manage_selection {
my ($self, %options) = @_;
$self->{ssd} = {};
my $urlbase = '/api/json/types/';
my @items = $self->{xtremio}->get_items(url => $urlbase,
obj => 'ssds');
foreach my $item (@items) {
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$item !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "Skipping '" . $item . "': no matching name.", debug => 1);
next;
}
my $details = $self->{xtremio}->get_details(url => $urlbase,
obj => 'ssds',
name => $item);
$self->{ssd}->{$item} = { display => $item, global_iops => $details->{iops},
read_iops => $details->{'rd-iops'}, write_iops => $details->{'wr-iops'} };
}
if (scalar(keys %{$self->{ssd}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No entry found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check IOPS (Global, Read, Write) on each SSDs.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'global' (%), 'read' (%), 'write' (%).
=item B<--critical-*>
Threshold critical.
Can be: 'global' (%), 'read' (%), 'write' (%).
=item B<--filter-name>
Filter SSD name (can be a regexp).
=back
=cut

View File

@ -0,0 +1,149 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::mode::xenvscpu;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"filter:s@" => { name => 'filter' },
"warning:s" => { name => 'warning' },
"critical:s" => { name => 'critical' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
$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] };
}
if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit();
}
}
sub run {
my ($self, %options) = @_;
my $xtremio = $options{custom};
my $urlbase = '/api/json/types/';
my @items = $xtremio->get_items(url => $urlbase,
obj => 'xenvs');
$self->{output}->output_add(severity => 'OK',
short_msg => 'All Xenvs CPU Usage are OK');
foreach my $item (@items) {
next if ($self->check_filter(section => 'cpu', instance => $item));
my $details = $xtremio->get_details(url => $urlbase,
obj => 'xenvs',
name => $item);
$self->{output}->output_add(long_msg => sprintf("Xenvs '%s' CPU Usage is %i%%",
$item,
$details->{'cpu-usage'}));
my $exit = $self->{perfdata}->threshold_check(value => $details->{'cpu-usage'}, threshold => [ { label => 'warning', 'exit_litteral' => 'warning' }, { label => 'critical', exit_litteral => 'critical' } ]);
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Xenvs '%s' cpu-Usage is %i%%",
$item,
$details->{'cpu-usage'}));
}
$self->{output}->perfdata_add(label => 'cpu_' . $item, unit => '%',
value => $details->{'cpu-usage'},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
min => 0, max => 100);
}
$self->{output}->display();
$self->{output}->exit();
}
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;
}
1;
__END__
=head1 MODE
Check Xenvs CPU usage
=over 8
=item B<--filter>
Filter some parts (comma seperated list)
Can also exclude specific instance: --filter=cpu,XENVS-NAME-NUMBER
=item B<--warning>
Value to trigger a warning alarm on CPU usage
=item B<--critical>
Value to trigger a critical alarm on CPU usage
=back
=cut

View File

@ -0,0 +1,188 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::mode::xenvsstate;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
my $thresholds = {
xenvs_state => [
['active', 'OK'],
['.*', 'CRITICAL'],
],
};
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.1';
$options{options}->add_options(arguments =>
{
"filter:s@" => { name => 'filter' },
"threshold-overload:s@" => { name => 'threshold_overload' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
$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->{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 (!defined $thresholds->{$section}) {
$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) = @_;
my $xtremio = $options{custom};
my $urlbase = '/api/json/types/';
my @items = $xtremio->get_items(url => $urlbase,
obj => 'xenvs');
$self->{output}->output_add(severity => 'OK',
short_msg => 'All Xenvs states are active');
foreach my $item (@items) {
next if ($self->check_filter(section => 'state', instance => $item));
my $details = $xtremio->get_details(url => $urlbase,
obj => 'xenvs',
name => $item);
$self->{output}->output_add(long_msg => sprintf("Xenvs '%s' state is '%s'",
$item,
$details->{'xenv-state'}));
my $exit = $self->get_severity(section => 'xenvs_state', instance => $item, value => $details->{'xenv-state'});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Xenvs '%s' state is '%s'",
$item, $details->{'xenv-state'}));
}
}
$self->{output}->display();
$self->{output}->exit();
}
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 {
my ($self, %options) = @_;
my $status = 'UNKNOWN'; # default
if (defined($self->{overload_th}->{$options{section}})) {
foreach (@{$self->{overload_th}->{$options{section}}}) {
if ($options{value} =~ /$_->{filter}/i &&
(!defined($options{instance}) || $options{instance} =~ /$_->{instance}/)) {
$status = $_->{status};
return $status;
}
}
}
my $label = defined($options{label}) ? $options{label} : $options{section};
foreach (@{$thresholds->{$label}}) {
if ($options{value} =~ /$$_[0]/i) {
$status = $$_[1];
return $status;
}
}
return $status;
}
1;
__END__
=head1 MODE
Check Xenvs state
=over 8
=item B<--filter>
Filter some parts (comma seperated list)
Can also exclude specific instance: --filter=device,cluster-1_xxxx
=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='xenvs_state,CRITICAL,^(?!(ok)$)'
=back
=cut

View File

@ -0,0 +1,58 @@
#
# Copyright 2015 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 storage::emc::xtremio::restapi::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_custom);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
# $options->{options} = options object
$self->{version} = '1.0';
%{$self->{modes}} = (
'xenvs-cpu' => 'storage::emc::xtremio::restapi::mode::xenvscpu',
'xenvs-state' => 'storage::emc::xtremio::restapi::mode::xenvsstate',
'ssds-endurance' => 'storage::emc::xtremio::restapi::mode::ssdendurance',
'ssds-iops' => 'storage::emc::xtremio::restapi::mode::ssdiops',
'cluster-health' => 'storage::emc::xtremio::restapi::mode::clusterhealth',
);
$self->{custom_modes}{xtremioapi} = 'storage::emc::xtremio::restapi::custom::xtremioapi';
return $self;
}
sub init {
my ($self, %options) = @_;
$self->SUPER::init(%options);
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check EMC Xtremio through HTTP/REST API.

View File

@ -94,7 +94,6 @@ sub run {
$self->{output}->output_add(severity => $self->get_severity(value => $result->{$oid_ibm3200StatusGlobalStatus}), $self->{output}->output_add(severity => $self->get_severity(value => $result->{$oid_ibm3200StatusGlobalStatus}),
short_msg => sprintf("Overall global status is '%s'.", short_msg => sprintf("Overall global status is '%s'.",
${$states{$result->{$oid_ibm3200StatusGlobalStatus}}}[0])); ${$states{$result->{$oid_ibm3200StatusGlobalStatus}}}[0]));
$self->{output}->display(); $self->{output}->display();
$self->{output}->exit(); $self->{output}->exit();
} }

View File

@ -0,0 +1,264 @@
#
# Copyright 2015 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 storage::nimble::snmp::mode::globalstats;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);
use centreon::plugins::values;
use centreon::plugins::statefile;
my $maps_counters = {
global => {
'000_read' => { set => {
key_values => [ { name => 'read', diff => 1 } ],
per_second => 1,
output_template => 'Read I/O : %s %s/s', output_error_template => "Read I/O : %s",
output_change_bytes => 1,
perfdatas => [
{ label => 'read', value => 'read_per_second', template => '%d',
unit => 'B/s' },
],
}
},
'001_write' => { set => {
key_values => [ { name => 'write', diff => 1 } ],
per_second => 1,
output_template => 'Write I/O : %s %s/s', output_error_template => "Write I/O : %s",
output_change_bytes => 1,
perfdatas => [
{ label => 'write', value => 'write_per_second', template => '%d',
unit => 'B/s', min => 0 },
],
}
},
'002_read-iops' => { set => {
key_values => [ { name => 'read_iops', diff => 1 } ],
per_second => 1,
output_template => 'Read IOPs : %.2f', output_error_template => "Read IOPs : %s",
perfdatas => [
{ label => 'read_iops', value => 'read_iops_per_second', template => '%.2f',
unit => 'iops', min => 0 },
],
}
},
'003_write-iops' => { set => {
key_values => [ { name => 'write_iops', diff => 1 } ],
per_second => 1,
output_template => 'Write IOPs : %.2f', output_error_template => "Write IOPs : %s",
perfdatas => [
{ label => 'write_iops', value => 'write_iops_per_second', template => '%.2f',
unit => 'iops', min => 0 },
],
}
},
'004_read-time' => { set => {
key_values => [ { name => 'read_time', diff => 1 } ],
output_template => 'Read Time : %.3f s', output_error_template => "Read Time : %s",
perfdatas => [
{ label => 'read_time', value => 'read_time_absolute', template => '%.3f',
unit => 's', min => 0 },
],
}
},
'005_write-time' => { set => {
key_values => [ { name => 'write_time', diff => 1 } ],
output_template => 'Write Time : %.3f s', output_error_template => "Write Time : %s",
perfdatas => [
{ label => 'write_time', value => 'write_time_absolute', template => '%.3f',
unit => 's', min => 0 },
],
}
},
},
};
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 =>
{
"filter-counters:s" => { name => 'filter_counters' },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(statefile => $self->{statefile_value},
output => $self->{output},
perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('global')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
$self->{statefile_value}->check_options(%options);
}
sub run_global {
my ($self, %options) = @_;
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits;
foreach (sort keys %{$maps_counters->{global}}) {
if (defined($self->{option_results}->{filter_counters}) && $self->{option_results}->{filter_counters} ne '' &&
$_ !~ /$self->{option_results}->{filter_counters}/) {
$self->{output}->output_add(long_msg => "skipping counter $_", debug => 1);
next;
}
my $obj = $maps_counters->{global}->{$_}->{obj};
$obj->set(instance => 'global');
my ($value_check) = $obj->execute(new_datas => $self->{new_datas},
values => $self->{global});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata();
}
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "$short_msg"
);
} else {
$self->{output}->output_add(short_msg => "$long_msg");
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
$self->{new_datas} = {};
$self->{statefile_value}->read(statefile => $self->{cache_name});
$self->{new_datas}->{last_timestamp} = time();
$self->run_global();
$self->{statefile_value}->write(data => $self->{new_datas});
$self->{output}->display();
$self->{output}->exit();
}
sub manage_selection {
my ($self, %options) = @_;
if ($options{snmp}->is_snmpv1()) {
$self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3.");
$self->{output}->option_exit();
}
$self->{cache_name} = "nimble_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' .
(defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all'));
$self->{global} = {};
my $oid_globalStats = '.1.3.6.1.4.1.37447.1.3';
my $oid_ioReads = '.1.3.6.1.4.1.37447.1.3.2.0';
my $oid_ioReadBytes = '.1.3.6.1.4.1.37447.1.3.8.0';
my $oid_ioReadTimeMicrosec = '.1.3.6.1.4.1.37447.1.3.6.0';
my $oid_ioWrites = '.1.3.6.1.4.1.37447.1.3.4.0';
my $oid_ioWriteBytes = '.1.3.6.1.4.1.37447.1.3.10.0';
my $oid_ioWriteTimeMicrosec = '.1.3.6.1.4.1.37447.1.3.7.0';
my $result = $options{snmp}->get_table(oid => $oid_globalStats,
nothing_quit => 1);
$self->{global}->{read} = defined($result->{$oid_ioReadBytes}) ? $result->{$oid_ioReadBytes} : undef;
$self->{global}->{read_iops} = defined($result->{$oid_ioReads}) ? $result->{$oid_ioReads} : undef;
$self->{global}->{read_time} = defined($result->{$oid_ioReadTimeMicrosec}) ? $result->{$oid_ioReadTimeMicrosec} / 1000000 : undef;
$self->{global}->{write} = defined($result->{$oid_ioWriteBytes}) ? $result->{$oid_ioWriteBytes} : undef;
$self->{global}->{write_iops} = defined($result->{$oid_ioWrites}) ? $result->{$oid_ioWrites} : undef;
$self->{global}->{write_time} = defined($result->{$oid_ioWriteTimeMicrosec}) ? $result->{$oid_ioWriteTimeMicrosec} / 1000000: undef;
}
1;
__END__
=head1 MODE
Check global statistics of storage.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'read', 'read-iops', 'write', 'write-iops',
'read-time', 'write-time'.
=item B<--critical-*>
Threshold critical.
Can be: 'read', 'read-iops', 'write', 'write-iops',
'read-time', 'write-time'.
=item B<--filter-counters>
Only display some counters (regexp can be used).
Example: --filter-counters='-iops$'
=back
=cut

View File

@ -0,0 +1,259 @@
#
# Copyright 2015 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 storage::nimble::snmp::mode::volumeusage;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
use centreon::plugins::values;
my $instance_mode;
my $maps_counters = {
vol => {
'000_usage' => {
set => {
key_values => [ { name => 'display' }, { name => 'total' }, { name => 'used' } ],
closure_custom_calc => \&custom_usage_calc,
closure_custom_output => \&custom_usage_output,
closure_custom_perfdata => \&custom_usage_perfdata,
closure_custom_threshold_check => \&custom_usage_threshold,
},
},
}
};
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
if (!defined($options{extra_instance}) || $options{extra_instance} != 0) {
$extra_label .= '_' . $self->{result_values}->{display};
}
$self->{output}->perfdata_add(label => 'used' . $extra_label, unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my $msg = sprintf("Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)",
$total_size_value . " " . $total_size_unit,
$total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used},
$total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'};
$self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used};
$self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total};
$self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
return 0;
}
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 =>
{
"filter-name:s" => { name => 'filter_name' },
});
foreach my $key (('vol')) {
foreach (keys %{$maps_counters->{$key}}) {
my ($id, $name) = split /_/;
if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) {
$options{options}->add_options(arguments => {
'warning-' . $name . ':s' => { name => 'warning-' . $name },
'critical-' . $name . ':s' => { name => 'critical-' . $name },
});
}
$maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new(output => $self->{output}, perfdata => $self->{perfdata},
label => $name);
$maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}});
}
}
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
foreach my $key (('vol')) {
foreach (keys %{$maps_counters->{$key}}) {
$maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results});
}
}
$instance_mode = $self;
}
sub run_instances {
my ($self, %options) = @_;
my $multiple = 1;
if (scalar(keys %{$self->{vol}}) == 1) {
$multiple = 0;
}
if ($multiple == 1) {
$self->{output}->output_add(severity => 'OK',
short_msg => 'All volume usages are ok');
}
foreach my $id (sort keys %{$self->{vol}}) {
my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', '');
my @exits = ();
foreach (sort keys %{$maps_counters->{vol}}) {
my $obj = $maps_counters->{vol}->{$_}->{obj};
$obj->set(instance => $id);
my ($value_check) = $obj->execute(values => $self->{vol}->{$id});
if ($value_check != 0) {
$long_msg .= $long_msg_append . $obj->output_error();
$long_msg_append = ', ';
next;
}
my $exit2 = $obj->threshold_check();
push @exits, $exit2;
my $output = $obj->output();
$long_msg .= $long_msg_append . $output;
$long_msg_append = ', ';
if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) {
$short_msg .= $short_msg_append . $output;
$short_msg_append = ', ';
}
$obj->perfdata(extra_instance => $multiple);
}
$self->{output}->output_add(long_msg => "Volume '$self->{vol}->{$id}->{display}' $long_msg");
my $exit = $self->{output}->get_most_critical(status => [ @exits ]);
if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) {
$self->{output}->output_add(severity => $exit,
short_msg => "Volume '$self->{vol}->{$id}->{display}' $short_msg"
);
}
if ($multiple == 0) {
$self->{output}->output_add(short_msg => "Volume '$self->{vol}->{$id}->{display}' $long_msg");
}
}
}
sub run {
my ($self, %options) = @_;
$self->manage_selection(%options);
$self->run_instances();
$self->{output}->display();
$self->{output}->exit();
}
my $mapping = {
volName => { oid => '.1.3.6.1.4.1.37447.1.2.1.3' },
volSizeLow => { oid => '.1.3.6.1.4.1.37447.1.2.1.4' }, # seems in MB
volSizeHigh => { oid => '.1.3.6.1.4.1.37447.1.2.1.5' }, # seems in MB
volUsageLow => { oid => '.1.3.6.1.4.1.37447.1.2.1.6' }, # seems in MB
volUsageHigh => { oid => '.1.3.6.1.4.1.37447.1.2.1.7' }, # seems in MB
};
sub manage_selection {
my ($self, %options) = @_;
my $oid_volEntry = '.1.3.6.1.4.1.37447.1.2.1';
my $results = $options{snmp}->get_table(oid => $oid_volEntry, nothing_quit => 1);
$self->{vol} = {};
foreach my $oid (keys %{$results}) {
next if ($oid !~ /^$mapping->{volName}->{oid}\.(.*)/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results, instance => $instance);
if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' &&
$result->{volName} !~ /$self->{option_results}->{filter_name}/) {
$self->{output}->output_add(long_msg => "Skipping '" . $result->{volName} . "': no matching vserver name.", debug => 1);
next;
}
my $total = (($result->{volSizeHigh} << 32) + $result->{volSizeLow}) * 1024 * 1024;
my $used = (($result->{volUsageHigh} << 32) + $result->{volUsageLow}) * 1024 * 1024;
$self->{vol}->{$instance} = { display => $result->{volName}, used => $used, total => $total };
}
if (scalar(keys %{$self->{vol}}) <= 0) {
$self->{output}->add_option_msg(short_msg => "No entry found.");
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check volume usages.
=over 8
=item B<--filter-name>
Filter by name (regexp can be used).
=item B<--warning-usage>
Threshold warning (in percent).
=item B<--critical-usage>
Threshold critical (in percent).
=back
=cut

View File

@ -0,0 +1,49 @@
#
# Copyright 2015 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 storage::nimble::snmp::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_snmp);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
%{$self->{modes}} = (
'volume-usage' => 'storage::nimble::snmp::mode::volumeusage',
'global-stats' => 'storage::nimble::snmp::mode::globalstats',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check nimble storage in SNMP.
=cut