Fix some windows carriage return and pod doc (#1330)

This commit is contained in:
garnier-quentin 2019-01-11 16:56:18 +01:00
parent 19bff42565
commit c9bf84d279
16 changed files with 2211 additions and 2203 deletions

View File

@ -233,6 +233,8 @@ sub manage_selection {
1;
__END__
=head1 MODE
Check storage usage.

View File

@ -53,6 +53,8 @@ sub run {
1;
__END__
=head1 MODE
Get Proxmox VE Version

View File

@ -315,6 +315,8 @@ sub manage_selection {
1;
__END__
=head1 MODE
Check VM usage on Proxmox VE Cluster.

View File

@ -1,431 +1,431 @@
#
# Copyright 2019 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::selenium::mode::scenariokatalon;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
use XML::XPath;
use WWW::Selenium;
my $instance_mode;
my %handlers = (ALRM => {} );
sub custom_count_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{label},
value => $self->{result_values}->{value},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
$self->{output}->perfdata_add(label => $self->{result_values}->{label} . '_prct',
value => sprintf('%.2f', $self->{result_values}->{value_prct}),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label} . '-prct'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label} . '-prct'),
min => 0, max => 100, unit => '%');
}
sub custom_count_threshold {
my ($self, %options) = @_;
my $exit1 = $self->{perfdata}->threshold_check(value => $self->{result_values}->{value},
threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' },
{ label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $self->{result_values}->{value} . '_prct',
threshold => [ { label => 'critical-' . $self->{result_values}->{label} . '-prct', exit_litteral => 'critical' },
{ label => 'warning-' . $self->{result_values}->{label} . '-prct', exit_litteral => 'warning' } ]);
my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2 ]);
return $exit;
}
sub custom_count_output {
my ($self, %options) = @_;
my $msg = sprintf("%s steps : %s/%s (%.2f%%)", ucfirst($self->{result_values}->{label}),
$self->{result_values}->{value}, $self->{result_values}->{total}, $self->{result_values}->{value_prct});
return $msg;
}
sub custom_count_calc {
my ($self, %options) = @_;
$self->{result_values}->{label} = $options{extra_options}->{label};
$self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_' . $self->{result_values}->{label}};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{value_prct} = $self->{result_values}->{value} / $self->{result_values}->{total} * 100;
return 0;
}
sub custom_state_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_state}) && $instance_mode->{option_results}->{critical_state} ne '' &&
eval "$instance_mode->{option_results}->{critical_state}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_state}) && $instance_mode->{option_results}->{warning_state} ne '' &&
eval "$instance_mode->{option_results}->{warning_state}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_state_output {
my ($self, %options) = @_;
my $msg = "state is '" . $self->{result_values}->{state} . "'";
$msg .= " : " . $self->{result_values}->{comment} if (defined($self->{result_values}->{comment}) && $self->{result_values}->{comment} ne '');
return $msg;
}
sub custom_state_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{command} = $options{new_datas}->{$self->{instance} . '_command'};
$self->{result_values}->{target} = $options{new_datas}->{$self->{instance} . '_target'};
$self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_value'};
$self->{result_values}->{state} = $options{new_datas}->{$self->{instance} . '_state'};
$self->{result_values}->{comment} = $options{new_datas}->{$self->{instance} . '_comment'};
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
my $msg = "Step '" . $options{instance_value}->{display} . "' [command: " . $options{instance_value}->{command};
$msg .= ", target: " . $options{instance_value}->{target} if (defined($options{instance_value}->{target}) && $options{instance_value}->{target} ne '');
$msg .= ", value: " . $options{instance_value}->{value} if (defined($options{instance_value}->{value}) && $options{instance_value}->{value} ne '');
$msg .= "] ";
return $msg;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'steps', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All steps state are ok' },
];
$self->{maps_counters}->{global} = [
{ label => 'successful', set => {
key_values => [ { name => 'successful' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_count_calc'),
closure_custom_calc_extra_options => { label => 'successful' },
closure_custom_output => $self->can('custom_count_output'),
closure_custom_perfdata => $self->can('custom_count_perfdata'),
closure_custom_threshold_check => $self->can('custom_count_threshold'),
}
},
{ label => 'failed', set => {
key_values => [ { name => 'failed' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_count_calc'),
closure_custom_calc_extra_options => { label => 'failed' },
closure_custom_output => $self->can('custom_count_output'),
closure_custom_perfdata => $self->can('custom_count_perfdata'),
closure_custom_threshold_check => $self->can('custom_count_threshold'),
}
},
{ label => 'time-scenario', set => {
key_values => [ { name => 'time_scenario' } ],
output_template => 'Total execution time : %.2f ms',
perfdatas => [
{ label => 'time_scenario', value => 'time_scenario_absolute', template => '%.2f',
min => 0, unit => 'ms' },
],
}
},
];
$self->{maps_counters}->{steps} = [
{ label => 'state', set => {
key_values => [ { name => 'state' }, { name => 'command' }, { name => 'target' },
{ name => 'value' }, { name => 'comment' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_state_calc'),
closure_custom_output => $self->can('custom_state_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_state_threshold'),
}
},
{ label => 'time-step', set => {
key_values => [ { name => 'time_step' }, { name => 'display' } ],
output_template => 'Execution time : %.2f ms',
perfdatas => [
{ label => 'time_step', value => 'time_step_absolute', template => '%.2f',
min => 0, unit => 'ms', 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 =>
{
"selenium-hostname:s" => { name => 'selenium_hostname', default => 'localhost' },
"selenium-port:s" => { name => 'selenium_port', default => '4444' },
"browser:s" => { name => 'browser', default => '*firefox' },
"directory:s" => { name => 'directory', default => '/var/lib/centreon_waa' },
"scenario:s" => { name => 'scenario' },
"force-continue" => { name => 'force_continue' },
"timeout:s" => { name => 'timeout', default => 50 },
"action-timeout:s" => { name => 'action_timeout', default => 10 },
"warning-state:s" => { name => 'warning_state', default => '' },
"critical-state:s" => { name => 'critical_state', default => '%{state} !~ /OK/i' },
});
$self->set_signal_handlers;
return $self;
}
sub set_signal_handlers {
my $self = shift;
$SIG{ALRM} = \&class_handle_ALRM;
$handlers{ALRM}->{$self} = sub { $self->handle_ALRM() };
}
sub class_handle_ALRM {
foreach (keys %{$handlers{ALRM}}) {
&{$handlers{ALRM}->{$_}}();
}
}
sub handle_ALRM {
my $self = shift;
$self->{output}->output_add(severity => 'UNKNOWN',
short_msg => sprintf("Cannot finished scenario execution (timeout received)"));
$self->{output}->display();
$self->{output}->exit();
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
if (defined($self->{option_results}->{timeout}) && $self->{option_results}->{timeout} =~ /^\d+$/ &&
$self->{option_results}->{timeout} > 0) {
alarm($self->{option_results}->{timeout});
}
if (!defined($self->{option_results}->{scenario})) {
$self->{output}->add_option_msg(short_msg => "Please specify a scenario name.");
$self->{output}->option_exit();
}
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_state', 'critical_state')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
$self->{global}->{failed} = 0;
$self->{global}->{successful} = 0;
$self->{global}->{time_scenario} = 0;
$self->{selenium} = WWW::Selenium->new(
host => $self->{option_results}->{selenium_hostname},
port => $self->{option_results}->{selenium_port},
browser => $self->{option_results}->{browser},
browser_url => "file://localhost"
);
my $filename = $self->{option_results}->{directory} . '/' . $self->{option_results}->{scenario} . '.xml';
my $xp = XML::XPath->new(filename => $filename);
my $step = 1;
$self->{selenium}->start;
$self->{selenium}->set_timeout($self->{option_results}->{action_timeout} * 1000);
my $actions = $xp->find('/TestCase/selenese');
$self->{global}->{total} = $actions->size;
my $start = gettimeofday() * 1000;
foreach my $action ($actions->get_nodelist) {
my $command = centreon::plugins::misc::trim($xp->find('command', $action)->string_value);
my $target = centreon::plugins::misc::trim($xp->find('target', $action)->string_value);
my $value = centreon::plugins::misc::trim($xp->find('value', $action)->string_value);
$self->{steps}->{$step}->{display} = $step;
$self->{steps}->{$step}->{command} = $command;
$self->{steps}->{$step}->{target} = $target;
$self->{steps}->{$step}->{value} = $value;
$self->{steps}->{$step}->{state} = 'OK';
$self->{steps}->{$step}->{comment} = '';
$self->{steps}->{$step}->{time_step} = 0;
my $result;
my $step_start = gettimeofday() * 1000;
eval {
if ($command =~ /pause/) {
$result = $self->{selenium}->pause($value);
} else {
$result = $self->{selenium}->do_command($command, $target, $value);
}
};
$self->{steps}->{$step}->{time_step} = gettimeofday() * 1000 - $step_start;
if (!$@) {
$self->{global}->{successful}++;
} else {
$self->{steps}->{$step}->{comment} = $@;
$self->{steps}->{$step}->{comment} =~ s/^(.*\n)//;;;
$self->{steps}->{$step}->{comment} =~ s/\n//;;;
$self->{steps}->{$step}->{state} = 'ERROR';
$self->{global}->{failed}++;
last unless $self->{option_results}->{force_continue};
}
$step++;
}
$self->{global}->{time_scenario} = gettimeofday() * 1000 - $start;
$self->{selenium}->stop;
}
1;
__END__
=head1 MODE
Play scenario based on Katalon Automation Recorder XML export
=over 8
=item B<--selenium-hostname>
IP Addr/FQDN of the Selenium server.
=item B<--selenium-port>
Port used by Selenium server.
=item B<--browser>
Browser used by Selenium server (Default : '*firefox').
=item B<--directory>
Directory where scenarii are stored.
=item B<--scenario>
Scenario to play (without extension).
=item B<--force-continue>
Don't stop if error.
=item B<--timeout>
Set scenario execution timeout in second (Default: 50).
=item B<--action-timeout>
Set action execution timeout in second (Default: 10).
=item B<--warning-*>
Threshold warning for steps state count
(Can be: 'failed', 'successful').
=item B<--critical-*>
Threshold critical for steps state count
(Can be: 'failed', 'successful').
=item B<--warning-time-scenario>
Threshold warning in milliseconds
for scenario execution time.
=item B<--critical-time-scenario>
Threshold critical in milliseconds
for scenario execution time.
=item B<--warning-time-step>
Threshold warning in milliseconds
for step execution time.
=item B<--critical-time-step>
Threshold critical in milliseconds
for step execution time.
=item B<--warning-state>
Threshold warning for step state.
=item B<--critical-state>
Threshold critical for step state
(Default: '%{state} !~ /OK/i').
=back
=cut
#
# Copyright 2019 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::selenium::mode::scenariokatalon;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);
use XML::XPath;
use WWW::Selenium;
my $instance_mode;
my %handlers = (ALRM => {} );
sub custom_count_perfdata {
my ($self, %options) = @_;
$self->{output}->perfdata_add(label => $self->{result_values}->{label},
value => $self->{result_values}->{value},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1),
min => 0, max => $self->{result_values}->{total});
$self->{output}->perfdata_add(label => $self->{result_values}->{label} . '_prct',
value => sprintf('%.2f', $self->{result_values}->{value_prct}),
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label} . '-prct'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label} . '-prct'),
min => 0, max => 100, unit => '%');
}
sub custom_count_threshold {
my ($self, %options) = @_;
my $exit1 = $self->{perfdata}->threshold_check(value => $self->{result_values}->{value},
threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' },
{ label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $self->{result_values}->{value} . '_prct',
threshold => [ { label => 'critical-' . $self->{result_values}->{label} . '-prct', exit_litteral => 'critical' },
{ label => 'warning-' . $self->{result_values}->{label} . '-prct', exit_litteral => 'warning' } ]);
my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2 ]);
return $exit;
}
sub custom_count_output {
my ($self, %options) = @_;
my $msg = sprintf("%s steps : %s/%s (%.2f%%)", ucfirst($self->{result_values}->{label}),
$self->{result_values}->{value}, $self->{result_values}->{total}, $self->{result_values}->{value_prct});
return $msg;
}
sub custom_count_calc {
my ($self, %options) = @_;
$self->{result_values}->{label} = $options{extra_options}->{label};
$self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_' . $self->{result_values}->{label}};
$self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'};
$self->{result_values}->{value_prct} = $self->{result_values}->{value} / $self->{result_values}->{total} * 100;
return 0;
}
sub custom_state_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_state}) && $instance_mode->{option_results}->{critical_state} ne '' &&
eval "$instance_mode->{option_results}->{critical_state}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_state}) && $instance_mode->{option_results}->{warning_state} ne '' &&
eval "$instance_mode->{option_results}->{warning_state}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_state_output {
my ($self, %options) = @_;
my $msg = "state is '" . $self->{result_values}->{state} . "'";
$msg .= " : " . $self->{result_values}->{comment} if (defined($self->{result_values}->{comment}) && $self->{result_values}->{comment} ne '');
return $msg;
}
sub custom_state_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'};
$self->{result_values}->{command} = $options{new_datas}->{$self->{instance} . '_command'};
$self->{result_values}->{target} = $options{new_datas}->{$self->{instance} . '_target'};
$self->{result_values}->{value} = $options{new_datas}->{$self->{instance} . '_value'};
$self->{result_values}->{state} = $options{new_datas}->{$self->{instance} . '_state'};
$self->{result_values}->{comment} = $options{new_datas}->{$self->{instance} . '_comment'};
return 0;
}
sub prefix_output {
my ($self, %options) = @_;
my $msg = "Step '" . $options{instance_value}->{display} . "' [command: " . $options{instance_value}->{command};
$msg .= ", target: " . $options{instance_value}->{target} if (defined($options{instance_value}->{target}) && $options{instance_value}->{target} ne '');
$msg .= ", value: " . $options{instance_value}->{value} if (defined($options{instance_value}->{value}) && $options{instance_value}->{value} ne '');
$msg .= "] ";
return $msg;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'steps', type => 1, cb_prefix_output => 'prefix_output', message_multiple => 'All steps state are ok' },
];
$self->{maps_counters}->{global} = [
{ label => 'successful', set => {
key_values => [ { name => 'successful' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_count_calc'),
closure_custom_calc_extra_options => { label => 'successful' },
closure_custom_output => $self->can('custom_count_output'),
closure_custom_perfdata => $self->can('custom_count_perfdata'),
closure_custom_threshold_check => $self->can('custom_count_threshold'),
}
},
{ label => 'failed', set => {
key_values => [ { name => 'failed' }, { name => 'total' } ],
closure_custom_calc => $self->can('custom_count_calc'),
closure_custom_calc_extra_options => { label => 'failed' },
closure_custom_output => $self->can('custom_count_output'),
closure_custom_perfdata => $self->can('custom_count_perfdata'),
closure_custom_threshold_check => $self->can('custom_count_threshold'),
}
},
{ label => 'time-scenario', set => {
key_values => [ { name => 'time_scenario' } ],
output_template => 'Total execution time : %.2f ms',
perfdatas => [
{ label => 'time_scenario', value => 'time_scenario_absolute', template => '%.2f',
min => 0, unit => 'ms' },
],
}
},
];
$self->{maps_counters}->{steps} = [
{ label => 'state', set => {
key_values => [ { name => 'state' }, { name => 'command' }, { name => 'target' },
{ name => 'value' }, { name => 'comment' }, { name => 'display' } ],
closure_custom_calc => $self->can('custom_state_calc'),
closure_custom_output => $self->can('custom_state_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_state_threshold'),
}
},
{ label => 'time-step', set => {
key_values => [ { name => 'time_step' }, { name => 'display' } ],
output_template => 'Execution time : %.2f ms',
perfdatas => [
{ label => 'time_step', value => 'time_step_absolute', template => '%.2f',
min => 0, unit => 'ms', 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 =>
{
"selenium-hostname:s" => { name => 'selenium_hostname', default => 'localhost' },
"selenium-port:s" => { name => 'selenium_port', default => '4444' },
"browser:s" => { name => 'browser', default => '*firefox' },
"directory:s" => { name => 'directory', default => '/var/lib/centreon_waa' },
"scenario:s" => { name => 'scenario' },
"force-continue" => { name => 'force_continue' },
"timeout:s" => { name => 'timeout', default => 50 },
"action-timeout:s" => { name => 'action_timeout', default => 10 },
"warning-state:s" => { name => 'warning_state', default => '' },
"critical-state:s" => { name => 'critical_state', default => '%{state} !~ /OK/i' },
});
$self->set_signal_handlers;
return $self;
}
sub set_signal_handlers {
my $self = shift;
$SIG{ALRM} = \&class_handle_ALRM;
$handlers{ALRM}->{$self} = sub { $self->handle_ALRM() };
}
sub class_handle_ALRM {
foreach (keys %{$handlers{ALRM}}) {
&{$handlers{ALRM}->{$_}}();
}
}
sub handle_ALRM {
my $self = shift;
$self->{output}->output_add(severity => 'UNKNOWN',
short_msg => sprintf("Cannot finished scenario execution (timeout received)"));
$self->{output}->display();
$self->{output}->exit();
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
if (defined($self->{option_results}->{timeout}) && $self->{option_results}->{timeout} =~ /^\d+$/ &&
$self->{option_results}->{timeout} > 0) {
alarm($self->{option_results}->{timeout});
}
if (!defined($self->{option_results}->{scenario})) {
$self->{output}->add_option_msg(short_msg => "Please specify a scenario name.");
$self->{output}->option_exit();
}
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_state', 'critical_state')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
$self->{global}->{failed} = 0;
$self->{global}->{successful} = 0;
$self->{global}->{time_scenario} = 0;
$self->{selenium} = WWW::Selenium->new(
host => $self->{option_results}->{selenium_hostname},
port => $self->{option_results}->{selenium_port},
browser => $self->{option_results}->{browser},
browser_url => "file://localhost"
);
my $filename = $self->{option_results}->{directory} . '/' . $self->{option_results}->{scenario} . '.xml';
my $xp = XML::XPath->new(filename => $filename);
my $step = 1;
$self->{selenium}->start;
$self->{selenium}->set_timeout($self->{option_results}->{action_timeout} * 1000);
my $actions = $xp->find('/TestCase/selenese');
$self->{global}->{total} = $actions->size;
my $start = gettimeofday() * 1000;
foreach my $action ($actions->get_nodelist) {
my $command = centreon::plugins::misc::trim($xp->find('command', $action)->string_value);
my $target = centreon::plugins::misc::trim($xp->find('target', $action)->string_value);
my $value = centreon::plugins::misc::trim($xp->find('value', $action)->string_value);
$self->{steps}->{$step}->{display} = $step;
$self->{steps}->{$step}->{command} = $command;
$self->{steps}->{$step}->{target} = $target;
$self->{steps}->{$step}->{value} = $value;
$self->{steps}->{$step}->{state} = 'OK';
$self->{steps}->{$step}->{comment} = '';
$self->{steps}->{$step}->{time_step} = 0;
my $result;
my $step_start = gettimeofday() * 1000;
eval {
if ($command =~ /pause/) {
$result = $self->{selenium}->pause($value);
} else {
$result = $self->{selenium}->do_command($command, $target, $value);
}
};
$self->{steps}->{$step}->{time_step} = gettimeofday() * 1000 - $step_start;
if (!$@) {
$self->{global}->{successful}++;
} else {
$self->{steps}->{$step}->{comment} = $@;
$self->{steps}->{$step}->{comment} =~ s/^(.*\n)//;;;
$self->{steps}->{$step}->{comment} =~ s/\n//;;;
$self->{steps}->{$step}->{state} = 'ERROR';
$self->{global}->{failed}++;
last unless $self->{option_results}->{force_continue};
}
$step++;
}
$self->{global}->{time_scenario} = gettimeofday() * 1000 - $start;
$self->{selenium}->stop;
}
1;
__END__
=head1 MODE
Play scenario based on Katalon Automation Recorder XML export
=over 8
=item B<--selenium-hostname>
IP Addr/FQDN of the Selenium server.
=item B<--selenium-port>
Port used by Selenium server.
=item B<--browser>
Browser used by Selenium server (Default : '*firefox').
=item B<--directory>
Directory where scenarii are stored.
=item B<--scenario>
Scenario to play (without extension).
=item B<--force-continue>
Don't stop if error.
=item B<--timeout>
Set scenario execution timeout in second (Default: 50).
=item B<--action-timeout>
Set action execution timeout in second (Default: 10).
=item B<--warning-*>
Threshold warning for steps state count
(Can be: 'failed', 'successful').
=item B<--critical-*>
Threshold critical for steps state count
(Can be: 'failed', 'successful').
=item B<--warning-time-scenario>
Threshold warning in milliseconds
for scenario execution time.
=item B<--critical-time-scenario>
Threshold critical in milliseconds
for scenario execution time.
=item B<--warning-time-step>
Threshold warning in milliseconds
for step execution time.
=item B<--critical-time-step>
Threshold critical in milliseconds
for step execution time.
=item B<--warning-state>
Threshold warning for step state.
=item B<--critical-state>
Threshold critical for step state
(Default: '%{state} !~ /OK/i').
=back
=cut

View File

@ -1,139 +1,139 @@
#
# Copyright 2019 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 cloud::aws::billing::mode::estimatedcharges;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub prefix_charges_output {
my ($self, %options) = @_;
return "Service '" . $self->{option_results}->{service} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'estimatedcharges', type => 0, cb_prefix_output => 'prefix_charges_output' },
];
$self->{maps_counters}->{estimatedcharges} = [
{ label => 'billing', set => {
key_values => [ { name => 'estimated_charges' }, { name => 'display' } ],
output_template => 'estimated charges: %.2f USD',
perfdatas => [
{ label => 'billing', value => 'estimated_charges_absolute', template => '%.2f',
unit => 'USD' },
],
}
},
];
}
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 =>
{
"service:s" => { name => 'service' },
"currency:s" => { name => 'currency', default => 'USD' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
if (!defined($self->{option_results}->{service}) || $self->{option_results}->{service} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --service option.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{currency}) || $self->{option_results}->{currency} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --currency option.");
$self->{output}->option_exit();
}
$self->{aws_timeframe} = defined($self->{option_results}->{timeframe}) ? $self->{option_results}->{timeframe} : 86400;
$self->{aws_period} = defined($self->{option_results}->{period}) ? $self->{option_results}->{period} : 60;
}
sub manage_selection {
my ($self, %options) = @_;
my $metric_results = $options{custom}->cloudwatch_get_metrics(
region => $self->{option_results}->{region},
namespace => 'AWS/Billing',
dimensions => [ { Name => 'ServiceName', Value => $self->{option_results}->{service} }, { Name => 'Currency', Value => $self->{option_results}->{currency} } ],
metrics => ['EstimatedCharges'],
statistics => ['Maximum'],
timeframe => $self->{aws_timeframe},
period => $self->{aws_period},
);
$self->{estimatedcharges}->{estimated_charges} = $metric_results->{'EstimatedCharges'}->{'maximum'} if defined($metric_results->{'EstimatedCharges'}->{'maximum'});
$self->{estimatedcharges}->{display} = $self->{option_results}->{service};
if (scalar(keys %{$self->{estimatedcharges}}) <= 0) {
$self->{output}->add_option_msg(short_msg => 'No value.');
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check Billing estimated charges for a service.
Example:
perl centreon_plugins.pl --plugin=cloud::aws::billing::plugin --custommode=paws --mode=estimated-charges
--region='us-east-1' --service='AWSService' --verbose
See 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/billing-metricscollected.html' for more informations.
=over 8
=item B<--service>
Set the Amazon service (Required).
=item B<--warning-billing>
Thresholds warning.
=item B<--critical-billing>
Thresholds critical.
=back
=cut
#
# Copyright 2019 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 cloud::aws::billing::mode::estimatedcharges;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub prefix_charges_output {
my ($self, %options) = @_;
return "Service '" . $self->{option_results}->{service} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'estimatedcharges', type => 0, cb_prefix_output => 'prefix_charges_output' },
];
$self->{maps_counters}->{estimatedcharges} = [
{ label => 'billing', set => {
key_values => [ { name => 'estimated_charges' }, { name => 'display' } ],
output_template => 'estimated charges: %.2f USD',
perfdatas => [
{ label => 'billing', value => 'estimated_charges_absolute', template => '%.2f',
unit => 'USD' },
],
}
},
];
}
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 =>
{
"service:s" => { name => 'service' },
"currency:s" => { name => 'currency', default => 'USD' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
if (!defined($self->{option_results}->{service}) || $self->{option_results}->{service} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --service option.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{currency}) || $self->{option_results}->{currency} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --currency option.");
$self->{output}->option_exit();
}
$self->{aws_timeframe} = defined($self->{option_results}->{timeframe}) ? $self->{option_results}->{timeframe} : 86400;
$self->{aws_period} = defined($self->{option_results}->{period}) ? $self->{option_results}->{period} : 60;
}
sub manage_selection {
my ($self, %options) = @_;
my $metric_results = $options{custom}->cloudwatch_get_metrics(
region => $self->{option_results}->{region},
namespace => 'AWS/Billing',
dimensions => [ { Name => 'ServiceName', Value => $self->{option_results}->{service} }, { Name => 'Currency', Value => $self->{option_results}->{currency} } ],
metrics => ['EstimatedCharges'],
statistics => ['Maximum'],
timeframe => $self->{aws_timeframe},
period => $self->{aws_period},
);
$self->{estimatedcharges}->{estimated_charges} = $metric_results->{'EstimatedCharges'}->{'maximum'} if defined($metric_results->{'EstimatedCharges'}->{'maximum'});
$self->{estimatedcharges}->{display} = $self->{option_results}->{service};
if (scalar(keys %{$self->{estimatedcharges}}) <= 0) {
$self->{output}->add_option_msg(short_msg => 'No value.');
$self->{output}->option_exit();
}
}
1;
__END__
=head1 MODE
Check Billing estimated charges for a service.
Example:
perl centreon_plugins.pl --plugin=cloud::aws::billing::plugin --custommode=paws --mode=estimated-charges
--region='us-east-1' --service='AWSService' --verbose
See 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/billing-metricscollected.html' for more informations.
=over 8
=item B<--service>
Set the Amazon service (Required).
=item B<--warning-billing>
Thresholds warning.
=item B<--critical-billing>
Thresholds critical.
=back
=cut

View File

@ -1,259 +1,259 @@
#
# Copyright 2019 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 cloud::ibm::softlayer::custom::xmlapi;
use strict;
use warnings;
use centreon::plugins::http;
use XML::Simple;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
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' },
"url-path:s" => { name => 'url_path' },
"port:s" => { name => 'port' },
"proto:s" => { name => 'proto' },
"proxyurl:s" => { name => 'proxyurl' },
"timeout:s" => { name => 'timeout' },
"ssl-opt:s@" => { name => 'ssl_opt' },
"api-username:s" => { name => 'api_username' },
"api-key:s" => { name => 'api_key' },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'XMLAPI OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
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) = @_;
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? $self->{option_results}->{hostname} : 'api.softlayer.com';
$self->{port} = (defined($self->{option_results}->{port})) ? $self->{option_results}->{port} : 443;
$self->{proto} = (defined($self->{option_results}->{proto})) ? $self->{option_results}->{proto} : 'https';
$self->{url_path} = (defined($self->{option_results}->{url_path})) ? $self->{option_results}->{url_path} : '/soap/v3';
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? $self->{option_results}->{timeout} : 10;
$self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? $self->{option_results}->{proxyurl} : undef;
$self->{ssl_opt} = (defined($self->{option_results}->{ssl_opt})) ? $self->{option_results}->{ssl_opt} : undef;
if (!defined($self->{option_results}->{api_username}) || $self->{option_results}->{api_username} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --api-username option.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{api_key}) || $self->{option_results}->{api_key} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --api-key option.");
$self->{output}->option_exit();
}
return 0;
}
sub build_options_for_httplib {
my ($self, %options) = @_;
$self->{option_results}->{hostname} = $self->{hostname};
$self->{option_results}->{timeout} = $self->{timeout};
$self->{option_results}->{port} = $self->{port};
$self->{option_results}->{proto} = $self->{proto};
$self->{option_results}->{proxyurl} = $self->{proxyurl};
$self->{option_results}->{warning_status} = '';
$self->{option_results}->{critical_status} = '';
}
sub settings {
my ($self, %options) = @_;
$self->build_options_for_httplib();
$self->{http}->add_header(key => 'Accept', value => 'text/xml');
$self->{http}->add_header(key => 'Accept', value => 'multipart/*');
$self->{http}->add_header(key => 'Accept', value => 'text/xmlapplication/soap');
$self->{http}->add_header(key => 'Content-Type', value => 'text/xml; charset=utf-8');
$self->{http}->set_options(%{$self->{option_results}});
}
sub get_connection_info {
my ($self, %options) = @_;
return $self->{hostname} . ":" . $self->{port};
}
sub get_hostname {
my ($self, %options) = @_;
return $self->{hostname};
}
sub get_port {
my ($self, %options) = @_;
return $self->{port};
}
sub get_api_username {
my ($self, %options) = @_;
return $self->{option_results}->{api_username};
}
sub get_api_key {
my ($self, %options) = @_;
return $self->{option_results}->{api_key};
}
sub get_endpoint {
my ($self, %options) = @_;
$self->settings;
$self->{http}->add_header(key => 'SOAPAction', value => 'http://api.service.softlayer.com/soap/v3/#' . $options{method});
my $content = '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:slapi="http://api.service.softlayer.com/soap/v3/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header>
<slapi:authenticate>
<apiKey>' . $self->get_api_key() . '</apiKey>
<username>' . $self->get_api_username() . '</username>
</slapi:authenticate>' .
$options{extra_content}
. '</soap:Header>
<soap:Body>
<slapi:' . $options{method} . ' xsi:nil="true"/>
</soap:Body>
</soap:Envelope>';
my $response = $self->{http}->request(url_path => $self->{url_path} . '/' . $options{service}, method => 'POST', query_form_post => $content);
my $xml_hash = XMLin($response, ForceArray => ['item']);
if (defined($xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'})) {
$self->{output}->output_add(long_msg => "Returned message: " . $response, debug => 1);
$self->{output}->add_option_msg(short_msg => "API returned error code '" . $xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'}->{faultcode} .
"' with message '" . $xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'}->{faultstring} . "'");
$self->{output}->option_exit();
}
return $xml_hash->{'SOAP-ENV:Body'};
}
1;
__END__
=head1 NAME
IBM SoftLayer XML API
=head1 SYNOPSIS
IBM SoftLayer XML API
=head1 XMLAPI OPTIONS
=over 8
=item B<--hostname>
API hostname (Default: 'api.softlayer.com').
=item B<--url-path>
API url path (Default: '/soap/v3')
=item B<--port>
API port (Default: 443)
=item B<--proto>
Specify https if needed (Default: 'https')
=item B<--api-username>
Set API username
=item B<--api-key>
Set API Key
=item B<--proxyurl>
Proxy URL if any
=item B<--timeout>
Set HTTP timeout
=item B<--ssl-opt>
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=back
=head1 DESCRIPTION
B<custom>.
=cut
#
# Copyright 2019 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 cloud::ibm::softlayer::custom::xmlapi;
use strict;
use warnings;
use centreon::plugins::http;
use XML::Simple;
sub new {
my ($class, %options) = @_;
my $self = {};
bless $self, $class;
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' },
"url-path:s" => { name => 'url_path' },
"port:s" => { name => 'port' },
"proto:s" => { name => 'proto' },
"proxyurl:s" => { name => 'proxyurl' },
"timeout:s" => { name => 'timeout' },
"ssl-opt:s@" => { name => 'ssl_opt' },
"api-username:s" => { name => 'api_username' },
"api-key:s" => { name => 'api_key' },
});
}
$options{options}->add_help(package => __PACKAGE__, sections => 'XMLAPI OPTIONS', once => 1);
$self->{output} = $options{output};
$self->{mode} = $options{mode};
$self->{http} = centreon::plugins::http->new(output => $self->{output});
return $self;
}
sub set_options {
my ($self, %options) = @_;
$self->{option_results} = $options{option_results};
}
sub set_defaults {
my ($self, %options) = @_;
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) = @_;
$self->{hostname} = (defined($self->{option_results}->{hostname})) ? $self->{option_results}->{hostname} : 'api.softlayer.com';
$self->{port} = (defined($self->{option_results}->{port})) ? $self->{option_results}->{port} : 443;
$self->{proto} = (defined($self->{option_results}->{proto})) ? $self->{option_results}->{proto} : 'https';
$self->{url_path} = (defined($self->{option_results}->{url_path})) ? $self->{option_results}->{url_path} : '/soap/v3';
$self->{timeout} = (defined($self->{option_results}->{timeout})) ? $self->{option_results}->{timeout} : 10;
$self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? $self->{option_results}->{proxyurl} : undef;
$self->{ssl_opt} = (defined($self->{option_results}->{ssl_opt})) ? $self->{option_results}->{ssl_opt} : undef;
if (!defined($self->{option_results}->{api_username}) || $self->{option_results}->{api_username} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --api-username option.");
$self->{output}->option_exit();
}
if (!defined($self->{option_results}->{api_key}) || $self->{option_results}->{api_key} eq '') {
$self->{output}->add_option_msg(short_msg => "Need to specify --api-key option.");
$self->{output}->option_exit();
}
return 0;
}
sub build_options_for_httplib {
my ($self, %options) = @_;
$self->{option_results}->{hostname} = $self->{hostname};
$self->{option_results}->{timeout} = $self->{timeout};
$self->{option_results}->{port} = $self->{port};
$self->{option_results}->{proto} = $self->{proto};
$self->{option_results}->{proxyurl} = $self->{proxyurl};
$self->{option_results}->{warning_status} = '';
$self->{option_results}->{critical_status} = '';
}
sub settings {
my ($self, %options) = @_;
$self->build_options_for_httplib();
$self->{http}->add_header(key => 'Accept', value => 'text/xml');
$self->{http}->add_header(key => 'Accept', value => 'multipart/*');
$self->{http}->add_header(key => 'Accept', value => 'text/xmlapplication/soap');
$self->{http}->add_header(key => 'Content-Type', value => 'text/xml; charset=utf-8');
$self->{http}->set_options(%{$self->{option_results}});
}
sub get_connection_info {
my ($self, %options) = @_;
return $self->{hostname} . ":" . $self->{port};
}
sub get_hostname {
my ($self, %options) = @_;
return $self->{hostname};
}
sub get_port {
my ($self, %options) = @_;
return $self->{port};
}
sub get_api_username {
my ($self, %options) = @_;
return $self->{option_results}->{api_username};
}
sub get_api_key {
my ($self, %options) = @_;
return $self->{option_results}->{api_key};
}
sub get_endpoint {
my ($self, %options) = @_;
$self->settings;
$self->{http}->add_header(key => 'SOAPAction', value => 'http://api.service.softlayer.com/soap/v3/#' . $options{method});
my $content = '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:slapi="http://api.service.softlayer.com/soap/v3/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header>
<slapi:authenticate>
<apiKey>' . $self->get_api_key() . '</apiKey>
<username>' . $self->get_api_username() . '</username>
</slapi:authenticate>' .
$options{extra_content}
. '</soap:Header>
<soap:Body>
<slapi:' . $options{method} . ' xsi:nil="true"/>
</soap:Body>
</soap:Envelope>';
my $response = $self->{http}->request(url_path => $self->{url_path} . '/' . $options{service}, method => 'POST', query_form_post => $content);
my $xml_hash = XMLin($response, ForceArray => ['item']);
if (defined($xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'})) {
$self->{output}->output_add(long_msg => "Returned message: " . $response, debug => 1);
$self->{output}->add_option_msg(short_msg => "API returned error code '" . $xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'}->{faultcode} .
"' with message '" . $xml_hash->{'SOAP-ENV:Body'}->{'SOAP-ENV:Fault'}->{faultstring} . "'");
$self->{output}->option_exit();
}
return $xml_hash->{'SOAP-ENV:Body'};
}
1;
__END__
=head1 NAME
IBM SoftLayer XML API
=head1 SYNOPSIS
IBM SoftLayer XML API
=head1 XMLAPI OPTIONS
=over 8
=item B<--hostname>
API hostname (Default: 'api.softlayer.com').
=item B<--url-path>
API url path (Default: '/soap/v3')
=item B<--port>
API port (Default: 443)
=item B<--proto>
Specify https if needed (Default: 'https')
=item B<--api-username>
Set API username
=item B<--api-key>
Set API Key
=item B<--proxyurl>
Proxy URL if any
=item B<--timeout>
Set HTTP timeout
=item B<--ssl-opt>
Set SSL Options (--ssl-opt="SSL_version => TLSv1" --ssl-opt="SSL_verify_mode => SSL_VERIFY_NONE").
=back
=head1 DESCRIPTION
B<custom>.
=cut

View File

@ -1,284 +1,284 @@
#
# Copyright 2019 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 cloud::ibm::softlayer::mode::events;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use DateTime;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message, debug => 1);
}
return $status;
}
sub custom_event_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s', Impacted items: %d, Start date: %s, End date: %s",
$self->{result_values}->{status},
$self->{result_values}->{items},
($self->{result_values}->{start_date} ne "-") ? $self->{result_values}->{start_date} . ' (' . centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since_start}) . ' ago)' : '-',
($self->{result_values}->{end_date} ne "-") ? $self->{result_values}->{end_date} . ' (' . centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since_end}) . ' ago)' : '-');
return $msg;
}
sub custom_event_calc {
my ($self, %options) = @_;
$self->{result_values}->{id} = $options{new_datas}->{$self->{instance} . '_id'};
$self->{result_values}->{subject} = $options{new_datas}->{$self->{instance} . '_subject'};
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{items} = $options{new_datas}->{$self->{instance} . '_items'};
$self->{result_values}->{start_date} = $options{new_datas}->{$self->{instance} . '_start_date'};
$self->{result_values}->{since_start} = $options{new_datas}->{$self->{instance} . '_since_start'};
$self->{result_values}->{end_date} = $options{new_datas}->{$self->{instance} . '_end_date'};
$self->{result_values}->{since_end} = $options{new_datas}->{$self->{instance} . '_since_end'};
return 0;
}
sub prefix_global_output {
my ($self, %options) = @_;
return "Number of events ";
}
sub prefix_events_output {
my ($self, %options) = @_;
return "Event '" . $options{instance_value}->{id} . "' with subject '" . $options{instance_value}->{subject} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', skipped_code => { -10 => 1 } },
{ name => 'events', type => 1, cb_prefix_output => 'prefix_events_output' },
];
$self->{maps_counters}->{global} = [
{ label => 'active', set => {
key_values => [ { name => 'active' } ],
output_template => 'Active : %d',
perfdatas => [
{ label => 'active_events', value => 'active_absolute', template => '%d',
min => 0 },
],
}
},
{ label => 'completed', set => {
key_values => [ { name => 'completed' } ],
output_template => 'Completed : %d',
perfdatas => [
{ label => 'completed_events', value => 'completed_absolute', template => '%d',
min => 0 },
],
}
},
{ label => 'published', set => {
key_values => [ { name => 'published' } ],
output_template => 'Published : %d',
perfdatas => [
{ label => 'published_events', value => 'published_absolute', template => '%d',
min => 0 },
],
}
},
];
$self->{maps_counters}->{events} = [
{ label => 'event', threshold => 0, set => {
key_values => [ { name => 'id' }, { name => 'subject' }, { name => 'status' }, { name => 'items' },
{ name => 'start_date' }, { name => 'since_start' }, { name => 'end_date' }, { name => 'since_end' } ],
closure_custom_calc => $self->can('custom_event_calc'),
closure_custom_output => $self->can('custom_event_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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-status:s" => { name => 'filter_status', default => 'Active' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Active/ && %{items} > 0' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $current_time = time();
my %status_hash;
my $events = $options{custom}->get_endpoint(service => 'SoftLayer_Notification_Occurrence_Event', method => 'getAllObjects', extra_content => '');
foreach my $event (@{$events->{'ns1:getAllObjectsResponse'}->{'getAllObjectsReturn'}->{'item'}}) {
my $status;
$status = $event->{statusCode}->{name}->{content} if (defined($event->{statusCode}->{name}->{content}));
$status_hash{'#' . $event->{statusCode}->{id}} = $event->{statusCode}->{name}->{content} if (defined($event->{statusCode}->{name}->{content}));
$status = $status_hash{$event->{statusCode}->{href}} if (!defined($event->{statusCode}->{name}->{content}) && defined($event->{statusCode}->{href}));
next if (defined($self->{option_results}->{filter_status}) && $status !~ /$self->{option_results}->{filter_status}/);
my $extra_content = '<slapi:SoftLayer_Notification_Occurrence_EventInitParameters>
<id>' . $event->{id}->{content} . '</id>
</slapi:SoftLayer_Notification_Occurrence_EventInitParameters>';
my $ressources = $options{custom}->get_endpoint(service => 'SoftLayer_Notification_Occurrence_Event', method => 'getImpactedResources', extra_content => $extra_content);
my $items = 0;
if (defined($ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'})) {
$items = 1;
$items = scalar(@{$ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'}}) if (ref($ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'}) eq 'ARRAY');
}
my $start_epoch = '';
my $end_epoch = '';
if (defined($event->{startDate}->{content}) &&
$event->{startDate}->{content} =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/) { # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$start_epoch = $dt->epoch;
}
if (defined($event->{endDate}->{content}) &&
$event->{endDate}->{content} =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/) { # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$end_epoch = $dt->epoch;
}
$self->{events}->{$event->{id}->{content}} = {
id => $event->{id}->{content},
subject => $event->{subject}->{content},
status => $status,
items => $items,
start_date => (defined($event->{startDate}->{content})) ? $event->{startDate}->{content} : "-",
since_start => ($start_epoch ne '') ? $current_time - $start_epoch : "-",
end_date => (defined($event->{endDate}->{content})) ? $event->{endDate}->{content} : "-",
since_end => ($end_epoch ne '') ? $current_time - $end_epoch : "-",
};
$self->{global}->{lc($status)}++;
}
}
1;
__END__
=head1 MODE
Check events status and number of impacted ressources
=over 8
=item B<--filter-status>
Filter events status (Default: 'Active')
=item B<--warning-status>
Set warning threshold for status (Default: '')
Can used special variables like: %{id}, %{subject}, %{status}, %{items},
%{start_date}, %{since_start}, %{end_date}, %{since_end}.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /Active/ && %{items} > 0').
Can used special variables like: %{id}, %{subject}, %{status}, %{items},
%{start_date}, %{since_start}, %{end_date}, %{since_end}.
=item B<--warning-*>
Threshold warning.
Can be: 'active', 'completed', 'published'.
=item B<--critical-*>
Threshold critical.
Can be: 'active', 'completed', 'published'.
=back
=cut
#
# Copyright 2019 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 cloud::ibm::softlayer::mode::events;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use DateTime;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message, debug => 1);
}
return $status;
}
sub custom_event_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s', Impacted items: %d, Start date: %s, End date: %s",
$self->{result_values}->{status},
$self->{result_values}->{items},
($self->{result_values}->{start_date} ne "-") ? $self->{result_values}->{start_date} . ' (' . centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since_start}) . ' ago)' : '-',
($self->{result_values}->{end_date} ne "-") ? $self->{result_values}->{end_date} . ' (' . centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since_end}) . ' ago)' : '-');
return $msg;
}
sub custom_event_calc {
my ($self, %options) = @_;
$self->{result_values}->{id} = $options{new_datas}->{$self->{instance} . '_id'};
$self->{result_values}->{subject} = $options{new_datas}->{$self->{instance} . '_subject'};
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'};
$self->{result_values}->{items} = $options{new_datas}->{$self->{instance} . '_items'};
$self->{result_values}->{start_date} = $options{new_datas}->{$self->{instance} . '_start_date'};
$self->{result_values}->{since_start} = $options{new_datas}->{$self->{instance} . '_since_start'};
$self->{result_values}->{end_date} = $options{new_datas}->{$self->{instance} . '_end_date'};
$self->{result_values}->{since_end} = $options{new_datas}->{$self->{instance} . '_since_end'};
return 0;
}
sub prefix_global_output {
my ($self, %options) = @_;
return "Number of events ";
}
sub prefix_events_output {
my ($self, %options) = @_;
return "Event '" . $options{instance_value}->{id} . "' with subject '" . $options{instance_value}->{subject} . "' ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', skipped_code => { -10 => 1 } },
{ name => 'events', type => 1, cb_prefix_output => 'prefix_events_output' },
];
$self->{maps_counters}->{global} = [
{ label => 'active', set => {
key_values => [ { name => 'active' } ],
output_template => 'Active : %d',
perfdatas => [
{ label => 'active_events', value => 'active_absolute', template => '%d',
min => 0 },
],
}
},
{ label => 'completed', set => {
key_values => [ { name => 'completed' } ],
output_template => 'Completed : %d',
perfdatas => [
{ label => 'completed_events', value => 'completed_absolute', template => '%d',
min => 0 },
],
}
},
{ label => 'published', set => {
key_values => [ { name => 'published' } ],
output_template => 'Published : %d',
perfdatas => [
{ label => 'published_events', value => 'published_absolute', template => '%d',
min => 0 },
],
}
},
];
$self->{maps_counters}->{events} = [
{ label => 'event', threshold => 0, set => {
key_values => [ { name => 'id' }, { name => 'subject' }, { name => 'status' }, { name => 'items' },
{ name => 'start_date' }, { name => 'since_start' }, { name => 'end_date' }, { name => 'since_end' } ],
closure_custom_calc => $self->can('custom_event_calc'),
closure_custom_output => $self->can('custom_event_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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-status:s" => { name => 'filter_status', default => 'Active' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /Active/ && %{items} > 0' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
my $current_time = time();
my %status_hash;
my $events = $options{custom}->get_endpoint(service => 'SoftLayer_Notification_Occurrence_Event', method => 'getAllObjects', extra_content => '');
foreach my $event (@{$events->{'ns1:getAllObjectsResponse'}->{'getAllObjectsReturn'}->{'item'}}) {
my $status;
$status = $event->{statusCode}->{name}->{content} if (defined($event->{statusCode}->{name}->{content}));
$status_hash{'#' . $event->{statusCode}->{id}} = $event->{statusCode}->{name}->{content} if (defined($event->{statusCode}->{name}->{content}));
$status = $status_hash{$event->{statusCode}->{href}} if (!defined($event->{statusCode}->{name}->{content}) && defined($event->{statusCode}->{href}));
next if (defined($self->{option_results}->{filter_status}) && $status !~ /$self->{option_results}->{filter_status}/);
my $extra_content = '<slapi:SoftLayer_Notification_Occurrence_EventInitParameters>
<id>' . $event->{id}->{content} . '</id>
</slapi:SoftLayer_Notification_Occurrence_EventInitParameters>';
my $ressources = $options{custom}->get_endpoint(service => 'SoftLayer_Notification_Occurrence_Event', method => 'getImpactedResources', extra_content => $extra_content);
my $items = 0;
if (defined($ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'})) {
$items = 1;
$items = scalar(@{$ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'}}) if (ref($ressources->{'ns1:getImpactedResourcesResponse'}->{'getImpactedResourcesReturn'}->{'item'}) eq 'ARRAY');
}
my $start_epoch = '';
my $end_epoch = '';
if (defined($event->{startDate}->{content}) &&
$event->{startDate}->{content} =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/) { # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$start_epoch = $dt->epoch;
}
if (defined($event->{endDate}->{content}) &&
$event->{endDate}->{content} =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/) { # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$end_epoch = $dt->epoch;
}
$self->{events}->{$event->{id}->{content}} = {
id => $event->{id}->{content},
subject => $event->{subject}->{content},
status => $status,
items => $items,
start_date => (defined($event->{startDate}->{content})) ? $event->{startDate}->{content} : "-",
since_start => ($start_epoch ne '') ? $current_time - $start_epoch : "-",
end_date => (defined($event->{endDate}->{content})) ? $event->{endDate}->{content} : "-",
since_end => ($end_epoch ne '') ? $current_time - $end_epoch : "-",
};
$self->{global}->{lc($status)}++;
}
}
1;
__END__
=head1 MODE
Check events status and number of impacted ressources
=over 8
=item B<--filter-status>
Filter events status (Default: 'Active')
=item B<--warning-status>
Set warning threshold for status (Default: '')
Can used special variables like: %{id}, %{subject}, %{status}, %{items},
%{start_date}, %{since_start}, %{end_date}, %{since_end}.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /Active/ && %{items} > 0').
Can used special variables like: %{id}, %{subject}, %{status}, %{items},
%{start_date}, %{since_start}, %{end_date}, %{since_end}.
=item B<--warning-*>
Threshold warning.
Can be: 'active', 'completed', 'published'.
=item B<--critical-*>
Threshold critical.
Can be: 'active', 'completed', 'published'.
=back
=cut

View File

@ -1,240 +1,240 @@
#
# Copyright 2019 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 cloud::ibm::softlayer::mode::opentickets;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use DateTime;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_ticket_output {
my ($self, %options) = @_;
my $msg = sprintf("Title: '%s', Group: '%s', Priority: %s, Create Date: %s (%s ago)",
$self->{result_values}->{title},
$self->{result_values}->{group},
$self->{result_values}->{priority},
$self->{result_values}->{create_date},
centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since}));
return $msg;
}
sub custom_ticket_calc {
my ($self, %options) = @_;
$self->{result_values}->{id} = $options{new_datas}->{$self->{instance} . '_id'};
$self->{result_values}->{title} = $options{new_datas}->{$self->{instance} . '_title'};
$self->{result_values}->{priority} = $options{new_datas}->{$self->{instance} . '_priority'};
$self->{result_values}->{create_date} = $options{new_datas}->{$self->{instance} . '_create_date'};
$self->{result_values}->{group} = $options{new_datas}->{$self->{instance} . '_group'};
$self->{result_values}->{since} = $options{new_datas}->{$self->{instance} . '_since'};
return 0;
}
sub prefix_tickets_output {
my ($self, %options) = @_;
return "Ticket '" . $options{instance_value}->{id} . "' is open with ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'tickets', type => 1, cb_prefix_output => 'prefix_tickets_output' },
];
$self->{maps_counters}->{global} = [
{ label => 'open', set => {
key_values => [ { name => 'open' } ],
output_template => 'Number of open tickets : %d',
perfdatas => [
{ label => 'open_tickets', value => 'open_absolute', template => '%d',
min => 0 },
],
}
},
];
$self->{maps_counters}->{tickets} = [
{ label => 'ticket', threshold => 0, set => {
key_values => [ { name => 'id' }, { name => 'title' }, { name => 'priority' }, { name => 'create_date' },
{ name => 'group' }, { name => 'since' } ],
closure_custom_calc => $self->can('custom_ticket_calc'),
closure_custom_output => $self->can('custom_ticket_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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 =>
{
"ticket-group:s" => { name => 'ticket_group' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
$self->{global}->{open} = 0;
$self->{tickets} = {};
my $group_id = '';
my %groups_hash;
my $groups = $options{custom}->get_endpoint(service => 'SoftLayer_Ticket', method => 'getAllTicketGroups', extra_content => '');
foreach my $group (@{$groups->{'ns1:getAllTicketGroupsResponse'}->{'getAllTicketGroupsReturn'}->{'item'}}) {
$groups_hash{$group->{id}->{content}} = $group->{name}->{content};
if (defined($self->{option_results}->{ticket_group}) && $self->{option_results}->{ticket_group} ne '' &&
$group->{name}->{content} =~ /^$self->{option_results}->{ticket_group}$/) {
$group_id = $group->{id}->{content};
}
}
if (defined($self->{option_results}->{ticket_group}) && $self->{option_results}->{ticket_group} ne '' && $group_id eq '') {
$self->{output}->add_option_msg(short_msg => "Ticket group ID not found from API.");
$self->{output}->option_exit();
}
my $current_time = time();
my $tickets = $options{custom}->get_endpoint(service => 'SoftLayer_Account', method => 'getOpenTickets', extra_content => '');
foreach my $ticket (@{$tickets->{'ns1:getOpenTicketsResponse'}->{'getOpenTicketsReturn'}->{'item'}}) {
next if (defined($group_id) && $group_id ne '' && $ticket->{groupId}->{content} ne $group_id);
next if ($ticket->{createDate}->{content} !~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/); # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$self->{tickets}->{$ticket->{id}->{content}} = {
id => $ticket->{id}->{content},
title => $ticket->{title}->{content},
priority => $ticket->{priority}->{content},
create_date => $ticket->{createDate}->{content},
group => $groups_hash{$ticket->{groupId}->{content}},
since => $current_time - $dt->epoch,
};
$self->{global}->{open}++;
}
}
1;
__END__
=head1 MODE
Check if there is open tickets
=over 8
=item B<--ticket-group>
Name of the ticket group (Can be a regexp).
=item B<--warning-status>
Set warning threshold for status (Default: '')
Can used special variables like: %{id}, %{title},
%{priority}, %{create_date}, %{group}, %{since}.
=item B<--critical-status>
Set critical threshold for status (Default: '').
Can used special variables like: %{id}, %{title},
%{priority}, %{create_date}, %{group}, %{since}.
=item B<--warning-open>
Threshold warning for open tickets.
=item B<--critical-open>
Threshold critical for open tickets.
=back
=cut
#
# Copyright 2019 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 cloud::ibm::softlayer::mode::opentickets;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
use DateTime;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_ticket_output {
my ($self, %options) = @_;
my $msg = sprintf("Title: '%s', Group: '%s', Priority: %s, Create Date: %s (%s ago)",
$self->{result_values}->{title},
$self->{result_values}->{group},
$self->{result_values}->{priority},
$self->{result_values}->{create_date},
centreon::plugins::misc::change_seconds(value => $self->{result_values}->{since}));
return $msg;
}
sub custom_ticket_calc {
my ($self, %options) = @_;
$self->{result_values}->{id} = $options{new_datas}->{$self->{instance} . '_id'};
$self->{result_values}->{title} = $options{new_datas}->{$self->{instance} . '_title'};
$self->{result_values}->{priority} = $options{new_datas}->{$self->{instance} . '_priority'};
$self->{result_values}->{create_date} = $options{new_datas}->{$self->{instance} . '_create_date'};
$self->{result_values}->{group} = $options{new_datas}->{$self->{instance} . '_group'};
$self->{result_values}->{since} = $options{new_datas}->{$self->{instance} . '_since'};
return 0;
}
sub prefix_tickets_output {
my ($self, %options) = @_;
return "Ticket '" . $options{instance_value}->{id} . "' is open with ";
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 0 },
{ name => 'tickets', type => 1, cb_prefix_output => 'prefix_tickets_output' },
];
$self->{maps_counters}->{global} = [
{ label => 'open', set => {
key_values => [ { name => 'open' } ],
output_template => 'Number of open tickets : %d',
perfdatas => [
{ label => 'open_tickets', value => 'open_absolute', template => '%d',
min => 0 },
],
}
},
];
$self->{maps_counters}->{tickets} = [
{ label => 'ticket', threshold => 0, set => {
key_values => [ { name => 'id' }, { name => 'title' }, { name => 'priority' }, { name => 'create_date' },
{ name => 'group' }, { name => 'since' } ],
closure_custom_calc => $self->can('custom_ticket_calc'),
closure_custom_output => $self->can('custom_ticket_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
];
}
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 =>
{
"ticket-group:s" => { name => 'ticket_group' },
"warning-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '' },
});
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::check_options(%options);
$instance_mode = $self;
$self->change_macros();
}
sub change_macros {
my ($self, %options) = @_;
foreach (('warning_status', 'critical_status')) {
if (defined($self->{option_results}->{$_})) {
$self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g;
}
}
}
sub manage_selection {
my ($self, %options) = @_;
$self->{global}->{open} = 0;
$self->{tickets} = {};
my $group_id = '';
my %groups_hash;
my $groups = $options{custom}->get_endpoint(service => 'SoftLayer_Ticket', method => 'getAllTicketGroups', extra_content => '');
foreach my $group (@{$groups->{'ns1:getAllTicketGroupsResponse'}->{'getAllTicketGroupsReturn'}->{'item'}}) {
$groups_hash{$group->{id}->{content}} = $group->{name}->{content};
if (defined($self->{option_results}->{ticket_group}) && $self->{option_results}->{ticket_group} ne '' &&
$group->{name}->{content} =~ /^$self->{option_results}->{ticket_group}$/) {
$group_id = $group->{id}->{content};
}
}
if (defined($self->{option_results}->{ticket_group}) && $self->{option_results}->{ticket_group} ne '' && $group_id eq '') {
$self->{output}->add_option_msg(short_msg => "Ticket group ID not found from API.");
$self->{output}->option_exit();
}
my $current_time = time();
my $tickets = $options{custom}->get_endpoint(service => 'SoftLayer_Account', method => 'getOpenTickets', extra_content => '');
foreach my $ticket (@{$tickets->{'ns1:getOpenTicketsResponse'}->{'getOpenTicketsReturn'}->{'item'}}) {
next if (defined($group_id) && $group_id ne '' && $ticket->{groupId}->{content} ne $group_id);
next if ($ticket->{createDate}->{content} !~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.*)$/); # 2018-10-18T15:36:54+00:00
my $dt = DateTime->new(
year => $1,
month => $2,
day => $3,
hour => $4,
minute => $5,
second => $6,
time_zone => $7
);
$self->{tickets}->{$ticket->{id}->{content}} = {
id => $ticket->{id}->{content},
title => $ticket->{title}->{content},
priority => $ticket->{priority}->{content},
create_date => $ticket->{createDate}->{content},
group => $groups_hash{$ticket->{groupId}->{content}},
since => $current_time - $dt->epoch,
};
$self->{global}->{open}++;
}
}
1;
__END__
=head1 MODE
Check if there is open tickets
=over 8
=item B<--ticket-group>
Name of the ticket group (Can be a regexp).
=item B<--warning-status>
Set warning threshold for status (Default: '')
Can used special variables like: %{id}, %{title},
%{priority}, %{create_date}, %{group}, %{since}.
=item B<--critical-status>
Set critical threshold for status (Default: '').
Can used special variables like: %{id}, %{title},
%{priority}, %{create_date}, %{group}, %{since}.
=item B<--warning-open>
Threshold warning for open tickets.
=item B<--critical-open>
Threshold critical for open tickets.
=back
=cut

View File

@ -1,74 +1,74 @@
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::fan;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
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_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'fan', instance => $instance));
next if ($result->{hwSensorType} != 1); #Fans
$self->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan '%s' speed is '%s' RPM",
$result->{hwSensorName}, $result->{hwSensorValue}));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{hwSensorValue});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fan '%s' speed is '%s' RPM", $result->{hwSensorName}, $result->{hwSensorValue}));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'speed_' . $perf_label, unit => 'rpm',
value => $result->{hwSensorValue},
warning => $warn,
critical => $crit
);
}
}
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::fan;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
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_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'fan', instance => $instance));
next if ($result->{hwSensorType} != 1); #Fans
$self->{components}->{fan}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Fan '%s' speed is '%s' RPM",
$result->{hwSensorName}, $result->{hwSensorValue}));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{hwSensorValue});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fan '%s' speed is '%s' RPM", $result->{hwSensorName}, $result->{hwSensorValue}));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'speed_' . $perf_label, unit => 'rpm',
value => $result->{hwSensorValue},
warning => $warn,
critical => $crit
);
}
}
1;

View File

@ -1,72 +1,72 @@
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::psu;
use strict;
use warnings;
my %map_status = (
0 => 'critical',
1 => 'ok',
2 => 'critical',
);
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3', map => \%map_status },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0};
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'psu', instance => $instance));
next if ($result->{hwSensorType} != 3); #PSU
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is '%s'",
$result->{hwSensorName}, $result->{hwSensorValue}));
my $exit = $self->get_severity(label => 'psu', section => 'psu', value => $result->{hwSensorValue});
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'", $result->{hwSensorName}, $result->{hwSensorValue}));
}
}
}
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::psu;
use strict;
use warnings;
my %map_status = (
0 => 'critical',
1 => 'ok',
2 => 'critical',
);
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3', map => \%map_status },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking power supplies");
$self->{components}->{psu} = {name => 'power supplies', total => 0, skip => 0};
return if ($self->check_filter(section => 'psu'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'psu', instance => $instance));
next if ($result->{hwSensorType} != 3); #PSU
$self->{components}->{psu}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Power supply '%s' status is '%s'",
$result->{hwSensorName}, $result->{hwSensorValue}));
my $exit = $self->get_severity(label => 'psu', section => 'psu', value => $result->{hwSensorValue});
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'", $result->{hwSensorName}, $result->{hwSensorValue}));
}
}
}
1;

View File

@ -1,74 +1,74 @@
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::temperature;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0};
return if ($self->check_filter(section => 'temperature'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'temperature', instance => $instance));
next if ($result->{hwSensorType} != 2); #Temperatures
$self->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature '%s' is '%s' celsius degrees",
$result->{hwSensorName}, $result->{hwSensorValue} / 1000));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{hwSensorValue} / 1000);
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Temperature '%s' is '%s' celsius degrees", $result->{hwSensorName}, $result->{hwSensorValue} / 1000));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'temperature_' . $perf_label, unit => 'C',
value => $result->{hwSensorValue} / 1000,
warning => $warn,
critical => $crit
);
}
}
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::temperature;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking temperatures");
$self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0};
return if ($self->check_filter(section => 'temperature'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'temperature', instance => $instance));
next if ($result->{hwSensorType} != 2); #Temperatures
$self->{components}->{temperature}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Temperature '%s' is '%s' celsius degrees",
$result->{hwSensorName}, $result->{hwSensorValue} / 1000));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{hwSensorValue} / 1000);
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Temperature '%s' is '%s' celsius degrees", $result->{hwSensorName}, $result->{hwSensorValue} / 1000));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'temperature_' . $perf_label, unit => 'C',
value => $result->{hwSensorValue} / 1000,
warning => $warn,
critical => $crit
);
}
}
1;

View File

@ -1,74 +1,74 @@
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::voltage;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking voltages");
$self->{components}->{voltage} = {name => 'voltages', total => 0, skip => 0};
return if ($self->check_filter(section => 'voltage'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'voltage', instance => $instance));
next if ($result->{hwSensorType} != 0); #Voltages
$self->{components}->{voltage}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Voltage '%s' is '%s' mV",
$result->{hwSensorName}, $result->{hwSensorValue}));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'voltage', instance => $instance, value => $result->{hwSensorValue});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Voltage '%s' is '%s' mV", $result->{hwSensorName}, $result->{hwSensorValue}));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'voltage_' . $perf_label, unit => 'mV',
value => $result->{hwSensorValue},
warning => $warn,
critical => $crit
);
}
}
#
# Copyright 2019 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::barracuda::cloudgen::snmp::mode::components::voltage;
use strict;
use warnings;
my $mapping = {
hwSensorName => { oid => '.1.3.6.1.4.1.10704.1.4.1.1' },
hwSensorType => { oid => '.1.3.6.1.4.1.10704.1.4.1.2' },
hwSensorValue => { oid => '.1.3.6.1.4.1.10704.1.4.1.3' },
};
my $oid_HwSensorsEntry = '.1.3.6.1.4.1.10704.1.4.1';
sub load {
my ($self) = @_;
push @{$self->{request}}, { oid => $oid_HwSensorsEntry };
}
sub check {
my ($self) = @_;
$self->{output}->output_add(long_msg => "Checking voltages");
$self->{components}->{voltage} = {name => 'voltages', total => 0, skip => 0};
return if ($self->check_filter(section => 'voltage'));
foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_HwSensorsEntry}})) {
next if ($oid !~ /^$mapping->{hwSensorType}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_HwSensorsEntry}, instance => $instance);
next if ($self->check_filter(section => 'voltage', instance => $instance));
next if ($result->{hwSensorType} != 0); #Voltages
$self->{components}->{voltage}->{total}++;
$self->{output}->output_add(long_msg => sprintf("Voltage '%s' is '%s' mV",
$result->{hwSensorName}, $result->{hwSensorValue}));
my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'voltage', instance => $instance, value => $result->{hwSensorValue});
if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) {
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Voltage '%s' is '%s' mV", $result->{hwSensorName}, $result->{hwSensorValue}));
}
my $perf_label = $result->{hwSensorName};
$perf_label =~ s/ /_/g;
$self->{output}->perfdata_add(label => 'voltage_' . $perf_label, unit => 'mV',
value => $result->{hwSensorValue},
warning => $warn,
critical => $crit
);
}
}
1;

View File

@ -100,6 +100,8 @@ sub manage_selection {
__END__
=head1 MODE
Check Juniper sessions usage and failed sessions (NETSCREEN-RESOURCE-MIB).
=over 8

View File

@ -1,172 +1,172 @@
#
# Copyright 2019 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::ibm::fs900::snmp::mode::arraysstatus;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s'", $self->{result_values}->{status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_arrayStatus'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All arrays metrics are ok", message_separator => ' - ' }
];
$self->{maps_counters}->{global} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'arrayStatus' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'vdisk-count', set => {
key_values => [ { name => 'arrayVDiskCount' }, { name => 'arrayId' } ],
output_template => 'VDisk count: %s',
perfdatas => [
{ label => 'vdisk_count', value => 'arrayVDiskCount_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'arrayId_absolute', min => 0 },
],
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Array '" . $options{instance_value}->{arrayId} . "' ";
}
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-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /degraded/i' },
});
return $self;
}
my $mapping = {
arrayId => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.2' },
arrayStatus => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.3' },
arrayVDiskCount => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.9' },
};
my $oid_arrayIndex = '.1.3.6.1.4.1.2.6.255.1.1.1.52.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_arrayIndex,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{arrayId}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{arrayId}} = $result;
}
}
1;
__END__
=head1 MODE
Check arrays status.
=over 8
=item B<--warning-status>
Set warning threshold for status.
'status' can be: 'online', 'offline', 'excluded', 'degraded'.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /degraded/i').
'status' can be: 'online', 'offline', 'excluded', 'degraded'.
=item B<--warning-vdisk-count>
Threshold warning for VDisks count.
=item B<--critical-vdisk-count>
Threshold critical for VDisks count.
=back
=cut
#
# Copyright 2019 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::ibm::fs900::snmp::mode::arraysstatus;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
my $instance_mode;
sub custom_status_threshold {
my ($self, %options) = @_;
my $status = 'ok';
my $message;
eval {
local $SIG{__WARN__} = sub { $message = $_[0]; };
local $SIG{__DIE__} = sub { $message = $_[0]; };
if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' &&
eval "$instance_mode->{option_results}->{critical_status}") {
$status = 'critical';
} elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' &&
eval "$instance_mode->{option_results}->{warning_status}") {
$status = 'warning';
}
};
if (defined($message)) {
$self->{output}->output_add(long_msg => 'filter status issue: ' . $message);
}
return $status;
}
sub custom_status_output {
my ($self, %options) = @_;
my $msg = sprintf("Status is '%s'", $self->{result_values}->{status});
return $msg;
}
sub custom_status_calc {
my ($self, %options) = @_;
$self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_arrayStatus'};
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All arrays metrics are ok", message_separator => ' - ' }
];
$self->{maps_counters}->{global} = [
{ label => 'status', threshold => 0, set => {
key_values => [ { name => 'arrayStatus' } ],
closure_custom_calc => $self->can('custom_status_calc'),
closure_custom_output => $self->can('custom_status_output'),
closure_custom_perfdata => sub { return 0; },
closure_custom_threshold_check => $self->can('custom_status_threshold'),
}
},
{ label => 'vdisk-count', set => {
key_values => [ { name => 'arrayVDiskCount' }, { name => 'arrayId' } ],
output_template => 'VDisk count: %s',
perfdatas => [
{ label => 'vdisk_count', value => 'arrayVDiskCount_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'arrayId_absolute', min => 0 },
],
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Array '" . $options{instance_value}->{arrayId} . "' ";
}
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-status:s" => { name => 'warning_status', default => '' },
"critical-status:s" => { name => 'critical_status', default => '%{status} =~ /degraded/i' },
});
return $self;
}
my $mapping = {
arrayId => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.2' },
arrayStatus => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.3' },
arrayVDiskCount => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.9' },
};
my $oid_arrayIndex = '.1.3.6.1.4.1.2.6.255.1.1.1.52.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_arrayIndex,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{arrayId}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{arrayId}} = $result;
}
}
1;
__END__
=head1 MODE
Check arrays status.
=over 8
=item B<--warning-status>
Set warning threshold for status.
'status' can be: 'online', 'offline', 'excluded', 'degraded'.
=item B<--critical-status>
Set critical threshold for status (Default: '%{status} =~ /degraded/i').
'status' can be: 'online', 'offline', 'excluded', 'degraded'.
=item B<--warning-vdisk-count>
Threshold warning for VDisks count.
=item B<--critical-vdisk-count>
Threshold critical for VDisks count.
=back
=cut

View File

@ -1,183 +1,183 @@
#
# Copyright 2019 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::ibm::fs900::snmp::mode::arraysusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
$self->{output}->perfdata_add(label => "used" . $extra_label,
unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-usage'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-usage'),
min => 0,
max => $self->{result_values}->{total},
);
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{used_prct},
threshold => [ { label => 'critical-usage', exit_litteral => 'critical' },
{ label => 'warning-usage', exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my ($used, $used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($free, $free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my $msg = sprintf("Usage Total: %s %s, Used: %s %s (%.2f%%), Free: %s %s (%.2f%%)", $total, $total_unit, $used, $used_unit, $self->{result_values}->{used_prct}, $free, $free_unit, $self->{result_values}->{free_prct});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
($self->{result_values}->{total}, $self->{result_values}->{total_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacity'}));
($self->{result_values}->{used}, $self->{result_values}->{used_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacityUsed'}));
($self->{result_values}->{free}, $self->{result_values}->{free_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacityFree'}));
$self->{result_values}->{total} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{total}, unit => $self->{result_values}->{total_unit});
$self->{result_values}->{used} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{used}, unit => $self->{result_values}->{used_unit});
$self->{result_values}->{free} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{free}, unit => $self->{result_values}->{free_unit});
$self->{result_values}->{used_prct} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{free_prct} = 100 - $self->{result_values}->{used_prct};
return 0;
}
sub change_to_bytes {
my ($self, %options) = @_;
my $value = '';
if ($options{unit} =~ /KiB*/i) {
$value = $options{value} * 1024;
} elsif ($options{unit} =~ /MiB*/i) {
$value = $options{value} * 1024 * 1024;
} elsif ($options{unit} =~ /GiB*/i) {
$value = $options{value} * 1024 * 1024 * 1024;
} elsif ($options{unit} =~ /TiB*/i) {
$value = $options{value} * 1024 * 1024 * 1024 * 1024;
}
return $value
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All arrays usage are ok" }
];
$self->{maps_counters}->{global} = [
{ label => 'usage', set => {
key_values => [ { name => 'arrayCapacity' }, { name => 'arrayCapacityUsed' }, { name => 'arrayCapacityFree' }, { name => 'arrayId' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Array '" . $options{instance_value}->{arrayId} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
my $mapping = {
arrayId => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.2' },
arrayCapacity => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.4' },
arrayCapacityUsed => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.5' },
arrayCapacityFree => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.6' },
};
my $oid_arrayIndex = '.1.3.6.1.4.1.2.6.255.1.1.1.52.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_arrayIndex,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{arrayId}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{arrayId}} = $result;
}
}
1;
__END__
=head1 MODE
Check arrays usage.
=over 8
=item B<--warning-usage>
Threshold warning.
=item B<--critical-usage>
Threshold critical.
=back
=cut
#
# Copyright 2019 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::ibm::fs900::snmp::mode::arraysusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub custom_usage_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
$self->{output}->perfdata_add(label => "used" . $extra_label,
unit => 'B',
value => $self->{result_values}->{used},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-usage'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-usage'),
min => 0,
max => $self->{result_values}->{total},
);
}
sub custom_usage_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{used_prct},
threshold => [ { label => 'critical-usage', exit_litteral => 'critical' },
{ label => 'warning-usage', exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_usage_output {
my ($self, %options) = @_;
my ($total, $total_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total});
my ($used, $used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used});
my ($free, $free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free});
my $msg = sprintf("Usage Total: %s %s, Used: %s %s (%.2f%%), Free: %s %s (%.2f%%)", $total, $total_unit, $used, $used_unit, $self->{result_values}->{used_prct}, $free, $free_unit, $self->{result_values}->{free_prct});
return $msg;
}
sub custom_usage_calc {
my ($self, %options) = @_;
($self->{result_values}->{total}, $self->{result_values}->{total_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacity'}));
($self->{result_values}->{used}, $self->{result_values}->{used_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacityUsed'}));
($self->{result_values}->{free}, $self->{result_values}->{free_unit}) = (split(' ', $options{new_datas}->{$self->{instance} . '_arrayCapacityFree'}));
$self->{result_values}->{total} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{total}, unit => $self->{result_values}->{total_unit});
$self->{result_values}->{used} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{used}, unit => $self->{result_values}->{used_unit});
$self->{result_values}->{free} = storage::ibm::fs900::snmp::mode::arraysusage->change_to_bytes(value => $self->{result_values}->{free}, unit => $self->{result_values}->{free_unit});
$self->{result_values}->{used_prct} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total};
$self->{result_values}->{free_prct} = 100 - $self->{result_values}->{used_prct};
return 0;
}
sub change_to_bytes {
my ($self, %options) = @_;
my $value = '';
if ($options{unit} =~ /KiB*/i) {
$value = $options{value} * 1024;
} elsif ($options{unit} =~ /MiB*/i) {
$value = $options{value} * 1024 * 1024;
} elsif ($options{unit} =~ /GiB*/i) {
$value = $options{value} * 1024 * 1024 * 1024;
} elsif ($options{unit} =~ /TiB*/i) {
$value = $options{value} * 1024 * 1024 * 1024 * 1024;
}
return $value
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All arrays usage are ok" }
];
$self->{maps_counters}->{global} = [
{ label => 'usage', set => {
key_values => [ { name => 'arrayCapacity' }, { name => 'arrayCapacityUsed' }, { name => 'arrayCapacityFree' }, { name => 'arrayId' } ],
closure_custom_calc => $self->can('custom_usage_calc'),
closure_custom_output => $self->can('custom_usage_output'),
closure_custom_perfdata => $self->can('custom_usage_perfdata'),
closure_custom_threshold_check => $self->can('custom_usage_threshold'),
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Array '" . $options{instance_value}->{arrayId} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
my $mapping = {
arrayId => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.2' },
arrayCapacity => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.4' },
arrayCapacityUsed => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.5' },
arrayCapacityFree => { oid => '.1.3.6.1.4.1.2.6.255.1.1.1.52.1.6' },
};
my $oid_arrayIndex = '.1.3.6.1.4.1.2.6.255.1.1.1.52.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_arrayIndex,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{arrayId}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{arrayId}} = $result;
}
}
1;
__END__
=head1 MODE
Check arrays usage.
=over 8
=item B<--warning-usage>
Threshold warning.
=item B<--critical-usage>
Threshold critical.
=back
=cut

View File

@ -1,205 +1,205 @@
#
# Copyright 2019 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::ibm::fs900::snmp::mode::fcusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub custom_bandwidth_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
$self->{output}->perfdata_add(label => lc($self->{result_values}->{type}) . "_bandwidth" . $extra_label,
unit => 'B/s',
value => $self->{result_values}->{bandwidth},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . lc($self->{result_values}->{type}) . '-bandwidth'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . lc($self->{result_values}->{type}) . '-bandwidth'),
);
}
sub custom_bandwidth_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{bandwidth},
threshold => [ { label => 'critical-' . lc($self->{result_values}->{type}) . '-bandwidth', exit_litteral => 'critical' },
{ label => 'warning-' . lc($self->{result_values}->{type}) . '-bandwidth', exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_bandwidth_output {
my ($self, %options) = @_;
my ($bandwidth, $unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{bandwidth});
my $msg = sprintf("%s bandwidth: %s %s/s", $self->{result_values}->{type}, $bandwidth, $unit);
return $msg;
}
sub custom_bandwidth_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_fcObject'};
$self->{result_values}->{type} = $options{extra_options}->{type};
$self->{result_values}->{bandwidth} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{bandwidth}} *1024 * 1024;
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All fibre channels read/write metrics are ok", skipped_code => { -10 => 1 } }
];
$self->{maps_counters}->{global} = [
{ label => 'read-bandwidth', set => {
key_values => [ { name => 'fcReadBW' }, { name => 'fcObject' } ],
closure_custom_calc => $self->can('custom_bandwidth_calc'),
closure_custom_calc_extra_options => { type => 'Read', bandwidth => 'fcReadBW' },
closure_custom_output => $self->can('custom_bandwidth_output'),
closure_custom_perfdata => $self->can('custom_bandwidth_perfdata'),
closure_custom_threshold_check => $self->can('custom_bandwidth_threshold'),
}
},
{ label => 'write-bandwidth', set => {
key_values => [ { name => 'fcWriteBW' }, { name => 'fcObject' } ],
closure_custom_calc => $self->can('custom_bandwidth_calc'),
closure_custom_calc_extra_options => { type => 'Write', bandwidth => 'fcWriteBW' },
closure_custom_output => $self->can('custom_bandwidth_output'),
closure_custom_perfdata => $self->can('custom_bandwidth_perfdata'),
closure_custom_threshold_check => $self->can('custom_bandwidth_threshold'),
}
},
{ label => 'read-iops', set => {
key_values => [ { name => 'fcReadIOPS' }, { name => 'fcObject' } ],
output_template => 'Read IOPS: %s iops',
perfdatas => [
{ label => 'read_iops', value => 'fcReadIOPS_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'write-iops', set => {
key_values => [ { name => 'fcWriteIOPS' }, { name => 'fcObject' } ],
output_template => 'Write IOPS: %s iops',
perfdatas => [
{ label => 'write_iops', value => 'fcWriteIOPS_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'read-queue-depth', set => {
key_values => [ { name => 'fcReadQueueDepth' }, { name => 'fcObject' } ],
output_template => 'Read queue depth: %s',
perfdatas => [
{ label => 'read_queue_depth', value => 'fcReadQueueDepth_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'write-queue-depth', set => {
key_values => [ { name => 'fcWriteQueueDepth' }, { name => 'fcObject' } ],
output_template => 'Write queue depth: %s',
perfdatas => [
{ label => 'write_queue_depth', value => 'fcWriteQueueDepth_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Fibre channel '" . $options{instance_value}->{fcObject} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
my $mapping = {
fcObject => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.2' },
fcReadBW => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.13' }, #MB/s
fcWriteBW => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.14' }, #MB/s
fcReadIOPS => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.16' },
fcWriteIOPS => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.17' },
fcReadQueueDepth => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.19' },
fcWriteQueueDepth => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.20' },
};
my $oid_fcTableEntry = '.1.3.6.1.4.1.2.6.255.1.1.2.1.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_fcTableEntry,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{fcObject}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{fcObject}} = $result;
}
}
1;
__END__
=head1 MODE
Check fibre channels usage.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'read-bandwidth', 'write-bandwidth', 'read-iops', 'write-iops', 'read-queue-depth', 'write-queue-depth'.
=item B<--critical-*>
Threshold critical.
Can be: 'read-bandwidth', 'write-bandwidth', 'read-iops', 'write-iops', 'read-queue-depth', 'write-queue-depth'.
=back
=cut
#
# Copyright 2019 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::ibm::fs900::snmp::mode::fcusage;
use base qw(centreon::plugins::templates::counter);
use strict;
use warnings;
sub custom_bandwidth_perfdata {
my ($self, %options) = @_;
my $extra_label = '';
$extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0);
$self->{output}->perfdata_add(label => lc($self->{result_values}->{type}) . "_bandwidth" . $extra_label,
unit => 'B/s',
value => $self->{result_values}->{bandwidth},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . lc($self->{result_values}->{type}) . '-bandwidth'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . lc($self->{result_values}->{type}) . '-bandwidth'),
);
}
sub custom_bandwidth_threshold {
my ($self, %options) = @_;
my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{bandwidth},
threshold => [ { label => 'critical-' . lc($self->{result_values}->{type}) . '-bandwidth', exit_litteral => 'critical' },
{ label => 'warning-' . lc($self->{result_values}->{type}) . '-bandwidth', exit_litteral => 'warning' } ]);
return $exit;
}
sub custom_bandwidth_output {
my ($self, %options) = @_;
my ($bandwidth, $unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{bandwidth});
my $msg = sprintf("%s bandwidth: %s %s/s", $self->{result_values}->{type}, $bandwidth, $unit);
return $msg;
}
sub custom_bandwidth_calc {
my ($self, %options) = @_;
$self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_fcObject'};
$self->{result_values}->{type} = $options{extra_options}->{type};
$self->{result_values}->{bandwidth} = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{bandwidth}} *1024 * 1024;
return 0;
}
sub set_counters {
my ($self, %options) = @_;
$self->{maps_counters_type} = [
{ name => 'global', type => 1, cb_prefix_output => 'prefix_output', message_multiple => "All fibre channels read/write metrics are ok", skipped_code => { -10 => 1 } }
];
$self->{maps_counters}->{global} = [
{ label => 'read-bandwidth', set => {
key_values => [ { name => 'fcReadBW' }, { name => 'fcObject' } ],
closure_custom_calc => $self->can('custom_bandwidth_calc'),
closure_custom_calc_extra_options => { type => 'Read', bandwidth => 'fcReadBW' },
closure_custom_output => $self->can('custom_bandwidth_output'),
closure_custom_perfdata => $self->can('custom_bandwidth_perfdata'),
closure_custom_threshold_check => $self->can('custom_bandwidth_threshold'),
}
},
{ label => 'write-bandwidth', set => {
key_values => [ { name => 'fcWriteBW' }, { name => 'fcObject' } ],
closure_custom_calc => $self->can('custom_bandwidth_calc'),
closure_custom_calc_extra_options => { type => 'Write', bandwidth => 'fcWriteBW' },
closure_custom_output => $self->can('custom_bandwidth_output'),
closure_custom_perfdata => $self->can('custom_bandwidth_perfdata'),
closure_custom_threshold_check => $self->can('custom_bandwidth_threshold'),
}
},
{ label => 'read-iops', set => {
key_values => [ { name => 'fcReadIOPS' }, { name => 'fcObject' } ],
output_template => 'Read IOPS: %s iops',
perfdatas => [
{ label => 'read_iops', value => 'fcReadIOPS_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'write-iops', set => {
key_values => [ { name => 'fcWriteIOPS' }, { name => 'fcObject' } ],
output_template => 'Write IOPS: %s iops',
perfdatas => [
{ label => 'write_iops', value => 'fcWriteIOPS_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'read-queue-depth', set => {
key_values => [ { name => 'fcReadQueueDepth' }, { name => 'fcObject' } ],
output_template => 'Read queue depth: %s',
perfdatas => [
{ label => 'read_queue_depth', value => 'fcReadQueueDepth_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
{ label => 'write-queue-depth', set => {
key_values => [ { name => 'fcWriteQueueDepth' }, { name => 'fcObject' } ],
output_template => 'Write queue depth: %s',
perfdatas => [
{ label => 'write_queue_depth', value => 'fcWriteQueueDepth_absolute', template => '%s', label_extra_instance => 1,
instance_use => 'fcObject_absolute', min => 0, unit => 'iops' },
],
}
},
];
}
sub prefix_output {
my ($self, %options) = @_;
return "Fibre channel '" . $options{instance_value}->{fcObject} . "' ";
}
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
});
return $self;
}
my $mapping = {
fcObject => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.2' },
fcReadBW => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.13' }, #MB/s
fcWriteBW => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.14' }, #MB/s
fcReadIOPS => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.16' },
fcWriteIOPS => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.17' },
fcReadQueueDepth => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.19' },
fcWriteQueueDepth => { oid => '.1.3.6.1.4.1.2.6.255.1.1.2.1.1.20' },
};
my $oid_fcTableEntry = '.1.3.6.1.4.1.2.6.255.1.1.2.1.1';
sub manage_selection {
my ($self, %options) = @_;
my $snmp_result = $options{snmp}->get_table(oid => $oid_fcTableEntry,
nothing_quit => 1);
$self->{global} = {};
foreach my $oid (keys %{$snmp_result}) {
next if ($oid !~ /^$mapping->{fcObject}->{oid}\.(.*)$/);
my $instance = $1;
my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance);
$self->{global}->{$result->{fcObject}} = $result;
}
}
1;
__END__
=head1 MODE
Check fibre channels usage.
=over 8
=item B<--warning-*>
Threshold warning.
Can be: 'read-bandwidth', 'write-bandwidth', 'read-iops', 'write-iops', 'read-queue-depth', 'write-queue-depth'.
=item B<--critical-*>
Threshold critical.
Can be: 'read-bandwidth', 'write-bandwidth', 'read-iops', 'write-iops', 'read-queue-depth', 'write-queue-depth'.
=back
=cut