diff --git a/centreon-plugins/apps/protocols/http/mode/expectedcontent.pm b/centreon-plugins/apps/protocols/http/mode/expectedcontent.pm index cc1d0d02e..2ccbb6a6b 100644 --- a/centreon-plugins/apps/protocols/http/mode/expectedcontent.pm +++ b/centreon-plugins/apps/protocols/http/mode/expectedcontent.pm @@ -61,6 +61,7 @@ sub new { "proxyurl:s" => { name => 'proxyurl' }, "expected-string:s" => { name => 'expected_string' }, "timeout:s" => { name => 'timeout', default => '3' }, + "ssl:s" => { name => 'ssl', }, }); return $self; } @@ -158,6 +159,10 @@ Specify password for basic authentification (Mandatory if --credentials is speci Threshold for HTTP timeout +=item B<--ssl> + +Specify SSL version (example : 'sslv3', 'tlsv1'...) + =item B<--expected-string> Specify String to check on the Webpage diff --git a/centreon-plugins/apps/protocols/http/mode/jsoncontent.pm b/centreon-plugins/apps/protocols/http/mode/jsoncontent.pm index 7bc61476a..6c2166ded 100644 --- a/centreon-plugins/apps/protocols/http/mode/jsoncontent.pm +++ b/centreon-plugins/apps/protocols/http/mode/jsoncontent.pm @@ -67,6 +67,7 @@ sub new { "expected-string:s" => { name => 'expected_string' }, "header:s@" => { name => 'header' }, "timeout:s" => { name => 'timeout', default => 10 }, + "ssl:s" => { name => 'ssl', }, "warning-numeric:s" => { name => 'warning_numeric' }, "critical-numeric:s" => { name => 'critical_numeric' }, @@ -419,6 +420,10 @@ Specify password for basic authentification (Mandatory if --credentials is speci Threshold for HTTP timeout (Default: 10) +=item B<--ssl> + +Specify SSL version (example : 'sslv3', 'tlsv1'...) + =item B<--header> Set HTTP headers (Multiple option) diff --git a/centreon-plugins/apps/protocols/http/mode/responsetime.pm b/centreon-plugins/apps/protocols/http/mode/responsetime.pm index 1e99b50ab..8193506e7 100644 --- a/centreon-plugins/apps/protocols/http/mode/responsetime.pm +++ b/centreon-plugins/apps/protocols/http/mode/responsetime.pm @@ -63,6 +63,7 @@ sub new { "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, "timeout:s" => { name => 'timeout', default => '3' }, + "ssl:s" => { name => 'ssl', }, }); return $self; } @@ -173,6 +174,10 @@ Proxy URL if any Threshold for HTTP timeout +=item B<--ssl> + +Specify SSL version (example : 'sslv3', 'tlsv1'...) + =item B<--warning> Threshold warning in seconds (Webpage response time) diff --git a/centreon-plugins/apps/protocols/http/mode/soapcontent.pm b/centreon-plugins/apps/protocols/http/mode/soapcontent.pm index a5213d27c..d0a8342d9 100644 --- a/centreon-plugins/apps/protocols/http/mode/soapcontent.pm +++ b/centreon-plugins/apps/protocols/http/mode/soapcontent.pm @@ -67,6 +67,7 @@ sub new { "expected-string:s" => { name => 'expected_string' }, "header:s@" => { name => 'header' }, "timeout:s" => { name => 'timeout', default => 10 }, + "ssl:s" => { name => 'ssl', }, "warning-numeric:s" => { name => 'warning_numeric' }, "critical-numeric:s" => { name => 'critical_numeric' }, @@ -433,6 +434,10 @@ Specify password for basic authentification (Mandatory if --credentials is speci Threshold for HTTP timeout (Default: 10) +=item B<--ssl> + +Specify SSL version (example : 'sslv3', 'tlsv1'...) + =item B<--header> Set HTTP headers (Multiple option) diff --git a/centreon-plugins/centreon/plugins/httplib.pm b/centreon-plugins/centreon/plugins/httplib.pm index 5683339da..d93e2afdc 100644 --- a/centreon-plugins/centreon/plugins/httplib.pm +++ b/centreon-plugins/centreon/plugins/httplib.pm @@ -116,6 +116,14 @@ sub connect { if (defined($self->{option_results}->{proxyurl})) { $ua->proxy(['http', 'https'], $self->{option_results}->{proxyurl}); } + + if (defined($self->{option_results}->{ssl}) && $self->{option_results}->{ssl} ne '') { + use IO::Socket::SSL; + my $context = new IO::Socket::SSL::SSL_Context( + SSL_version => $self->{option_results}->{ssl}, + ); + IO::Socket::SSL::set_default_context($context); + } $response = $ua->request($req); diff --git a/centreon-plugins/storage/hp/3par/7000/mode/battery.pm b/centreon-plugins/storage/hp/3par/7000/mode/battery.pm new file mode 100644 index 000000000..9a1e4abc4 --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/battery.pm @@ -0,0 +1,174 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::battery; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %states = ( + 'ok' => 'OK', + 'new' => 'OK', + 'degraded' => 'WARNING', + 'failed' => 'CRITICAL', +); + +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 => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showbattery", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my @batteries = split("\n",$stdout); + foreach my $battery (@batteries) { + if ($battery =~ /\d+\s+(\d+)\s+(\d+)\s+\S+\s+(\S+)\s+(\d+)/) { + $total_components++; + my $psuId = $1; + my $batteryId = $2; + my $batteryState = $3; + my $batteryChrgLvl = $4; + + $self->{output}->output_add(long_msg => sprintf("Battery '%d' on power supply '%d' is '%s' [Battery charge level: '%d%%']", $batteryId, $psuId, $batteryState, $batteryChrgLvl)); + if ($states{lc($batteryState)} ne 'OK'){ + $self->{output}->output_add(severity => $states{lc($batteryState)}, + short_msg => sprintf("Battery '%d' on power supply '%d' state is '%s' [Battery charge level: '%d%%']", $batteryId, $psuId, $batteryState, $batteryChrgLvl)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d batteries are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check batteries. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/cim.pm b/centreon-plugins/storage/hp/3par/7000/mode/cim.pm new file mode 100644 index 000000000..cf78f2d3d --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/cim.pm @@ -0,0 +1,172 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::cim; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-cim:s" => { name => 'no_cim' }, + }); + $self->{no_cim} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_cim})) { + if ($self->{option_results}->{no_cim} ne '') { + $self->{no_cim} = $self->{option_results}->{no_cim}; + } else { + $self->{no_cim} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showcim", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my @results = split("\n",$stdout); + my $total_cim = 0; + foreach my $result (@results) { + if ($result =~ /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+\S+/) { + $total_cim++; + my $serviceStatus = $1; + my $serviceState = $2; + my $slpState = $3; + my $slpPort = $4; + my $httpState = $5; + my $httpPort = $6; + my $httpsState = $7; + my $httpsPort = $8; + + $self->{output}->output_add(long_msg => sprintf("CIM service is '%s' and '%s' [SLP on port %d is %s] [HTTP on port %d is %s] [HTTPS on port %d is %s]", + $serviceStatus, $serviceState, $slpPort, $slpState, $httpPort, $httpState, $httpsPort ,$httpsState)); + if ((lc($serviceStatus) ne 'enabled') || (lc($serviceState) ne 'active')){ + $self->{output}->output_add(severity => 'critical', + short_msg => sprintf("CIM service is '%s' and '%s' [SLP on port %d is %s] [HTTP on port %d is %s] [HTTPS on port %d is %s]", + $serviceStatus, $serviceState, $slpPort, $slpState, $httpPort, $httpState, $httpsPort ,$httpsState)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'CIM service is ok.'); + + if (defined($self->{option_results}->{no_cim}) && $total_cim == 0) { + $self->{output}->output_add(severity => $self->{no_cim}, + short_msg => 'No CIM service is checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check CIM service status. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-cim> + +Return an error if no CIM are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/iscsi.pm b/centreon-plugins/storage/hp/3par/7000/mode/iscsi.pm new file mode 100644 index 000000000..82b074c09 --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/iscsi.pm @@ -0,0 +1,173 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::iscsi; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %states = ( + 'ready' => 'OK', + 'loss_sync' => 'WARNING', + 'offline' => 'CRITICAL', +); + +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 => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showport", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my @iscsis = split("\n",$stdout); + foreach my $iscsi (@iscsis) { + if ($iscsi =~ /(\S+)\s+\S+\s+(\S+)\s+\S+\s+\S+\s+(\S+)/) { + my $iscsiNsp = $1; + my $iscsiState = $2; + my $iscsiType = $3; + if($iscsiType eq 'iscsi') { + $self->{output}->output_add(long_msg => sprintf("Interface '%s' is '%s'", $iscsiNsp, $iscsiState)); + if ($states{lc($iscsiState)} ne 'OK'){ + $self->{output}->output_add(severity => $states{lc($iscsiState)}, + short_msg => sprintf("Interface '%s' is '%s'", $iscsiNsp, $iscsiState)); + } + $total_components++; + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d ISCSIs are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check ISCSIs. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/node.pm b/centreon-plugins/storage/hp/3par/7000/mode/node.pm new file mode 100644 index 000000000..aad4789a8 --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/node.pm @@ -0,0 +1,173 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::node; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %states = ( + 'ok' => 'OK', + 'new' => 'OK', + 'degraded' => 'WARNING', + 'failed' => 'CRITICAL', +); + +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 => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "shownode -s", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my @nodes = split("\n",$stdout); + foreach my $node (@nodes) { + if ($node =~ /(\d+)\s+(\S+)\s+(\S+)/) { + $total_components++; + my $nodeId = $1; + my $nodeState = $2; + my $detailNodeState = $3; + + $self->{output}->output_add(long_msg => sprintf("Node '%d' state is '%s' [Detailed State: %s]", $nodeId, $nodeState, $detailNodeState)); + if ($states{lc($nodeState)} ne 'OK'){ + $self->{output}->output_add(severity => $states{lc($nodeState)}, + short_msg => sprintf("Node '%d' state is '%s' [Detailed State: %s]", $nodeId, $nodeState, $detailNodeState)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d nodes are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check nodes. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/physicaldisk.pm b/centreon-plugins/storage/hp/3par/7000/mode/physicaldisk.pm new file mode 100644 index 000000000..8dc14865e --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/physicaldisk.pm @@ -0,0 +1,172 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::physicaldisk; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %states = ( + 'normal' => 'OK', + 'new' => 'OK', + 'degraded' => 'WARNING', + 'failed' => 'CRITICAL', +); + +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 => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showpd -showcols Id,State", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my @disks = split("\n",$stdout); + foreach my $disk (@disks) { + if ($disk =~ /(\d+)\s+(\S+)/) { + $total_components++; + my $diskId = $1; + my $diskState = $2; + + $self->{output}->output_add(long_msg => sprintf("Physical Disk '%d' state is '%s'", $diskId, $diskState)); + if ($states{$diskState} ne 'OK'){ + $self->{output}->output_add(severity => $states{$diskState}, + short_msg => sprintf("Physical Disk '%d' state is '%s'.", $diskId, $diskState)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d physical disks are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check Physical disks. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/psu.pm b/centreon-plugins/storage/hp/3par/7000/mode/psu.pm new file mode 100644 index 000000000..ee3d04f0c --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/psu.pm @@ -0,0 +1,174 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::psu; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %states = ( + 'ok' => 'OK', + 'new' => 'OK', + 'degraded' => 'WARNING', + 'failed' => 'CRITICAL', +); + +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 => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "shownode -ps", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my @psus = split("\n",$stdout); + foreach my $psu (@psus) { + if ($psu =~ /\S+\s+(\d+)\s+\S+\s+\S+\s+(\S+)\s+(\S+)\s+(\S+)/) { + $total_components++; + my $psuId = $1; + my $ACState = $2; + my $DCState = $3; + my $psuState = $4; + + $self->{output}->output_add(long_msg => sprintf("Power Suppply '%d' state is '%s' [AC: %s] [DC: %s]", $psuId, $psuState, $ACState ,$DCState)); + if ($states{lc($psuState)} ne 'OK'){ + $self->{output}->output_add(severity => $states{lc($psuState)}, + short_msg => sprintf("Power Suppply '%d' state is '%s' [AC: %s] [DC: %s]", $psuId, $psuState, $ACState ,$DCState)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d power supplies are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check power supplies. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/storage.pm b/centreon-plugins/storage/hp/3par/7000/mode/storage.pm new file mode 100644 index 000000000..cbd95276b --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/storage.pm @@ -0,0 +1,189 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::storage; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + "filter-type:s" => { name => 'filter_type' }, + "disk:s" => { name => 'disk' }, + "regexp" => { name => 'regexp' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showpd", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_disks = 0; + my @disks = split("\n",$stdout); + foreach my $disk (@disks) { + if ($disk =~ /(\d+)\s+\S+\s+(\S+)\s+\d+\s+\S+\s+(\d+)\s+(\d+)\s+\S+\s+\S+\s+\d+/) { + $total_disks++; + my $diskId = $1; + my $diskType = $2; + my $diskSize = $3 * 1024 * 1024; + my $diskFree = $4 * 1024 * 1024; + my $diskUsed = $diskSize - $diskFree; + my $percentUsed = ($diskUsed / $diskSize) * 100; + my $percentFree = ($diskFree / $diskSize) * 100; + + next if (defined($self->{option_results}->{filter_type}) && ($diskType !~ /$self->{option_results}->{filter_type}/i)); + next if (defined($self->{option_results}->{disk}) && defined($self->{option_results}->{regexp}) && ($diskId !~ /$self->{option_results}->{disk}/i)); + next if (defined($self->{option_results}->{disk}) && !defined($self->{option_results}->{regexp}) && ($diskId != $self->{option_results}->{disk})); + + my ($diskSizeValue, $diskSizeUnit) = $self->{perfdata}->change_bytes(value => $diskSize); + my ($diskUsedValue, $diskUsedUnit) = $self->{perfdata}->change_bytes(value => $diskUsed); + my ($diskFreeValue, $diskFreeUnit) = $self->{perfdata}->change_bytes(value => $diskFree); + + $self->{output}->output_add(long_msg => sprintf("Disk '%d' Total: %.2f%s Used: %.2f%s (%.2f%%) Free: %.2f%s (%.2f%%)", + $diskId, $diskSizeValue, $diskSizeUnit, $diskUsedValue, $diskUsedUnit, $percentUsed, $diskFreeValue, $diskFreeUnit, $percentFree)); + my $exit = $self->{perfdata}->threshold_check(value => $percentUsed, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Disk '%d' Total: %.2f%s Used: %.2f%s (%.2f%%) Free: %.2f%s (%.2f%%)", + $diskId, $diskSizeValue, $diskSizeUnit, $diskUsedValue, $diskUsedUnit, $percentUsed, $diskFreeValue, $diskFreeUnit, $percentFree)); + } + $self->{output}->perfdata_add(label => 'disk_'.$diskId, + unit => 'B', + value => $diskUsed, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $diskSize, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $diskSize, cast_int => 1), + min => 0, + max => $diskSize); + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'All disks are ok.'); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check Physical disks. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/temperature.pm b/centreon-plugins/storage/hp/3par/7000/mode/temperature.pm new file mode 100644 index 000000000..a8dc9af29 --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/temperature.pm @@ -0,0 +1,182 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::temperature; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-component:s" => { name => 'no_component' }, + "sensor:s" => { name => 'sensor' }, + "regexp" => { name => 'regexp' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_component})) { + if ($self->{option_results}->{no_component} ne '') { + $self->{no_components} = $self->{option_results}->{no_component}; + } else { + $self->{no_components} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "shownodeenv", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_components = 0; + my $nodeID = 0; + my @temperatures = split(/\n/,$stdout); + foreach my $temperature (@temperatures) { + if ($temperature =~ /^Node\s(\d+)$/) { + $nodeID = $1; + } + if ($temperature =~ /^(.+)\s(\d+)\sC\s+(\d+)\sC\s+(\d+)/) { + my $measurement = $1; + my $readTemp = $2; + my $loTemp = $3; + my $hiTemp= $4; + $measurement =~ s/^\s+//; + $measurement =~ s/\s+$//; + $total_components++; + + next if (defined($self->{option_results}->{sensor}) && defined($self->{option_results}->{regexp}) && ($measurement !~ /$self->{option_results}->{sensor}/i)); + next if (defined($self->{option_results}->{sensor}) && !defined($self->{option_results}->{regexp}) && ($measurement != $self->{option_results}->{sensor})); + +$self->{output}->output_add(long_msg => sprintf("Temperature '%s' on node '%d' is '%dC' [Max temperature: '%dC'] [Min temperature: '%dC'", $measurement, $nodeID, $readTemp, $hiTemp, $loTemp)); + if (($readTemp > $hiTemp) || ($readTemp < $loTemp)){ + $self->{output}->output_add(severity => 'critical', + short_msg => sprintf("Temperature '%s' on node '%d' is '%dC' [Max temperature: '%dC'] [Min temperature: '%dC'", $measurement, $nodeID, $readTemp, $hiTemp, $loTemp)); + } + $self->{output}->perfdata_add(label => $measurement.'_temperature', + unit => 'C', + value => $readTemp); + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => sprintf("All %d temperatures are ok.", $total_components)); + + if (defined($self->{option_results}->{no_component}) && $total_components == 0) { + $self->{output}->output_add(severity => $self->{no_components}, + short_msg => 'No components are checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check temperature. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/volume.pm b/centreon-plugins/storage/hp/3par/7000/mode/volume.pm new file mode 100644 index 000000000..195f425bc --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/volume.pm @@ -0,0 +1,216 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::volume; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + "filter-type:s" => { name => 'filter_type' }, + "volume:s" => { name => 'volume' }, + "name" => { name => 'name' }, + "regexp" => { name => 'regexp' }, + }); + $self->{components} = {}; + $self->{no_components} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showvv -showcols Id,Name,VSize_MB,Snp_Rsvd_MB,Snp_Used_MB,Adm_Rsvd_MB,Adm_Used_MB,Usr_Rsvd_MB,Usr_Used_MB", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my $total_volumes = 0; + my @volumes = split("\n",$stdout); + foreach my $volume (@volumes) { + if ($volume =~ /(\d+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) { + $total_volumes++; + my $volumeId = $1; + my $volumeName = $2; + my $volumeSize = $3 * 1024 * 1024; + my $volumeSnpSize = $4 * 1024 * 1024; + my $volumeSnpUsed = $5 * 1024 * 1024; + my $volumeAdmSize = $6 * 1024 * 1024; + my $volumeAdmUsed = $7 * 1024 * 1024; + my $volumeUsrSize = $8 * 1024 * 1024; + my $volumeUsrUsed = $9 * 1024 * 1024; + my $volumeUsed = $volumeSnpUsed + $volumeAdmUsed + $volumeUsrUsed; + my $volumeFree = $volumeSize - $volumeUsed; + my $percentUsed = ($volumeUsed / $volumeSize) * 100; + my $percentFree = 100 - $percentUsed; + + my $string_to_compare = $volumeId; + if (defined($self->{option_results}->{name})) { + $string_to_compare = $volumeName; + } + + next if (defined($self->{option_results}->{volume}) && defined($self->{option_results}->{regexp}) && ($string_to_compare !~ /$self->{option_results}->{volume}/i)); + next if (defined($self->{option_results}->{volume}) && !defined($self->{option_results}->{regexp}) && ($string_to_compare ne $self->{option_results}->{volume})); + + my ($volumeSizeValue, $volumeSizeUnit) = $self->{perfdata}->change_bytes(value => $volumeSize); + my ($volumeUsedValue, $volumeUsedUnit) = $self->{perfdata}->change_bytes(value => $volumeUsed); + my ($volumeFreeValue, $volumeFreeUnit) = $self->{perfdata}->change_bytes(value => $volumeFree); + my ($volumeSnpSizeValue, $volumeSnpSizeUnit) = $self->{perfdata}->change_bytes(value => $volumeSnpSize); + my ($volumeSnpUsedValue, $volumeSnpUsedUnit) = $self->{perfdata}->change_bytes(value => $volumeSnpUsed); + my ($volumeAdmSizeValue, $volumeAdmSizeUnit) = $self->{perfdata}->change_bytes(value => $volumeAdmSize); + my ($volumeAdmUsedValue, $volumeAdmUsedUnit) = $self->{perfdata}->change_bytes(value => $volumeAdmUsed); + my ($volumeUsrSizeValue, $volumeUsrSizeUnit) = $self->{perfdata}->change_bytes(value => $volumeUsrSize); + my ($volumeUsrUsedValue, $volumeUsrUsedUnit) = $self->{perfdata}->change_bytes(value => $volumeUsrUsed); + + $self->{output}->output_add(long_msg => sprintf("Volume %d '%s' Total: %.2f%s Used: %.2f%s (%.2f%%) Free: %.2f%s (%.2f%%) Usr: %.2f%s Adm: %.2f%s Snp: %.2f%s", + $volumeId, $volumeName, $volumeSizeValue, $volumeSizeUnit, + $volumeUsedValue, $volumeUsedUnit, $percentUsed, + $volumeFreeValue, $volumeFreeUnit, $percentFree, + $volumeUsrUsedValue, $volumeUsrUsedUnit, + $volumeAdmUsedValue, $volumeAdmUsedUnit, + $volumeSnpUsedValue, $volumeSnpUsedUnit,)); + my $exit = $self->{perfdata}->threshold_check(value => $percentUsed, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Volume %d '%s' Total: %.2f%s Used: %.2f%s (%.2f%%) Free: %.2f%s (%.2f%%) Usr: %.2f%s Adm: %.2f%s Snp: %.2f%s", + $volumeId, $volumeName, $volumeSizeValue, $volumeSizeUnit, + $volumeUsedValue, $volumeUsedUnit, $percentUsed, + $volumeFreeValue, $volumeFreeUnit, $percentFree, + $volumeUsrUsedValue, $volumeUsrUsedUnit, + $volumeAdmUsedValue, $volumeAdmUsedUnit, + $volumeSnpUsedValue, $volumeSnpUsedUnit,)); + } + $self->{output}->perfdata_add(label => 'volume_'.$volumeName, + unit => 'B', + value => $volumeUsed, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $volumeSize, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $volumeSize, cast_int => 1), + min => 0, + max => $volumeSize); + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'All volumes are ok.'); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check Physical disks. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/mode/wsapi.pm b/centreon-plugins/storage/hp/3par/7000/mode/wsapi.pm new file mode 100644 index 000000000..8fb605385 --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/mode/wsapi.pm @@ -0,0 +1,170 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::mode::wsapi; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "sudo" => { name => 'sudo' }, + "ssh-option:s@" => { name => 'ssh_option' }, + "ssh-path:s" => { name => 'ssh_path' }, + "ssh-command:s" => { name => 'ssh_command', default => 'ssh' }, + "no-wsapi:s" => { name => 'no_wsapi' }, + }); + $self->{no_wsapi} = undef; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify a hostname."); + $self->{output}->option_exit(); + } + + if (defined($self->{option_results}->{no_wsapi})) { + if ($self->{option_results}->{no_wsapi} ne '') { + $self->{no_wsapi} = $self->{option_results}->{no_wsapi}; + } else { + $self->{no_wsapi} = 'critical'; + } + } +} + +sub run { + my ($self, %options) = @_; + + $self->{option_results}->{remote} = 1; + my $stdout = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + sudo => $self->{option_results}->{sudo}, + command => "showwsapi", + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}); + + + my @results = split("\n",$stdout); + my $total_wsapi = 0; + foreach my $result (@results) { + if ($result =~ /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)\s+\S+/) { + $total_wsapi++; + my $serviceStatus = $1; + my $serviceState = $2; + my $httpState = $3; + my $httpPort = $4; + my $httpsState = $5; + my $httpsPort = $6; + + $self->{output}->output_add(long_msg => sprintf("WSAPI service is '%s' and '%s' [HTTP on port %d is %s] [HTTPS on port %d is %s]", + $serviceStatus, $serviceState, $httpPort, $httpState, $httpsPort ,$httpsState)); + if ((lc($serviceStatus) ne 'enabled') || (lc($serviceState) ne 'active')){ + $self->{output}->output_add(severity => 'critical', + short_msg => sprintf("WSAPI service is '%s' and '%s' [HTTP on port %d is %s] [HTTPS on port %d is %s]", + $serviceStatus, $serviceState, $httpPort, $httpState, $httpsPort ,$httpsState)); + } + } + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'WSAPI service is ok.'); + + if (defined($self->{option_results}->{no_wsapi}) && $total_wsapi == 0) { + $self->{output}->output_add(severity => $self->{no_wsapi}, + short_msg => 'No WSAPI service is checked.'); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check WSAPI service status. + +=over 8 + +=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'). + +=item B<--sudo> + +Use sudo. + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--no-wsapi> + +Return an error if no WSAPI are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=back + +=cut + + diff --git a/centreon-plugins/storage/hp/3par/7000/plugin.pm b/centreon-plugins/storage/hp/3par/7000/plugin.pm new file mode 100644 index 000000000..d967edddf --- /dev/null +++ b/centreon-plugins/storage/hp/3par/7000/plugin.pm @@ -0,0 +1,73 @@ +################################################################################ +# Copyright 2005-2013 MERETHIS +# Centreon is developped by : Julien Mathis and Romain Le Merlus under +# GPL Licence 2.0. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation ; either version 2 of the License. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, see . +# +# Linking this program statically or dynamically with other modules is making a +# combined work based on this program. Thus, the terms and conditions of the GNU +# General Public License cover the whole combination. +# +# As a special exception, the copyright holders of this program give MERETHIS +# permission to link this program with independent modules to produce an executable, +# regardless of the license terms of these independent modules, and to copy and +# distribute the resulting executable under terms of MERETHIS choice, provided that +# MERETHIS also meet, for each linked independent module, the terms and conditions +# of the license of that module. An independent module is a module which is not +# derived from this program. If you modify this program, you may extend this +# exception to your version of the program, but you are not obliged to do so. If you +# do not wish to do so, delete this exception statement from your version. +# +# For more information : contact@centreon.com +# Authors : Quentin Garnier +# +#################################################################################### + +package storage::hp::3par::7000::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_simple); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + # $options->{options} = options object + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'physicaldisk' => 'storage::hp::3par::7000::mode::physicaldisk', + 'psu' => 'storage::hp::3par::7000::mode::psu', + 'node' => 'storage::hp::3par::7000::mode::node', + 'battery' => 'storage::hp::3par::7000::mode::battery', + 'wsapi' => 'storage::hp::3par::7000::mode::wsapi', + 'cim' => 'storage::hp::3par::7000::mode::cim', + 'temperature' => 'storage::hp::3par::7000::mode::temperature', + 'storage' => 'storage::hp::3par::7000::mode::storage', + 'iscsi' => 'storage::hp::3par::7000::mode::iscsi', + 'volume' => 'storage::hp::3par::7000::mode::volume', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check HP 3par 7000 series in SSH. + +=cut