diff --git a/centreon/common/protocols/ssh/custom/api.pm b/centreon/common/protocols/ssh/custom/api.pm index f8e18feea..865d4e757 100644 --- a/centreon/common/protocols/ssh/custom/api.pm +++ b/centreon/common/protocols/ssh/custom/api.pm @@ -37,19 +37,18 @@ sub new { $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' }, - "port:s@" => { name => 'port' }, - "timeout:s@" => { name => 'timeout' }, - "ssh-username:s@" => { name => 'ssh_username' }, - "ssh-password:s@" => { name => 'ssh_password' }, - "ssh-dir:s@" => { name => 'ssh_dir' }, - "ssh-identity:s@" => { name => 'ssh_identity' }, - "ssh-skip-serverkey-issue" => { name => 'ssh_skip_serverkey_issue' }, - }); + $options{options}->add_options(arguments => { + 'hostname:s@' => { name => 'hostname' }, + 'port:s@' => { name => 'port' }, + 'timeout:s@' => { name => 'timeout' }, + 'ssh-username:s@' => { name => 'ssh_username' }, + 'ssh-password:s@' => { name => 'ssh_password' }, + 'ssh-dir:s@' => { name => 'ssh_dir' }, + 'ssh-identity:s@' => { name => 'ssh_identity' }, + 'ssh-skip-serverkey-issue' => { name => 'ssh_skip_serverkey_issue' }, + }); } $options{options}->add_help(package => __PACKAGE__, sections => 'SSH OPTIONS', once => 1); @@ -68,7 +67,7 @@ sub set_options { sub set_defaults { my ($self, %options) = @_; - + foreach (keys %{$options{default}}) { if ($_ eq $self->{mode}) { for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { @@ -111,7 +110,7 @@ sub login { my $result = { status => 0, message => 'authentification succeeded' }; $self->{ssh} = Libssh::Session->new(); - + foreach (['hostname', 'host'], ['port', 'port'], ['timeout', 'timeout'], ['ssh_username', 'user'], ['ssh_dir', 'sshdir'], ['ssh_identity', 'identity']) { next if (!defined($self->{$_->[0]}) || $self->{$_->[0]} eq ''); @@ -122,25 +121,25 @@ sub login { return $result; } } - + if ($self->{ssh}->connect(SkipKeyProblem => $self->{ssh_skip_serverkey_issue}) != SSH_OK) { $result->{message} = $self->{ssh}->error(); $result->{status} = 1; return $result; } - + if ($self->{ssh}->auth_publickey_auto() != SSH_AUTH_SUCCESS) { if (defined($self->{ssh_username}) && $self->{ssh_username} ne '' && defined($self->{ssh_password}) && $self->{ssh_password} ne '' && $self->{ssh}->auth_password(password => $self->{ssh_password}) == SSH_AUTH_SUCCESS) { return $result; } - + my $msg_error = $self->{ssh}->error(GetErrorSession => 1); $result->{message} = sprintf("auth issue: %s", defined($msg_error) && $msg_error ne '' ? $msg_error : 'pubkey issue'); $result->{status} = 1; } - + return $result; } diff --git a/centreon/plugins/backend/ssh/plink.pm b/centreon/plugins/backend/ssh/plink.pm new file mode 100644 index 000000000..b409d36d5 --- /dev/null +++ b/centreon/plugins/backend/ssh/plink.pm @@ -0,0 +1,127 @@ +# +# Copyright 2020 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 centreon::plugins::backend::ssh::plink; + +use strict; +use warnings; +use centreon::plugins::misc; + +sub new { + my ($class, %options) = @_; + my $self = {}; + bless $self, $class; + + if (!defined($options{noptions}) || $options{noptions} != 1) { + $options{options}->add_options(arguments => { + 'plink-command:s' => { name => 'plink_command', default => 'plink' }, + 'plink-path:s' => { name => 'plink_path' }, + 'plink-option:s@' => { name => 'plink_option' } + }); + $options{options}->add_help(package => __PACKAGE__, sections => 'BACKEND PLINK OPTIONS', once => 1); + } + + $self->{output} = $options{output}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + + $self->{ssh_command} = defined($options{option_results}->{plink_command}) && $options{option_results}->{plink_command} ne '' ? + $options{option_results}->{plink_command} : 'plink'; + $self->{ssh_path} = $options{option_results}->{sshcli_path}; + $self->{ssh_option} = defined($options{option_results}->{plink_option}) ? $options{option_results}->{plink_option} : []; + $self->{ssh_port} = defined($options{option_results}->{ssh_port}) && $options{option_results}->{ssh_port} =~ /(\d+)/ ? $1 : 22; + $self->{ssh_priv_key} = $options{option_results}->{ssh_priv_key}; + $self->{ssh_username} = $options{option_results}->{ssh_username}; + $self->{ssh_password} = $options{option_results}->{ssh_password}; + + push @{$self->{ssh_option}}, '-batch'; + push @{$self->{ssh_option}}, '-l=' . $self->{ssh_username} if (defined($self->{ssh_username}) && $self->{ssh_username} ne ''); + push @{$self->{ssh_option}}, '-pw=' . $self->{ssh_password} if (defined($self->{ssh_password}) && $self->{ssh_password} ne ''); + push @{$self->{ssh_option}}, '-P=' . $self->{ssh_port} if (defined($self->{ssh_port}) && $self->{ssh_port} ne ''); + push @{$self->{ssh_option}}, '-i=' . $self->{ssh_priv_key} if (defined($self->{ssh_priv_key}) && $self->{ssh_priv_key} ne ''); +} + +sub execute { + my ($self, %options) = @_; + + my ($content, $exit_code) = centreon::plugins::misc::execute( + output => $self->{output}, + sudo => $options{sudo}, + command => $options{command}, + command_path => $options{command_path}, + command_options => $options{command_options}, + options => { + remote => 1, + ssh_address => $options{hostname}, + ssh_command => $self->{ssh_command}, + ssh_path => $self->{ssh_path}, + ssh_option => $self->{ssh_option}, + ssh_pipe => $options{ssh_pipe}, + timeout => $options{timeout} + } + ); + + # plink exit code is 0 even connection is abandoned + if ($content =~ /server.*?key fingerprint.*connection abandoned/msi) { + $self->{output}->add_option_msg(short_msg => 'please connect with plink command to your host and accept the server host key'); + $self->{output}->option_exit(); + } + + return ($content, $exit_code); +} + +1; + +__END__ + +=head1 NAME + +plink backend. + +=head1 SYNOPSIS + +plink backend. + +=head1 BACKEND PLINK OPTIONS + +=over 8 + +=item B<--plink-command> + +plink command (default: 'plink'). + +=item B<--plink-path> + +plink command path (default: none) + +=item B<--plink-option> + +Specify plink options (example: --plink-option='-T'). + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon/plugins/backend/ssh/sshcli.pm b/centreon/plugins/backend/ssh/sshcli.pm new file mode 100644 index 000000000..858f73337 --- /dev/null +++ b/centreon/plugins/backend/ssh/sshcli.pm @@ -0,0 +1,123 @@ +# +# Copyright 2020 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 centreon::plugins::backend::ssh::sshcli; + +use strict; +use warnings; +use centreon::plugins::misc; + +sub new { + my ($class, %options) = @_; + my $self = {}; + bless $self, $class; + + if (!defined($options{noptions}) || $options{noptions} != 1) { + $options{options}->add_options(arguments => { + 'sshcli-command:s' => { name => 'sshcli_command', default => 'ssh' }, + 'sshcli-path:s' => { name => 'sshcli_path' }, + 'sslcli-option:s@' => { name => 'sshcli_option' } + }); + $options{options}->add_help(package => __PACKAGE__, sections => 'BACKEND SSHCLI OPTIONS', once => 1); + } + + $self->{output} = $options{output}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + + $self->{ssh_command} = defined($options{option_results}->{sshcli_command}) && $options{option_results}->{sshcli_command} ne '' ? + $options{option_results}->{sshcli_command} : 'ssh'; + $self->{ssh_path} = $options{option_results}->{sshcli_path}; + $self->{ssh_option} = defined($options{option_results}->{sshcli_option}) ? $options{option_results}->{sshcli_option} : []; + $self->{ssh_port} = defined($options{option_results}->{ssh_port}) && $options{option_results}->{ssh_port} =~ /(\d+)/ ? $1 : 22; + $self->{ssh_priv_key} = $options{option_results}->{ssh_priv_key}; + $self->{ssh_username} = $options{option_results}->{ssh_username}; + if (defined($options{option_results}->{ssh_password}) && $options{option_results}->{ssh_password} ne '') { + $self->{output}->add_option_msg(short_msg => 'sshcli backend cannot use ssh password. please use backend plink or libssh'); + $self->{output}->option_exit(); + } + + push @{$self->{ssh_option}}, '-o=BatchMode yes'; + push @{$self->{ssh_option}}, '-l=' . $self->{ssh_username} if (defined($self->{ssh_username}) && $self->{ssh_username} ne ''); + push @{$self->{ssh_option}}, '-p=' . $self->{ssh_port} if (defined($self->{ssh_port}) && $self->{ssh_port} ne ''); + push @{$self->{ssh_option}}, '-i=' . $self->{ssh_priv_key} if (defined($self->{ssh_priv_key}) && $self->{ssh_priv_key} ne ''); +} + +sub execute { + my ($self, %options) = @_; + + my ($content, $exit_code) = centreon::plugins::misc::execute( + output => $self->{output}, + sudo => $options{sudo}, + command => $options{command}, + command_path => $options{command_path}, + command_options => $options{command_options}, + options => { + remote => 1, + ssh_address => $options{hostname}, + ssh_command => $self->{ssh_command}, + ssh_path => $self->{ssh_path}, + ssh_option => $self->{ssh_option}, + ssh_pipe => $options{ssh_pipe}, + timeout => $options{timeout} + } + ); + + return ($content, $exit_code); +} + +1; + +__END__ + +=head1 NAME + +ssh cli backend. + +=head1 SYNOPSIS + +ssh cli backend. + +=head1 BACKEND SSHCLI OPTIONS + +=over 8 + +=item B<--sshcli-command> + +ssh command (default: 'ssh'). + +=item B<--sshcli-path> + +ssh command path (default: none) + +=item B<--sshcli-option> + +Specify ssh cli options (example: --sshcli-option='-o=StrictHostKeyChecking=no'). + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon/plugins/misc.pm b/centreon/plugins/misc.pm index 67028cdb7..7c96f1b88 100644 --- a/centreon/plugins/misc.pm +++ b/centreon/plugins/misc.pm @@ -39,16 +39,20 @@ sub windows_execute { my $result; my ($stdout, $pid, $ended) = (''); my ($exit_code, $cmd); - + $cmd = $options{command_path} . '/' if (defined($options{command_path})); $cmd .= $options{command} . ' ' if (defined($options{command})); $cmd .= $options{command_options} if (defined($options{command_options})); - - centreon::plugins::misc::mymodule_load(output => $options{output}, module => 'Win32::Job', - error_msg => "Cannot load module 'Win32::Job'."); - centreon::plugins::misc::mymodule_load(output => $options{output}, module => 'Time::HiRes', - error_msg => "Cannot load module 'Time::HiRes'."); - + + centreon::plugins::misc::mymodule_load( + output => $options{output}, module => 'Win32::Job', + error_msg => "Cannot load module 'Win32::Job'." + ); + centreon::plugins::misc::mymodule_load( + output => $options{output}, module => 'Time::HiRes', + error_msg => "Cannot load module 'Time::HiRes'." + ); + $| = 1; pipe FROM_CHILD, TO_PARENT or do { $options{output}->add_option_msg(short_msg => "Internal error: can't create pipe from child to parent: $!"); @@ -91,10 +95,10 @@ sub windows_execute { }, 0.1 ); - + $result = $job->status; close FROM_CHILD; - + if ($ended == 0) { $options{output}->add_option_msg(short_msg => 'Command too long to execute (timeout)...'); $options{output}->option_exit(); @@ -104,13 +108,13 @@ sub windows_execute { if (defined($options{no_quit}) && $options{no_quit} == 1) { return ($stdout, $result->{$pid}->{exitcode}); } - + if ($result->{$pid}->{exitcode} != 0) { $stdout =~ s/\n/ - /g; $options{output}->add_option_msg(short_msg => "Command error: $stdout"); $options{output}->option_exit(); } - + return ($stdout, $result->{$pid}->{exitcode}); } @@ -124,7 +128,7 @@ sub unix_execute { $redirect_stderr = $options{redirect_stderr} if (defined($options{redirect_stderr})); my $wait_exit = 1; $wait_exit = $options{wait_exit} if (defined($options{wait_exit})); - + # Build command line # Can choose which command is done remotely (can filter and use local file) if (defined($options{options}->{remote}) && @@ -133,19 +137,20 @@ sub unix_execute { $cmd = $options{options}->{ssh_path} . '/' if (defined($options{options}->{ssh_path})); $cmd .= $options{options}->{ssh_command} if (defined($options{options}->{ssh_command})); - + foreach (@{$options{options}->{ssh_option}}) { - my ($lvalue, $rvalue) = split /=/; - push @$args, $lvalue if (defined($lvalue)); - push @$args, $rvalue if (defined($rvalue)); + if (/^(.*?)(?:=(.*))?$/) { + push @$args, $1 if (defined($1)); + push @$args, $2 if (defined($2)); + } } - + if (defined($options{options}->{ssh_address}) && $options{options}->{ssh_address} ne '') { push @$args, $options{options}->{ssh_address}; } else { push @$args, $options{options}->{hostname}; } - + $sub_cmd = 'sudo ' if (defined($options{sudo})); $sub_cmd .= $options{command_path} . '/' if (defined($options{command_path})); $sub_cmd .= $options{command} . ' ' if (defined($options{command})); @@ -173,7 +178,7 @@ sub unix_execute { $cmd .= $options{command_path} . '/' if (defined($options{command_path})); $cmd .= $options{command} . ' ' if (defined($options{command})); $cmd .= $options{command_options} if (defined($options{command_options})); - + ($lerror, $stdout, $exit_code) = backtick( command => $cmd, timeout => $options{options}->{timeout}, @@ -187,23 +192,23 @@ sub unix_execute { print $stdout; exit $exit_code; } - + $stdout =~ s/\r//g; if ($lerror <= -1000) { $options{output}->add_option_msg(short_msg => $stdout); $options{output}->option_exit(); } - + if (defined($options{no_quit}) && $options{no_quit} == 1) { return ($stdout, $exit_code); } - + if ($exit_code != 0 && (!defined($options{no_errors}) || !defined($options{no_errors}->{$exit_code}))) { $stdout =~ s/\n/ - /g; $options{output}->add_option_msg(short_msg => "Command error: $stdout"); $options{output}->option_exit(); } - + return $stdout; } @@ -211,7 +216,7 @@ sub mymodule_load { my (%options) = @_; my $file; ($file = ($options{module} =~ /\.pm$/ ? $options{module} : $options{module} . '.pm')) =~ s{::}{/}g; - + eval { local $SIG{__DIE__} = 'IGNORE'; require $file; @@ -239,7 +244,7 @@ sub backtick { my @output; my $pid; my $return_code; - + my $sig_do; if ($arg{wait_exit} == 0) { $sig_do = 'IGNORE'; diff --git a/centreon/plugins/ssh.pm b/centreon/plugins/ssh.pm new file mode 100644 index 000000000..0780e7d07 --- /dev/null +++ b/centreon/plugins/ssh.pm @@ -0,0 +1,129 @@ +# +# Copyright 2020 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 centreon::plugins::ssh; + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = {}; + bless $self, $class; + + if (!defined($options{noptions}) || $options{noptions} != 1) { + $options{options}->add_options(arguments => { + 'ssh-backend:s' => { name => 'ssh_backend', default => 'sshcli' }, + 'ssh-port:s' => { name => 'ssh_port' }, + 'ssh-priv-key:s' => { name => 'ssh_priv_key' }, + 'ssh-username:s' => { name => 'ssh_username' }, + 'ssh-password:s' => { name => 'ssh_password' } + }); + $options{options}->add_help(package => __PACKAGE__, sections => 'SSH GLOBAL OPTIONS'); + } + + centreon::plugins::misc::mymodule_load( + output => $options{output}, + module => 'centreon::plugins::backend::ssh::sshcli', + error_msg => "Cannot load module 'centreon::plugins::backend::ssh::sshcli'." + ); + $self->{backend_sshcli} = centreon::plugins::backend::ssh::sshcli->new(%options); + + centreon::plugins::misc::mymodule_load( + output => $options{output}, + module => 'centreon::plugins::backend::ssh::plink', + error_msg => "Cannot load module 'centreon::plugins::backend::ssh::plink'." + ); + $self->{backend_plink} = centreon::plugins::backend::ssh::plink->new(%options); + + $self->{output} = $options{output}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + + $self->{ssh_backend} = $options{option_results}->{ssh_backend}; + $self->{ssh_port} = defined($options{option_results}->{ssh_port}) && $options{option_results}->{ssh_port} =~ /(\d+)/ ? $1 : 22; + $self->{ssh_backend} = 'sshcli' + if (!defined($options{option_results}->{ssh_backend}) || $options{option_results}->{ssh_backend} eq ''); + if (!defined($self->{'backend_' . $self->{ssh_backend}})) { + $self->{output}->add_option_msg(short_msg => 'unknown ssh backend: ' . $self->{ssh_backend}); + $self->{output}->option_exit(); + } + $self->{'backend_' . $self->{ssh_backend}}->check_options(%options); +} + +sub get_port { + my ($self, %options) = @_; + + return $self->{ssh_port}; +} + +sub execute { + my ($self, %options) = @_; + + return $self->{'backend_' . $self->{ssh_backend}}->execute(%options); +} + +1; + +__END__ + +=head1 NAME + +SSH abstraction layer. + +=head1 SYNOPSIS + +SSH abstraction layer for sscli, plink and libssh backends + +=head1 SSH GLOBAL OPTIONS + +=over 8 + +=item B<--ssh-backend> + +Set the backend used (Default: 'sshcli') +Can be: sshcli, plink, libssh. + +=item B<--ssh-username> + +Connect with specified username. + +=item B<--ssh-password> + +Login with specified password. Cannot be used with sshcli backend. + +=item B<--ssh-port> + +Connect to specified port. + +=item B<--ssh-priv-key> + +Private key file for user authentication. + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon/plugins/statefile.pm b/centreon/plugins/statefile.pm index cffe22283..d81bbd31f 100644 --- a/centreon/plugins/statefile.pm +++ b/centreon/plugins/statefile.pm @@ -80,11 +80,16 @@ sub check_options { } } - centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Redis', - error_msg => "Cannot load module 'Redis'."); + centreon::plugins::misc::mymodule_load( + output => $self->{output}, + module => 'Redis', + error_msg => "Cannot load module 'Redis'." + ); eval { - $self->{redis_cnx} = Redis->new(server => $options{option_results}->{redis_server}, - eval $self->{redis_attributes}); + $self->{redis_cnx} = Redis->new( + server => $options{option_results}->{redis_server}, + eval $self->{redis_attributes} + ); if (defined($self->{redis_cnx}) && defined($options{option_results}->{redis_db}) && $options{option_results}->{redis_db} ne '' @@ -96,13 +101,19 @@ sub check_options { $self->{statefile_dir} = $options{option_results}->{statefile_dir}; if ($self->{statefile_dir} ne $default_dir && defined($options{option_results}->{statefile_concat_cwd})) { - centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Cwd', - error_msg => "Cannot load module 'Cwd'."); + centreon::plugins::misc::mymodule_load( + output => $self->{output}, + module => 'Cwd', + error_msg => "Cannot load module 'Cwd'." + ); $self->{statefile_dir} = Cwd::cwd() . '/' . $self->{statefile_dir}; } if (defined($options{option_results}->{statefile_storable})) { - centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Storable', - error_msg => "Cannot load module 'Storable'."); + centreon::plugins::misc::mymodule_load( + output => $self->{output}, + module => 'Storable', + error_msg => "Cannot load module 'Storable'." + ); $self->{storable} = 1; } $self->{statefile_suffix} = $options{option_results}->{statefile_suffix}; @@ -111,7 +122,7 @@ sub check_options { sub error { my ($self) = shift; - + if (@_) { $self->{error} = $_[0]; } @@ -140,7 +151,7 @@ sub read { return 0; } } - + if (defined($self->{redis_cnx})) { my $val = $self->{redis_cnx}->get($self->{statefile_dir} . "/" . $self->{statefile}); if (defined($val)) { @@ -152,7 +163,7 @@ sub read { return 0; } - + if (! -e $self->{statefile_dir} . '/' . $self->{statefile}) { if (! -w $self->{statefile_dir} || ! -x $self->{statefile_dir}) { $self->error(1); @@ -173,7 +184,7 @@ sub read { # Empty file. Not a problem. Maybe plugin not manage not values return 0; } - + if ($self->{storable} == 1) { open FILE, $self->{statefile_dir} . '/' . $self->{statefile}; eval { @@ -227,15 +238,19 @@ sub write { my ($self, %options) = @_; if ($self->{memcached_ok} == 1) { - Memcached::libmemcached::memcached_set($self->{memcached}, $self->{statefile_dir} . '/' . $self->{statefile}, - Data::Dumper->Dump([$options{data}], ['datas']), $self->{memexpiration}); + Memcached::libmemcached::memcached_set( + $self->{memcached}, $self->{statefile_dir} . '/' . $self->{statefile}, + Data::Dumper->Dump([$options{data}], ['datas']), $self->{memexpiration} + ); if (defined($self->{memcached}->errstr) && $self->{memcached}->errstr =~ /^SUCCESS$/i) { return ; } } if (defined($self->{redis_cnx})) { - return if (defined($self->{redis_cnx}->set($self->{statefile_dir} . '/' . $self->{statefile}, Data::Dumper->Dump([$options{data}], ['datas']), - 'EX', $self->{memexpiration}))); + return if (defined($self->{redis_cnx}->set( + $self->{statefile_dir} . '/' . $self->{statefile}, Data::Dumper->Dump([$options{data}], ['datas']), + 'EX', $self->{memexpiration})) + ); } open FILE, '>', $self->{statefile_dir} . '/' . $self->{statefile}; if ($self->{storable} == 1) { diff --git a/storage/hp/eva/cli/plugin.pm b/storage/hp/eva/cli/plugin.pm index e86f2e99b..4b363c723 100644 --- a/storage/hp/eva/cli/plugin.pm +++ b/storage/hp/eva/cli/plugin.pm @@ -35,7 +35,7 @@ sub new { 'storage-usage' => 'storage::hp::eva::cli::mode::storageusage', ); $self->{custom_modes}{api} = 'storage::hp::eva::cli::custom::api'; - + return $self; } diff --git a/storage/ibm/storwize/ssh/custom/api.pm b/storage/ibm/storwize/ssh/custom/api.pm new file mode 100644 index 000000000..6c9e21b7b --- /dev/null +++ b/storage/ibm/storwize/ssh/custom/api.pm @@ -0,0 +1,190 @@ +# +# Copyright 2020 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::storwize::ssh::custom::api; + +use strict; +use warnings; +use centreon::plugins::ssh; +use centreon::plugins::misc; + +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' }, + 'timeout:s' => { name => 'timeout', default => 30 }, + 'sudo' => { name => 'sudo' }, + 'command:s' => { name => 'command' }, + 'command-path:s' => { name => 'command_path' }, + 'command-options:s' => { name => 'command_options' } + }); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'STORWIZE OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{mode} = $options{mode}; + $self->{ssh} = centreon::plugins::ssh->new(%options); + + 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) = @_; + + if (defined($self->{option_results}->{hostname}) && $self->{option_results}->{hostname} ne '') { + $self->{ssh}->check_options(option_results => $self->{option_results}); + } + + return 0; +} + +sub get_hasharray { + my ($self, %options) = @_; + + my $result = []; + return $result if ($options{content} eq ''); + my ($header, @lines) = split /\n/, $options{content}; + my @header_names = split /$options{delim}/, $header; + + for (my $i = 0; $i <= $#lines; $i++) { + my @content = split /$options{delim}/, $lines[$i]; + my $data = {}; + for (my $j = 0; $j <= $#header_names; $j++) { + $data->{$header_names[$j]} = $content[$j]; + } + push @$result, $data; + } + + return $result; +} + +sub execute_command { + my ($self, %options) = @_; + + my $content; + if (defined($self->{option_results}->{hostname}) && $self->{option_results}->{hostname} ne '') { + ($content) = $self->{ssh}->execute( + hostname => $self->{option_results}->{hostname}, + command => defined($self->{option_results}->{command}) && $self->{option_results}->{command} ne '' ? $self->{option_results}->{command} : $options{command}, + command_path => $self->{option_results}->{command_path}, + command_options => defined($self->{option_results}->{command_options}) && $self->{option_results}->{command_options} ne '' ? $self->{option_results}->{command_options} : undef, + timeout => $self->{option_results}->{timeout}, + sudo => $self->{option_results}->{sudo} + ); + } else { + if (!defined($self->{option_results}->{command}) || $self->{option_results}->{command} eq '') { + $self->{output}->add_option_msg(short_msg => 'please set --hostname option for ssh connection (or --command)'); + $self->{output}->option_exit(); + } + ($content) = centreon::plugins::misc::execute( + output => $self->{output}, + options => { timeout => $self->{option_results}->{timeout} }, + sudo => $self->{option_results}->{sudo}, + command => $self->{option_results}->{command}, + command_path => $self->{option_results}->{command_path}, + command_options => defined($self->{option_results}->{command_options}) && $self->{option_results}->{command_options} ne '' ? $self->{option_results}->{command_options} : undef + ); + } + + return $content; +} + +1; + +__END__ + +=head1 NAME + +storwize + +=head1 SYNOPSIS + +storwize + +=head1 STORWIZE OPTIONS + +=over 8 + +=item B<--hostname> + +Hostname to query. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--sudo> + +Use 'sudo' to execute the command. + +=item B<--command> + +Command to get information. Used it you have output in a file. + +=item B<--command-path> + +Command path. + +=item B<--command-options> + +Command options. + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/storage/ibm/storwize/ssh/mode/components/array.pm b/storage/ibm/storwize/ssh/mode/components/array.pm index 5f418cdc8..e573c7367 100644 --- a/storage/ibm/storwize/ssh/mode/components/array.pm +++ b/storage/ibm/storwize/ssh/mode/components/array.pm @@ -25,13 +25,13 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsarray=========="; lsarray -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking arrays"); $self->{components}->{array} = {name => 'arrays', total => 0, skip => 0}; return if ($self->check_filter(section => 'array')); @@ -39,22 +39,31 @@ sub check { return if ($self->{results} !~ /==========lsarray==.*?\n(.*?)==============/msi); my $content = $1; - my $result = $self->get_hasharray(content => $content, delim => ':'); + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'array', instance => $_->{mdisk_id})); $self->{components}->{array}->{total}++; - $self->{output}->output_add(long_msg => sprintf("array '%s' status is '%s' [instance: %s].", - $_->{mdisk_name}, $_->{status}, - $_->{mdisk_id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "array '%s' status is '%s' [instance: %s].", + $_->{mdisk_name}, + $_->{status}, + $_->{mdisk_id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'array', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Array '%s' status is '%s'", - $_->{mdisk_name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Array '%s' status is '%s'", + $_->{mdisk_name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/drive.pm b/storage/ibm/storwize/ssh/mode/components/drive.pm index 743ab9faf..89c9793fb 100644 --- a/storage/ibm/storwize/ssh/mode/components/drive.pm +++ b/storage/ibm/storwize/ssh/mode/components/drive.pm @@ -25,36 +25,44 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsdrive=========="; lsdrive -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking drives"); $self->{components}->{drive} = {name => 'drives', total => 0, skip => 0}; return if ($self->check_filter(section => 'drive')); return if ($self->{results} !~ /==========lsdrive==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'drive', instance => $_->{id})); $self->{components}->{drive}->{total}++; - $self->{output}->output_add(long_msg => sprintf("drive '%s' status is '%s' [instance: %s].", - $_->{id}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "drive '%s' status is '%s' [instance: %s].", + $_->{id}, $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'drive', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Drive '%s' status is '%s'", - $_->{id}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Drive '%s' status is '%s'", + $_->{id}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/enclosure.pm b/storage/ibm/storwize/ssh/mode/components/enclosure.pm index 08c7cae1a..672fa9574 100644 --- a/storage/ibm/storwize/ssh/mode/components/enclosure.pm +++ b/storage/ibm/storwize/ssh/mode/components/enclosure.pm @@ -25,36 +25,45 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsenclosure=========="; lsenclosure -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking enclosures"); $self->{components}->{enclosure} = {name => 'enclosures', total => 0, skip => 0}; return if ($self->check_filter(section => 'enclosure')); return if ($self->{results} !~ /==========lsenclosure==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'enclosure', instance => $_->{id})); $self->{components}->{enclosure}->{total}++; - $self->{output}->output_add(long_msg => sprintf("enclosure '%s' status is '%s' [instance: %s].", - $_->{id}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "enclosure '%s' status is '%s' [instance: %s].", + $_->{id}, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'enclosure', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Enclosure '%s' status is '%s'", - $_->{id}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Enclosure '%s' status is '%s'", + $_->{id}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/enclosurebattery.pm b/storage/ibm/storwize/ssh/mode/components/enclosurebattery.pm index a0809715e..b433e036a 100644 --- a/storage/ibm/storwize/ssh/mode/components/enclosurebattery.pm +++ b/storage/ibm/storwize/ssh/mode/components/enclosurebattery.pm @@ -25,37 +25,46 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsenclosurebattery=========="; lsenclosurebattery -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking enclosure batteries"); $self->{components}->{enclosurebattery} = {name => 'enclosure batteries', total => 0, skip => 0}; return if ($self->check_filter(section => 'enclosurebattery')); return if ($self->{results} !~ /==========lsenclosurebattery==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { my $instance = $_->{enclosure_id} . '.' . $_->{battery_id}; next if ($self->check_filter(section => 'enclosurebattery', instance => $instance)); $self->{components}->{enclosurebattery}->{total}++; - $self->{output}->output_add(long_msg => sprintf("enclosure battery '%s' status is '%s' [instance: %s].", - $instance, $_->{status}, - $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "enclosure battery '%s' status is '%s' [instance: %s].", + $instance, + $_->{status}, + $instance + ) + ); my $exit = $self->get_severity(label => 'default', section => 'enclosurebattery', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Enclosure battery '%s' status is '%s'", - $instance, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Enclosure battery '%s' status is '%s'", + $instance, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/enclosurecanister.pm b/storage/ibm/storwize/ssh/mode/components/enclosurecanister.pm index dd6b961bd..e0388de32 100644 --- a/storage/ibm/storwize/ssh/mode/components/enclosurecanister.pm +++ b/storage/ibm/storwize/ssh/mode/components/enclosurecanister.pm @@ -25,37 +25,46 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsenclosurecanister=========="; lsenclosurecanister -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking enclosure canisters"); $self->{components}->{enclosurecanister} = {name => 'enclosure canisters', total => 0, skip => 0}; return if ($self->check_filter(section => 'enclosurecanister')); return if ($self->{results} !~ /==========lsenclosurecanister==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { my $instance = $_->{enclosure_id} . '.' . $_->{canister_id}; next if ($self->check_filter(section => 'enclosurecanister', instance => $instance)); $self->{components}->{enclosurecanister}->{total}++; - $self->{output}->output_add(long_msg => sprintf("enclosure canister '%s' status is '%s' [instance: %s].", - $instance, $_->{status}, - $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "enclosure canister '%s' status is '%s' [instance: %s].", + $instance, + $_->{status}, + $instance + ) + ); my $exit = $self->get_severity(label => 'default', section => 'enclosurecanister', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Enclosure canister '%s' status is '%s'", - $instance, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Enclosure canister '%s' status is '%s'", + $instance, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/enclosurepsu.pm b/storage/ibm/storwize/ssh/mode/components/enclosurepsu.pm index a581f7131..bb3e7f564 100644 --- a/storage/ibm/storwize/ssh/mode/components/enclosurepsu.pm +++ b/storage/ibm/storwize/ssh/mode/components/enclosurepsu.pm @@ -25,37 +25,46 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsenclosurepsu=========="; lsenclosurepsu -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking enclosure psus"); $self->{components}->{enclosurepsu} = {name => 'enclosure psus', total => 0, skip => 0}; return if ($self->check_filter(section => 'enclosurepsu')); return if ($self->{results} !~ /==========lsenclosurepsu==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { my $instance = $_->{enclosure_id} . '.' . $_->{PSU_id}; next if ($self->check_filter(section => 'enclosurepsu', instance => $instance)); $self->{components}->{enclosurepsu}->{total}++; - $self->{output}->output_add(long_msg => sprintf("enclosure power supply '%s' status is '%s' [instance: %s].", - $instance, $_->{status}, - $instance - )); + $self->{output}->output_add( + long_msg => sprintf( + "enclosure power supply '%s' status is '%s' [instance: %s].", + $instance, + $_->{status}, + $instance + ) + ); my $exit = $self->get_severity(label => 'default', section => 'enclosurepsu', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Enclosure power supply '%s' status is '%s'", - $instance, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Enclosure power supply '%s' status is '%s'", + $instance, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/host.pm b/storage/ibm/storwize/ssh/mode/components/host.pm index 5d8015add..026237acc 100644 --- a/storage/ibm/storwize/ssh/mode/components/host.pm +++ b/storage/ibm/storwize/ssh/mode/components/host.pm @@ -25,36 +25,45 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lshost=========="; lshost -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking hosts"); $self->{components}->{host} = {name => 'hosts', total => 0, skip => 0}; return if ($self->check_filter(section => 'host')); return if ($self->{results} !~ /==========lshost==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'host', instance => $_->{id})); $self->{components}->{host}->{total}++; - $self->{output}->output_add(long_msg => sprintf("host '%s' status is '%s' [instance: %s].", - $_->{name}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "host '%s' status is '%s' [instance: %s].", + $_->{name}, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'host', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Host '%s' status is '%s'", - $_->{name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Host '%s' status is '%s'", + $_->{name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/mdisk.pm b/storage/ibm/storwize/ssh/mode/components/mdisk.pm index bb05572d4..7d72746d7 100644 --- a/storage/ibm/storwize/ssh/mode/components/mdisk.pm +++ b/storage/ibm/storwize/ssh/mode/components/mdisk.pm @@ -25,7 +25,7 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsmdisk=========="; lsmdisk -delim : ; echo "===============";'; } @@ -38,23 +38,32 @@ sub check { return if ($self->{results} !~ /==========lsmdisk==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'mdisk', instance => $_->{id})); $self->{components}->{mdisk}->{total}++; - $self->{output}->output_add(long_msg => sprintf("mdisk '%s' status is '%s' [instance: %s].", - $_->{name}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "mdisk '%s' status is '%s' [instance: %s].", + $_->{name}, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(section => 'mdisk', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("MDisk '%s' status is '%s'", - $_->{name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "MDisk '%s' status is '%s'", + $_->{name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/node.pm b/storage/ibm/storwize/ssh/mode/components/node.pm index d3c635c64..6d898034d 100644 --- a/storage/ibm/storwize/ssh/mode/components/node.pm +++ b/storage/ibm/storwize/ssh/mode/components/node.pm @@ -25,36 +25,45 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsnode=========="; lsnode -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking nodes"); $self->{components}->{node} = {name => 'nodes', total => 0, skip => 0}; return if ($self->check_filter(section => 'node')); return if ($self->{results} !~ /==========lsnode==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'node', instance => $_->{id})); $self->{components}->{node}->{total}++; - $self->{output}->output_add(long_msg => sprintf("node '%s' status is '%s' [instance: %s].", - $_->{name}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "node '%s' status is '%s' [instance: %s].", + $_->{name}, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'node', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Node '%s' status is '%s'", - $_->{name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Node '%s' status is '%s'", + $_->{name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/portfc.pm b/storage/ibm/storwize/ssh/mode/components/portfc.pm index 8c91cfe0c..0d9d90d2c 100644 --- a/storage/ibm/storwize/ssh/mode/components/portfc.pm +++ b/storage/ibm/storwize/ssh/mode/components/portfc.pm @@ -38,24 +38,33 @@ sub check { return if ($self->{results} !~ /==========lsportfc==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'portfc', instance => $_->{id})); $self->{components}->{portfc}->{total}++; my $name = $_->{node_name} . "." . $_->{WWPN}; - $self->{output}->output_add(long_msg => sprintf("portfc '%s' status is '%s' [instance: %s].", - $name, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "portfc '%s' status is '%s' [instance: %s].", + $name, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(section => 'portfc', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("PortFC '%s' status is '%s'", - $name, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "PortFC '%s' status is '%s'", + $name, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/portsas.pm b/storage/ibm/storwize/ssh/mode/components/portsas.pm index 6cedcc222..d80ff9308 100644 --- a/storage/ibm/storwize/ssh/mode/components/portsas.pm +++ b/storage/ibm/storwize/ssh/mode/components/portsas.pm @@ -38,24 +38,33 @@ sub check { return if ($self->{results} !~ /==========lsportsas==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'portsas', instance => $_->{id})); $self->{components}->{portsas}->{total}++; my $name = $_->{node_name} . "." . $_->{WWPN}; - $self->{output}->output_add(long_msg => sprintf("port sas '%s' status is '%s' [instance: %s].", - $name, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "port sas '%s' status is '%s' [instance: %s].", + $name, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(section => 'portsas', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Port sas '%s' status is '%s'", - $name, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Port sas '%s' status is '%s'", + $name, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/quorum.pm b/storage/ibm/storwize/ssh/mode/components/quorum.pm index 1ab5ebdc2..01c01ff5d 100644 --- a/storage/ibm/storwize/ssh/mode/components/quorum.pm +++ b/storage/ibm/storwize/ssh/mode/components/quorum.pm @@ -25,36 +25,45 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsquorum=========="; lsquorum -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking quorums"); $self->{components}->{quorum} = {name => 'quorums', total => 0, skip => 0}; return if ($self->check_filter(section => 'quorum')); return if ($self->{results} !~ /==========lsquorum==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'quorum', instance => $_->{quorum_index})); $self->{components}->{quorum}->{total}++; - $self->{output}->output_add(long_msg => sprintf("quorum '%s' status is '%s' [instance: %s].", - $_->{controller_name}, $_->{status}, - $_->{quorum_index} - )); + $self->{output}->output_add( + long_msg => sprintf( + "quorum '%s' status is '%s' [instance: %s].", + $_->{controller_name}, + $_->{status}, + $_->{quorum_index} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'quorum', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Quorum '%s' status is '%s'", - $_->{controller_name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Quorum '%s' status is '%s'", + $_->{controller_name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/components/systemstats.pm b/storage/ibm/storwize/ssh/mode/components/systemstats.pm index 8d4ae01c6..7c422d8c8 100644 --- a/storage/ibm/storwize/ssh/mode/components/systemstats.pm +++ b/storage/ibm/storwize/ssh/mode/components/systemstats.pm @@ -25,7 +25,7 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lssystemstats=========="; lssystemstats ; echo "===============";'; } @@ -38,20 +38,28 @@ sub check { return if ($self->{results} !~ /==========lssystemstats==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => '\s+'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => '\s+'); foreach (@$result) { next if ($self->check_filter(section => 'systemstats', instance => $_->{stat_name})); $self->{components}->{systemstats}->{total}++; - $self->{output}->output_add(long_msg => sprintf("system stat '%s' value is '%s' [instance: %s].", - $_->{stat_name}, $_->{stat_current}, - $_->{stat_name} - )); + $self->{output}->output_add( + long_msg => sprintf( + "system stat '%s' value is '%s' [instance: %s].", + $_->{stat_name}, + $_->{stat_current}, + $_->{stat_name} + ) + ); my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'systemstats', instance => $_->{stat_name}, value => $_->{stat_current}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("System stat '%s' value is '%s'", $_->{stat_name}, $_->{stat_current})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "System stat '%s' value is '%s'", $_->{stat_name}, $_->{stat_current} + ) + ); } $self->{output}->perfdata_add( label => "sstat", diff --git a/storage/ibm/storwize/ssh/mode/components/vdisk.pm b/storage/ibm/storwize/ssh/mode/components/vdisk.pm index 0e48013a2..23f656161 100644 --- a/storage/ibm/storwize/ssh/mode/components/vdisk.pm +++ b/storage/ibm/storwize/ssh/mode/components/vdisk.pm @@ -25,36 +25,45 @@ use warnings; sub load { my ($self) = @_; - + $self->{ssh_commands} .= 'echo "==========lsvdisk=========="; lsvdisk -delim : ; echo "===============";'; } sub check { my ($self) = @_; - + $self->{output}->output_add(long_msg => "Checking vdisks"); $self->{components}->{vdisk} = {name => 'vdisks', total => 0, skip => 0}; return if ($self->check_filter(section => 'vdisk')); return if ($self->{results} !~ /==========lsvdisk==.*?\n(.*?)==============/msi); my $content = $1; - - my $result = $self->get_hasharray(content => $content, delim => ':'); + + my $result = $self->{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { next if ($self->check_filter(section => 'vdisk', instance => $_->{id})); $self->{components}->{vdisk}->{total}++; - $self->{output}->output_add(long_msg => sprintf("vdisk '%s' status is '%s' [instance: %s].", - $_->{name}, $_->{status}, - $_->{id} - )); + $self->{output}->output_add( + long_msg => sprintf( + "vdisk '%s' status is '%s' [instance: %s].", + $_->{name}, + $_->{status}, + $_->{id} + ) + ); my $exit = $self->get_severity(label => 'default', section => 'vdisk', value => $_->{status}); if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Vdisk '%s' status is '%s'", - $_->{name}, $_->{status})); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Vdisk '%s' status is '%s'", + $_->{name}, + $_->{status} + ) + ); } } } -1; \ No newline at end of file +1; diff --git a/storage/ibm/storwize/ssh/mode/eventlog.pm b/storage/ibm/storwize/ssh/mode/eventlog.pm index e6ffa3faa..c749309e2 100644 --- a/storage/ibm/storwize/ssh/mode/eventlog.pm +++ b/storage/ibm/storwize/ssh/mode/eventlog.pm @@ -36,16 +36,7 @@ sub new { 'critical:s' => { name => 'critical', }, 'filter-event-id:s' => { name => 'filter_event_id' }, 'filter-message:s' => { name => 'filter_message' }, - 'retention:s' => { name => 'retention' }, - 'hostname:s' => { name => 'hostname' }, - 'ssh-option:s@' => { name => 'ssh_option' }, - 'ssh-path:s' => { name => 'ssh_path' }, - 'ssh-command:s' => { name => 'ssh_command', default => 'ssh' }, - 'timeout:s' => { name => 'timeout', default => 30 }, - 'sudo' => { name => 'sudo' }, - 'command:s' => { name => 'command' }, - 'command-path:s' => { name => 'command_path' }, - 'command-options:s' => { name => 'command_options' }, + 'retention:s' => { name => 'retention' } }); return $self; @@ -63,9 +54,6 @@ sub check_options { $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); $self->{output}->option_exit(); } - if (defined($self->{option_results}->{hostname}) && $self->{option_results}->{hostname} ne '') { - $self->{option_results}->{remote} = 1; - } my $last_timestamp = ''; if (defined($self->{option_results}->{retention}) && $self->{option_results}->{retention} =~ /^\d+$/) { @@ -77,37 +65,10 @@ sub check_options { $self->{ls_command} = "svcinfo lseventlog -message no -alert yes -filtervalue '${last_timestamp}fixed=no' -delim :"; } -sub get_hasharray { - my ($self, %options) = @_; - - my $result = []; - return $result if ($options{content} eq ''); - my ($header, @lines) = split /\n/, $options{content}; - my @header_names = split /$options{delim}/, $header; - - for (my $i = 0; $i <= $#lines; $i++) { - my @content = split /$options{delim}/, $lines[$i]; - my $data = {}; - for (my $j = 0; $j <= $#header_names; $j++) { - $data->{$header_names[$j]} = $content[$j]; - } - push @$result, $data; - } - - return $result; -} - sub run { my ($self, %options) = @_; - my $content = centreon::plugins::misc::execute( - output => $self->{output}, - options => $self->{option_results}, - sudo => $self->{option_results}->{sudo}, - command => defined($self->{option_results}->{command}) && $self->{option_results}->{command} ne '' ? $self->{option_results}->{command} : $self->{ls_command} . " ; exit ;", - command_path => $self->{option_results}->{command_path}, - command_options => defined($self->{option_results}->{command_options}) && $self->{option_results}->{command_options} ne '' ? $self->{option_results}->{command_options} : undef - ); + my $content = $options{custom}->execute_command(command => $self->{ls_command}); my $result = $self->get_hasharray(content => $content, delim => ':'); my ($num_eventlog_checked, $num_errors) = (0, 0); @@ -133,7 +94,7 @@ sub run { ); $num_errors++; } - + $self->{output}->output_add(long_msg => sprintf("Number of message checked: %s", $num_eventlog_checked)); my $exit = $self->{perfdata}->threshold_check(value => $num_errors, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); $self->{output}->output_add( @@ -147,7 +108,7 @@ sub run { critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), min => 0 ); - + $self->{output}->display(); $self->{output}->exit(); } @@ -182,42 +143,6 @@ Filter on event message. Get eventlog of X last seconds. For the last minutes: --retention=60 -=item B<--hostname> - -Hostname to query. - -=item B<--ssh-option> - -Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52'). - -=item B<--ssh-path> - -Specify ssh command path (default: none) - -=item B<--ssh-command> - -Specify ssh command (default: 'ssh'). Useful to use 'plink'. - -=item B<--timeout> - -Timeout in seconds for the command (Default: 30). - -=item B<--sudo> - -Use 'sudo' to execute the command. - -=item B<--command> - -Command to get information. Used it you have output in a file. - -=item B<--command-path> - -Command path. - -=item B<--command-options> - -Command options. - =back =cut diff --git a/storage/ibm/storwize/ssh/mode/hardware.pm b/storage/ibm/storwize/ssh/mode/hardware.pm index a3bb3ed13..dafbe1afa 100644 --- a/storage/ibm/storwize/ssh/mode/hardware.pm +++ b/storage/ibm/storwize/ssh/mode/hardware.pm @@ -65,72 +65,31 @@ sub set_system { }; $self->{components_path} = 'storage::ibm::storwize::ssh::mode::components'; - $self->{components_module} = ['array', 'drive', 'enclosure', 'enclosurebattery', 'enclosurecanister', - 'enclosurepsu', 'host', 'portfc', 'portsas', 'vdisk', 'node', 'quorum', 'mdisk', 'systemstats']; + $self->{components_module} = [ + 'array', 'drive', 'enclosure', 'enclosurebattery', 'enclosurecanister', + 'enclosurepsu', 'host', 'portfc', 'portsas', 'vdisk', 'node', 'quorum', 'mdisk', 'systemstats' + ]; } sub ssh_execute { my ($self, %options) = @_; - - $self->{results} = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - sudo => $self->{option_results}->{sudo}, - command => defined($self->{option_results}->{command}) && $self->{option_results}->{command} ne '' ? $self->{option_results}->{command} : $self->{ssh_commands} . " exit ;", - command_path => $self->{option_results}->{command_path}, - command_options => defined($self->{option_results}->{command_options}) && $self->{option_results}->{command_options} ne '' ? $self->{option_results}->{command_options} : undef); -} -sub check_options { - my ($self, %options) = @_; - $self->SUPER::check_options(%options); - - if (defined($self->{option_results}->{hostname}) && $self->{option_results}->{hostname} ne '') { - $self->{option_results}->{remote} = 1; - } + ($self->{results}) = $options{custom}->execute_command(command => $self->{ssh_commands}); + $self->{custom} = $options{custom}; } sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_absent => 1); bless $self, $class; - - $options{options}->add_options(arguments => - { - "hostname:s" => { name => 'hostname' }, - "ssh-option:s@" => { name => 'ssh_option' }, - "ssh-path:s" => { name => 'ssh_path' }, - "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, - "timeout:s" => { name => 'timeout', default => 30 }, - "sudo" => { name => 'sudo' }, - "command:s" => { name => 'command' }, - "command-path:s" => { name => 'command_path' }, - "command-options:s" => { name => 'command_options' }, - }); + + $options{options}->add_options(arguments => { + }); $self->{ssh_commands} = ''; return $self; } -sub get_hasharray { - my ($self, %options) = @_; - - my $result = []; - return $result if ($options{content} eq ''); - my ($header, @lines) = split /\n/, $options{content}; - my @header_names = split /$options{delim}/, $header; - - for (my $i = 0; $i <= $#lines; $i++) { - my @content = split /$options{delim}/, $lines[$i]; - my $data = {}; - for (my $j = 0; $j <= $#header_names; $j++) { - $data->{$header_names[$j]} = $content[$j]; - } - push @$result, $data; - } - - return $result; -} - 1; __END__ @@ -173,42 +132,6 @@ Example: --warning='systemstats,cpu_pc,30' Set critical threshold for temperatures (syntax: type,regexp,threshold) Example: --critical='systemstats,cpu_pc,40' -=item B<--hostname> - -Hostname to query. - -=item B<--ssh-option> - -Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52'). - -=item B<--ssh-path> - -Specify ssh command path (default: none) - -=item B<--ssh-command> - -Specify ssh command (default: 'ssh'). Useful to use 'plink'. - -=item B<--timeout> - -Timeout in seconds for the command (Default: 30). - -=item B<--sudo> - -Use 'sudo' to execute the command. - -=item B<--command> - -Command to get information. Used it you have output in a file. - -=item B<--command-path> - -Command path. - -=item B<--command-options> - -Command options. - =back =cut diff --git a/storage/ibm/storwize/ssh/mode/poolusage.pm b/storage/ibm/storwize/ssh/mode/poolusage.pm index 2d2a215d8..2368d63c5 100644 --- a/storage/ibm/storwize/ssh/mode/poolusage.pm +++ b/storage/ibm/storwize/ssh/mode/poolusage.pm @@ -28,14 +28,13 @@ use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold) sub custom_status_output { my ($self, %options) = @_; - - my $msg = 'status : ' . $self->{result_values}->{status}; - return $msg; + + return 'status : ' . $self->{result_values}->{status}; } sub custom_status_calc { my ($self, %options) = @_; - + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; return 0; @@ -43,7 +42,7 @@ sub custom_status_calc { sub custom_usage_perfdata { my ($self, %options) = @_; - + my $label = 'used'; my $value_perf = $self->{result_values}->{used}; if (defined($self->{instance_mode}->{option_results}->{free})) { @@ -69,7 +68,7 @@ sub custom_usage_perfdata { sub custom_usage_threshold { my ($self, %options) = @_; - + my ($exit, $threshold_value); $threshold_value = $self->{result_values}->{used}; $threshold_value = $self->{result_values}->{free} if (defined($self->{instance_mode}->{option_results}->{free})); @@ -83,15 +82,16 @@ sub custom_usage_threshold { sub custom_usage_output { my ($self, %options) = @_; - + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total}); my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free}); - my $msg = sprintf("Usage Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, - $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free}); - return $msg; + return sprintf( + 'Usage Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)', + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free} + ); } sub custom_usage_calc { @@ -103,17 +103,17 @@ sub custom_usage_calc { $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used}; $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total}; $self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used}; - + return 0; } sub set_counters { my ($self, %options) = @_; - + $self->{maps_counters_type} = [ { name => 'pool', type => 1, cb_prefix_output => 'prefix_pool_output', message_multiple => 'All pools are ok' } ]; - + $self->{maps_counters}->{pool} = [ { label => 'status', threshold => 0, set => { key_values => [ { name => 'status' }, { name => 'display' } ], @@ -140,22 +140,13 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - "filter-name:s" => { name => 'filter_name' }, - "warning-status:s" => { name => 'warning_status', default => '%{status} =~ /degraded/i' }, - "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /offline/i' }, - "units:s" => { name => 'units', default => '%' }, - "free" => { name => 'free' }, - "hostname:s" => { name => 'hostname' }, - "ssh-option:s@" => { name => 'ssh_option' }, - "ssh-path:s" => { name => 'ssh_path' }, - "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, - "timeout:s" => { name => 'timeout', default => 30 }, - "sudo" => { name => 'sudo' }, - "command:s" => { name => 'command' }, - "command-path:s" => { name => 'command_path' }, - "command-options:s" => { name => 'command_options' }, + 'filter-name:s' => { name => 'filter_name' }, + 'warning-status:s' => { name => 'warning_status', default => '%{status} =~ /degraded/i' }, + 'critical-status:s' => { name => 'critical_status', default => '%{status} =~ /offline/i' }, + 'units:s' => { name => 'units', default => '%' }, + 'free' => { name => 'free' }, }); - + return $self; } @@ -163,29 +154,21 @@ sub check_options { my ($self, %options) = @_; $self->SUPER::check_options(%options); - if (defined($self->{option_results}->{hostname}) && $self->{option_results}->{hostname} ne '') { - $self->{option_results}->{remote} = 1; - } $self->change_macros(macros => ['warning_status', 'critical_status']); } sub prefix_pool_output { my ($self, %options) = @_; - + return "Pool '" . $options{instance_value}->{display} . "' "; } sub manage_selection { my ($self, %options) = @_; + my ($content) = $options{custom}->execute_command(command => 'lsmdiskgrp -delim : -bytes'); $self->{pool} = {}; - my $content = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - sudo => $self->{option_results}->{sudo}, - command => defined($self->{option_results}->{command}) && $self->{option_results}->{command} ne '' ? $self->{option_results}->{command} : "lsmdiskgrp -delim : -bytes ; exit ;", - command_path => $self->{option_results}->{command_path}, - command_options => defined($self->{option_results}->{command_options}) && $self->{option_results}->{command_options} ne '' ? $self->{option_results}->{command_options} : undef); - my $result = $self->get_hasharray(content => $content, delim => ':'); + my $result = $options{custom}->get_hasharray(content => $content, delim => ':'); foreach (@$result) { if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && $_->{name} !~ /$self->{option_results}->{filter_name}/) { @@ -193,38 +176,20 @@ sub manage_selection { next; } - $self->{pool}->{$_->{id}} = { display => $_->{name}, - status => $_->{status}, - total => $_->{used_capacity} + $_->{free_capacity}, used => $_->{used_capacity} - }; + $self->{pool}->{$_->{id}} = { + display => $_->{name}, + status => $_->{status}, + total => $_->{used_capacity} + $_->{free_capacity}, + used => $_->{used_capacity} + }; } - + if (scalar(keys %{$self->{pool}}) <= 0) { - $self->{output}->add_option_msg(short_msg => "No pool found."); + $self->{output}->add_option_msg(short_msg => 'No pool found.'); $self->{output}->option_exit(); } } -sub get_hasharray { - my ($self, %options) = @_; - - my $result = []; - return $result if ($options{content} eq ''); - my ($header, @lines) = split /\n/, $options{content}; - my @header_names = split /$options{delim}/, $header; - - for (my $i = 0; $i <= $#lines; $i++) { - my @content = split /$options{delim}/, $lines[$i]; - my $data = {}; - for (my $j = 0; $j <= $#header_names; $j++) { - $data->{$header_names[$j]} = $content[$j]; - } - push @$result, $data; - } - - return $result; -} - 1; __END__ @@ -254,14 +219,9 @@ Can used special variables like: %{status}, %{display} Set critical threshold for status (Default: '%{status} =~ /offline/i'). Can used special variables like: %{status}, %{display} -=item B<--warning-*> +=item B<--warning-*> B<--critical-*> -Threshold warning. -Can be: 'usage'. - -=item B<--critical-*> - -Threshold critical. +Thresholds. Can be: 'usage'. =item B<--units> @@ -272,42 +232,6 @@ Units of thresholds (Default: '%') ('%', 'B'). Thresholds are on free space left. -=item B<--hostname> - -Hostname to query. - -=item B<--ssh-option> - -Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52'). - -=item B<--ssh-path> - -Specify ssh command path (default: none) - -=item B<--ssh-command> - -Specify ssh command (default: 'ssh'). Useful to use 'plink'. - -=item B<--timeout> - -Timeout in seconds for the command (Default: 30). - -=item B<--sudo> - -Use 'sudo' to execute the command. - -=item B<--command> - -Command to get information. Used it you have output in a file. - -=item B<--command-path> - -Command path. - -=item B<--command-options> - -Command options. - =back =cut diff --git a/storage/ibm/storwize/ssh/plugin.pm b/storage/ibm/storwize/ssh/plugin.pm index ed4162540..e41d7093f 100644 --- a/storage/ibm/storwize/ssh/plugin.pm +++ b/storage/ibm/storwize/ssh/plugin.pm @@ -22,7 +22,7 @@ package storage::ibm::storwize::ssh::plugin; use strict; use warnings; -use base qw(centreon::plugins::script_simple); +use base qw(centreon::plugins::script_custom); sub new { my ($class, %options) = @_; @@ -35,6 +35,7 @@ sub new { 'eventlog' => 'storage::ibm::storwize::ssh::mode::eventlog', 'pool-usage' => 'storage::ibm::storwize::ssh::mode::poolusage', ); + $self->{custom_modes}{api} = 'storage::ibm::storwize::ssh::custom::api'; return $self; }