diff --git a/centreon-plugins/apps/centreon/sql/mode/multiservices.pm b/centreon-plugins/apps/centreon/sql/mode/multiservices.pm index b05aed885..185154088 100644 --- a/centreon-plugins/apps/centreon/sql/mode/multiservices.pm +++ b/centreon-plugins/apps/centreon/sql/mode/multiservices.pm @@ -1,4 +1,5 @@ -# Copyright 2016 Centreon (http://www.centreon.com/) +# +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/centreon/sql/mode/virtualservice.pm b/centreon-plugins/apps/centreon/sql/mode/virtualservice.pm index a84ec2ec4..765caf67e 100644 --- a/centreon-plugins/apps/centreon/sql/mode/virtualservice.pm +++ b/centreon-plugins/apps/centreon/sql/mode/virtualservice.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/java/hibernate/jmx/mode/stats.pm b/centreon-plugins/apps/java/hibernate/jmx/mode/stats.pm index fad0cd08f..52a67d7b3 100644 --- a/centreon-plugins/apps/java/hibernate/jmx/mode/stats.pm +++ b/centreon-plugins/apps/java/hibernate/jmx/mode/stats.pm @@ -148,7 +148,7 @@ sub manage_selection { $self->{output}->option_exit(); } - $self->{cache_name} = "hibernate_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "hibernate_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } diff --git a/centreon-plugins/apps/java/jboss/jmx/mode/datasourceusage.pm b/centreon-plugins/apps/java/jboss/jmx/mode/datasourceusage.pm new file mode 100644 index 000000000..7888a1869 --- /dev/null +++ b/centreon-plugins/apps/java/jboss/jmx/mode/datasourceusage.pm @@ -0,0 +1,164 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::java::jboss::jmx::mode::datasourceusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'datasource', type => 1, cb_prefix_output => 'prefix_ds_output', message_multiple => 'All datasources are ok' }, + ]; + + $self->{maps_counters}->{datasource} = [ + { label => 'active-con', set => { + key_values => [ { name => 'ActiveCount' }, { name => 'display' } ], + output_template => 'Current Active Connections : %s', + perfdatas => [ + { label => 'active_con', value => 'ActiveCount_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'available-con', set => { + key_values => [ { name => 'AvailableCount' }, { name => 'display' } ], + output_template => 'Current Available Connections : %s', + perfdatas => [ + { label => 'available_con', value => 'AvailableCount_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'in-use-con', set => { + key_values => [ { name => 'InUseCount' }, { name => 'display' } ], + output_template => 'Current In Use Connections : %s', + perfdatas => [ + { label => 'in_use_con', value => 'InUseCount_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'created-con', set => { + key_values => [ { name => 'CreatedCount', diff => 1 }, { name => 'display' } ], + output_template => 'Created Connections : %s', + perfdatas => [ + { label => 'created_con', value => 'CreatedCount_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_ds_output { + my ($self, %options) = @_; + + return "Datasource '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + }); + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $request = [ + { mbean => "jboss.jca:name=*,service=ManagedConnectionPool", attributes => + [ { name => 'AvailableConnectionCount' }, { name => 'ConnectionCount' }, { name => 'ConnectionCreatedCount' }, { name => 'InUseConnectionCount' } ] }, + { mbean => "jboss.as:data-source=*,statistics=pool,subsystem=datasources", attributes => + [ { name => 'AvailableCount' }, { name => 'ActiveCount' }, { name => 'CreatedCount' }, { name => 'InUseCount' } ] }, + ]; + + my $result = $options{custom}->get_attributes(request => $request, nothing_quit => 1); + + $self->{datasource} = {}; + foreach my $key (keys %$result) { + $key =~ /(?:[:,])(?:name|data-source)=(.*?)(?:,|$)/; + my $ds_name = $1; + $ds_name =~ s/^"(.*)"$/$1/; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $ds_name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $ds_name . "': no matching filter.", debug => 1); + next; + } + + $self->{datasource}->{$ds_name} = { + display => $ds_name, + AvailableCount => defined($result->{$key}->{AvailableConnectionCount}) ? $result->{$key}->{AvailableConnectionCount} : $result->{$key}->{AvailableCount}, + ActiveCount => defined($result->{$key}->{ConnectionCount}) ? $result->{$key}->{ConnectionCount} : $result->{$key}->{ActiveCount}, + CreatedCount => defined($result->{$key}->{ConnectionCreatedCount}) ? $result->{$key}->{ConnectionCreatedCount} : $result->{$key}->{CreatedCount}, + InUseCount => defined($result->{$key}->{InUseConnectionCount}) ? $result->{$key}->{InUseConnectionCount} : $result->{$key}->{InUseCount}, + }; + } + + $self->{cache_name} = "jboss_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check data sources usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='num-active' + +=item B<--filter-name> + +Filter datasource name (can be a regexp). + +=item B<--warning-*> + +Threshold warning. +Can be: 'active-con', 'available-con', 'created-con', 'in-use-con'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'active-con', 'available-con', 'created-con', 'in-use-con'. + +=back + +=cut diff --git a/centreon-plugins/apps/java/jboss/jmx/mode/listdatasources.pm b/centreon-plugins/apps/java/jboss/jmx/mode/listdatasources.pm new file mode 100644 index 000000000..74c828e0b --- /dev/null +++ b/centreon-plugins/apps/java/jboss/jmx/mode/listdatasources.pm @@ -0,0 +1,123 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::java::jboss::jmx::mode::listdatasources; + +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 => + { + "filter-name:s" => { name => 'filter_name' }, + }); + $self->{ds} = {}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $request = [ + { mbean => "jboss.jca:name=*,service=ManagedConnectionPool", attributes => + [ { name => 'ConnectionCount' } ] }, + { mbean => "jboss.as:data-source=*,statistics=pool,subsystem=datasources", attributes => + [ { name => 'ActiveCount' } ] }, + ]; + my $result = $options{custom}->get_attributes(request => $request); + + foreach my $mbean (keys %{$result}) { + $mbean =~ /(?:[:,])(?:data-source|name)=(.*?)(?:,|$)/; + my $name = $1; + $name =~ s/^"(.*)"$/$1/; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{ds}->{$name} = { + name => $name, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{ds}}) { + $self->{output}->output_add(long_msg => '[name = ' . $self->{ds}->{$instance}->{name} . "]"); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List data sources:'); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['name']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{ds}}) { + $self->{output}->add_disco_entry( + %{$self->{ds}->{$instance}} + ); + } +} + +1; + +__END__ + +=head1 MODE + +List data sources. + +=over 8 + +=item B<--filter-name> + +Filter by name (can be a regexp). + +=back + +=cut + diff --git a/centreon-plugins/apps/java/jboss/jmx/plugin.pm b/centreon-plugins/apps/java/jboss/jmx/plugin.pm new file mode 100644 index 000000000..d37cc2ef3 --- /dev/null +++ b/centreon-plugins/apps/java/jboss/jmx/plugin.pm @@ -0,0 +1,54 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::java::jboss::jmx::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_custom); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '0.1'; + %{$self->{modes}} = ( + 'class-count' => 'centreon::common::jvm::mode::classcount', + 'datasource-usage' => 'apps::java::jboss::jmx::mode::datasourceusage', + 'list-datasources' => 'apps::java::jboss::jmx::mode::listdatasources', + 'memory' => 'centreon::common::jvm::mode::memory', + 'memory-detailed' => 'centreon::common::jvm::mode::memorydetailed', + 'threads' => 'centreon::common::jvm::mode::threads', + ); + + $self->{custom_modes}{jolokia} = 'centreon::common::protocols::jmx::custom::jolokia'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Jboss in JMX. Need Jolokia agent. + +=cut diff --git a/centreon-plugins/apps/java/solr/jmx/mode/cacheusage.pm b/centreon-plugins/apps/java/solr/jmx/mode/cacheusage.pm index 0f8a1fe05..acbb09e12 100644 --- a/centreon-plugins/apps/java/solr/jmx/mode/cacheusage.pm +++ b/centreon-plugins/apps/java/solr/jmx/mode/cacheusage.pm @@ -131,7 +131,7 @@ sub manage_selection { $self->{output}->option_exit(); } - $self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } diff --git a/centreon-plugins/apps/java/solr/jmx/mode/requesthandlerusage.pm b/centreon-plugins/apps/java/solr/jmx/mode/requesthandlerusage.pm index 30f0cd6be..9f6814e7f 100644 --- a/centreon-plugins/apps/java/solr/jmx/mode/requesthandlerusage.pm +++ b/centreon-plugins/apps/java/solr/jmx/mode/requesthandlerusage.pm @@ -128,7 +128,7 @@ sub manage_selection { $self->{output}->option_exit(); } - $self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "solr_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } diff --git a/centreon-plugins/apps/java/zookeeper/jmx/mode/stats.pm b/centreon-plugins/apps/java/zookeeper/jmx/mode/stats.pm index 812dd2ee2..6b98b318e 100644 --- a/centreon-plugins/apps/java/zookeeper/jmx/mode/stats.pm +++ b/centreon-plugins/apps/java/zookeeper/jmx/mode/stats.pm @@ -141,7 +141,7 @@ sub manage_selection { $self->{output}->option_exit(); } - $self->{cache_name} = "zookeeper_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "zookeeper_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); } diff --git a/centreon-plugins/apps/kingdee/eas/custom/api.pm b/centreon-plugins/apps/kingdee/eas/custom/api.pm new file mode 100644 index 000000000..08b2c238a --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/custom/api.pm @@ -0,0 +1,184 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kingdee::eas::custom::api; + +use strict; +use warnings; +use centreon::plugins::http; + +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', }, + "proto:s@" => { name => 'proto' }, + "port:s@" => { name => 'port', }, + "username:s@" => { name => 'username', }, + "password:s@" => { name => 'password', }, + "proxyurl:s@" => { name => 'proxyurl', }, + "timeout:s@" => { name => 'timeout', }, + }); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{mode} = $options{mode}; + $self->{http} = centreon::plugins::http->new(output => $self->{output}); + + return $self; + +} + +sub set_options { + my ($self, %options) = @_; + + $self->{option_results} = $options{option_results}; +} + +sub set_defaults { + my ($self, %options) = @_; + + foreach (keys %{$options{default}}) { + if ($_ eq $self->{mode}) { + for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { + foreach my $opt (keys %{$options{default}->{$_}[$i]}) { + if (!defined($self->{option_results}->{$opt}[$i])) { + $self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt}; + } + } + } + } + } +} + +sub check_options { + my ($self, %options) = @_; + + $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef; + $self->{username} = (defined($self->{option_results}->{username})) ? shift(@{$self->{option_results}->{username}}) : ''; + $self->{password} = (defined($self->{option_results}->{password})) ? shift(@{$self->{option_results}->{password}}) : ''; + $self->{proto} = (defined($self->{option_results}->{proto})) ? shift(@{$self->{option_results}->{proto}}) : 'http'; + $self->{port} = (defined($self->{option_results}->{port})) ? shift(@{$self->{option_results}->{port}}) : 80; + $self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10; + $self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef; + + if (!defined($self->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify hostname option."); + $self->{output}->option_exit(); + } + + if (!defined($self->{hostname}) || + scalar(@{$self->{option_results}->{hostname}}) == 0) { + return 0; + } + return 1; +} + +sub build_options_for_httplib { + my ($self, %options) = @_; + + $self->{option_results}->{hostname} = $self->{hostname}; + $self->{option_results}->{timeout} = $self->{timeout}; + $self->{option_results}->{port} = $self->{port}; + $self->{option_results}->{proto} = $self->{proto}; + $self->{option_results}->{proxyurl} = $self->{proxyurl}; + $self->{option_results}->{credentials} = 1; + $self->{option_results}->{username} = $self->{username}; + $self->{option_results}->{password} = $self->{password}; +} + +sub settings { + my ($self, %options) = @_; + + $self->build_options_for_httplib(); + $self->{http}->set_options(%{$self->{option_results}}); +} + +sub request { + my ($self, %options) = @_; + + $self->settings(); + my $content = $self->{http}->request(url_path => $options{path}); + $content =~ s/^\s|\s+$//g; + + return $content; +} + +1; + +__END__ + +=head1 NAME + +KINGDEE REST API + +=head1 SYNOPSIS + +KINGDEE Rest API custom mode + +=head1 REST API OPTIONS + +=over 8 + +=item B<--hostname> + +Kingdee hostname. + +=item B<--proto> + +Specify https if needed. + +=item B<--username> + +Kingdee username. + +=item B<--password> + +Kingdee password. + +=item B<--proxyurl> + +Proxy URL if any. + +=item B<--timeout> + +Set HTTP timeout in seconds (Default: '10'). + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/activeusers.pm b/centreon-plugins/apps/kingdee/eas/mode/activeusers.pm new file mode 100644 index 000000000..6968190b7 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/activeusers.pm @@ -0,0 +1,111 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::activeusers; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkactiveusers.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /.*ActiveUsers_1m=.*/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find eas actvie users info." + ); + $self->{output}->option_exit(); + } + + my @activeusers = split(" ",$webcontent); + + my $info; + foreach $info (@activeusers) { + if ($info =~ /(.*)=(.*)/) { + my ($counttype, $num) = ($1, $2); + $self->{output}->output_add(severity => "ok", short_msg => $info); + $self->{output}->perfdata_add(label => $counttype, unit => '',value => $num); + } + } + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check eas active users info. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp') + +=item B<--warning> + +Warning Threshold. + +=item B<--critical> + +Critical Threshold. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/classloading.pm b/centreon-plugins/apps/kingdee/eas/mode/classloading.pm new file mode 100644 index 000000000..046964fdd --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/classloading.pm @@ -0,0 +1,126 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::classloading; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkclassloading.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /(LoadedClassCount|UnloadedClassCount)/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find classloading status." + ); + $self->{output}->option_exit(); + } + + my ($loadedclasscount, $unloadedclasscount) = (0, 0); + + if ($webcontent =~ /LoadedClassCount=\s*(\d+)/mi) { + $loadedclasscount = $1; + } + if ($webcontent =~ /UnloadedClassCount=\s*(\d+)/mi) { + $unloadedclasscount = $1; + } + + my $exit = $self->{perfdata}->threshold_check(value => $loadedclasscount, + threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', 'exit_litteral' => 'warning' } ]); + + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ClassLoaded: %d", $loadedclasscount)); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ClassUnloaded: %d", $unloadedclasscount)); + + $self->{output}->perfdata_add(label => "LoadedClassCount", unit => '', + value => sprintf("%d", $loadedclasscount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + $self->{output}->perfdata_add(label => "c[UnloadedClassCount]", unit => '', + value => sprintf("%d", $unloadedclasscount), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check EAS application classLoading status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp') + +=item B<--warning> + +Warning Threshold for class loaded + +=item B<--critical> + +Critical Threshold for class unloaded + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/datasource.pm b/centreon-plugins/apps/kingdee/eas/mode/datasource.pm new file mode 100644 index 000000000..4d8ba561a --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/datasource.pm @@ -0,0 +1,174 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::datasource; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkdatasources.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /^Name=/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find datasource \'" . $self->{option_results}->{datasource} . "\' status." + ); + } + + my $init_pool_size = -1; + my $max_pool_size = -1; + my $idle_timeout = -1; + my $cur_conn_count = -1; + my $cur_avail_conn_count = -1; + my $max_conn_count = -1; + my $create_count = -1; + my $close_count = -1; + + $init_pool_size = $1 if $webcontent =~ /InitialPoolSize=(\d+)\s/i; + $max_pool_size = $1 if $webcontent =~ /MaxPoolSize=(\d+)\s/i; + $idle_timeout = $1 if $webcontent =~ /IdleTimeout=(\d+)\s/i; + $cur_conn_count = $1 if $webcontent =~ /CurrentConnectionCount=(\d+)\s/i; + $cur_avail_conn_count = $1 if $webcontent =~ /CurrentAvailableConnectionCount=(\d+)\s/i; + $max_conn_count = $1 if $webcontent =~ /MaxConnectionCount=(\d+)\s/i; + $create_count = $1 if $webcontent =~ /CreateCount=(\d+)\s/i; + $close_count = $1 if $webcontent =~ /CloseCount=(\d+)\s/i; + + my $active_conn_count = $cur_conn_count - $cur_avail_conn_count; + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("InitialPoolSize: %d", $init_pool_size)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxPoolSize: %d", $max_pool_size)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %d", $idle_timeout)); + + my $exit = $self->{perfdata}->threshold_check(value => $active_conn_count, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveConnectionCount: %d", $active_conn_count)); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentConnectionCount: %d", $cur_conn_count)); + #$self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentAvailableConnectionCount: %d", $cur_avail_conn_count)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxConnectionCount: %d", $max_conn_count)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $create_count)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CloseCount: %d", $close_count)); + + $self->{output}->perfdata_add(label => "InitPoolSize", unit => '', + value => sprintf("%d", $init_pool_size), + ); + $self->{output}->perfdata_add(label => "MaxPoolSize", unit => '', + value => sprintf("%d", $max_pool_size), + ); + $self->{output}->perfdata_add(label => "IdleTimeout", unit => '', + value => sprintf("%d", $idle_timeout), + ); + + $self->{output}->perfdata_add(label => "ActiveConnectionCount", unit => '', + value => sprintf("%d", $active_conn_count), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + $self->{output}->perfdata_add(label => "CurrentConnectionCount", unit => '', + value => sprintf("%d", $cur_conn_count), + ); + #$self->{output}->perfdata_add(label => "CurrentAvailableConnectionCount", unit => '', + # value => sprintf("%d", $cur_avail_conn_count), + # ); + $self->{output}->perfdata_add(label => "MaxConnectionCount", unit => '', + value => sprintf("%d", $max_conn_count), + ); + $self->{output}->perfdata_add(label => "c[CreateCount]", unit => '', + value => sprintf("%d", $create_count), + ); + $self->{output}->perfdata_add(label => "c[CloseCount]", unit => '', + value => sprintf("%d", $close_count), + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS application datasource status. + +=over 8 + +=item B<--urlpath> + +Specify path to get status page. (Default: '/easportal/tools/nagios/checkdatasources.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold for active connection count. + +=item B<--critical> + +Critical Threshold for active connection count. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/easlicense.pm b/centreon-plugins/apps/kingdee/eas/mode/easlicense.pm new file mode 100644 index 000000000..0dd1d0153 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/easlicense.pm @@ -0,0 +1,108 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::easlicense; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkeaslicense.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /.*BOS=.*/i) { + $self->{output}->output_add(severity => 'UNKNOWN', + short_msg => "Cannot find eas license usage info."); + $self->{output}->option_exit(); + } + + my @licenseinfo = split(" ",$webcontent); + + my $info; + foreach $info (@licenseinfo) { + if ($info =~ /(.*)=(.*)/) { + my ($modname, $num) = ($1, $2); + $self->{output}->output_add(severity => "ok", short_msg => $info); + $self->{output}->perfdata_add(label => $modname, unit => '',value => $num); + } + } + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check eas license usage info. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkclassloading.jsp') + +=item B<--warning> + +Warning Threshold. + +=item B<--critical> + +Critical Threshold. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/httphandler.pm b/centreon-plugins/apps/kingdee/eas/mode/httphandler.pm new file mode 100644 index 000000000..7983689cb --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/httphandler.pm @@ -0,0 +1,186 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::httphandler; + +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 => { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkhttphandler.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + } + ); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } + +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /MaxThreads=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find httphandler status in response: '" . $webcontent . "'" + ); + $self->{output}->option_exit(); + } + + my ($maxthreads, $minsparethreads, $maxsparethreads, $maxqueuesize, $idletimeout, $processedcount) = (0, 0, 0, 0, 0, 0); + my ($currentthreadcount, $availablethreadcount, $busythreadcount, $maxavailablethreadcount, $maxbusythreadcount) = (0, 0, 0, 0, 0); + my ($maxprocessedtime, $createcount, $destroycount) = (0, 0, 0); + + $maxthreads = $1 if $webcontent =~ /MaxThreads=(\d+)/mi ; + $minsparethreads = $1 if $webcontent =~ /MinSpareThreads=(\d+)/mi ; + $maxsparethreads = $1 if $webcontent =~ /MaxSpareThreads=(\d+)/mi ; + $maxqueuesize = $1 if $webcontent =~ /MaxQueueSize=(\d+)/mi ; + $idletimeout = $1 if $webcontent =~ /IdleTimeout=(\d+)/mi ; + $processedcount = $1 if $webcontent =~ /ProcessedCount=(\d+)/mi ; + $currentthreadcount = $1 if $webcontent =~ /CurrentThreadCount=(\d+)/mi ; + $availablethreadcount = $1 if $webcontent =~ /AvailableThreadCount=(\d+)/mi ; + $busythreadcount = $1 if $webcontent =~ /BusyThreadCount=(\d+)/mi ; + $maxavailablethreadcount = $1 if $webcontent =~ /MaxAvailableThreadCount=(\d+)/mi ; + $maxbusythreadcount = $1 if $webcontent =~ /MaxBusyThreadCount=(\d+)/mi ; + $maxprocessedtime = $1 if $webcontent =~ /MaxProcessedTime=(\d+)/mi ; + $createcount = $1 if $webcontent =~ /CreateCount=(\d+)/mi ; + $destroycount = $1 if $webcontent =~ /DestroyCount=(\d+)/mi ; + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxThreads: %d", $maxthreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MinSpareThreads: %d", $minsparethreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxSpareThreads: %d", $maxsparethreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxQueueSize: %d", $maxqueuesize)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %ds", $idletimeout)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("ProcessedCount: %d", $processedcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentThreadCount: %d", $currentthreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("AvailableThreadCount: %d", $availablethreadcount)); + + my $exit = $self->{perfdata}->threshold_check(value => $busythreadcount, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("BusyThreadCount: %d", $busythreadcount)); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxAvailableThreadCount: %d", $maxavailablethreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxBusyThreadCount: %d", $maxbusythreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxProcessedTime: %dms", $maxprocessedtime)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $createcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("DestroyCount: %d", $destroycount)); + + $self->{output}->perfdata_add(label => "MaxThreads", unit => '', + value => sprintf("%d", $maxthreads), + ); + $self->{output}->perfdata_add(label => "MinSpareThreads", unit => '', + value => sprintf("%d", $minsparethreads), + ); + $self->{output}->perfdata_add(label => "MaxSpareThreads", unit => '', + value => sprintf("%d", $maxsparethreads), + ); + $self->{output}->perfdata_add(label => "MaxQueueSize", unit => '', + value => sprintf("%d", $maxqueuesize), + ); + $self->{output}->perfdata_add(label => "IdleTimeout", unit => 's', + value => sprintf("%d", $idletimeout), + ); + $self->{output}->perfdata_add(label => "c[ProcessedCount]", unit => '', + value => sprintf("%d", $processedcount), + ); + $self->{output}->perfdata_add(label => "CurrentThreadCount", unit => '', + value => sprintf("%d", $currentthreadcount), + ); + $self->{output}->perfdata_add(label => "AvailableThreadCount", unit => '', + value => sprintf("%d", $availablethreadcount), + ); + + $self->{output}->perfdata_add(label => "BusyThreadCount", unit => '', + value => sprintf("%d", $busythreadcount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + + $self->{output}->perfdata_add(label => "MaxAvailableThreadCount", unit => '', + value => sprintf("%d", $maxavailablethreadcount), + ); + $self->{output}->perfdata_add(label => "MaxBusyThreadCount", unit => '', + value => sprintf("%d", $maxbusythreadcount), + ); + $self->{output}->perfdata_add(label => "MaxProcessedTime", unit => 'ms', + value => sprintf("%d", $maxprocessedtime), + ); + $self->{output}->perfdata_add(label => "c[CreateCount]", unit => '', + value => sprintf("%d", $createcount), + ); + $self->{output}->perfdata_add(label => "c[DestroyCount]", unit => '', + value => sprintf("%d", $destroycount), + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS instance httphandler(Apusic) threads pool status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkhttphandler.jsp') + +=item B<--warning> + +Warning Threshold for busy thread count. + +=item B<--critical> + +Critical Threshold for busy thread count. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/ibmjvmgc.pm b/centreon-plugins/apps/kingdee/eas/mode/ibmjvmgc.pm new file mode 100644 index 000000000..c62b8d1db --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/ibmjvmgc.pm @@ -0,0 +1,115 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::ibmjvmgc; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkgc_j9gen.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /CollectionCount=\d+/mi) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find ibm jdk j9 gc status." + ); + $self->{output}->option_exit(); + } + + my ($collectioncount, $collectiontime) = (0, 0); + + ($collectioncount, $collectiontime) = ($1, $2) if ($webcontent =~ /CollectionCount=(\d+)\sCollectionTime=(\d+)/mi); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CollectionCount: %d", $collectioncount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CollectionTime: %dms", $collectiontime)); + + $self->{output}->perfdata_add(label => "c[CollectionCount]", unit => '', + value => sprintf("%d", $collectioncount), + ); + $self->{output}->perfdata_add(label => "c[CollectionTime]", unit => 'ms', + value => sprintf("%d", $collectiontime), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check EAS application jvm gc status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkgc_j9.jsp') + +=item B<--warning> + +Warning Threshold for class loaded + +=item B<--critical> + +Critical Threshold for class unloaded + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/javaruntime.pm b/centreon-plugins/apps/kingdee/eas/mode/javaruntime.pm new file mode 100644 index 000000000..932e11386 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/javaruntime.pm @@ -0,0 +1,129 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::javaruntime; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use POSIX; +use centreon::plugins::misc; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkjavaruntime.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /VmName=/mi) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find java runtime status." + ); + $self->{output}->option_exit(); + } + + my $vmname = $1 if $webcontent =~ /VmName=\'(.*?)\'/i; + my $specversion = $1 if $webcontent =~ /SpecVersion=([\d\.]+)/i; + my $vmversion = $1 if $webcontent =~ /VmVersion=(.*?)\s/i; + my $vender = $1 if $webcontent =~ /VmVendor=\'(.*?)\'/i; + my $uptime = $1 if $webcontent =~ /Uptime=(\d*)/i; #unit:ms + my $startime = $1 if $webcontent =~ /StartTime=(\d*)/i; + + my $exit = $self->{perfdata}->threshold_check(value => $uptime / 1000, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("Uptime: %s", + centreon::plugins::misc::change_seconds(value => floor($uptime / 1000), start => 'd')) + ); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("%s %s (build %s), %s", + $vmname ,$specversion, $vmversion,$vender) + ); + + $self->{output}->perfdata_add(label => "Uptime", unit => 's', + value => sprintf("%d", floor($uptime / 1000)), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + $self->{output}->perfdata_add(label => "SpecVersion", unit => '', + value => sprintf("%s", $specversion), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check EAS application java runtime status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkjavaruntime.jsp') + +=item B<--warning> + +Warning Threshold for uptime (sec) + +=item B<--critical> + +Critical Threshold for uptime (sec) + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/memory.pm b/centreon-plugins/apps/kingdee/eas/mode/memory.pm new file mode 100644 index 000000000..e08f12123 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/memory.pm @@ -0,0 +1,322 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::memory; + +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 => { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkmemory.jsp" }, + "warning-heap:s" => { name => 'warning-heap' , default => ",,,"}, + "warning-nonheap:s" => { name => 'warning-nonheap' , default => ",,,"}, + "critical-heap:s" => { name => 'critical-heap' , default => ",,,"}, + "critical-nonheap:s" => { name => 'critical-nonheap' , default => ",,,"}, + } + ); + + return $self; +} + +sub check_options { + my ( $self, %options ) = @_; + $self->SUPER::init(%options); + + ($self->{warn_init_heap}, $self->{warn_max_heap}, $self->{warn_used_heap}, $self->{warn_committed_heap}) + = split /,/, $self->{option_results}->{"warning-heap"}; + ($self->{warn_init_nonheap}, $self->{warn_max_nonheap}, $self->{warn_used_nonheap}, $self->{warn_committed_nonheap}) + = split /,/, $self->{option_results}->{"warning-nonheap"}; + ($self->{crit_init_heap}, $self->{crit_max_heap}, $self->{crit_used_heap}, $self->{crit_committed_heap}) + = split /,/, $self->{option_results}->{"critical-heap"}; + ($self->{crit_init_nonheap}, $self->{crit_max_nonheap}, $self->{crit_used_nonheap}, $self->{crit_committed_nonheap}) + = split /,/, $self->{option_results}->{"critical-nonheap"}; + + # warning-heap + if (($self->{perfdata}->threshold_validate(label => 'warn_init_heap', value => $self->{warn_init_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-heap init threshold '" . $self->{warn_init_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_max_heap', value => $self->{warn_max_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-heap max threshold '" . $self->{warn_max_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_used_heap', value => $self->{warn_used_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-heap used threshold '" . $self->{warn_used_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_committed_heap', value => $self->{warn_committed_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-heap committed threshold '" . $self->{warn_committed_heap} . "'."); + $self->{output}->option_exit(); + } + + # waring-nonheap + if (($self->{perfdata}->threshold_validate(label => 'warn_init_nonheap', value => $self->{warn_init_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap init threshold '" . $self->{warn_init_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_max_nonheap', value => $self->{warn_max_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap max threshold '" . $self->{warn_max_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_used_nonheap', value => $self->{warn_used_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap used threshold '" . $self->{warn_used_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_committed_nonheap', value => $self->{warn_committed_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning-nonheap committed threshold '" . $self->{warn_committed_nonheap} . "'."); + $self->{output}->option_exit(); + } + + # critical-heap + if (($self->{perfdata}->threshold_validate(label => 'crit_init_heap', value => $self->{crit_init_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-heap init threshold '" . $self->{crit_init_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_max_heap', value => $self->{crit_max_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-heap max threshold '" . $self->{crit_max_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_used_heap', value => $self->{crit_used_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-heap used threshold '" . $self->{crit_used_heap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_committed_heap', value => $self->{crit_committed_heap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-heap committed threshold '" . $self->{crit_committed_heap} . "'."); + $self->{output}->option_exit(); + } + + # critical-nonheap + if (($self->{perfdata}->threshold_validate(label => 'crit_init_nonheap', value => $self->{crit_init_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap init threshold '" . $self->{crit_init_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_max_nonheap', value => $self->{crit_max_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap max threshold '" . $self->{crit_max_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_used_nonheap', value => $self->{crit_used_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap used threshold '" . $self->{crit_used_nonheap} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_committed_nonheap', value => $self->{crit_committed_nonheap})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical-nonheap committed threshold '" . $self->{crit_committed_nonheap} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ( $self, %options ) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /(^Type=HeapMemoryUsage|^Type=NonHeapMemoryUsage)/mi) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find heap or nonheap memory usage status." + ); + $self->{output}->option_exit(); + } + + my ( $init_heap, $max_heap, $used_heap, $committed_heap ) = ( 0, 0, 0, 0 ); + my ( $init_nonheap, $max_nonheap, $used_nonheap, $committed_nonheap ) = ( 0, 0, 0, 0 ); + if ( $webcontent =~ /^Type=HeapMemoryUsage\sinit=(\d+)\smax=(\d+)\sused=(\d+)\scommitted=(\d+)/mi ){ + ( $init_heap, $max_heap, $used_heap, $committed_heap ) = ( $1, $2, $3, $4 ); + $self->{output}->output_add( + severity => 'ok', + short_msg => sprintf( + "Heap Memory: init %d , max %d ,used %d ,commited %d", + $init_heap, $max_heap, $used_heap, $committed_heap + ) + ); + } + if ( $webcontent =~ /^Type=NonHeapMemoryUsage\sinit=(\d+)\smax=(-{0,1}\d+)\sused=(\d+)\scommitted=(\d+)/mi ){ + ( $init_nonheap, $max_nonheap, $used_nonheap, $committed_nonheap ) = ( $1, $2, $3, $4 ); + $self->{output}->output_add( + severity => 'ok', + short_msg => sprintf( + "NonHeap Memory: init %d , max %d ,used %d ,commited %d", + $init_nonheap, $max_nonheap, + $used_nonheap, $committed_nonheap + ) + ); + } + + my $exit = $self->{perfdata}->threshold_check(value => $init_heap, + threshold => [ { label => 'crit_init_heap', 'exit_litteral' => 'critical' }, + { label => 'warn_init_heap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Init Heap: %d", $init_heap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $max_heap, + threshold => [ { label => 'crit_max_heap', 'exit_litteral' => 'critical' }, + { label => 'warn_max_heap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Max Heap: %d", $max_heap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $used_heap, + threshold => [ { label => 'crit_used_heap', 'exit_litteral' => 'critical' }, + { label => 'warn_used_heap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Used Heap: %d", $used_heap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $committed_heap, + threshold => [ { label => 'crit_committed_heap', 'exit_litteral' => 'critical' }, + { label => 'warn_committed_heap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Committed Heap: %d", $committed_heap) + ); + } + + $exit = $self->{perfdata}->threshold_check(value => $init_nonheap, + threshold => [ { label => 'crit_init_nonheap', 'exit_litteral' => 'critical' }, + { label => 'warn_init_nonheap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Init NonHeap: %d", $init_nonheap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $max_nonheap, + threshold => [ { label => 'crit_max_nonheap', 'exit_litteral' => 'critical' }, + { label => 'warn_max_nonheap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Max NonHeap: %d", $max_nonheap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $used_nonheap, + threshold => [ { label => 'crit_used_nonheap', 'exit_litteral' => 'critical' }, + { label => 'warn_used_nonheap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Used NonHeap: %d", $used_nonheap) + ); + } + $exit = $self->{perfdata}->threshold_check(value => $committed_nonheap, + threshold => [ { label => 'crit_committed_nonheap', 'exit_litteral' => 'critical' }, + { label => 'warn_committed_nonheap', 'exit_litteral' => 'warning' } ]); + if ($exit ne "ok"){ + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Committed NonHeap: %d", $committed_nonheap) + ); + } + + $self->{output}->perfdata_add( + label => "init_heap", + value => $init_heap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_init_heap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_init_heap'), + ); + $self->{output}->perfdata_add( + label => "max_heap", + value => $max_heap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_max_heap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_max_heap'), + ); + $self->{output}->perfdata_add( + label => "used_heap", + value => $used_heap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_used_heap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_used_heap'), + ); + $self->{output}->perfdata_add( + label => "committed_heap", + value => $committed_heap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_committed_heap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_committed_heap'), + ); + $self->{output}->perfdata_add( + label => "init_nonheap", + value => $init_nonheap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_init_nonheap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_init_nonheap'), + ); + $self->{output}->perfdata_add( + label => "max_nonheap", + value => $max_nonheap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_max_nonheap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_max_nonheap'), + ); + $self->{output}->perfdata_add( + label => "used_nonheap", + value => $used_nonheap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_used_nonheap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_used_nonheap'), + ); + $self->{output}->perfdata_add( + label => "committed_nonheap", + value => $committed_nonheap, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_committed_nonheap'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_committed_nonheap'), + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS instance heap & nonheap memory usage. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkmemory.jsp') + +=item B<--warning-*> + +Warning Threshold (init,max,used,committed), '*' Can be: 'heap', 'nonheap'. + +=item B<--critical-*> + +Critical Threshold (init,max,used,committed), '*' Can be: 'heap', 'nonheap'. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/muxhandler.pm b/centreon-plugins/apps/kingdee/eas/mode/muxhandler.pm new file mode 100644 index 000000000..680820a9e --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/muxhandler.pm @@ -0,0 +1,185 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::muxhandler; + +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 => { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkmuxhandler.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + } + ); + + return $self; +} + +sub check_options { + my ( $self, %options ) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ( $self, %options ) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /MaxThreads=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find httphandler status in response: '" . $webcontent . "'" + ); + $self->{output}->option_exit(); + } + + my ($maxthreads, $minsparethreads, $maxsparethreads, $maxqueuesize, $idletimeout, $processedcount) = (0, 0, 0, 0, 0, 0); + my ($currentthreadcount, $availablethreadcount, $busythreadcount, $maxavailablethreadcount, $maxbusythreadcount) = (0, 0, 0, 0, 0); + my ($maxprocessedtime, $createcount, $destroycount) = (0, 0, 0); + + $maxthreads = $1 if $webcontent =~ /MaxThreads=(\d+)/mi ; + $minsparethreads = $1 if $webcontent =~ /MinSpareThreads=(\d+)/mi ; + $maxsparethreads = $1 if $webcontent =~ /MaxSpareThreads=(\d+)/mi ; + $maxqueuesize = $1 if $webcontent =~ /MaxQueueSize=(\d+)/mi ; + $idletimeout = $1 if $webcontent =~ /IdleTimeout=(\d+)/mi ; + $processedcount = $1 if $webcontent =~ /ProcessedCount=(\d+)/mi ; + $currentthreadcount = $1 if $webcontent =~ /CurrentThreadCount=(\d+)/mi ; + $availablethreadcount = $1 if $webcontent =~ /AvailableThreadCount=(\d+)/mi ; + $busythreadcount = $1 if $webcontent =~ /BusyThreadCount=(\d+)/mi ; + $maxavailablethreadcount = $1 if $webcontent =~ /MaxAvailableThreadCount=(\d+)/mi ; + $maxbusythreadcount = $1 if $webcontent =~ /MaxBusyThreadCount=(\d+)/mi ; + $maxprocessedtime = $1 if $webcontent =~ /MaxProcessedTime=(\d+)/mi ; + $createcount = $1 if $webcontent =~ /CreateCount=(\d+)/mi ; + $destroycount = $1 if $webcontent =~ /DestroyCount=(\d+)/mi ; + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxThreads: %d", $maxthreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MinSpareThreads: %d", $minsparethreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxSpareThreads: %d", $maxsparethreads)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxQueueSize: %d", $maxqueuesize)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("IdleTimeout: %ds", $idletimeout)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("ProcessedCount: %d", $processedcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentThreadCount: %d", $currentthreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("AvailableThreadCount: %d", $availablethreadcount)); + + my $exit = $self->{perfdata}->threshold_check(value => $busythreadcount, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("BusyThreadCount: %d", $busythreadcount)); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxAvailableThreadCount: %d", $maxavailablethreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxBusyThreadCount: %d", $maxbusythreadcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxProcessedTime: %dms", $maxprocessedtime)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CreateCount: %d", $createcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("DestroyCount: %d", $destroycount)); + + $self->{output}->perfdata_add(label => "MaxThreads", unit => '', + value => sprintf("%d", $maxthreads), + ); + $self->{output}->perfdata_add(label => "MinSpareThreads", unit => '', + value => sprintf("%d", $minsparethreads), + ); + $self->{output}->perfdata_add(label => "MaxSpareThreads", unit => '', + value => sprintf("%d", $maxsparethreads), + ); + $self->{output}->perfdata_add(label => "MaxQueueSize", unit => '', + value => sprintf("%d", $maxqueuesize), + ); + $self->{output}->perfdata_add(label => "IdleTimeout", unit => 's', + value => sprintf("%d", $idletimeout), + ); + $self->{output}->perfdata_add(label => "c[ProcessedCount]", unit => '', + value => sprintf("%d", $processedcount), + ); + $self->{output}->perfdata_add(label => "CurrentThreadCount", unit => '', + value => sprintf("%d", $currentthreadcount), + ); + $self->{output}->perfdata_add(label => "AvailableThreadCount", unit => '', + value => sprintf("%d", $availablethreadcount), + ); + + $self->{output}->perfdata_add(label => "BusyThreadCount", unit => '', + value => sprintf("%d", $busythreadcount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + + $self->{output}->perfdata_add(label => "MaxAvailableThreadCount", unit => '', + value => sprintf("%d", $maxavailablethreadcount), + ); + $self->{output}->perfdata_add(label => "MaxBusyThreadCount", unit => '', + value => sprintf("%d", $maxbusythreadcount), + ); + $self->{output}->perfdata_add(label => "MaxProcessedTime", unit => 'ms', + value => sprintf("%d", $maxprocessedtime), + ); + $self->{output}->perfdata_add(label => "c[CreateCount]", unit => '', + value => sprintf("%d", $createcount), + ); + $self->{output}->perfdata_add(label => "c[DestroyCount]", unit => '', + value => sprintf("%d", $destroycount), + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS instance muxhandler(Apusic) threads pool status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkmuxhandler.jsp') + +=item B<--warning> + +Warning Threshold for busy thread count. + +=item B<--critical> + +Critical Threshold for busy thread count. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oraclejvmgc.pm b/centreon-plugins/apps/kingdee/eas/mode/oraclejvmgc.pm new file mode 100644 index 000000000..7a9f1f871 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oraclejvmgc.pm @@ -0,0 +1,123 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oraclejvmgc; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkgc_ps.jsp" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ( $webcontent !~ /MinorGCCount=\d+/mi ) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find jvm gc status." + ); + $self->{output}->option_exit(); + } + + my ($minorgccount, $minorgctime, $fullgccount, $fullgctime) = (0, 0, 0, 0); + + ($minorgccount, $minorgctime, $fullgccount, $fullgctime) = ($1, $2, $3, $4) if ($webcontent =~ /MinorGCCount=(\d+)\sMinorGCTime=(\d+)\sFullGCCount=(\d+)\sFullGCTime=(\d+)/mi); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MinorGCCount: %d", $minorgccount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MinorGCTime: %dms", $minorgctime)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("FullGCCount: %d", $fullgccount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("FullGCTime: %dms", $fullgctime)); + + $self->{output}->perfdata_add(label => "c[MinorGCCount]", unit => '', + value => sprintf("%d", $minorgccount), + ); + $self->{output}->perfdata_add(label => "c[MinorGCTime]", unit => 'ms', + value => sprintf("%d", $minorgctime), + ); + $self->{output}->perfdata_add(label => "c[FullGCCount]", unit => '', + value => sprintf("%d", $fullgccount), + ); + $self->{output}->perfdata_add(label => "c[FullGCTime]", unit => 'ms', + value => sprintf("%d", $fullgctime), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check EAS application jvm gc status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkgc_ps.jsp') + +=item B<--warning> + +Warning Threshold for class loaded + +=item B<--critical> + +Critical Threshold for class unloaded + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oracleksqltemptable.pm b/centreon-plugins/apps/kingdee/eas/mode/oracleksqltemptable.pm new file mode 100644 index 000000000..ed97ca5b0 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oracleksqltemptable.pm @@ -0,0 +1,125 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oracleksqltemptable; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclevt.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ($webcontent !~ /^COUNT.*?=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find ksql temptable status." + ); + $self->{output}->option_exit(); + } + + my $count = $1 if $webcontent =~ /^COUNT.*?=(\d+)/i; + + my $exit = $self->{perfdata}->threshold_check(value => $count, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("KSQLTempTableCount: %d", $count)); + + $self->{output}->perfdata_add(label => "KSQLTempTableCount", unit => '', + value => sprintf("%d", $count), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check ksql temp table count for specify datasource. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclevt.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold. + +=item B<--critical> + +Critical Threshold. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oraclerecyclebin.pm b/centreon-plugins/apps/kingdee/eas/mode/oraclerecyclebin.pm new file mode 100644 index 000000000..1cbb63078 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oraclerecyclebin.pm @@ -0,0 +1,125 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oraclerecyclebin; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclerecyclebin.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + + if ( $webcontent !~ /^COUNT.*?=\d+/i ) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle recyclebin status." + ); + $self->{output}->option_exit(); + } + + my $count = $1 if $webcontent =~ /^COUNT.*?=(\d+)/i; + + my $exit = $self->{perfdata}->threshold_check(value => $count, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("RecyclebinTableCount: %d", $count)); + + $self->{output}->perfdata_add(label => "RecyclebinTableCount", unit => '', + value => sprintf("%d", $count), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check oracle recyclebin table count for specify datasource. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclerecyclebin.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold. + +=item B<--critical> + +Critical Threshold. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oracleredolog.pm b/centreon-plugins/apps/kingdee/eas/mode/oracleredolog.pm new file mode 100644 index 000000000..21d50d0fa --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oracleredolog.pm @@ -0,0 +1,133 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure 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 +# limitations under the License. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oracleredolog; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracleredolog.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /^STATUS=CURRENT/mi) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle redolog status." + ); + $self->{output}->option_exit(); + } + + my ($activecount, $inactivecount, $currentcount) = (0, 0, 0); + $activecount = $1 if $webcontent =~ /^STATUS=ACTIVE\sCOUNT=(\d+)/mi ; + $inactivecount = $1 if $webcontent =~ /^STATUS=INACTIVE\sCOUNT=(\d+)/mi ; + $currentcount = $1 if $webcontent =~ /^STATUS=CURRENT\sCOUNT=(\d+)/mi ; + + my $exit = $self->{perfdata}->threshold_check(value => $inactivecount, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("InactiveCount: %d", $inactivecount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("ActiveCount: %d", $activecount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CurrentCount: %d", $currentcount)); + + $self->{output}->perfdata_add(label => "InactiveCount", unit => '', + value => sprintf("%d", $inactivecount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + $self->{output}->perfdata_add(label => "ActiveCount", unit => '', + value => sprintf("%d", $activecount)); + $self->{output}->perfdata_add(label => "CurrentCount", unit => '', + value => sprintf("%d", $currentcount)); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check oracle redolog status . + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoracleredolog.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold for INACTIVE count. + +=item B<--critical> + +Critical Threshold for INACTIVE count. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oraclesession.pm b/centreon-plugins/apps/kingdee/eas/mode/oraclesession.pm new file mode 100644 index 000000000..d91ba1267 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oraclesession.pm @@ -0,0 +1,200 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure 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 +# limitations under the License. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oraclesession; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoraclesession.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning', default => "," }, + "critical:s" => { name => 'critical', default => "," }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + ($self->{warn_activecount}, $self->{warn_totalcount}) = split /,/, $self->{option_results}->{"warning"}; + ($self->{crit_activecount}, $self->{crit_totalcount}) = split /,/, $self->{option_results}->{"critical"}; + + # warning + if (($self->{perfdata}->threshold_validate(label => 'warn_activecount', value => $self->{warn_activecount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning activecount threshold '" . $self->{warn_activecount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_totalcount', value => $self->{warn_totalcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning totalcount threshold '" . $self->{warn_totalcount} . "'."); + $self->{output}->option_exit(); + } + # critical + if (($self->{perfdata}->threshold_validate(label => 'crit_activecount', value => $self->{crit_activecount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical activecount threshold '" . $self->{crit_activecount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_totalcount', value => $self->{crit_totalcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical totalcount threshold '" . $self->{crit_totalcount} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path} . '&groupby=status'); + if ($webcontent !~ /^STATUS=ACTIVE/mi) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle session info." + ); + $self->{output}->option_exit(); + } + + my ($activecount, $inactivecount, $totalcount) = (0, 0, 0); + $activecount = $1 if $webcontent =~ /^STATUS=ACTIVE\sCOUNT=(\d+)/mi ; + $inactivecount = $1 if $webcontent =~ /^STATUS=INACTIVE\sCOUNT=(\d+)/mi ; + $totalcount = $activecount + $inactivecount; + + $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path} . '&groupby=wait_class&status=ACTIVE'); + if ($webcontent !~ /^WAIT_CLASS=.*?COUNT=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle session info." + ); + $self->{output}->option_exit(); + } + + my ($other, $queueing, $network, $administrative, $configuation, $commit) = (0, 0, 0, 0, 0, 0); + my ($application, $concurrency, $systemio, $userio, $scheduler, $idle) = (0, 0, 0, 0, 0, 0); + + $other = $1 if $webcontent =~ /^WAIT_CLASS=Other\sCOUNT=(\d+)/mi; + $queueing = $1 if $webcontent =~ /^WAIT_CLASS=Queueing\sCOUNT=(\d+)/mi; + $network = $1 if $webcontent =~ /^WAIT_CLASS=Network\sCOUNT=(\d+)/mi; + $administrative = $1 if $webcontent =~ /^WAIT_CLASS=Administrative\sCOUNT=(\d+)/mi; + $configuation = $1 if $webcontent =~ /^WAIT_CLASS=Configuration\sCOUNT=(\d+)/mi; + $commit = $1 if $webcontent =~ /^WAIT_CLASS=Commit\sCOUNT=(\d+)/mi; + $application = $1 if $webcontent =~ /^WAIT_CLASS=Application\sCOUNT=(\d+)/mi; + $concurrency = $1 if $webcontent =~ /^WAIT_CLASS=Concurrency\sCOUNT=(\d+)/mi; + $systemio = $1 if $webcontent =~ /^WAIT_CLASS=\'System\sI\/O\'\sCOUNT=(\d+)/mi; + $userio = $1 if $webcontent =~ /^WAIT_CLASS='User\sI\/O\'\sCOUNT=(\d+)/mi; + $scheduler = $1 if $webcontent =~ /^WAIT_CLASS=Scheduler\sCOUNT=(\d+)/mi; + $idle = $1 if $webcontent =~ /^WAIT_CLASS=Idle\sCOUNT=(\d+)/mi; + + #cpu cpuwait + my $cpu wait = $idle + $network ; + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Other: %d", $other)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Queueing: %d", $queueing)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Administrative: %d", $administrative)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Configuration: %d", $configuation)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Commit: %d", $commit)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Application: %d", $application)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Concurrency: %d", $concurrency)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("System I/O: %d", $systemio)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("User I/O: %d", $userio)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("Scheduler: %d", $scheduler)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CPU + CPU Wait: %d", $cpu wait)); + + my $exit = $self->{perfdata}->threshold_check(value => $activecount, threshold => [ { label => 'crit_activecount', exit_litteral => 'critical' }, + { label => 'warn_activecount', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveCount: %d", $activecount)); + + $exit = $self->{perfdata}->threshold_check(value => $totalcount, threshold => [ { label => 'crit_totalcount', exit_litteral => 'critical' }, + { label => 'warn_totalcount', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("TotalCount: %d", $totalcount)); + + $self->{output}->perfdata_add(label => "Other", unit => '', value => sprintf("%d", $other)); + $self->{output}->perfdata_add(label => "Queueing", unit => '', value => sprintf("%d", $queueing)); + $self->{output}->perfdata_add(label => "Administrative", unit => '', value => sprintf("%d", $administrative)); + $self->{output}->perfdata_add(label => "Configuration", unit => '', value => sprintf("%d", $configuation)); + $self->{output}->perfdata_add(label => "Commit", unit => '', value => sprintf("%d", $commit)); + $self->{output}->perfdata_add(label => "Application", unit => '', value => sprintf("%d", $application)); + $self->{output}->perfdata_add(label => "Concurrency", unit => '', value => sprintf("%d", $concurrency)); + $self->{output}->perfdata_add(label => "System I/O", unit => '', value => sprintf("%d", $systemio)); + $self->{output}->perfdata_add(label => "User I/O", unit => '', value => sprintf("%d", $userio)); + $self->{output}->perfdata_add(label => "Scheduler", unit => '', value => sprintf("%d", $scheduler)); + $self->{output}->perfdata_add(label => "CPU + CPU Wait", unit => '', value => sprintf("%d", $cpu wait)); + + $self->{output}->perfdata_add(label => "ActiveCount", unit => '', + value => sprintf("%d", $activecount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activecount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activecount'), + ); + $self->{output}->perfdata_add(label => "TotalCount", unit => '', + value => sprintf("%d", $totalcount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_totalcount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_totalcount'), + ); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check oracle database session status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoraclesession.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold. (activecount,totalcount) for example: --warning=50,200 + +=item B<--critical> + +Critical Threshold. (activecount,totalcount) for example: --critical=100,300 + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oracletable.pm b/centreon-plugins/apps/kingdee/eas/mode/oracletable.pm new file mode 100644 index 000000000..ad0053158 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oracletable.pm @@ -0,0 +1,156 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure 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 +# limitations under the License. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oracletable; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracletable.jsp" }, + "datasource:s" => { name => 'datasource' }, + "tablename:s" => { name => 'tablename' , default => "T_GL_VOUCHER"}, + "actualrows:s" => { name => 'actualrows', default => "false" }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource} + . "\&tablename=" . $self->{option_results}->{tablename} + . "\&actual=" . $self->{option_results}->{actualrows}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /^TABLE_NAME=\w+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle table status. \n" . $webcontent + ); + $self->{output}->option_exit(); + } + + my ($num_rows, $actual_num_rows) = (-1, -1); + $num_rows = $1 if $webcontent =~ /NUM_ROWS=(\d+)/i; + $actual_num_rows = $1 if $webcontent =~ /ACTUAL_NUM_ROWS=(\d+)/i; + + my $exit; + if ($actual_num_rows == -1) { + $exit = $self->{perfdata}->threshold_check(value => $num_rows, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ] + ); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("NUM_ROWS: %d", $num_rows)); + + $self->{output}->perfdata_add(label => "NUM_ROWS", unit => '', + value => sprintf("%d", $num_rows), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + } else { + $self->{output}->perfdata_add(label => "NUM_ROWS", unit => '', value => sprintf("%d", $num_rows)); + $exit = $self->{perfdata}->threshold_check(value => $actual_num_rows, threshold => [ + { label => 'critical', 'exit_litteral' => 'critical' }, + { label => 'warning', exit_litteral => 'warning' } ] + ); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ACTUAL_NUM_ROWS: %d", $actual_num_rows)); + + $self->{output}->perfdata_add(label => "ACTUAL_NUM_ROWS", unit => '', + value => sprintf("%d", $actual_num_rows), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + ); + } + $self->{output}->output_add(severity => $exit, short_msg => $webcontent); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check oracle table info for specify datasource. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoracletable.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--tablename> + +Specify the table name , MUST BE uppercase. + +=item B<--actualrows> + +Specify whether check actual rows of table or not , true or false. +MAY have performance problem for large table if specify true. + +=item B<--warning> + +Warning Threshold for num_rows , or actual_num_rows if actualrows is true. + +=item B<--critical> + +Critical Threshold for num_rows , or actual_num_rows if actualrows is true. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/oracleversion.pm b/centreon-plugins/apps/kingdee/eas/mode/oracleversion.pm new file mode 100644 index 000000000..a4ce4a70e --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/oracleversion.pm @@ -0,0 +1,115 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure 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 +# limitations under the License. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::oracleversion; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkoracleversion.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{datasource}) || $self->{option_results}->{datasource} eq "") { + $self->{output}->add_option_msg(short_msg => "Missing datasource name."); + $self->{output}->option_exit(); + } + $self->{option_results}->{url_path} .= "?ds=" . $self->{option_results}->{datasource}; + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /^BANNER=/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find oracle version info." + ); + $self->{output}->option_exit(); + } + + my $banner = $1 if $webcontent =~ /^BANNER=\'(.*?)\'/i; + + $self->{output}->output_add(severity => "ok", short_msg => $banner); + + $self->{output}->display(); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Check oracle database version. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkoracleversion.jsp') + +=item B<--datasource> + +Specify the datasource name. + +=item B<--warning> + +Warning Threshold. + +=item B<--critical> + +Critical Threshold. + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/ormrpc.pm b/centreon-plugins/apps/kingdee/eas/mode/ormrpc.pm new file mode 100644 index 000000000..d483a7260 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/ormrpc.pm @@ -0,0 +1,269 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::ormrpc; + +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 => { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checkrpc.jsp" }, + "warning:s" => { name => 'warning' , default => ",,,,,,"}, + "critical:s" => { name => 'critical' , default => ",,,,,,"}, + } + ); + + return $self; +} + +sub check_options { + my ( $self, %options ) = @_; + $self->SUPER::init(%options); + + ($self->{warn_activethreadcount}, $self->{warn_stubcount}, $self->{warn_proxycount}, $self->{warn_clientsessioncount} ,$self->{warn_serversessioncount} ,$self->{warn_invokecountpermin} ,$self->{warn_servicecountpermin}) + = split /,/, $self->{option_results}->{"warning"}; + ($self->{crit_activethreadcount}, $self->{crit_stubcount}, $self->{crit_proxycount}, $self->{crit_clientsessioncount} ,$self->{crit_serversessioncount} ,$self->{crit_invokecountpermin} ,$self->{crit_servicecountpermin}) + = split /,/, $self->{option_results}->{"critical"}; + + # warning + if (($self->{perfdata}->threshold_validate(label => 'warn_activethreadcount', value => $self->{warn_activethreadcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning activethreadcount threshold '" . $self->{warn_activethreadcount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_stubcount', value => $self->{warn_stubcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning stubcount threshold '" . $self->{warn_stubcount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_proxycount', value => $self->{warn_proxycount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning proxycount threshold '" . $self->{warn_proxycount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_clientsessioncount', value => $self->{warn_clientsessioncount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning clientsessioncount threshold '" . $self->{warn_clientsessioncount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_serversessioncount', value => $self->{warn_serversessioncount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning serversessioncount threshold '" . $self->{warn_serversessioncount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_invokecountpermin', value => $self->{warn_invokecountpermin})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning invokecountpermin threshold '" . $self->{warn_invokecountpermin} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_servicecountpermin', value => $self->{warn_servicecountpermin})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning servicecountpermin threshold '" . $self->{warn_servicecountpermin} . "'."); + $self->{output}->option_exit(); + } + + # critical + if (($self->{perfdata}->threshold_validate(label => 'crit_activethreadcount', value => $self->{crit_activethreadcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical activethreadcount threshold '" . $self->{crit_activethreadcount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_stubcount', value => $self->{crit_stubcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical stubcount threshold '" . $self->{crit_stubcount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_proxycount', value => $self->{crit_proxycount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical proxycount threshold '" . $self->{crit_proxycount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_clientsessioncount', value => $self->{crit_clientsessioncount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical clientsessioncount threshold '" . $self->{crit_clientsessioncount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_serversessioncount', value => $self->{crit_serversessioncount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical serversessioncount threshold '" . $self->{crit_serversessioncount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_invokecountpermin', value => $self->{crit_invokecountpermin})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical invokecountpermin threshold '" . $self->{crit_invokecountpermin} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_servicecountpermin', value => $self->{crit_servicecountpermin})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical servicecountpermin threshold '" . $self->{crit_servicecountpermin} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ( $self, %options ) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /ActiveThreadCount=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find ormrpc status in response: \'" . $webcontent . "\'" + ); + $self->{output}->option_exit(); + } + + my ($activethreadcount, $stubcount, $proxycount, $clientsessioncount, $serversessioncount, $invokecountpermin, $servicecountpermin, $invokecount, $servicecount) = (0, 0, 0, 0, 0, 0, 0, 0, 0); + + $activethreadcount = $1 if $webcontent =~ /ActiveThreadCount=(\d+)/mi ; + $stubcount = $1 if $webcontent =~ /StubCount=(\d+)/mi ; + $proxycount = $1 if $webcontent =~ /ProxyCount=(\d+)/mi ; + $clientsessioncount = $1 if $webcontent =~ /ClientSessionCount=(\d+)/mi ; + $serversessioncount = $1 if $webcontent =~ /ServerSessionCount=(\d+)/mi ; + $invokecountpermin = $1 if $webcontent =~ /ClientInvokeCountPerMinute=(\d+)/mi ; + $servicecountpermin = $1 if $webcontent =~ /ProcessedServiceCountPerMinute=(\d+)/mi ; + $invokecount = $1 if $webcontent =~ /ClientInvokeCount=(\d+)/mi ; + $servicecount = $1 if $webcontent =~ /ProcessedServiceCount=(\d+)/mi ; + + my $exit = $self->{perfdata}->threshold_check(value => $activethreadcount, + threshold => [ { label => 'crit_activethreadcount', 'exit_litteral' => 'critical' }, + { label => 'warn_activethreadcount', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("ActiveTrheadCount: %d", $activethreadcount) + ); + $exit = $self->{perfdata}->threshold_check(value => $stubcount, + threshold => [ { label => 'crit_stubcount', 'exit_litteral' => 'critical' }, + { label => 'warn_stubcount', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("StubCount: %d", $stubcount) + ); + $exit = $self->{perfdata}->threshold_check(value => $proxycount, + threshold => [ { label => 'crit_proxycount', 'exit_litteral' => 'critical' }, + { label => 'warn_proxycount', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("ProxyCount: %d", $proxycount) + ); + $exit = $self->{perfdata}->threshold_check(value => $clientsessioncount, + threshold => [ { label => 'crit_clientsessioncount', 'exit_litteral' => 'critical' }, + { label => 'warn_clientsessioncount', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("ClientSessionCount: %d", $clientsessioncount) + ); + $exit = $self->{perfdata}->threshold_check(value => $serversessioncount, + threshold => [ { label => 'crit_serversessioncount', 'exit_litteral' => 'critical' }, + { label => 'warn_serversessioncount', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("ServerSessionCount: %d", $serversessioncount) + ); + $exit = $self->{perfdata}->threshold_check(value => $invokecountpermin, + threshold => [ { label => 'crit_invokecountpermin', 'exit_litteral' => 'critical' }, + { label => 'warn_invokecountpermin', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("InvokeCountPerMinute: %d", $invokecountpermin) + ); + $exit = $self->{perfdata}->threshold_check(value => $servicecountpermin, + threshold => [ { label => 'crit_servicecountpermin', 'exit_litteral' => 'critical' }, + { label => 'warn_servicecountpermin', 'exit_litteral' => 'warning' } ]); + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("ServiceCountPerMinute: %d", $servicecountpermin) + ); + + $self->{output}->perfdata_add( + label => "ActiveTrheadCount", + value => $activethreadcount, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activethreadcount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activethreadcount'), + ); + $self->{output}->perfdata_add( + label => "StubCount", + value => $stubcount, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_stubcount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_stubcount'), + ); + $self->{output}->perfdata_add( + label => "ProxyCount", + value => $proxycount, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_proxycount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_proxycount'), + ); + $self->{output}->perfdata_add( + label => "ClientSessionCount", + value => $clientsessioncount, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_clientsessioncount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_clientsessioncount'), + ); + $self->{output}->perfdata_add( + label => "ServerSessionCount", + value => $serversessioncount, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_serversessioncount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_serversessioncount'), + ); + $self->{output}->perfdata_add( + label => "InvokeCount /min", + value => $invokecountpermin, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_invokecountpermin'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_invokecountpermin'), + ); + $self->{output}->perfdata_add( + label => "ServiceCount /min", + value => $servicecountpermin, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_servicecountpermin'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_servicecountpermin'), + ); + $self->{output}->perfdata_add( + label => "c[InvokeCount]", + value => $invokecount, + ); + $self->{output}->perfdata_add( + label => "c[ServiceCount]", + value => $servicecount, + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS instance orm rpc status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checkrpc.jsp') + +=item B<--warning> + +Warning Threshold (activethreadcount,stubcount,proxycount,clientsessioncount,serversessioncount,invokecountpermin,servicecountpermin). + +=item B<--critical> + +Critical Threshold (activethreadcount,stubcount,proxycount,clientsessioncount,serversessioncount,invokecountpermin,servicecountpermin). + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/mode/transaction.pm b/centreon-plugins/apps/kingdee/eas/mode/transaction.pm new file mode 100644 index 000000000..5c542c813 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/mode/transaction.pm @@ -0,0 +1,170 @@ +# +# Copyright 2017 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. +# +# Author : CHEN JUN , aladdin.china@gmail.com + +package apps::kingdee::eas::mode::transaction; + +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 => + { + "urlpath:s" => { name => 'url_path', default => "/easportal/tools/nagios/checktransaction.jsp" }, + "datasource:s" => { name => 'datasource' }, + "warning:s" => { name => 'warning', default => "," }, + "critical:s" => { name => 'critical', default => "," }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + ($self->{warn_activecount}, $self->{warn_timeoutcount}) + = split /,/, $self->{option_results}->{"warning"}; + ($self->{crit_activecount}, $self->{crit_timeoutcount}) + = split /,/, $self->{option_results}->{"critical"}; + + # warning + if (($self->{perfdata}->threshold_validate(label => 'warn_activecount', value => $self->{warn_activecount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning activecount threshold '" . $self->{warn_activecount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'warn_timeoutcount', value => $self->{warn_timeoutcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning timeoutcount threshold '" . $self->{warn_timeoutcount} . "'."); + $self->{output}->option_exit(); + } + # critical + if (($self->{perfdata}->threshold_validate(label => 'crit_activecount', value => $self->{crit_activecount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical activecount threshold '" . $self->{crit_activecount} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'crit_timeoutcount', value => $self->{crit_timeoutcount})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical timeoutcount threshold '" . $self->{crit_timeoutcount} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $webcontent = $options{custom}->request(path => $self->{option_results}->{url_path}); + if ($webcontent !~ /TransactionCount=\d+/i) { + $self->{output}->output_add( + severity => 'UNKNOWN', + short_msg => "Cannot find transaction status." + ); + } + + my ($transactioncount, $totaltransactiontime, $committedcount, $rolledbackcount, $activecount, $maxtransactiontime, $defaulttimeout, $timeoutcount) = (0, 0, 0, 0, 0, 0, 0, 0); + + $transactioncount = $1 if $webcontent =~ /TransactionCount=(\d+)\s/i; + $totaltransactiontime = $1 if $webcontent =~ /TotalTransactionTime=(\d+)\s/i; + $committedcount = $1 if $webcontent =~ /CommittedCount=(\d+)\s/i; + $rolledbackcount = $1 if $webcontent =~ /RolledbackCount=(\d+)\s/i; + $activecount = $1 if $webcontent =~ /ActiveCount=(\d+)\s/i; + $maxtransactiontime = $1 if $webcontent =~ /MaxTransactionTime=(\d+)\s/i; + $defaulttimeout = $1 if $webcontent =~ /DefaultTimeout=(\d+)\s/i; + $timeoutcount = $1 if $webcontent =~ /TimedOutCount=(\d+)\s/i; + + my $exit = $self->{perfdata}->threshold_check(value => $activecount, threshold => [ { label => 'crit_activecount', exit_litteral => 'critical' }, + { label => 'warn_activecount', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("ActiveCount: %d", $activecount)); + + $exit = $self->{perfdata}->threshold_check(value => $timeoutcount, threshold => [ { label => 'crit_timeoutcount', exit_litteral => 'critical' }, + { label => 'warn_timeoutcount', exit_litteral => 'warning' } ]); + $self->{output}->output_add(severity => $exit, short_msg => sprintf("TimedOutCount: %d", $timeoutcount)); + + $self->{output}->output_add(severity => "ok", short_msg => sprintf("CommittedCount: %d", $committedcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("RolledbackCount: %d", $rolledbackcount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("TransactionCount: %d", $transactioncount)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("TotalTransactionTime: %dms", $totaltransactiontime)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("MaxTransactionTime: %dms", $maxtransactiontime)); + $self->{output}->output_add(severity => "ok", short_msg => sprintf("DefaultTimeout: %ds", $defaulttimeout)); + + + $self->{output}->perfdata_add(label => "ActiveCount", unit => '', + value => sprintf("%d", $activecount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_activecount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_activecount'), + ); + $self->{output}->perfdata_add(label => "TimedOutCount", unit => '', + value => sprintf("%d", $timeoutcount), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warn_timeoutcount'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'crit_timeoutcount'), + ); + $self->{output}->perfdata_add(label => "c[CommittedCount]", unit => '', + value => sprintf("%d", $committedcount), + ); + $self->{output}->perfdata_add(label => "c[RolledbackCount]", unit => '', + value => sprintf("%d", $rolledbackcount), + ); + $self->{output}->perfdata_add(label => "c[TransactionCount]", unit => '', + value => sprintf("%d", $transactioncount), + ); + $self->{output}->perfdata_add(label => "c[TotalTransactionTime]", unit => 'ms', + value => sprintf("%d", $totaltransactiontime), + ); + $self->{output}->perfdata_add(label => "MaxTransactionTime", unit => 'ms', + value => sprintf("%d", $maxtransactiontime), + ); + $self->{output}->perfdata_add(label => "DefaultTimeout", unit => 's', + value => sprintf("%d", $defaulttimeout), + ); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check EAS application EJB transaction status. + +=over 8 + +=item B<--urlpath> + +Set path to get status page. (Default: '/easportal/tools/nagios/checktransaction.jsp') + +=item B<--warning> + +Warning Threshold for (activecount,timeoutcount). for example : --warning=100,1 + +=item B<--critical> + +Critical Threshold for (activecount,timeoutcount). for example : --critical=100,1 + +=back + +=cut diff --git a/centreon-plugins/apps/kingdee/eas/plugin.pm b/centreon-plugins/apps/kingdee/eas/plugin.pm new file mode 100644 index 000000000..ce1fe69c4 --- /dev/null +++ b/centreon-plugins/apps/kingdee/eas/plugin.pm @@ -0,0 +1,66 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::kingdee::eas::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_custom); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'classloading' => 'apps::kingdee::eas::mode::classloading', + 'memory' => 'apps::kingdee::eas::mode::memory', + 'javaruntime' => 'apps::kingdee::eas::mode::javaruntime', + 'datasource' => 'apps::kingdee::eas::mode::datasource', + 'httphandler' => 'apps::kingdee::eas::mode::httphandler', + 'muxhandler' => 'apps::kingdee::eas::mode::muxhandler', + 'transaction' => 'apps::kingdee::eas::mode::transaction', + 'oraclejvmgc' => 'apps::kingdee::eas::mode::oraclejvmgc', + 'ibmjvmgc' => 'apps::kingdee::eas::mode::ibmjvmgc', + 'ormrpc' => 'apps::kingdee::eas::mode::ormrpc', + 'easlicense' => 'apps::kingdee::eas::mode::easlicense', + 'activeusers' => 'apps::kingdee::eas::mode::activeusers', + 'oracleversion' => 'apps::kingdee::eas::mode::oracleversion', + 'oraclesession' => 'apps::kingdee::eas::mode::oraclesession', + 'oracletable' => 'apps::kingdee::eas::mode::oracletable', + 'oraclerecyclebin' => 'apps::kingdee::eas::mode::oraclerecyclebin', + 'oracleksqltemptable' => 'apps::kingdee::eas::mode::oracleksqltemptable', + 'oracleredolog' => 'apps::kingdee::eas::mode::oracleredolog', + ); + + $self->{custom_modes}{api} = 'apps::kingdee::eas::custom::api'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Kingdee EAS Application & DB Server Status . + +=cut diff --git a/centreon-plugins/apps/nsclient/restapi/mode/query.pm b/centreon-plugins/apps/nsclient/restapi/mode/query.pm new file mode 100644 index 000000000..182b763b9 --- /dev/null +++ b/centreon-plugins/apps/nsclient/restapi/mode/query.pm @@ -0,0 +1,247 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::nsclient::restapi::mode::query; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::http; +use JSON; +use URI::Encode; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.1'; + $options{options}->add_options(arguments => + { + "hostname:s" => { name => 'hostname' }, + "http-peer-addr:s" => { name => 'http_peer_addr' }, + "port:s" => { name => 'port', default => 8443 }, + "proto:s" => { name => 'proto', default => 'https' }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, + "legacy-password:s" => { name => 'legacy_password' }, + "proxyurl:s" => { name => 'proxyurl' }, + "proxypac:s" => { name => 'proxypac' }, + "timeout:s" => { name => 'timeout' }, + "ssl:s" => { name => 'ssl' }, + "command:s" => { name => 'command' }, + "arg:s@" => { name => 'arg' }, + "unknown-status:s" => { name => 'unknown_status', default => '%{http_code} < 200 or %{http_code} >= 300' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status', default => '' }, + }); + + $self->{http} = centreon::plugins::http->new(output => $self->{output}); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{command}) || $self->{option_results}->{command} eq '') { + $self->{output}->add_option_msg(short_msg => "Please set command option"); + $self->{output}->option_exit(); + } + if (defined($self->{option_results}->{legacy_password}) && $self->{option_results}->{legacy_password} ne '') { + $self->{http}->add_header(key => 'password', value => $self->{option_results}->{legacy_password}); + } + $self->{http}->set_options(%{$self->{option_results}}); +} + +# Two kind of outputs. +# 1- +# {"header":{"source_id":""},"payload":[{"command":"check_centreon_plugins","lines":[{"message":"OK: Reboot Pending : False | 'value1'=10;;;; 'value2'=10;;;;\r\nlong1\r\nlong2"}],"result":"OK"}]} +# 2- Can be also "int_value". +# { "header":{"source_id":""}, +# "payload": [ +# {"command":"check_drivesize", +# "lines": [ +# {"message":"OK All 1 drive(s) are ok", +# "perf":[ +# {"alias":"C:\\ used", +# "float_value": { +# "critical":44.690621566027403, +# "maximum":49.656246185302734, +# "minimum":0.00000000000000000, +# "unit":"GB", +# "value":21.684593200683594, +# "warning":39.724996947683394} +# }, +# {"alias":"C:\\ used %","float_value":{"critical":90.000000000000000,"maximum":100.00000000000000,"minimum":0.00000000000000000,"unit":"%","value":44.000000000000000,"warning":80.000000000000000}}]}], +# "result":"OK"}]} + +sub nscp_output_perf { + my ($self, %options) = @_; + + $self->{output}->output_add(severity => $options{result}, + short_msg => $options{data}->{message}); + foreach (@{$options{data}->{perf}}) { + my $perf = defined($_->{float_value}) ? $_->{float_value} : $_->{int_value}; + my $printf_format = '%d'; + $printf_format = '%.3f' if (defined($_->{float_value})); + + $self->{output}->perfdata_add(label => $_->{alias}, unit => $perf->{unit}, + value => sprintf($printf_format, $perf->{value}), + warning => defined($perf->{warning}) ? sprintf($printf_format, $perf->{warning}) : undef, + critical => defined($perf->{critical}) ? sprintf($printf_format, $perf->{critical}) : undef, + min => sprintf($printf_format, $perf->{minimum}), + max => sprintf($printf_format, $perf->{maximum}), + ); + } +} + +sub nscp_output_noperf { + my ($self, %options) = @_; + + $self->{output}->output_add(severity => $options{result}, + short_msg => $options{data}->{message}); +} + +sub check_nscp_result { + my ($self, %options) = @_; + + my $decoded; + eval { + $decoded = decode_json($options{content}); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@"); + $self->{output}->option_exit(); + } + + my $entry = $decoded->{payload}->[0]; + $entry->{lines}->[0]->{message} =~ s/\r//msg; + if (defined($entry->{lines}->[0]->{perf})) { + $self->nscp_output_perf(result => $entry->{result}, data => $entry->{lines}->[0]); + $self->{output}->display(nolabel => 1); + } else { + $self->nscp_output_noperf(result => $entry->{result}, data => $entry->{lines}->[0]); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + } +} + +sub run { + my ($self, %options) = @_; + + my $uri = URI::Encode->new({encode_reserved => 1}); + my ($encoded_args, $append) = ('', ''); + if (defined($self->{option_results}->{arg})) { + foreach (@{$self->{option_results}->{arg}}) { + $encoded_args .= $append . $uri->encode($_); + $append = '&'; + } + } + + my ($content) = $self->{http}->request(url_path => '/query/' . $self->{option_results}->{command} . '?' . $encoded_args); + $self->check_nscp_result(content => $content); + + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Query NSClient Rest API. + +=over 8 + +=item B<--hostname> + +IP Addr/FQDN of the host + +=item B<--http-peer-addr> + +Set the address you want to connect (Useful if hostname is only a vhost. no ip resolve) + +=item B<--port> + +Port used (Default: 8443) + +=item B<--proto> + +Specify https if needed (Default: 'https') + +=item B<--credentials> + +Specify this option if you access webpage over basic authentification + +=item B<--username> + +Specify username for basic authentification (Mandatory if --credentials is specidied) + +=item B<--password> + +Specify password for basic authentification (Mandatory if --credentials is specidied) + +=item B<--legacy-password> + +Specify password for old authentification system. + +=item B<--proxyurl> + +Proxy URL + +=item B<--proxypac> + +Proxy pac file (can be an url or local file) + +=item B<--timeout> + +Threshold for HTTP timeout (Default: 5) + +=item B<--ssl> + +Specify SSL version (example : 'sslv3', 'tlsv1'...) + +=item B<--command> + +Set command. + +=item B<--arg> + +Set arguments (Multiple option. Example: --arg='arg1') + +=item B<--unknown-status> + +Threshold warning for http response code. +(Default: '%{http_code} < 200 or %{http_code} >= 300') + +=item B<--warning-status> + +Threshold warning for http response code. + +=item B<--critical-status> + +Threshold critical for http response code. + +=back + +=cut diff --git a/centreon-plugins/apps/nsclient/restapi/plugin.pm b/centreon-plugins/apps/nsclient/restapi/plugin.pm new file mode 100644 index 000000000..90a770dcc --- /dev/null +++ b/centreon-plugins/apps/nsclient/restapi/plugin.pm @@ -0,0 +1,48 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::nsclient::restapi::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; + + $self->{version} = '0.1'; + %{$self->{modes}} = ( + 'query' => 'apps::nsclient::restapi::mode::query', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check nsclient Rest API. + +=cut diff --git a/centreon-plugins/apps/pacemaker/local/mode/clustat.pm b/centreon-plugins/apps/pacemaker/local/mode/clustat.pm index b26984e79..2b092c11d 100644 --- a/centreon-plugins/apps/pacemaker/local/mode/clustat.pm +++ b/centreon-plugins/apps/pacemaker/local/mode/clustat.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/protocols/jmx/mode/numericvalue.pm b/centreon-plugins/apps/protocols/jmx/mode/numericvalue.pm index 45f1e3ffb..9e48b2c8f 100644 --- a/centreon-plugins/apps/protocols/jmx/mode/numericvalue.pm +++ b/centreon-plugins/apps/protocols/jmx/mode/numericvalue.pm @@ -142,7 +142,7 @@ sub check_value { if ($self->{attributes}->{type} =~ /^counter$/i) { if (!defined($self->{datas})) { $self->{datas} = {}; - $self->{statefile_cache}->read(statefile => "jmxstandard_" . $self->{mode} . '_' . md5_hex($self->{connector}->{url} . ' ' . $self->{option_results}->{mbean_pattern})); + $self->{statefile_cache}->read(statefile => "jmxstandard_" . $self->{mode} . '_' . md5_hex($self->{connector}->get_connection_info() . ' ' . $self->{option_results}->{mbean_pattern})); } my $old_timestamp = $self->{statefile_cache}->get(name => 'timestamp'); diff --git a/centreon-plugins/apps/protocols/modbus/mode/numericvalue.pm b/centreon-plugins/apps/protocols/modbus/mode/numericvalue.pm index c8c50a5a7..db895021f 100644 --- a/centreon-plugins/apps/protocols/modbus/mode/numericvalue.pm +++ b/centreon-plugins/apps/protocols/modbus/mode/numericvalue.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/snmp_standard/plugin.pm b/centreon-plugins/apps/protocols/snmp/plugin.pm similarity index 69% rename from centreon-plugins/snmp_standard/plugin.pm rename to centreon-plugins/apps/protocols/snmp/plugin.pm index 2438cdf33..1e6460ab3 100644 --- a/centreon-plugins/snmp_standard/plugin.pm +++ b/centreon-plugins/apps/protocols/snmp/plugin.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package snmp_standard::plugin; +package apps::protocols::snmp::plugin; use strict; use warnings; @@ -31,11 +31,11 @@ sub new { $self->{version} = '0.1'; %{$self->{modes}} = ( - 'numeric-value' => 'snmp_standard::mode::numericvalue', - 'string-value' => 'snmp_standard::mode::stringvalue', - 'dynamic-command' => 'snmp_standard::mode::dynamiccommand', - 'uptime' => 'snmp_standard::mode::uptime', - ); + 'dynamic-command' => 'snmp_standard::mode::dynamiccommand', + 'numeric-value' => 'snmp_standard::mode::numericvalue', + 'string-value' => 'snmp_standard::mode::stringvalue', + 'uptime' => 'snmp_standard::mode::uptime', + ); return $self; } @@ -46,6 +46,6 @@ __END__ =head1 PLUGIN DESCRIPTION -Check SNMP values (string, numeric or execute commands) or standard (uptime). +Check SNMP values (string, numeric or execute commands). =cut diff --git a/centreon-plugins/apps/redis/cli/custom/rediscli.pm b/centreon-plugins/apps/redis/cli/custom/rediscli.pm new file mode 100644 index 000000000..5b95f8e02 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/custom/rediscli.pm @@ -0,0 +1,147 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::custom::rediscli; + +use strict; +use warnings; +use Redis; + +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' }, + "port:s" => { name => 'port' }, + }); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'REDIS CLI OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{mode} = $options{mode}; + + return $self; +} + +sub set_options { + my ($self, %options) = @_; + + $self->{option_results} = $options{option_results}; +} + +sub set_defaults { + my ($self, %options) = @_; + + foreach (keys %{$options{default}}) { + if ($_ eq $self->{mode}) { + for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { + foreach my $opt (keys %{$options{default}->{$_}[$i]}) { + if (!defined($self->{option_results}->{$opt}[$i])) { + $self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt}; + } + } + } + } + } +} + +sub check_options { + my ($self, %options) = @_; + + $self->{hostname} = $self->{option_results}->{hostname}; + $self->{port} = $self->{option_results}->{port}; + + if (!defined($self->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify hostname argument."); + $self->{output}->option_exit(); + } + if (!defined($self->{port})) { + $self->{output}->add_option_msg(short_msg => "Need to specify port argument."); + $self->{output}->option_exit(); + } + + return 0; +} + +sub get_connection_info { + my ($self, %options) = @_; + + return $self->{hostname} . ":" . $self->{port}; +} + +sub get_info { + my ($self, %options) = @_; + + $self->{redis} = Redis->new(server => $self->{hostname} . ":" . $self->{port}); + + my $response = $self->{redis}->info; + my $items; + foreach my $attributes (keys %{$response}) { + $items->{$attributes} = $response->{$attributes}; + } + + return $items; +} + +1; + +__END__ + +=head1 NAME + +REDIS CLI + +=head1 SYNOPSIS + +Redis Cli custom mode + +=head1 REDIS CLI OPTIONS + +=over 8 + +=item B<--hostname> + +Redis hostname. + +=item B<--port> + +Redis port. + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/clients.pm b/centreon-plugins/apps/redis/cli/mode/clients.pm new file mode 100644 index 000000000..21a4cd312 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/clients.pm @@ -0,0 +1,141 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::clients; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'connected-clients', set => { + key_values => [ { name => 'connected_clients' } ], + output_template => 'Connected clients: %s', + perfdatas => [ + { label => 'connected_clients', value => 'connected_clients_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'blocked-clients', set => { + key_values => [ { name => 'blocked_clients' } ], + output_template => 'Blocked clients: %s', + perfdatas => [ + { label => 'blocked_clients', value => 'blocked_clients_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'client-longest-output-list', set => { + key_values => [ { name => 'client_longest_output_list' } ], + output_template => 'Client longest output list: %s', + perfdatas => [ + { label => 'client_longest_output_list', value => 'client_longest_output_list_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'client-biggest-input-buf', set => { + key_values => [ { name => 'client_biggest_input_buf' } ], + output_template => 'Client biggest input buffer: %s', + perfdatas => [ + { label => 'client_biggest_input_buf', value => 'client_biggest_input_buf_absolute', template => '%s', min => 0 }, + ], + }, + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{custom}->get_info(); + $self->{global} = { + connected_clients => $results->{connected_clients}, + blocked_clients => $results->{blocked_clients}, + client_longest_output_list => $results->{client_longest_output_list}, + client_biggest_input_buf => $results->{client_biggest_input_buf}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check number of connected and blocked clients + +=over 8 + +=item B<--warning-connected-clients> + +Warning threshold for number of connected clients + +=item B<--critical-connected-clients> + +Critical threshold for number of connected clients + +=item B<--warning-blocked-clients> + +Warning threshold for number of blocked clients + +=item B<--critical-blocked-clients> + +Critical threshold for number of blocked clients + +=item B<--warning-client-longest-output-list> + +Warning threshold for longest output list among current client connections + +=item B<--critical-client-longest-output-list> + +Critical threshold for longest output list among current client connections + +=item B<--warning-client-biggest-input-buf> + +Warning threshold for biggest input buffer among current client connections + +=item B<--critical-client-biggest-input-buf> + +Critical threshold for biggest input buffer among current client connections + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/commands.pm b/centreon-plugins/apps/redis/cli/mode/commands.pm new file mode 100644 index 000000000..0ceeab764 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/commands.pm @@ -0,0 +1,117 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::commands; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_output' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'processed-commands', set => { + key_values => [ { name => 'total_commands_processed', diff => 1 } ], + output_template => 'Processed: %s', + perfdatas => [ + { label => 'processed_commands', value => 'total_commands_processed_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'ops-per-sec', set => { + key_values => [ { name => 'instantaneous_ops_per_sec' } ], + output_template => 'Processed per sec: %s', + perfdatas => [ + { label => 'ops_per_sec', value => 'instantaneous_ops_per_sec_absolute', template => '%s', min => 0, unit => 'ops/s' }, + ], + }, + }, + ]; +} + +sub prefix_output { + my ($self, %options) = @_; + + return "Number of commands: "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{custom}->get_info(); + $self->{global} = { + total_commands_processed => $results->{total_commands_processed}, + instantaneous_ops_per_sec => $results->{instantaneous_ops_per_sec}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check commands number + +=over 8 + +=item B<--warning-processed-commands> + +Warning threshold for number of commands processed by the server + +=item B<--critical-processed-commands> + +Critical threshold for number of commands processed by the server + +=item B<--warning-ops-per-sec> + +Warning threshold for number of commands processed per second + +=item B<--critical-ops-per-sec> + +Critical threshold for number of commands processed per second + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/connections.pm b/centreon-plugins/apps/redis/cli/mode/connections.pm new file mode 100644 index 000000000..40032ba64 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/connections.pm @@ -0,0 +1,167 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::connections; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'connections', type => 0, cb_prefix_output => 'prefix_connections_output' }, + { name => 'traffic', type => 0, cb_prefix_output => 'prefix_traffic_output' }, + ]; + + $self->{maps_counters}->{connections} = [ + { label => 'received-connections', set => { + key_values => [ { name => 'total_connections_received', diff => 1 } ], + output_template => 'Received: %s', + perfdatas => [ + { label => 'received_connections', value => 'total_connections_received_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'rejected-connections', set => { + key_values => [ { name => 'rejected_connections', diff => 1 } ], + output_template => 'Rejected: %s', + perfdatas => [ + { label => 'rejected_connections', value => 'rejected_connections_absolute', template => '%s', min => 0 }, + ], + }, + }, + ]; + + $self->{maps_counters}->{traffic} = [ + { label => 'traffic-in', set => { + key_values => [ { name => 'total_net_input_bytes', diff => 1 } ], + output_template => 'Traffic In: %s %s/s', + per_second => 1, output_change_bytes => 2, + perfdatas => [ + { label => 'traffic_in', value => 'total_net_input_bytes_per_second', template => '%d', min => 0, unit => 'b/s' }, + ], + }, + }, + { label => 'traffic-out', set => { + key_values => [ { name => 'total_net_output_bytes', diff => 1 } ], + output_template => 'Traffic Out: %s %s/s', + per_second => 1, output_change_bytes => 2, + perfdatas => [ + { label => 'traffic_out', value => 'total_net_output_bytes_per_second', template => '%d', min => 0, unit => 'b/s' }, + ], + }, + }, + ]; +} + +sub prefix_connections_output { + my ($self, %options) = @_; + + return "Number of connections: "; +} + +sub prefix_traffic_output { + my ($self, %options) = @_; + + return "Network usage: "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{custom}->get_info(); + + $self->{connections} = { + total_connections_received => $results->{total_connections_received}, + rejected_connections => $results->{rejected_connections}, + }; + + $self->{traffic} = { + total_net_input_bytes => $results->{total_net_input_bytes} * 8, + total_net_output_bytes => $results->{total_net_output_bytes} * 8, + }; +} + +1; + +__END__ + +=head1 MODE + +Check connections number and network usage + +=over 8 + +=item B<--warning-received-connections> + +Warning threshold for received connections + +=item B<--critical-received-connections> + +Critical threshold for received connections + +=item B<--warning-rejected-connections> + +Warning threshold for rejected connections + +=item B<--critical-rejected-connections> + +Critical threshold for rejected connections + +=item B<--warning-traffic-in> + +Warning threshold for inbound traffic (b/s) + +=item B<--critical-traffic-in> + +Critical threshold for inbound traffic (b/s) + +=item B<--warning-traffic-out> + +Warning threshold for outbound traffic (b/s) + +=item B<--critical-traffic-out> + +Critical thresholdfor outbound traffic (b/s) + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/cpu.pm b/centreon-plugins/apps/redis/cli/mode/cpu.pm new file mode 100644 index 000000000..8317d9527 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/cpu.pm @@ -0,0 +1,169 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::cpu; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'sys', set => { + key_values => [ { name => 'used_cpu_sys', diff => 1 } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_sys' }, + output_template => 'System: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta', + per_second => 1, + perfdatas => [ + { label => 'sys', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'user', set => { + key_values => [ { name => 'used_cpu_user', diff => 1 } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_user' }, + output_template => 'User: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta', + per_second => 1, + perfdatas => [ + { label => 'user', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'sys-children', set => { + key_values => [ { name => 'used_cpu_sys_children', diff => 1 } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_sys_children' }, + output_template => 'System children: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta', + per_second => 1, + perfdatas => [ + { label => 'sys_children', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'user-children', set => { + key_values => [ { name => 'used_cpu_user_children', diff => 1 } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'used_cpu_user_children' }, + output_template => 'User children: %.2f %%', output_use => 'used_delta', threshold_use => 'used_delta', + per_second => 1, + perfdatas => [ + { label => 'user_children', value => 'used_delta', template => '%.2f', min => 0, max => 100, unit => '%' }, + ], + } + }, + ]; +} + +sub prefix_output { + my ($self, %options) = @_; + + return "CPU usage: "; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + my $delta_total = $options{new_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref}} - $options{old_datas}->{$self->{instance} . '_' . $options{extra_options}->{label_ref}}; + $self->{result_values}->{used_delta} = 100 * $delta_total / $options{delta_time}; + + return 0; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = "redis_" . $self->{mode} . '_' . $options{custom}->get_connection_info() . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + my $results = $options{custom}->get_info(); + + $self->{global} = { + used_cpu_sys => $results->{used_cpu_sys}, + used_cpu_user => $results->{used_cpu_user}, + used_cpu_sys_children => $results->{used_cpu_sys_children}, + used_cpu_user_children => $results->{used_cpu_user_children}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check CPU utilization. + +=over 8 + +=item B<--warning-sys> + +Warning threshold for Sys CPU utilization + +=item B<--critical-sys> + +Critical threshold for Sys CPU utilization + +=item B<--warning-user> + +Warning threshold for User CPU utilization + +=item B<--critical-user> + +Critical threshold for User CPU utilization + +=item B<--warning-sys-children> + +Warning threshold for Sys Children CPU utilization + +=item B<--critical-sys-children> + +Critical threshold for Sys Children CPU utilization + +=item B<--warning-user-children> + +Warning threshold for User Children CPU utilization + +=item B<--critical-user-children> + +Critical threshold for User Children CPU utilization + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/memory.pm b/centreon-plugins/apps/redis/cli/mode/memory.pm new file mode 100644 index 000000000..6aef79436 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/memory.pm @@ -0,0 +1,356 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::memory; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => $self->{result_values}->{label}, unit => 'B', + value => $self->{result_values}->{used}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{result_values}->{label}, total => $self->{result_values}->{total}, cast_int => 1), + min => 0, max => $self->{result_values}->{total}); +} + +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($instance_mode->{option_results}->{free})); + if ($instance_mode->{option_results}->{units} eq '%') { + $threshold_value = $self->{result_values}->{prct_used}; + $threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free})); + } + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{result_values}->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{result_values}->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); + + my $msg = sprintf($self->{result_values}->{display}.": %s (%.2f%%)", + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{label} = $options{new_datas}->{$self->{instance} . '_label'}; + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'}; + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'}; + $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 => 'used', type => 0 }, + { name => 'rss', type => 0, skipped_code => { -10 => 1 } }, + { name => 'peak', type => 0, skipped_code => { -10 => 1 } }, + { name => 'overhead', type => 0, skipped_code => { -10 => 1 } }, + { name => 'startup', type => 0, skipped_code => { -10 => 1 } }, + { name => 'dataset', type => 0, skipped_code => { -10 => 1 } }, + { name => 'lua', type => 0, skipped_code => { -10 => 1 } }, + { name => 'stats', type => 0, cb_prefix_output => 'prefix_stats_output', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{used} = [ + { label => 'used', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{rss} = [ + { label => 'rss', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{peak} = [ + { label => 'peak', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{overhead} = [ + { label => 'overhead', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{startup} = [ + { label => 'startup', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{dataset} = [ + { label => 'dataset', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{lua} = [ + { label => 'lua', set => { + key_values => [ { name => 'display' }, { name => 'label' }, { name => 'used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; + + $self->{maps_counters}->{stats} = [ + { label => 'fragmentation-ratio', set => { + key_values => [ { name => 'mem_fragmentation_ratio' } ], + output_template => 'Fragmentation ratio: %s', + perfdatas => [ + { label => 'fragmentation_ratio', value => 'mem_fragmentation_ratio_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'defrag-running', set => { + key_values => [ { name => 'active_defrag_running' } ], + output_template => 'Defragmentation running: %s', + perfdatas => [ + { label => 'defrag_running', value => 'active_defrag_running_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'lazyfree-pending-objects', set => { + key_values => [ { name => 'lazyfree_pending_objects' } ], + output_template => 'Lazyfree pending objects: %s', + perfdatas => [ + { label => 'lazyfree_pending_objects', value => 'lazyfree_pending_objects_absolute', template => '%s', min => 0 }, + ], + }, + }, + ]; +} + +sub prefix_stats_output { + my ($self, %options) = @_; + + return "Statistics: "; +} + + +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 => + { + "units:s" => { name => 'units', default => '%' }, + "free" => { name => 'free' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; +} + +my $metrics = { + used_memory => { label => 'used', display => 'Used' }, + used_memory_rss => { label => 'rss', display => 'Rss' }, + used_memory_peak => { label => 'peak', display => 'Peak' }, + used_memory_overhead => { label => 'overhead', display => 'Overhead' }, + used_memory_startup => { label => 'startup', display => 'Startup' }, + used_memory_dataset => { label => 'dataset', display => 'Dataset' }, + used_memory_lua => { label => 'lua', display => 'Lua' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{custom}->get_info(); + foreach my $type (keys %$metrics) { + next if (!defined($results->{$type})); + $self->{$metrics->{$type}->{label}} = { display => $metrics->{$type}->{display}, + label => $metrics->{$type}->{label}, + used => $results->{$type}, + total => $results->{total_system_memory} }; + } + + $self->{stats} = { + mem_fragmentation_ratio => $results->{mem_fragmentation_ratio}, + active_defrag_running => $results->{active_defrag_running}, + lazyfree_pending_objects => $results->{lazyfree_pending_objects}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check memory utilization + +=over 8 + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'B'). + +=item B<--free> + +Thresholds are on free space left. + +=item B<--warning-used> + +Warning threshold for Used memory utilization + +=item B<--critical-used> + +Critical threshold for Used memory utilization + +=item B<--warning-rss> + +Warning threshold for Rss memory utilization + +=item B<--critical-rss> + +Critical threshold for Rss memory utilization + +=item B<--warning-peak> + +Warning threshold for Peak memory utilization + +=item B<--critical-peak> + +Critical threshold for Peak memory utilization + +=item B<--warning-overhead> + +Warning threshold for Overhead memory utilization + +=item B<--critical-overhead> + +Critical threshold for Overhead memory utilization + +=item B<--warning-startup> + +Warning threshold for Startup memory utilization + +=item B<--critical-startup> + +Critical threshold for Startup memory utilization + +=item B<--warning-dataset> + +Warning threshold for Dataset memory utilization + +=item B<--critical-dataset> + +Critical threshold for Dataset memory utilization + +=item B<--warning-lua> + +Warning threshold for Lua memory utilization + +=item B<--critical-lua> + +Critical threshold for Lua memory utilization + +=item B<--warning-fragmentation-ratio> + +Warning threshold for Fragmentation Ratio + +=item B<--critical-fragmentation-ratio> + +Critical threshold for Fragmentation Ratio + +=item B<--warning-defrag-running> + +Warning threshold for Running Defragmentation + +=item B<--critical-defrag-running> + +Critical threshold for Running Defragmentation + +=item B<--warning-lazyfree-pending-objects> + +Warning threshold for Lazyfree Pending Objects + +=item B<--critical-lazyfree-pending-objects> + +Critical threshold for Lazyfree Pending Objects + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/persistence.pm b/centreon-plugins/apps/redis/cli/mode/persistence.pm new file mode 100644 index 000000000..db141d38c --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/persistence.pm @@ -0,0 +1,218 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::persistence; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'status' }, { name => 'progress_status' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'changes', set => { + key_values => [ { name => 'rdb_changes_since_last_save' } ], + output_template => 'Number of changes since the last dump: %s', + perfdatas => [ + { label => 'changes', value => 'rdb_changes_since_last_save_absolute', template => '%s', min => 0 }, + ], + }, + }, + { label => 'last-save', set => { + key_values => [ { name => 'rdb_last_save_time' }, { name => 'rdb_last_save_time_sec' } ], + output_template => 'Time since last successful save: %s', + perfdatas => [ + { label => 'last_save', value => 'rdb_last_save_time_sec_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + { label => 'save-size', set => { + key_values => [ { name => 'rdb_last_cow_size' } ], + output_template => 'Size of last save: %s %s', + output_change_bytes => 1, + perfdatas => [ + { label => 'save_size', value => 'rdb_last_cow_size_absolute', template => '%s', min => 0, unit => 'B' }, + ], + }, + }, + { label => 'last-save-duration', set => { + key_values => [ { name => 'rdb_last_bgsave_time' } ], + output_template => 'Duration of last save: %s s', + perfdatas => [ + { label => 'last_save_duration', value => 'rdb_last_bgsave_time_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + { label => 'current-save-duration', set => { + key_values => [ { name => 'rdb_current_bgsave_time' } ], + output_template => 'Duration of current save: %s s', + perfdatas => [ + { label => 'current_save_duration', value => 'rdb_current_bgsave_time_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + ]; +} + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("RDB save status is '%s' [progress status: %s]", $self->{result_values}->{status}, $self->{result_values}->{progress_status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{progress_status} = $options{new_datas}->{$self->{instance} . '_progress_status'}; + return 0; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + "warning-status:s" => { name => 'warning_status', default => '%{sync_status} =~ /in progress/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{link_status} =~ /down/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +my %map_status = ( + 0 => 'stopped', + 1 => 'in progress', +); + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{custom}->get_info(); + $self->{global} = { + status => $results->{rdb_last_bgsave_status}, + progress_status => $map_status{$results->{rdb_bgsave_in_progress}}, + rdb_changes_since_last_save => $results->{rdb_changes_since_last_save}, + rdb_last_save_time => centreon::plugins::misc::change_seconds(value => time() - $results->{rdb_last_save_time}), + rdb_last_save_time_sec => time() - $results->{rdb_last_save_time}, + rdb_last_cow_size => $results->{rdb_last_cow_size}, + rdb_last_bgsave_time => $results->{rdb_last_bgsave_time_sec}, + rdb_current_bgsave_time => $results->{rdb_current_bgsave_time_sec} + }; +} + +1; + +__END__ + +=head1 MODE + +Check RDB persistence status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status (Default: '%{progress_status} =~ /in progress/i'). +Can used special variables like: %{progress_status}, %{status} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /fail/i'). +Can used special variables like: %{progress_status}, %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'changes', 'last-save', 'save-size', +'last-save-duration', 'current-save-duration'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'changes', 'last-save', 'save-size', +'last-save-duration', 'current-save-duration'. + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/mode/replication.pm b/centreon-plugins/apps/redis/cli/mode/replication.pm new file mode 100644 index 000000000..515d80518 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/mode/replication.pm @@ -0,0 +1,250 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::mode::replication; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, skipped_code => { -10 => 1 } }, + { name => 'master', type => 0, skipped_code => { -10 => 1 } }, + { name => 'slave', type => 0, skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'link_status' }, { name => 'sync_status' }, { name => 'role' }, { name => 'cluster_state' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'connected-slaves', set => { + key_values => [ { name => 'connected_slaves' } ], + output_template => 'Number of connected slaves: %s', + perfdatas => [ + { label => 'connected_slaves', value => 'connected_slaves_absolute', template => '%s', min => 0 }, + ], + }, + }, + ]; + + $self->{maps_counters}->{master} = [ + { label => 'master-repl-offset', set => { + key_values => [ { name => 'master_repl_offset' } ], + output_template => 'Master replication offset: %s s', + perfdatas => [ + { label => 'master_repl_offset', value => 'master_repl_offset_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + ]; + + $self->{maps_counters}->{slave} = [ + { label => 'master-last-io', set => { + key_values => [ { name => 'master_last_io_seconds_ago' } ], + output_template => 'Last interaction with master: %s s', + perfdatas => [ + { label => 'master_last_io', value => 'master_last_io_seconds_ago_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + { label => 'slave-repl-offset', set => { + key_values => [ { name => 'slave_repl_offset' } ], + output_template => 'Slave replication offset: %s s', + perfdatas => [ + { label => 'slave_repl_offset', value => 'slave_repl_offset_absolute', template => '%s', min => 0, unit => 's' }, + ], + }, + }, + { label => 'slave-priority', set => { + key_values => [ { name => 'slave_priority' } ], + output_template => 'Slave replication offset: %s s', + perfdatas => [ + { label => 'slave_priority', value => 'slave_priority_absolute', template => '%s' }, + ], + }, + }, + { label => 'slave-read-only', set => { + key_values => [ { name => 'slave_read_only' } ], + output_template => 'Slave replication offset: %s s', + perfdatas => [ + { label => 'slave_read_only', value => 'slave_read_only_absolute', template => '%s' }, + ], + }, + }, + ]; +} + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("Node role is '%s' [cluster: %s]", $self->{result_values}->{role}, $self->{result_values}->{cluster_state}); + if ($self->{result_values}->{role} eq 'slave') { + $msg .= sprintf(" [link status: %s] [sync status: %s]", + $self->{result_values}->{link_status}, $self->{result_values}->{sync_status}); + } + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{role} = $options{new_datas}->{$self->{instance} . '_role'}; + $self->{result_values}->{sync_status} = $options{new_datas}->{$self->{instance} . '_sync_status'}; + $self->{result_values}->{link_status} = $options{new_datas}->{$self->{instance} . '_link_status'}; + $self->{result_values}->{cluster_state} = $options{new_datas}->{$self->{instance} . '_cluster_state'}; + return 0; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + + $options{options}->add_options(arguments => + { + "warning-status:s" => { name => 'warning_status', default => '%{sync_status} =~ /in progress/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{link_status} =~ /down/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +my %map_sync = ( + 0 => 'stopped', + 1 => 'in progress', +); + +my %map_cluster_state = ( + 0 => 'disabled', + 1 => 'enabled', +); + +sub manage_selection { + my ($self, %options) = @_; + + my $results = $options{custom}->get_info(); + + $self->{global} = { + connected_slaves => $results->{connected_slaves}, + role => $results->{role}, + cluster_state => defined($results->{cluster_enabled}) ? $map_cluster_state{$results->{cluster_enabled}} : '-', + link_status => defined($results->{master_link_status}) ? $results->{master_link_status} : '-', + sync_status => defined($results->{master_sync_in_progress}) ? $map_sync{$results->{master_sync_in_progress}} : '-', + }; + + $self->{master} = { master_repl_offset => $results->{master_repl_offset} }; + $self->{slave} = { + master_last_io_seconds_ago => $results->{master_last_io_seconds_ago}, + slave_repl_offset => $results->{slave_repl_offset}, + slave_priority => $results->{slave_priority}, + slave_read_only => $results->{slave_read_only}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check replication status. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status (Default: '%{sync_status} =~ /in progress/i'). +Can used special variables like: %{sync_status}, %{link_status}, %{cluster_state} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{link_status} =~ /down/i'). +Can used special variables like: %{sync_status}, %{link_status}, %{cluster_state} + +=item B<--warning-*> + +Threshold warning. +Can be: 'connected-slaves', 'master-repl-offset', +'master-last-io', 'slave-priority', 'slave-read-only'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'connected-slaves', 'master-repl-offset', +'master-last-io', 'slave-priority', 'slave-read-only'. + +=back + +=cut diff --git a/centreon-plugins/apps/redis/cli/plugin.pm b/centreon-plugins/apps/redis/cli/plugin.pm new file mode 100644 index 000000000..a11ad34e1 --- /dev/null +++ b/centreon-plugins/apps/redis/cli/plugin.pm @@ -0,0 +1,59 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::redis::cli::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_custom); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'clients' => 'apps::redis::cli::mode::clients', + 'commands' => 'apps::redis::cli::mode::commands', + 'connections' => 'apps::redis::cli::mode::connections', + 'cpu' => 'apps::redis::cli::mode::cpu', + 'memory' => 'apps::redis::cli::mode::memory', + 'persistence' => 'apps::redis::cli::mode::persistence', + 'replication' => 'apps::redis::cli::mode::replication', + ); + + $self->{custom_modes}{rediscli} = 'apps::redis::cli::custom::rediscli'; + return $self; +} + +sub init { + my ($self, %options) = @_; + + $self->SUPER::init(%options); +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Redis server through Perl Cli binding library. diff --git a/centreon-plugins/apps/tomcat/jmx/mode/connectorusage.pm b/centreon-plugins/apps/tomcat/jmx/mode/connectorusage.pm index cea015621..4ab1dedbc 100644 --- a/centreon-plugins/apps/tomcat/jmx/mode/connectorusage.pm +++ b/centreon-plugins/apps/tomcat/jmx/mode/connectorusage.pm @@ -197,7 +197,8 @@ sub manage_selection { $self->{tomcatconnector} = {}; foreach my $key (keys %$result) { $key =~ /name=(.*?),type=(.*)/; - my ($connector, $type) = ($1, $2); + my ($connector, $type) = ($1, $2); # double quote nivo du name si existe + $connector =~ s/^"(.*)"$/$1/g; if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && $connector !~ /$self->{option_results}->{filter_name}/) { @@ -212,7 +213,7 @@ sub manage_selection { $self->{tomcatconnector}->{$connector} = { %{$self->{tomcatconnector}->{$connector}}, %{$result->{$key}} }; } - $self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } diff --git a/centreon-plugins/apps/tomcat/jmx/mode/datasourceusage.pm b/centreon-plugins/apps/tomcat/jmx/mode/datasourceusage.pm new file mode 100644 index 000000000..b1360f721 --- /dev/null +++ b/centreon-plugins/apps/tomcat/jmx/mode/datasourceusage.pm @@ -0,0 +1,232 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::tomcat::jmx::mode::datasourceusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'datasource', type => 1, cb_prefix_output => 'prefix_ds_output', message_multiple => 'All datasources are ok' }, + ]; + + $self->{maps_counters}->{datasource} = [ + { label => 'num-active', set => { + key_values => [ { name => 'numActive' }, { name => 'maxActive' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_calc_extra_options => { label_ref => 'Active', message => 'Current Num Active' }, + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + } + }, + { label => 'num-idle', set => { + key_values => [ { name => 'numIdle' }, { name => 'maxIdle' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_calc_extra_options => { label_ref => 'Idle', message => 'Current Num Idle' }, + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + } + }, + ]; +} + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + my $use_th = 1; + $use_th = 0 if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} <= 0); + + my $extra_label = ''; + $extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0); + + my $value_perf = $self->{result_values}->{used}; + my %total_options = (); + if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} > 0) { + $total_options{total} = $self->{result_values}->{max}; + $total_options{cast_int} = 1; + } + + my $label = $self->{label}; + $label =~ s/-/_/g; + $self->{output}->perfdata_add(label => $label . $extra_label, + value => $value_perf, + warning => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, %total_options) : undef, + critical => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, %total_options) : undef, + min => 0, max => $self->{result_values}->{max} > 0 ? $self->{result_values}->{max} : undef); +} + +sub custom_usage_threshold { + my ($self, %options) = @_; + + # Cannot use percent without total + return 'ok' if ($self->{result_values}->{max} <= 0 && $instance_mode->{option_results}->{units} eq '%'); + my ($exit, $threshold_value); + $threshold_value = $self->{result_values}->{used}; + if ($instance_mode->{option_results}->{units} eq '%') { + $threshold_value = $self->{result_values}->{prct_used}; + } + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-'. $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my $msg; + if ($self->{result_values}->{max} > 0) { + $msg = sprintf("%s Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $self->{result_values}->{message}, $self->{result_values}->{max}, + $self->{result_values}->{used}, $self->{result_values}->{prct_used}, + $self->{result_values}->{max} - $self->{result_values}->{used}, 100 - $self->{result_values}->{prct_used}); + } else { + $msg = sprintf("%s : %s", $self->{result_values}->{message}, $self->{result_values}->{used}); + } + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{message} = $options{extra_options}->{message}; + $self->{result_values}->{max} = $options{new_datas}->{$self->{instance} . '_max' . $options{extra_options}->{label_ref}}; + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_num' . $options{extra_options}->{label_ref}}; + if ($self->{result_values}->{max} > 0) { + $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{max}; + } + + return 0; +} + +sub prefix_ds_output { + my ($self, %options) = @_; + + return "Datasource '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + "units:s" => { name => 'units', default => '%' }, + }); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + # maxActive or maxTotal + $self->{request} = [ + { mbean => "*:type=DataSource,class=*,context=*,host=*,name=*", attributes => + [ { name => 'numActive' }, { name => 'numIdle' }, { name => 'maxIdle' }, { name => 'maxTotal' }, { name => 'maxActive' } ] }, + ]; + + my $result = $options{custom}->get_attributes(request => $self->{request}, nothing_quit => 1); + + $self->{datasource} = {}; + foreach my $key (keys %$result) { + $key =~ /(?:[:,])host=(.*?)(?:,|$)/; + my $ds_name = $1; + $key =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/; + $ds_name .= '.' . $1; + $key =~ /(?:[:,])name=(.*?)(?:,|$)/; # double quote a virer + my $tmp_name = $1; + $tmp_name =~ s/^"(.*)"$/$1/; + $ds_name .= '.' . $tmp_name; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $ds_name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $ds_name . "': no matching filter.", debug => 1); + next; + } + + $self->{datasource}->{$ds_name} = { + display => $ds_name, + numActive => $result->{$key}->{numActive}, + maxActive => defined($result->{$key}->{maxTotal}) ? $result->{$key}->{maxTotal} : $result->{$key}->{maxActive}, + numIdle => $result->{$key}->{numIdle}, + maxIdle => $result->{$key}->{maxIdle}, + }; + } + + $self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check data sources usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='num-active' + +=item B<--filter-name> + +Filter datasource name (can be a regexp). + +=item B<--warning-*> + +Threshold warning. +Can be: 'num-active', 'num-idle'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'num-active', 'num-idle'. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'absolute'). + +=back + +=cut diff --git a/centreon-plugins/apps/tomcat/jmx/mode/listdatasources.pm b/centreon-plugins/apps/tomcat/jmx/mode/listdatasources.pm new file mode 100644 index 000000000..babbeec93 --- /dev/null +++ b/centreon-plugins/apps/tomcat/jmx/mode/listdatasources.pm @@ -0,0 +1,138 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::tomcat::jmx::mode::listdatasources; + +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 => + { + "filter-host:s" => { name => 'filter_host' }, + "filter-path:s" => { name => 'filter_path' }, + }); + $self->{ds} = {}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{request} = [ + { mbean => "*:type=DataSource,class=*,context=*,host=*,name=*", attributes => + [ { name => 'numActive' } ] }, + ]; + my $result = $options{custom}->get_attributes(request => $self->{request}); + + foreach my $mbean (keys %{$result}) { + $mbean =~ /(?:[:,])host=(.*?)(?:,|$)/; + my $host = $1; + $mbean =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/; + my $path = $1; + $mbean =~ /(?:[:,])name=(.*?)(?:,|$)/; + my $name = $1; + $name =~ s/^"(.*)"$/$1/; + + if (defined($self->{option_results}->{filter_host}) && $self->{option_results}->{filter_host} ne '' && + $host !~ /$self->{option_results}->{filter_host}/) { + $self->{output}->output_add(long_msg => "skipping '" . $host . "': no matching filter.", debug => 1); + next; + } + if (defined($self->{option_results}->{filter_path}) && $self->{option_results}->{filter_path} ne '' && + $path !~ /$self->{option_results}->{filter_path}/) { + $self->{output}->output_add(long_msg => "skipping '" . $path . "': no matching filter.", debug => 1); + next; + } + + $self->{ds}->{$host . '.' . $path} = { + host => $host, path => $path, name => $name, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{ds}}) { + $self->{output}->output_add(long_msg => '[host = ' . $self->{ds}->{$instance}->{host} . "]" . + " [path = '" . $self->{ds}->{$instance}->{path} . "']" . + " [name = '" . $self->{ds}->{$instance}->{name} . "']" + ); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List data sources:'); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['host', 'path', 'name']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{ds}}) { + $self->{output}->add_disco_entry( + %{$self->{ds}->{$instance}} + ); + } +} + +1; + +__END__ + +=head1 MODE + +List data sources. + +=over 8 + +=item B<--filter-host> + +Filter by virtual host name (can be a regexp). + +=item B<--filter-path> + +Filter by application name (can be a regexp). + +=back + +=cut + diff --git a/centreon-plugins/apps/tomcat/jmx/mode/listwebapps.pm b/centreon-plugins/apps/tomcat/jmx/mode/listwebapps.pm new file mode 100644 index 000000000..d42afc749 --- /dev/null +++ b/centreon-plugins/apps/tomcat/jmx/mode/listwebapps.pm @@ -0,0 +1,134 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::tomcat::jmx::mode::listwebapps; + +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 => + { + "filter-host:s" => { name => 'filter_host' }, + "filter-path:s" => { name => 'filter_path' }, + }); + $self->{webapps} = {}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{request} = [ + { mbean => "*:context=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' } ] }, + { mbean => "*:path=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' } ] }, + ]; + my $result = $options{custom}->get_attributes(request => $self->{request}); + + foreach my $mbean (keys %{$result}) { + $mbean =~ /(?:[:,])host=(.*?)(?:,|$)/; + my $host = $1; + $mbean =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/; + my $path = $1; + + if (defined($self->{option_results}->{filter_host}) && $self->{option_results}->{filter_host} ne '' && + $host !~ /$self->{option_results}->{filter_host}/) { + $self->{output}->output_add(long_msg => "skipping '" . $host . "': no matching filter.", debug => 1); + next; + } + if (defined($self->{option_results}->{filter_path}) && $self->{option_results}->{filter_path} ne '' && + $path !~ /$self->{option_results}->{filter_path}/) { + $self->{output}->output_add(long_msg => "skipping '" . $path . "': no matching filter.", debug => 1); + next; + } + + $self->{webapps}->{$host . '.' . $path} = { + host => $host, path => $path, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{webapps}}) { + $self->{output}->output_add(long_msg => '[host = ' . $self->{webapps}->{$instance}->{host} . "]" . + " [path = '" . $self->{webapps}->{$instance}->{path} . "']" + ); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List webapps:'); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['host', 'path']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{webapps}}) { + $self->{output}->add_disco_entry( + %{$self->{webapps}->{$instance}} + ); + } +} + +1; + +__END__ + +=head1 MODE + +List webapps. + +=over 8 + +=item B<--filter-host> + +Filter by virtual host name (can be a regexp). + +=item B<--filter-path> + +Filter by application name (can be a regexp). + +=back + +=cut + diff --git a/centreon-plugins/apps/tomcat/jmx/mode/webappssessions.pm b/centreon-plugins/apps/tomcat/jmx/mode/webappssessions.pm new file mode 100644 index 000000000..165826a02 --- /dev/null +++ b/centreon-plugins/apps/tomcat/jmx/mode/webappssessions.pm @@ -0,0 +1,227 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::tomcat::jmx::mode::webappssessions; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'webapps', type => 1, cb_prefix_output => 'prefix_webapps_output', message_multiple => 'All webapp sessions are ok' }, + ]; + + $self->{maps_counters}->{webapps} = [ + { label => 'sessions-active', set => { + key_values => [ { name => 'activeSessions' }, { name => 'maxActiveSessions' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_calc_extra_options => { label_ref => 'currentThreadCount', message => 'Current Threads' }, + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + } + }, + { label => 'sessions-count', set => { + key_values => [ { name => 'sessionCounter', diff => 1 }, { name => 'display' } ], + output_template => 'Sessions Count : %s', + perfdatas => [ + { label => 'sessions_count', value => 'sessionCounter_absolute', template => '%s', + min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + my $use_th = 1; + $use_th = 0 if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} <= 0); + + my $extra_label = ''; + $extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0); + + my $value_perf = $self->{result_values}->{used}; + my %total_options = (); + if ($instance_mode->{option_results}->{units} eq '%' && $self->{result_values}->{max} > 0) { + $total_options{total} = $self->{result_values}->{max}; + $total_options{cast_int} = 1; + } + + my $label = $self->{label}; + $label =~ s/-/_/g; + $self->{output}->perfdata_add(label => $label . $extra_label, + value => $value_perf, + warning => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, %total_options) : undef, + critical => $use_th == 1 ? $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, %total_options) : undef, + min => 0, max => $self->{result_values}->{max} > 0 ? $self->{result_values}->{max} : undef); +} + +sub custom_usage_threshold { + my ($self, %options) = @_; + + # Cannot use percent without total + return 'ok' if ($self->{result_values}->{max} <= 0 && $instance_mode->{option_results}->{units} eq '%'); + my ($exit, $threshold_value); + $threshold_value = $self->{result_values}->{used}; + if ($instance_mode->{option_results}->{units} eq '%') { + $threshold_value = $self->{result_values}->{prct_used}; + } + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-'. $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my $msg; + if ($self->{result_values}->{max} > 0) { + $msg = sprintf("Current Active Sessions Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $self->{result_values}->{max}, + $self->{result_values}->{used}, $self->{result_values}->{prct_used}, + $self->{result_values}->{max} - $self->{result_values}->{used}, 100 - $self->{result_values}->{prct_used}); + } else { + $msg = sprintf("Current Active Sessions : %s", $self->{result_values}->{used}); + } + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{max} = $options{new_datas}->{$self->{instance} . '_maxActiveSessions'}; + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_activeSessions'}; + if ($self->{result_values}->{max} > 0) { + $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{max}; + } + + return 0; +} + +sub prefix_webapps_output { + my ($self, %options) = @_; + + return "Webapp '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + "units:s" => { name => 'units', default => '%' }, + }); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + # can be path or context + # Tomcat: Catalina:context=/xxxxx,host=localhost,type=Manager + # Jboss: jboss.web:host=localhost,path=/invoker,type=Manager + # maxActiveSessions = -1 (no limit) + $self->{request} = [ + { mbean => "*:context=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' }, { name => 'sessionCounter' }, { name => 'maxActiveSessions' } ] }, + { mbean => "*:path=*,host=*,type=Manager", attributes => [ { name => 'activeSessions' }, { name => 'sessionCounter' }, { name => 'maxActiveSessions' } ] }, + ]; + + my $result = $options{custom}->get_attributes(request => $self->{request}, nothing_quit => 1); + + $self->{webapps} = {}; + foreach my $key (keys %$result) { + $key =~ /(?:[:,])host=(.*?)(?:,|$)/; + my $webapps = $1; + $key =~ /(?:[:,])(?:path|context)=(.*?)(?:,|$)/; + $webapps .= '.' . $1; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $webapps !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $webapps . "': no matching filter.", debug => 1); + next; + } + + $self->{webapps}->{$webapps} = { + display => $webapps, + %{$result->{$key}} + }; + } + + $self->{cache_name} = "tomcat_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check webapps session usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='sessions-active' + +=item B<--filter-name> + +Filter webapps name (can be a regexp). + +=item B<--warning-*> + +Threshold warning. +Can be: 'sessions-count', 'sessions-active'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'sessions-count', 'sessions-active'. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'absolute'). + +=back + +=cut diff --git a/centreon-plugins/apps/tomcat/jmx/plugin.pm b/centreon-plugins/apps/tomcat/jmx/plugin.pm index 25a5c57a6..2d732e713 100644 --- a/centreon-plugins/apps/tomcat/jmx/plugin.pm +++ b/centreon-plugins/apps/tomcat/jmx/plugin.pm @@ -34,12 +34,16 @@ sub new { 'class-count' => 'centreon::common::jvm::mode::classcount', 'connector-usage' => 'apps::tomcat::jmx::mode::connectorusage', 'cpu-load' => 'centreon::common::jvm::mode::cpuload', + 'datasource-usage' => 'apps::tomcat::jmx::mode::datasourceusage', 'fd-usage' => 'centreon::common::jvm::mode::fdusage', 'gc-usage' => 'centreon::common::jvm::mode::gcusage', + 'list-datasources' => 'apps::tomcat::jmx::mode::listdatasources', + 'list-webapps' => 'apps::tomcat::jmx::mode::listwebapps', 'load-average' => 'centreon::common::jvm::mode::loadaverage', 'memory' => 'centreon::common::jvm::mode::memory', 'memory-detailed' => 'centreon::common::jvm::mode::memorydetailed', 'threads' => 'centreon::common::jvm::mode::threads', + 'webapps-sessions' => 'apps::tomcat::jmx::mode::webappssessions', ); $self->{custom_modes}{jolokia} = 'centreon::common::protocols::jmx::custom::jolokia'; diff --git a/centreon-plugins/apps/varnish/local/mode/backend.pm b/centreon-plugins/apps/varnish/local/mode/backend.pm index 5b34647a4..13e3d0985 100644 --- a/centreon-plugins/apps/varnish/local/mode/backend.pm +++ b/centreon-plugins/apps/varnish/local/mode/backend.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/varnish/local/mode/cache.pm b/centreon-plugins/apps/varnish/local/mode/cache.pm index 9582f4c06..219a6c6db 100644 --- a/centreon-plugins/apps/varnish/local/mode/cache.pm +++ b/centreon-plugins/apps/varnish/local/mode/cache.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/varnish/local/mode/clients.pm b/centreon-plugins/apps/varnish/local/mode/clients.pm index e9b701143..ec7d3d086 100644 --- a/centreon-plugins/apps/varnish/local/mode/clients.pm +++ b/centreon-plugins/apps/varnish/local/mode/clients.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/varnish/local/mode/sessions.pm b/centreon-plugins/apps/varnish/local/mode/sessions.pm index 46224d2aa..c7a74c2a7 100644 --- a/centreon-plugins/apps/varnish/local/mode/sessions.pm +++ b/centreon-plugins/apps/varnish/local/mode/sessions.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/varnish/local/mode/shm.pm b/centreon-plugins/apps/varnish/local/mode/shm.pm index 28e510120..552d85592 100644 --- a/centreon-plugins/apps/varnish/local/mode/shm.pm +++ b/centreon-plugins/apps/varnish/local/mode/shm.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/varnish/local/mode/threads.pm b/centreon-plugins/apps/varnish/local/mode/threads.pm index c867f9509..fb72a38f1 100644 --- a/centreon-plugins/apps/varnish/local/mode/threads.pm +++ b/centreon-plugins/apps/varnish/local/mode/threads.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/apps/voip/asterisk/ami/custom/api.pm b/centreon-plugins/apps/voip/asterisk/ami/custom/api.pm new file mode 100644 index 000000000..0db61b7e2 --- /dev/null +++ b/centreon-plugins/apps/voip/asterisk/ami/custom/api.pm @@ -0,0 +1,278 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::asterisk::ami::custom::api; + +use strict; +use warnings; +use IO::Socket::INET; +use IO::Select; + +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 => + { + "ami-hostname:s@" => { name => 'ami_hostname' }, + "ami-port:s@" => { name => 'ami_port' }, + "ami-username:s@" => { name => 'ami_username' }, + "ami-password:s@" => { name => 'ami_password' }, + "timeout:s@" => { name => 'timeout' }, + }); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{mode} = $options{mode}; + $self->{cnx_ami} = undef; + + return $self; + +} + +sub set_options { + my ($self, %options) = @_; + + $self->{option_results} = $options{option_results}; +} + +sub set_defaults { + my ($self, %options) = @_; + + foreach (keys %{$options{default}}) { + if ($_ eq $self->{mode}) { + for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { + foreach my $opt (keys %{$options{default}->{$_}[$i]}) { + if (!defined($self->{option_results}->{$opt}[$i])) { + $self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt}; + } + } + } + } + } +} + +sub check_options { + my ($self, %options) = @_; + + $self->{ami_hostname} = (defined($self->{option_results}->{ami_hostname})) ? shift(@{$self->{option_results}->{ami_hostname}}) : undef; + $self->{ami_username} = (defined($self->{option_results}->{ami_username})) ? shift(@{$self->{option_results}->{ami_username}}) : undef; + $self->{ami_password} = (defined($self->{option_results}->{ami_password})) ? shift(@{$self->{option_results}->{ami_password}}) : undef; + $self->{ami_port} = (defined($self->{option_results}->{ami_port})) ? shift(@{$self->{option_results}->{ami_port}}) : 5038; + $self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10; + + if (!defined($self->{ami_hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify --ami-hostname option."); + $self->{output}->option_exit(); + } + if (!defined($self->{ami_username})) { + $self->{output}->add_option_msg(short_msg => "Need to specify --ami-username option."); + $self->{output}->option_exit(); + } + if (!defined($self->{ami_password})) { + $self->{output}->add_option_msg(short_msg => "Need to specify --ami-password option."); + $self->{output}->option_exit(); + } + + if (!defined($self->{ami_hostname}) || + scalar(@{$self->{option_results}->{ami_hostname}}) == 0) { + return 0; + } + + return 1; +} + +sub get_connect_info { + my ($self, %options) = @_; + + return $self->{ami_hostname} . '_' . $self->{ami_port}; +} + +sub read_ami_protocol_end { + my ($self, %options) = @_; + + if (defined($options{response})) { + if ($options{response} eq 'Follows') { + return 1 if ($options{message} =~ /^--END COMMAND--/ms); + } else { + return 1 if ($options{message} =~ /^Message: (.*)(\r\n)/ms); + } + } + + return 0; +} + +sub read_ami_protocol { + my ($self, %options) = @_; + + my $select = IO::Select->new($self->{cnx_ami}); + # Two types of message: + # Response: Error + # Message: Authentication failed + # + # Response: Follows + # ... + # --END COMMAND-- + + my ($response, $read_msg); + my $message = ''; + while (1) { + if (!$select->can_read(10)) { + $response = 'Timeout'; + last; + } + + my $status = $self->{cnx_ami}->recv($read_msg, 4096); + if (!defined($response)) { + next if ($read_msg !~ /^Response: (.*?)(?:\r\n|\n)(.*)/ms); + ($response, $message) = ($1, $2); + } else { + $message .= $read_msg; + } + + last if ($self->read_ami_protocol_end(response => $response, message => $message)); + } + + $message =~ s/\r//msg; + if ($response !~ /Success|Follows/) { + $message =~ s/\n+$//msg; + $message =~ s/\n/ -- /msg; + $self->{output}->add_option_msg(short_msg => "Communication issue [" . $message . "]"); + $self->{output}->option_exit(); + } + + $self->{output}->output_add(long_msg => $message, debug => 1); + return $message; +} + +sub write_ami_protocol { + my ($self, %options) = @_; + + $self->{cnx_ami}->send($options{cmd}); +} + +sub login { + my ($self, %options) = @_; + + $self->write_ami_protocol(cmd => "Action:login +Username:$self->{ami_username} +Secret:$self->{ami_password} +Events: off + +"); + # don't need to get it. If it comes, it's success :) + $self->read_ami_protocol(); +} + +sub connect { + my ($self, %options) = @_; + + $self->{cnx_ami} = IO::Socket::INET->new( + PeerAddr => $self->{ami_hostname}, + PeerPort => $self->{ami_port}, + Proto => 'tcp', + Timeout => $self->{timeout}, + ); + if (!defined($self->{cnx_ami})) { + $self->{output}->add_option_msg(short_msg => "Can't bind : $@"); + $self->{output}->option_exit(); + } + + $self->{cnx_ami}->autoflush(1); + $self->login(); +} + +sub command { + my ($self, %options) = @_; + + if (!defined($self->{cnx_ami})) { + $self->connect(); + } + + $self->write_ami_protocol(cmd => "Action:command +Command:$options{cmd} + +"); + return $self->read_ami_protocol(); +} + +sub DESTROY { + my $self = shift; + + if (defined($self->{cnx_ami})) { + $self->{cnx_ami}->close(); + } +} + +1; + +__END__ + +=head1 NAME + +Asterisk AMI + +=head1 SYNOPSIS + +Asterisk AMI custom mode + +=head1 AMI API OPTIONS + +=over 8 + +=item B<--ami-hostname> + +AMI hostname (Required). + +=item B<--ami-port> + +AMI port (Default: 5038). + +=item B<--ami-username> + +AMI username. + +=item B<--ami-password> + +AMI password. + +=item B<--timeout> + +Set TCP timeout + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon-plugins/apps/voip/asterisk/ami/mode/channelusage.pm b/centreon-plugins/apps/voip/asterisk/ami/mode/channelusage.pm new file mode 100644 index 000000000..e3f2b4e2a --- /dev/null +++ b/centreon-plugins/apps/voip/asterisk/ami/mode/channelusage.pm @@ -0,0 +1,132 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::asterisk::ami::mode::channelusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'channels-active', set => { + key_values => [ { name => 'channels_active' } ], + output_template => 'Channels Active: %s', + perfdatas => [ + { label => 'channels_active', value => 'channels_active_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'calls-active', set => { + key_values => [ { name => 'calls_active' } ], + output_template => 'Calls Active: %s', + perfdatas => [ + { label => 'calls_active', value => 'calls_active_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'extcalls-active', set => { + key_values => [ { name => 'extcalls_active' } ], + output_template => 'External Calls Active: %s', + perfdatas => [ + { label => 'extcalls_active', value => 'extcalls_active_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'calls-count', set => { + key_values => [ { name => 'calls_count', diff => 1 } ], + output_template => 'Calls Count: %s', + perfdatas => [ + { label => 'calls_count', value => 'calls_count_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->command(cmd => 'core show channels'); + $self->{global} = { channels_active => 0, calls_active => 0, + calls_count => undef, extcalls_active => 0 }; + + $self->{global}->{channels_active} = $1 + if ($result =~ /^(\d+)\s+active\s+channels/ms); + $self->{global}->{calls_active} = $1 + if ($result =~ /^(\d+)\s+active\s+calls/ms); + $self->{global}->{calls_count} = $1 + if ($result =~ /^(\d+)\s+calls\s+processed/ms); + + my $count = 0; + $count++ while ($result =~ /Outgoing\s+Line/msig); + $self->{global}->{extcalls_active} = $count; + + $self->{cache_name} = "asterisk_" . '_' . $self->{mode} . '_' . $options{custom}->get_connect_info() . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check channel usage: active calls, external calls. + +=over 8 + +=item B<--warning-*> + +Threshold warning. +Can be: 'channels-active', 'calls-active', 'extcalls-active', +'calls-count'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'channels-active', 'calls-active', 'extcalls-active', +'calls-count'. + +=back + +=cut diff --git a/centreon-plugins/apps/voip/asterisk/ami/mode/dahdistatus.pm b/centreon-plugins/apps/voip/asterisk/ami/mode/dahdistatus.pm new file mode 100644 index 000000000..9c48d8ae8 --- /dev/null +++ b/centreon-plugins/apps/voip/asterisk/ami/mode/dahdistatus.pm @@ -0,0 +1,192 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::asterisk::ami::mode::dahdistatus; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + my $label = $self->{label}; + $label =~ s/-/_/g; + if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'critical_' . $label}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'warning_' . $label}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf('status : %s', $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{description} = $options{new_datas}->{$self->{instance} . '_description'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'dahdi', type => 1, cb_prefix_output => 'prefix_dahdi_output', message_multiple => 'All dahdi lines are ok' }, + ]; + + $self->{maps_counters}->{dahdi} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'description' }, { name => 'status' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-description:s" => { name => 'filter_description' }, + "warning-status:s" => { name => 'warning_status', default => '%{status} =~ /UNCONFIGURED|YEL|BLU/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /RED/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_dahdi_output { + my ($self, %options) = @_; + + return "Line '" . $options{instance_value}->{description} . "' "; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub manage_selection { + my ($self, %options) = @_; + + # Status can be: OK, UNCONFIGURED, BLU, YEL, RED, REC (recover), NOP (notopen), UUU + + #Description Alarms IRQ bpviol CRC4 + #Wildcard TDM410P Board 1 OK 0 0 0 + #Wildcard TDM800P Board 2 OK 0 0 0 + + #Description Alarms IRQ bpviol CRC Fra Codi Options LBO + #Wildcard TE131/TE133 Card 0 BLU/RED 0 0 0 CCS HDB3 0 db (CSU)/0-133 feet (DSX-1) + my $result = $options{custom}->command(cmd => 'dahdi show status'); + + $self->{dahdi} = {}; + foreach my $line (split /\n/, $result) { + if ($line =~ /^(.*?)\s+((?:OK|UNCONFIGURED|BLU|YEL|RED|REC|NOP|UUU)[^\s]*)\s+/msg) { + my ($description, $status) = ($1, $2); + if (defined($self->{option_results}->{filter_description}) && $self->{option_results}->{filter_description} ne '' && + $description !~ /$self->{option_results}->{filter_description}/) { + $self->{output}->output_add(long_msg => "skipping '" . $description . "': no matching filter.", debug => 1); + next; + } + + $self->{dahdi}->{$description} = { + description => $description, + status => $status, + }; + } + } + + if (scalar(keys %{$self->{dahdi}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No dahdi lines found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check status of dahdi lines. + +=over 8 + +=item B<--filter-description> + +Filter dahdi description (can be a regexp). + +=item B<--warning-status> + +Set warning threshold for status (Default: '%{status} =~ /UNCONFIGURED|YEL|BLU/i'). +Can used special variables like: %{description}, %{status} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /RED/i'). +Can used special variables like: %{description}, %{status} + +=back + +=cut diff --git a/centreon-plugins/apps/voip/asterisk/ami/mode/sippeersusage.pm b/centreon-plugins/apps/voip/asterisk/ami/mode/sippeersusage.pm new file mode 100644 index 000000000..c926ceeb3 --- /dev/null +++ b/centreon-plugins/apps/voip/asterisk/ami/mode/sippeersusage.pm @@ -0,0 +1,252 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::asterisk::ami::mode::sippeersusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + my $label = $self->{label}; + $label =~ s/-/_/g; + if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'critical_' . $label}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'warning_' . $label}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf('status : %s', $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{name} = $options{new_datas}->{$self->{instance} . '_name'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'sip', type => 1, cb_prefix_output => 'prefix_sip_output', message_multiple => 'All SIP peers are ok' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'total-peers', set => { + key_values => [ { name => 'total_peers' } ], + output_template => 'Total Peers: %s', + perfdatas => [ + { label => 'total_peers', value => 'total_peers_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'monitor-online-peers', set => { + key_values => [ { name => 'monitor_online_peers' } ], + output_template => 'Monitor Online Peers: %s', + perfdatas => [ + { label => 'monitor_online_peers', value => 'monitor_online_peers_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'monitor-offline-peers', set => { + key_values => [ { name => 'monitor_offline_peers' } ], + output_template => 'Monitor Offline Peers: %s', + perfdatas => [ + { label => 'monitor_offline_peers', value => 'monitor_offline_peers_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'unmonitor-online-peers', set => { + key_values => [ { name => 'unmonitor_online_peers' } ], + output_template => 'Unmonitor Online Peers: %s', + perfdatas => [ + { label => 'unmonitor_online_peers', value => 'unmonitor_online_peers_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'unmonitor-offline-peers', set => { + key_values => [ { name => 'unmonitor_offline_peers' } ], + output_template => 'Unmonitor Offline Peers: %s', + perfdatas => [ + { label => 'unmonitor_offline_peers', value => 'unmonitor_offline_peers_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; + $self->{maps_counters}->{sip} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'name' }, { name => 'status' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + "warning-status:s" => { name => 'warning_status', default => '%{status} =~ /LAGGED|UNKNOWN/i' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /UNREACHABLE/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_sip_output { + my ($self, %options) = @_; + + return "Peer '" . $options{instance_value}->{name} . "' "; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub manage_selection { + my ($self, %options) = @_; + + # Status can be: UNREACHABLE, LAGGED (%d ms), OK (%d ms), UNKNOWN, Unmonitored + + #Name/username Host Dyn Forcerport Comedia ACL Port Status Description + #02l44k/02l44k 10.9.0.61 D No No 5060 Unmonitored + #0rafkw/0rafkw 10.9.0.28 D No No 5060 Unmonitored + #... + #55 sip peers [Monitored: 0 online, 0 offline Unmonitored: 43 online, 12 offline] + my $result = $options{custom}->command(cmd => 'sip show peers'); + + $self->{sip} = {}; + foreach my $line (split /\n/, $result) { + if ($line =~ /^(.*?)\s+.*(UNREACHABLE|LAGGED|OK|UNKNOWN|Unmonitored)\s/msg) { + my ($name, $status) = ($1, $2); + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{sip}->{$name} = { + name => $name, + status => $status, + }; + } + } + + $self->{global} = { + total_peers => $1, + monitor_online_peers => $2, monitor_offline_peers => $3, + unmonitor_online_peers => $4, unmonitor_offline_peers => $5, + } if ($result =~ /(\d+) sip peers \[Monitored: (\d+) online, (\d+) offline Unmonitored: (\d+) online, (\d+) offline]/msi); + + if (scalar(keys %{$self->{sip}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No sip peers found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check SIP peers usage. + +=over 8 + +=item B<--filter-name> + +Filter sip peer name (can be a regexp). + +=item B<--warning-status> + +Set warning threshold for status (Default: '%{status} =~ /LAGGED|UNKNOWN/i'). +Can used special variables like: %{name}, %{status} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /UNREACHABLE/i'). +Can used special variables like: %{name}, %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'total-peers', 'monitor-online-peers', 'monitor-offline-peers', +'unmonitor-online-peers', 'unmonitor-offline-peers'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'total-peers', 'monitor-online-peers', 'monitor-offline-peers', +'unmonitor-online-peers', 'unmonitor-offline-peers'. + +=back + +=cut diff --git a/centreon-plugins/apps/voip/asterisk/remote/plugin.pm b/centreon-plugins/apps/voip/asterisk/ami/plugin.pm similarity index 63% rename from centreon-plugins/apps/voip/asterisk/remote/plugin.pm rename to centreon-plugins/apps/voip/asterisk/ami/plugin.pm index 40a94a11a..543256fa8 100644 --- a/centreon-plugins/apps/voip/asterisk/remote/plugin.pm +++ b/centreon-plugins/apps/voip/asterisk/ami/plugin.pm @@ -18,36 +18,34 @@ # limitations under the License. # -package apps::voip::asterisk::remote::plugin; +package apps::voip::asterisk::ami::plugin; use strict; use warnings; -use base qw(centreon::plugins::script_simple); +use base qw(centreon::plugins::script_custom); sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); bless $self, $class; - $self->{version} = '1.1'; + $self->{version} = '1.0'; %{$self->{modes}} = ( - 'showpeers' => 'apps::voip::asterisk::remote::mode::showpeers', - 'dahdistatus' => 'apps::voip::asterisk::remote::mode::dahdistatus', - 'activecalls' => 'apps::voip::asterisk::remote::mode::activecalls', - 'externalcalls' => 'apps::voip::asterisk::remote::mode::externalcalls', - ); + 'channel-usage' => 'apps::voip::asterisk::ami::mode::channelusage', + 'dahdi-status' => 'apps::voip::asterisk::ami::mode::dahdistatus', + 'sip-peers-usage' => 'apps::voip::asterisk::ami::mode::sippeersusage', + ); + $self->{custom_modes}{api} = 'apps::voip::asterisk::ami::custom::api'; return $self; } - 1; __END__ =head1 PLUGIN DESCRIPTION -Check Asterisk through AMI interface (AMI socket; telnet perl module required) +Check Asterisk through AMI interface. =cut diff --git a/centreon-plugins/apps/voip/asterisk/remote/lib/ami.pm b/centreon-plugins/apps/voip/asterisk/remote/lib/ami.pm deleted file mode 100644 index afc346116..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/lib/ami.pm +++ /dev/null @@ -1,103 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::remote::lib::ami; - -use strict; -use warnings; -use Net::Telnet; - -my $ami_handle; -my $line; -my @lines; -my @result; - -sub quit { - $ami_handle->print("Action: logoff"); - $ami_handle->print(""); - $ami_handle->close(); -} - -sub connect { - my ($self, %options) = @_; - - my $connection_exit = defined($options{connection_exit}) ? $options{connection_exit} : 'unknown'; - - $ami_handle = new Net::Telnet (Telnetmode => 0, - Timeout => $self->{option_results}->{timeout}, - Errmode => 'return', - ); - - $ami_handle->open(Host => $self->{option_results}->{hostname}, - Port => $self->{option_results}->{port}, - ); - - if ($ami_handle->errmsg) { - $self->{output}->output_add(severity => $connection_exit, - short_msg => 'Unable to connect to AMI: ' . $ami_handle->errmsg); - $self->{output}->display(); - $self->{output}->exit(); - } - - # Check connection message. - $line = $ami_handle->getline; - if ($line !~ /^Asterisk/) { - $self->{output}->output_add(severity => $connection_exit, - short_msg => 'Unable to connect to AMI: ' . $line); - $self->{output}->display(); - $self->{output}->exit(); - } - - # Authentication. - $ami_handle->print("Action: login"); - $ami_handle->print("Username: $self->{option_results}->{username}"); - $ami_handle->print("Secret: $self->{option_results}->{password}"); - $ami_handle->print("Events: off"); - $ami_handle->print(""); - - # Check authentication message (second message). - $line = $ami_handle->getline; - $line = $ami_handle->getline; - if ($line !~ /^Message: Authentication accepted/) { - $self->{output}->output_add(severity => $connection_exit, - short_msg => 'Unable to connect to AMI: ' . $line); - $self->{output}->display(); - $self->{output}->exit(); - } - -} - -sub action { - my ($self) = @_; - - $ami_handle->print("Action: command"); - $ami_handle->print("Command: $self->{asterisk_command}"); - $ami_handle->print(""); - - - my @return; - while (my $line = $ami_handle->getline(Timeout => 1)) { - push(@return,$line); - next if ($line !~ /END COMMAND/o); - } - return @return; -} - -1; diff --git a/centreon-plugins/apps/voip/asterisk/remote/mode/activecalls.pm b/centreon-plugins/apps/voip/asterisk/remote/mode/activecalls.pm deleted file mode 100644 index 9fc86dece..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/mode/activecalls.pm +++ /dev/null @@ -1,223 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::remote::mode::activecalls; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::misc; -use apps::voip::asterisk::remote::lib::ami; - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $self->{version} = '0.2'; - - $options{options}->add_options(arguments => - { - "hostname:s" => { name => 'hostname' }, - "port:s" => { name => 'port', default => 5038 }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, - "remote:s" => { name => 'remote', default => 'ssh' }, - "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 }, - "command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' }, - "command-path:s" => { name => 'command_path', default => '/home/centreon/bin' }, - "protocol:s" => { name => 'protocol', }, - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - }); - $self->{result} = {}; - 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 => "Please set the --hostname option"); - $self->{output}->option_exit(); - } - - if ($self->{option_results}->{remote} eq 'ami') - { - if (!defined($self->{option_results}->{username})) { - $self->{output}->add_option_msg(short_msg => "Please set the --username option"); - $self->{output}->option_exit(); - } - - if (!defined($self->{option_results}->{password})) { - $self->{output}->add_option_msg(short_msg => "Please set the --password option"); - $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 manage_selection { - my ($self, %options) = @_; - my @result; - - $self->{asterisk_command} = 'core show channels'; - - if ($self->{option_results}->{remote} eq 'ami') - { - apps::voip::asterisk::remote::lib::ami::connect($self); - @result = apps::voip::asterisk::remote::lib::ami::action($self); - apps::voip::asterisk::remote::lib::ami::quit(); - } - else - { - my $stdout = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - command => $self->{option_results}->{command}, - command_path => $self->{option_results}->{command_path}, - command_options => "'".$self->{asterisk_command}."'", - ); - @result = split /\n/, $stdout; - } - - # Compute data - foreach my $line (@result) { - if ($line =~ /^(\d*) active call/) - { - $self->{result}->{activecalls} = {value => $1, status => '1'}; - } - elsif ($line =~ /^Unable to connect .*/) - { - $self->{result}->{activecalls} = {value => $line, status => '0'}; - } - } -} - -sub run { - my ($self, %options) = @_; - - my $msg; - my $old_status = 'ok'; - - $self->manage_selection(); - - # Send formated data to Centreon - if ($self->{result}->{activecalls}->{status} eq '0') - { - $self->{output}->output_add(severity => $self->{result}->{activecalls}->{status}, - short_msg => $self->{result}->{activecalls}->{value}); - $self->{output}->display(); - $self->{output}->exit(); - } - my $exit_code = $self->{perfdata}->threshold_check(value => $self->{result}->{activecalls}->{value}, - threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->perfdata_add(label => 'Active Calls', - value => $self->{result}->{activecalls}->{value}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0); - - $self->{output}->output_add(severity => $exit_code, - short_msg => sprintf("Current active calls: %s", $self->{result}->{activecalls}->{value}) - ); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Show number of current active calls - -=over 8 - -=item B<--warning> - -Threshold warning. - -=item B<--critical> - -Threshold critical. - -=item B<--remote> - -Execute command remotely; can be 'ami' or 'ssh' (default: ssh). - -=item B<--hostname> - -Hostname to query (need --remote option). - -=item B<--port> - -AMI remote port (default: 5038). - -=item B<--username> - -AMI username. - -=item B<--password> - -AMI password. - -=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<--command> - -Command to get information (Default: 'asterisk_sendcommand.pm'). -Can be changed if you have output in a file. - -=item B<--command-path> - -Command path (Default: /home/centreon/bin). - -=back - -=cut diff --git a/centreon-plugins/apps/voip/asterisk/remote/mode/dahdistatus.pm b/centreon-plugins/apps/voip/asterisk/remote/mode/dahdistatus.pm deleted file mode 100644 index 027b5b886..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/mode/dahdistatus.pm +++ /dev/null @@ -1,230 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::remote::mode::dahdistatus; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::misc; -use apps::voip::asterisk::remote::lib::ami; - -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' }, - "port:s" => { name => 'port', default => 5038 }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, - "remote:s" => { name => 'remote', default => 'ssh' }, - "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 }, - "command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' }, - "command-path:s" => { name => 'command_path', default => '/home/centreon/bin' }, - "filter-name:s" => { name => 'filter_name', }, - }); - $self->{result} = {}; - 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 => "Please set the --hostname option"); - $self->{output}->option_exit(); - } - - if ($self->{option_results}->{remote} eq 'ami') - { - if (!defined($self->{option_results}->{username})) { - $self->{output}->add_option_msg(short_msg => "Please set the --username option"); - $self->{output}->option_exit(); - } - - if (!defined($self->{option_results}->{password})) { - $self->{output}->add_option_msg(short_msg => "Please set the --password option"); - $self->{output}->option_exit(); - } - } -} - -sub manage_selection { - my ($self, %options) = @_; - my @result; - - $self->{asterisk_command} = 'dahdi show status'; - - if ($self->{option_results}->{remote} eq 'ami') - { - apps::voip::asterisk::remote::lib::ami::connect($self); - @result = apps::voip::asterisk::remote::lib::ami::action($self); - apps::voip::asterisk::remote::lib::ami::quit(); - } - else - { - my $stdout = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - command => $self->{option_results}->{command}, - command_path => $self->{option_results}->{command_path}, - command_options => "'".$self->{asterisk_command}."'", - ); - @result = split /\n/, $stdout; - } - - # Compute data - foreach my $line (@result) { - if ($line =~ /^Description /) - { - next; - } - if ($line =~ /^(.{41})(\w*).*/) - { - my $status; - my ($trunkname, $trunkstatus) = ($1, $2); - $trunkname =~ s/^\s+|\s+$//g; - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $trunkname !~ /$self->{option_results}->{filter_name}/) - { - $self->{output}->output_add(long_msg => "Skipping trunk '" . $trunkname . "': no matching filter name"); - next; - } - if ($trunkstatus eq 'Red' | $trunkstatus eq 'Yel' | $trunkstatus eq 'Blu') - { - $status = 'CRITICAL'; - } - elsif ($trunkstatus eq 'Unconfi') - { - $status = 'WARNING'; - } - $self->{result}->{$trunkname} = {name => $trunkname, status => $status, realstatus => $trunkstatus}; - } - elsif ($line =~ /^Unable to connect .*/) - { - $self->{result}->{$line} = {name => $line, status => 'CRITICAL'}; - } - } -} - -sub run { - my ($self, %options) = @_; - - my $msg; - my $old_status = 'ok'; - - $self->manage_selection(); - - # Send formated data to Centreon - if (scalar keys %{$self->{result}} >= 1) - { - $self->{output}->output_add(severity => 'OK', - short_msg => 'Everything is OK'); - } - else - { - $self->{output}->output_add(severity => 'Unknown', - short_msg => 'Nothing to be monitored'); - } - - foreach my $name (sort(keys %{$self->{result}})) { - if (!$self->{output}->is_status(value => $self->{result}->{$name}->{status}, compare => 'ok', litteral => 1)) - { - $msg = sprintf("Trunk: %s", $self->{result}->{$name}->{name}); - $self->{output}->output_add(severity => $self->{result}->{$name}->{status}, - short_msg => $msg); - } - $self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{realstatus})); - } - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Show status of dahdi lines. - -=over 8 - -=item B<--remote> - -Execute command remotely; can be 'ami' or 'ssh' (default: ssh). - -=item B<--hostname> - -Hostname to query (need --remote option). - -=item B<--port> - -AMI remote port (default: 5038). - -=item B<--username> - -AMI username. - -=item B<--password> - -AMI password. - -=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<--command> - -Command to get information (Default: 'asterisk_sendcommand.pm'). -Can be changed if you have output in a file. - -=item B<--command-path> - -Command path (Default: /home/centreon/bin). - -=item B<--filter-name> - -Filter on trunkname (regexp can be used). - -=back - -=cut \ No newline at end of file diff --git a/centreon-plugins/apps/voip/asterisk/remote/mode/externalcalls.pm b/centreon-plugins/apps/voip/asterisk/remote/mode/externalcalls.pm deleted file mode 100644 index 6144885af..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/mode/externalcalls.pm +++ /dev/null @@ -1,213 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::remote::mode::externalcalls; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::misc; -use apps::voip::asterisk::remote::lib::ami; - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $self->{version} = '0.1'; - - $options{options}->add_options(arguments => - { - "hostname:s" => { name => 'hostname' }, - "port:s" => { name => 'port', default => 5038 }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, - "remote:s" => { name => 'remote', default => 'ssh' }, - "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 }, - "command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' }, - "command-path:s" => { name => 'command_path', default => '/home/centreon/bin' }, - "protocol:s" => { name => 'protocol', }, - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - }); - $self->{result} = {}; - 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 => "Please set the --hostname option"); - $self->{output}->option_exit(); - } - - if ($self->{option_results}->{remote} eq 'ami') - { - if (!defined($self->{option_results}->{username})) { - $self->{output}->add_option_msg(short_msg => "Please set the --username option"); - $self->{output}->option_exit(); - } - - if (!defined($self->{option_results}->{password})) { - $self->{output}->add_option_msg(short_msg => "Please set the --password option"); - $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 manage_selection { - my ($self, %options) = @_; - my @result; - - $self->{asterisk_command} = 'core show channels'; - - if ($self->{option_results}->{remote} eq 'ami') - { - apps::voip::asterisk::remote::lib::ami::connect($self); - @result = apps::voip::asterisk::remote::lib::ami::action($self); - apps::voip::asterisk::remote::lib::ami::quit(); - } - else - { - my $stdout = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - command => $self->{option_results}->{command}, - command_path => $self->{option_results}->{command_path}, - command_options => "'".$self->{asterisk_command}."'", - ); - @result = split /\n/, $stdout; - } - - # Compute data - $self->{option_results}->{extcallcounter} = '0'; - foreach my $line (@result) { - if ($line =~ /Outgoing Line/m) - { - $self->{option_results}->{extcallcounter}++; - } - } -} - -sub run { - my ($self, %options) = @_; - - my $msg; - my $old_status = 'ok'; - - $self->manage_selection(); - - # Send formated data to Centreon - my $exit_code = $self->{perfdata}->threshold_check(value => $self->{option_results}->{extcallcounter}, - threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->perfdata_add(label => 'External Calls', - value => $self->{option_results}->{extcallcounter}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0); - - $self->{output}->output_add(severity => $exit_code, - short_msg => sprintf("Current external calls: %s", $self->{option_results}->{extcallcounter}) - ); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Show number of current external calls - -=over 8 - -=item B<--warning> - -Threshold warning. - -=item B<--critical> - -Threshold critical. - -=item B<--remote> - -Execute command remotely; can be 'ami' or 'ssh' (default: ssh). - -=item B<--hostname> - -Hostname to query (need --remote option). - -=item B<--port> - -AMI remote port (default: 5038). - -=item B<--username> - -AMI username. - -=item B<--password> - -AMI password. - -=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<--command> - -Command to get information (Default: 'asterisk_sendcommand.pm'). -Can be changed if you have output in a file. - -=item B<--command-path> - -Command path (Default: /home/centreon/bin). - -=back - -=cut diff --git a/centreon-plugins/apps/voip/asterisk/remote/mode/showpeers.pm b/centreon-plugins/apps/voip/asterisk/remote/mode/showpeers.pm deleted file mode 100644 index 6d92077c7..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/mode/showpeers.pm +++ /dev/null @@ -1,277 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::remote::mode::showpeers; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::misc; -use apps::voip::asterisk::remote::lib::ami; - -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' }, - "port:s" => { name => 'port', default => 5038 }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, - "remote:s" => { name => 'remote', default => 'ssh' }, - "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 }, - "command:s" => { name => 'command', default => 'asterisk_sendcommand.pm' }, - "command-path:s" => { name => 'command_path', default => '/home/centreon/bin' }, - "protocol:s" => { name => 'protocol', }, - "filter-name:s" => { name => 'filter_name', }, - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - }); - $self->{result} = {}; - 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 => "Please set the --hostname option"); - $self->{output}->option_exit(); - } - - if ($self->{option_results}->{remote} eq 'ami') - { - if (!defined($self->{option_results}->{username})) { - $self->{output}->add_option_msg(short_msg => "Please set the --username option"); - $self->{output}->option_exit(); - } - - if (!defined($self->{option_results}->{password})) { - $self->{output}->add_option_msg(short_msg => "Please set the --password option"); - $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 manage_selection { - my ($self, %options) = @_; - my @result; - - if ($self->{option_results}->{protocol} eq 'sip' || $self->{option_results}->{protocol} eq 'SIP') - { - $self->{asterisk_command} = 'sip show peers'; - } - elsif ($self->{option_results}->{protocol} eq 'iax' || $self->{option_results}->{protocol} eq 'IAX') - { - $self->{asterisk_command} = 'iax2 show peers'; - } - - if ($self->{option_results}->{remote} eq 'ami') - { - apps::voip::asterisk::remote::lib::ami::connect($self); - @result = apps::voip::asterisk::remote::lib::ami::action($self); - apps::voip::asterisk::remote::lib::ami::quit(); - } - else - { - my $stdout = centreon::plugins::misc::execute(output => $self->{output}, - options => $self->{option_results}, - command => $self->{option_results}->{command}, - command_path => $self->{option_results}->{command_path}, - command_options => "'".$self->{asterisk_command}."'", - ); - @result = split /\n/, $stdout; - } - - # Compute data - foreach my $line (@result) { - if ($line =~ /^([\w\-\/]*) *\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} .* (OK) \((.*) (.*)\)/) - { - my ($trunkname, $trunkstatus, $trunkvalue, $trunkunit) = ($1, $2, $3, $4); - - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $trunkname !~ /$self->{option_results}->{filter_name}/) - { - $self->{output}->output_add(long_msg => "Skipping trunk '" . $trunkname . "': no matching filter name"); - next; - } - - $self->{result}->{$trunkname} = {name => $trunkname, status => 'OK', - realstatus => $trunkstatus, - value => $trunkvalue, - unit => $trunkunit}; - } - elsif ($line =~ /^([\w\-\/]*) *\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} .* (Unreachable)/) - { - my ($trunkname, $trunkstatus) = ($1, $2); - $self->{result}->{$trunkname} = {name => $trunkname, status => 'CRITICAL', realstatus => $trunkstatus}; - } - elsif ($line =~ /^Unable to connect .*/) - { - $self->{result}->{$line} = {name => $line, status => 'CRITICAL', realstatus => 'Unreachable'}; - } - } -} - -sub run { - my ($self, %options) = @_; - - my $msg; - my $old_status = 'ok'; - - $self->manage_selection(); - - # Send formated data to Centreon - if (scalar keys %{$self->{result}} >= 1) - { - $self->{output}->output_add(severity => 'OK', - short_msg => 'Everything is OK'); - } - else - { - $self->{output}->output_add(severity => 'Unknown', - short_msg => 'Nothing to be monitored'); - } - - foreach my $name (sort(keys %{$self->{result}})) { - if (defined($self->{result}->{$name}->{value}) && defined($self->{result}->{$name}->{unit})) - { - $self->{result}->{$name}->{status} = $self->{perfdata}->threshold_check(value => $self->{result}->{$name}->{value}, - threshold => [{ label => 'critical', exit_litteral => 'critical' }, - { label => 'warning', exit_litteral => 'warning' }]); - $self->{output}->perfdata_add(label => $self->{result}->{$name}->{name}, - value => $self->{result}->{$name}->{value}.$self->{result}->{$name}->{unit}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0); - } - - if (!$self->{output}->is_status(value => $self->{result}->{$name}->{status}, compare => 'ok', litteral => 1)) - { - $msg = sprintf("Trunk: %s", $self->{result}->{$name}->{name}); - $self->{output}->output_add(severity => $self->{result}->{$name}->{status}, - short_msg => $msg); - if ($self->{result}->{$name}->{realstatus} eq 'Unreachable') - { - $self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{realstatus})); - } - else - { - $self->{output}->output_add(long_msg => sprintf("%s : %s", $self->{result}->{$name}->{name}, $self->{result}->{$name}->{value})); - } - } - } - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Show peers for different protocols. - -=over 8 - -=item B<--warning> - -Threshold warning. - -=item B<--critical> - -Threshold critical. - -=item B<--remote> - -Execute command remotely; can be 'ami' or 'ssh' (default: ssh). - -=item B<--hostname> - -Hostname to query (need --remote option). - -=item B<--port> - -AMI remote port (default: 5038). - -=item B<--username> - -AMI username. - -=item B<--password> - -AMI password. - -=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<--command> - -Command to get information (Default: 'asterisk_sendcommand.pm'). -Can be changed if you have output in a file. - -=item B<--command-path> - -Command path (Default: /home/centreon/bin). - -=item B<--filter-name> - -Filter on trunkname (regexp can be used). - -=item B<--protocol> - -show peer for the choosen protocol (sip or iax). - -=back - -=cut \ No newline at end of file diff --git a/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_centreon.conf b/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_centreon.conf deleted file mode 100644 index 0d3576665..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_centreon.conf +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_sendcommand.pm b/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_sendcommand.pm deleted file mode 100755 index 0b30a7050..000000000 --- a/centreon-plugins/apps/voip/asterisk/remote/remote-script/asterisk_sendcommand.pm +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2005 Rodolphe Quiedeville -# -# 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; version 2 dated June, -# 1991. -# -# 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, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# If you improve this script please send your version to my email address -# with the copyright notice upgrade with your name. -# -# -# $Log$ -# Revision 1.0 2015/01/16 11:15 David Sabatie -# Release based on already existing munin script -# -# Parameters mandatory: -# -# username -# secret -# -#%# family=asterisk -#%# capabilities=autoconf - -use strict; -use File::Basename; - -my $ret = undef; -if (! eval "require Net::Telnet;") -{ - $ret = "Net::Telnet not found"; -} - -my $DIRNAME=dirname($0); -my $conffile=$DIRNAME."/asterisk_centreon.conf"; - -my $command; -if ( (defined($ARGV[0])) && ($ARGV[0] ne '') ) -{ - $command = $ARGV[0]; -} -else -{ - print 'No command to send'; - exit; -} - -my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1"; -my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038"; - -#[asterisk_*] -#env.username xivo_centreon_user -#env.secret secretpass - -my ($username, $secret); - -open FILE, $conffile or die $!; -while (my $confline = ) -{ - ($username, $secret) = split(' ', $confline); -} -close(FILE); - -my $pop = new Net::Telnet (Telnetmode => 0); -$pop->open(Host => $host, - Port => $port); - -## Read connection message. -my $line = $pop->getline; -die $line unless $line =~ /^Asterisk/; - -## Send user name. -$pop->print("Action: login"); -$pop->print("Username: $username"); -$pop->print("Secret: $secret"); -$pop->print("Events: off"); -$pop->print(""); - -#Response: Success -#Message: Authentication accepted - -$line = $pop->getline; -$line = $pop->getline; -if ($line !~ /^Message: Authentication accepted/) { - print 'Unable to connect to AMI: ' . $line; - exit; -} - -## Request status of messages. -$pop->print("Action: command"); -$pop->print("Command: ".$command); -$pop->print(""); -$line = $pop->getline; -$line = $pop->getline; -$line = $pop->getline; -while (($line = $pop->getline) and ($line !~ /END COMMAND/o)) -{ - print $line; -} -$pop->print("Action: logoff"); -$pop->print(""); -$pop->close(); - -# vim:syntax=perl diff --git a/centreon-plugins/apps/voip/asterisk/snmp/mode/activecalls.pm b/centreon-plugins/apps/voip/asterisk/snmp/mode/activecalls.pm deleted file mode 100644 index c9cf8fe06..000000000 --- a/centreon-plugins/apps/voip/asterisk/snmp/mode/activecalls.pm +++ /dev/null @@ -1,127 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::snmp::mode::activecalls; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::statefile; - -my $oid_astBase = '.1.3.6.1.4.1.22736'; -my $oid_astConfigCallsActive = $oid_astBase.'.1.2.5.0'; -#my $oid_AsteriskConfigCallsProcessed = $oid_AsteriskBase.'.1.2.6.0'; - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $self->{version} = '1.1'; - $options{options}->add_options(arguments => - { - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - "force-oid:s" => { name => 'force_oid', }, - }); - $self->{statefile_value} = centreon::plugins::statefile->new(%options); - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); - $self->{output}->option_exit(); - } - - $self->{statefile_value}->check_options(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my ($result, $value); - - if (defined($self->{option_results}->{force_oid})) { - $result = $self->{snmp}->get_leef(oids => [ $self->{option_results}->{force_oid} ], nothing_quit => 1); - $value = $result->{$self->{option_results}->{force_oid}}; - } else { - $result = $self->{snmp}->get_leef(oids => [ $oid_astConfigCallsActive ], nothing_quit => 1); - $value = $result->{$oid_astConfigCallsActive}; - } - - if (!defined($value)) { - $self->{output}->output_add(severity => 'Unknown', - short_msg => sprintf("No information available for active channel") - ); - $self->{output}->display(); - $self->{output}->exit(); - } - - my $exit_code = $self->{perfdata}->threshold_check(value => $value, - threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->perfdata_add(label => 'Calls', - value => $value, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0); - - $self->{output}->output_add(severity => $exit_code, - short_msg => sprintf("Current active calls: %s", $value) - ); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check number of active calls. - -=over 8 - -=item B<--warning> - -Threshold warning. - -=item B<--critical> - -Threshold critical. - -=item B<--force-oid> - -Can choose your oid (numeric format only). - -=back - -=cut diff --git a/centreon-plugins/apps/voip/asterisk/snmp/mode/channelusage.pm b/centreon-plugins/apps/voip/asterisk/snmp/mode/channelusage.pm new file mode 100644 index 000000000..1fb70b503 --- /dev/null +++ b/centreon-plugins/apps/voip/asterisk/snmp/mode/channelusage.pm @@ -0,0 +1,121 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::asterisk::snmp::mode::channelusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + ]; + $self->{maps_counters}->{global} = [ + { label => 'channels-active', set => { + key_values => [ { name => 'channels_active' } ], + output_template => 'Channels Active: %s', + perfdatas => [ + { label => 'channels_active', value => 'channels_active_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'calls-active', set => { + key_values => [ { name => 'calls_active' } ], + output_template => 'Calls Active: %s', + perfdatas => [ + { label => 'calls_active', value => 'calls_active_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'calls-count', set => { + key_values => [ { name => 'calls_count', diff => 1 } ], + output_template => 'Calls Count: %s', + perfdatas => [ + { label => 'calls_count', value => 'calls_count_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_astConfigCallsActive = '.1.3.6.1.4.1.22736.1.2.5.0'; + my $oid_astConfigCallsProcessed = '.1.3.6.1.4.1.22736.1.2.6.0'; + my $oid_astNumChannels = '.1.3.6.1.4.1.22736.1.5.1.0'; + my $result = $options{snmp}->get_leef(oids => [$oid_astConfigCallsActive, $oid_astConfigCallsProcessed, $oid_astNumChannels], nothing_quit => 1); + + $self->{cache_name} = "asterisk_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); + + $self->{global} = { + calls_active => $result->{$oid_astConfigCallsActive}, + calls_count => $result->{$oid_astConfigCallsProcessed}, + channels_active => $result->{$oid_astNumChannels}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check channel usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='calls-active' + +=item B<--warning-*> + +Threshold warning. +Can be: 'channels-active', 'calls-active', 'calls-count'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'channels-active', 'calls-active', 'calls-count'. + +=back + +=cut diff --git a/centreon-plugins/apps/voip/asterisk/snmp/mode/externalcalls.pm b/centreon-plugins/apps/voip/asterisk/snmp/mode/externalcalls.pm deleted file mode 100644 index 31748c3f8..000000000 --- a/centreon-plugins/apps/voip/asterisk/snmp/mode/externalcalls.pm +++ /dev/null @@ -1,224 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::asterisk::snmp::mode::externalcalls; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use centreon::plugins::statefile; - -my $oid_astBase = '.1.3.6.1.4.1.22736'; -my $oid_astConfigCallsActive = $oid_astBase.'.1.2.5.0'; -my $oid_astChanName = $oid_astBase.'.1.5.2.1.2'; # need an index at the end -my $oid_astChanIndex = $oid_astBase.'.1.5.2.1.1'; # need an index at the end -my $oid_astNumChannels = $oid_astBase.'.1.5.1.0'; - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $self->{version} = '1.0'; - $options{options}->add_options(arguments => - { - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - "warnontrunk:s" => { name => 'warnontrunk', }, - "critontrunk:s" => { name => 'critontrunk', }, - "force-oid:s" => { name => 'force_oid', }, - "trunkusernamelist:s" => { name => 'trunkusernamelist', }, - "filter-name" => { name => 'filter-name' }, - }); - $self->{statefile_value} = centreon::plugins::statefile->new(%options); - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'warnontrunk', value => $self->{option_results}->{warnontrunk})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warnontrunk} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critontrunk', value => $self->{option_results}->{critontrunk})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critontrunk} . "'."); - $self->{output}->option_exit(); - } - if (!defined($self->{option_results}->{trunkusernamelist})) { - $self->{output}->add_option_msg(short_msg => "trunkusernamelist must be defined."); - $self->{output}->option_exit(); - } - - $self->{statefile_value}->check_options(%options); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - my ($result, $value); - my (@callsbytrunk, @error_msg, @msg); - - # explode trunk list - my @trunkusernamelist = split(',',$self->{option_results}->{trunkusernamelist}); - foreach my $trunk (@trunkusernamelist) - { - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $trunk !~ /$self->{option_results}->{filter_name}/) { - $self->{output}->output_add(long_msg => "Skipping trunk '" . $trunk . "': no matching filter name"); - next; - } - push @callsbytrunk , { trunk => $trunk, num => 0}; - } - # get chanName and sum calls for each - $result = $self->{snmp}->get_leef(oids => [ $oid_astNumChannels ], nothing_quit => 1); - my $astNumChannels = $result->{$oid_astNumChannels}; - my $astConfigCallsActive = 0; - foreach my $i (1..$astNumChannels) { - $result = $self->{snmp}->get_leef(oids => [ $oid_astChanName.'.'.$i ], nothing_quit => 1); - $value = $result->{$oid_astChanName.'.'.$i}; - $value =~ /^(.*)\/(.*)-.*/; - my ($protocol, $trunkname) = ($1, $2); - foreach my $val (@callsbytrunk) - { - if ( $val->{trunk} eq $trunkname ) - { - $val->{num} = $val->{num}+1; - $astConfigCallsActive = $astConfigCallsActive+1; - } - } - } - - # compute status based on total number of active calls - my $exit_code = $self->{perfdata}->threshold_check(value => $astConfigCallsActive, - threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - push @msg, {msg => sprintf("Current external calls: %s", $astConfigCallsActive)}; - - # Perfdata on all active calls - $self->{output}->perfdata_add(label => 'Total calls', - value => $astConfigCallsActive, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), - min => 0); - - # Perfdata on number of calls for each trunk - my ($temp_exit, $exit_msg); - my (@trunk_msg, @out_msg); - my $trunk_exit_code = 'ok'; - foreach $value (@callsbytrunk) - { - $temp_exit = $self->{perfdata}->threshold_check(value => $value->{num}, - threshold => [ { label => 'critontrunk', exit_litteral => 'critical' }, { label => 'warnontrunk', exit_litteral => 'warning' } ]); - $self->{output}->perfdata_add(label => $value->{trunk}, - value => $value->{num}, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warnontrunk'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critontrunk'), - min => 0); - $self->{output}->output_add(long_msg => sprintf("%s : %s", $value->{trunk}, $value->{num})); - - $trunk_exit_code = $self->{output}->get_most_critical(status => [ $temp_exit, $trunk_exit_code ]); - # create msg for most critical data .... - if ($self->{output}->is_status(value => $temp_exit, compare => $trunk_exit_code, litteral => 1)) - { - push @trunk_msg, {msg => sprintf("'%s': %s", $value->{trunk}, $value->{num})}; - } - } - if (!$self->{output}->is_status(value => $exit_code, compare => 'ok', litteral => 1) && !$self->{output}->is_status(value => $trunk_exit_code, compare => 'ok', litteral => 1)) - { - unshift @trunk_msg, @msg; - $exit_code = $self->{output}->get_most_critical(status => [ $exit_code, $trunk_exit_code ]); - } - if (!$self->{output}->is_status(value => $trunk_exit_code, compare => 'ok', litteral => 1)) - { - @out_msg=@trunk_msg; - $exit_code = $trunk_exit_code ; - } - else - { - push @out_msg, @msg; - } - - $exit_msg = ''; - my $separator = ''; - foreach my $out (@out_msg) - { - $exit_msg .= $separator.$out->{msg}; - $separator = ', '; - } - $self->{output}->output_add(severity => $exit_code, - short_msg => $exit_msg - ); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -Check number of external calls (total and by trunk) - -=over 8 - -=item B<--warning> - -Threshold warning for total number of external calls. - -=item B<--critical> - -Threshold critical for total number of external calls. - -=item B<--warnontrunk> - -Threshold warning for trunks. - -=item B<--critontrunk> - -Threshold critical for trunks. - -=item B<--force-oid> - -Can choose your oid (numeric format only). - -=item B<--trunkusernamelist> - -List of outgoing trunks' username. - -=item B<--filter-name> - -Filter on trunk's username (regexp can be used). - -=back - -=cut \ No newline at end of file diff --git a/centreon-plugins/apps/voip/asterisk/snmp/plugin.pm b/centreon-plugins/apps/voip/asterisk/snmp/plugin.pm index d6811d6f3..61a0bb3b5 100644 --- a/centreon-plugins/apps/voip/asterisk/snmp/plugin.pm +++ b/centreon-plugins/apps/voip/asterisk/snmp/plugin.pm @@ -32,9 +32,8 @@ sub new { $self->{version} = '0.1'; %{$self->{modes}} = ( - 'activecalls' => 'apps::voip::asterisk::snmp::mode::activecalls', - 'externalcalls' => 'apps::voip::asterisk::snmp::mode::externalcalls', - ); + 'channel-usage' => 'apps::voip::asterisk::snmp::mode::channelusage', + ); return $self; } diff --git a/centreon-plugins/centreon/common/bluearc/snmp/mode/hardware.pm b/centreon-plugins/centreon/common/bluearc/snmp/mode/hardware.pm index 65d823a85..4a951e44e 100644 --- a/centreon-plugins/centreon/common/bluearc/snmp/mode/hardware.pm +++ b/centreon-plugins/centreon/common/bluearc/snmp/mode/hardware.pm @@ -1,5 +1,5 @@ # -# Copyright 2016 Centreon (http://www.centreon.com/) +# Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/fan.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/fan.pm new file mode 100644 index 000000000..ab37053e9 --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/fan.pm @@ -0,0 +1,86 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::components::fan; + +use strict; +use warnings; + +my %map_fan_status = ( + 1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering', + 5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible' +); + +my $mapping = { + boxServicesFanItemState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.6.1.3', map => \%map_fan_status }, + boxServicesFanSpeed => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.6.1.4' }, +}; +my $oid_boxServicesFansEntry = '.1.3.6.1.4.1.4413.1.1.43.1.6.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_boxServicesFansEntry, begin => $mapping->{boxServicesFanItemState}->{oid}, end => $mapping->{boxServicesFanSpeed}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking fans"); + $self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; + return if ($self->check_filter(section => 'fan')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesFansEntry}})) { + next if ($oid !~ /^$mapping->{boxServicesFanItemState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesFansEntry}, instance => $instance); + + next if ($self->check_filter(section => 'fan', instance => $instance)); + if ($result->{boxServicesFanItemState} =~ /notpresent/i) { + $self->absent_problem(section => 'fan', instance => $instance); + next; + } + + $self->{components}->{fan}->{total}++; + $self->{output}->output_add(long_msg => sprintf("fan '%s' status is '%s' [instance = %s, speed = %s]", + $instance, $result->{boxServicesFanItemState}, $instance, defined($result->{boxServicesFanSpeed}) ? $result->{boxServicesFanSpeed} : 'unknown')); + $exit = $self->get_severity(label => 'default', section => 'fan', value => $result->{boxServicesFanItemState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' status is '%s'", $instance, $result->{boxServicesFanItemState})); + } + + next if (!defined($result->{boxServicesFanSpeed}) || $result->{boxServicesFanSpeed} !~ /[0-9]+/); + + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{boxServicesFanSpeed}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' is '%s' rpm", $instance, $result->{boxServicesFanSpeed})); + } + $self->{output}->perfdata_add(label => 'fan_' . $instance, unit => 'rpm', + value => $result->{boxServicesFanSpeed}, + warning => $warn, + critical => $crit, min => 0 + ); + } +} + +1; diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/psu.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/psu.pm new file mode 100644 index 000000000..6b8767ece --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/psu.pm @@ -0,0 +1,71 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::components::psu; + +use strict; +use warnings; + +my %map_psu_status = ( + 1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering', + 5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible' +); + +my $mapping = { + boxServicesPowSupplyItemState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.7.1.3', map => \%map_psu_status }, +}; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $mapping->{boxServicesPowSupplyItemState}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking power supplies"); + $self->{components}->{psu} = {name => 'psu', total => 0, skip => 0}; + return if ($self->check_filter(section => 'psu')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}})) { + next if ($oid !~ /^$mapping->{boxServicesPowSupplyItemState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}, instance => $instance); + + next if ($self->check_filter(section => 'psu', instance => $instance)); + if ($result->{boxServicesPowSupplyItemState} =~ /notpresent/i) { + $self->absent_problem(section => 'psu', instance => $instance); + next; + } + + $self->{components}->{psu}->{total}++; + $self->{output}->output_add(long_msg => sprintf("power supply '%s' status is '%s' [instance = %s]", + $instance, $result->{boxServicesPowSupplyItemState}, $instance)); + $exit = $self->get_severity(label => 'default', section => 'psu', value => $result->{boxServicesPowSupplyItemState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Power supply '%s' status is '%s'", $instance, $result->{boxServicesPowSupplyItemState})); + } + } +} + +1; diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/temperature.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/temperature.pm new file mode 100644 index 000000000..bf85207ee --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/components/temperature.pm @@ -0,0 +1,86 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::components::temperature; + +use strict; +use warnings; + +my %map_temp_status = ( + 0 => 'low', 1 => 'normal', 2 => 'warning', 3 => 'critical', + 4 => 'shutdown', 5 => 'notpresent', 6 => 'notoperational', +); + +my $mapping = { + boxServicesTempSensorState => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.8.1.4', map => \%map_temp_status }, + boxServicesTempSensorTemperature => { oid => '.1.3.6.1.4.1.4413.1.1.43.1.8.1.5' }, +}; +my $oid_boxServicesTempSensorsEntry = '.1.3.6.1.4.1.4413.1.1.43.1.8.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_boxServicesTempSensorsEntry, begin => $mapping->{boxServicesTempSensorState}->{oid}, end => $mapping->{boxServicesTempSensorTemperature}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking temperatures"); + $self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0}; + return if ($self->check_filter(section => 'temperature')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesTempSensorsEntry}})) { + next if ($oid !~ /^$mapping->{boxServicesTempSensorState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesTempSensorsEntry}, instance => $instance); + + next if ($self->check_filter(section => 'temperature', instance => $instance)); + if ($result->{boxServicesTempSensorState} =~ /notpresent/i) { + $self->absent_problem(section => 'temperature', instance => $instance); + next; + } + + $self->{components}->{temperature}->{total}++; + $self->{output}->output_add(long_msg => sprintf("temperature '%s' status is '%s' [instance = %s, temperature = %s]", + $instance, $result->{boxServicesTempSensorState}, $instance, defined($result->{boxServicesTempSensorTemperature}) ? $result->{boxServicesTempSensorTemperature} : 'unknown')); + $exit = $self->get_severity(section => 'temperature', value => $result->{boxServicesTempSensorState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Temperature '%s' status is '%s'", $instance, $result->{boxServicesTempSensorState})); + } + + next if (!defined($result->{boxServicesTempSensorTemperature}) || $result->{boxServicesTempSensorTemperature} !~ /[0-9]+/); + + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{boxServicesTempSensorTemperature}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Temperature '%s' is '%s' rpm", $instance, $result->{boxServicesTempSensorTemperature})); + } + $self->{output}->perfdata_add(label => 'temp_' . $instance, unit => 'C', + value => $result->{boxServicesTempSensorTemperature}, + warning => $warn, + critical => $crit, + ); + } +} + +1; diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/cpu.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/cpu.pm new file mode 100644 index 000000000..bdcde39c0 --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/cpu.pm @@ -0,0 +1,123 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::cpu; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_cpu_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => '5s', set => { + key_values => [ { name => 'usage_5s' } ], + output_template => '%.2f %% (5sec)', output_error_template => "%s (5sec)", + perfdatas => [ + { label => 'cpu_5s', value => 'usage_5s_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '1m', set => { + key_values => [ { name => 'usage_1m' } ], + output_template => '%.2f %% (1m)', output_error_template => "%s (1min)", + perfdatas => [ + { label => 'cpu_1m', value => 'usage_1m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '5m', set => { + key_values => [ { name => 'usage_5m' } ], + output_template => '%.2f %% (5min)', output_error_template => "%s (5min)", + perfdatas => [ + { label => 'cpu_5m', value => 'usage_5m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + ]; +} + +sub prefix_cpu_output { + my ($self, %options) = @_; + + return "CPU "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + # STRING: " 5 Secs ( 43.2625%) 60 Secs ( 13.9157%) 300 Secs ( 8.9274%)" + my $oid_agentSwitchCpuProcessTotalUtilization = '.1.3.6.1.4.1.4413.1.1.1.1.4.9.0'; + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_agentSwitchCpuProcessTotalUtilization], nothing_quit => 1); + + $snmp_result->{$oid_agentSwitchCpuProcessTotalUtilization} =~ /\s*5\s*Secs\s*\(\s*(.*?)%\s*\)\s*60\s*Secs\s*\(\s*(.*?)%\s*\)\s*300\s*Secs\s*\(\s*(.*?)%\s*\)/i; + $self->{global} = { usage_5s => $1, usage_1m => $2, usage_5m => $3 }; +} + +1; + +__END__ + +=head1 MODE + +Check CPU usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='5m' + +=item B<--warning-*> + +Threshold warning. +Can be: '5s', '1m', '5m'. + +=item B<--critical-*> + +Threshold critical. +Can be: '5s', '1m', '5m'. + +=back + +=cut diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/hardware.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/hardware.pm new file mode 100644 index 000000000..6257ea940 --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/hardware.pm @@ -0,0 +1,129 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::hardware; + +use base qw(centreon::plugins::templates::hardware); + +use strict; +use warnings; + +sub set_system { + my ($self, %options) = @_; + + $self->{regexp_threshold_overload_check_section_option} = '^(temperature|fan|psu)$'; + $self->{regexp_threshold_numeric_check_section_option} = '^(temperature|fan)$'; + + $self->{cb_hook2} = 'snmp_execute'; + + $self->{thresholds} = { + default => [ + ['notPresent', 'OK'], + ['operational', 'OK'], + ['failed', 'CRITICAL'], + ['notpowering', 'WARNING'], + ['powering', 'OK'], + ['nopower', 'OK'], + ['incompatible', 'WARNING'], + ], + temperature => [ + ['low', 'OK'], + ['normal', 'OK'], + ['warning', 'WARNING'], + ['critical', 'CRITICAL'], + ['notpresent', 'OK'], + ['shutdown', 'OK'], + ['notoperational', 'WARNING'], + ], + }; + + $self->{components_path} = 'centreon::common::broadcom::fastpath::snmp::mode::components'; + $self->{components_module} = ['fan', 'psu', 'temperature']; +} + +sub snmp_execute { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +1; + +__END__ + +=head1 MODE + +Check hardware. + +=over 8 + +=item B<--component> + +Which component to check (Default: '.*'). +Can be: 'fan', 'psu', 'temperature'. + +=item B<--filter> + +Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu) +Can also exclude specific instance: --filter=fan,1.1 + +=item B<--absent-problem> + +Return an error if an entity is not 'present' (default is skipping) (comma seperated list) +Can be specific or global: --absent-problem=fan,1 + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='psu,CRITICAL,^(?!(operational)$)' + +=item B<--warning> + +Set warning threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) +Example: --warning='temperature,.*,40' + +=item B<--critical> + +Set critical threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) +Example: --critical='temperature,.*,50' + +=back + +=cut diff --git a/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/memory.pm b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/memory.pm new file mode 100644 index 000000000..3bee13503 --- /dev/null +++ b/centreon-plugins/centreon/common/broadcom/fastpath/snmp/mode/memory.pm @@ -0,0 +1,138 @@ +# +# Copyright 2017 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::common::broadcom::fastpath::snmp::mode::memory; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'used', unit => 'B', + value => $self->{result_values}->{used}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + min => 0, max => $self->{result_values}->{total}); +} + +sub custom_usage_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free}); + + my $msg = sprintf("Memory Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free}); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'}; + $self->{result_values}->{prct_used} = $options{new_datas}->{$self->{instance} . '_prct_used'}; + + $self->{result_values}->{used} = int($self->{result_values}->{prct_used} * $self->{result_values}->{total} / 100); + $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used}; + $self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'memory', type => 0 } + ]; + + $self->{maps_counters}->{memory} = [ + { label => 'usage', set => { + key_values => [ { name => 'prct_used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_agentSwitchCpuProcessMemFree = '.1.3.6.1.4.1.4413.1.1.1.1.4.1.0'; # KB + my $oid_agentSwitchCpuProcessMemAvailable = '.1.3.6.1.4.1.4413.1.1.1.1.4.2.0'; # KB + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_agentSwitchCpuProcessMemFree, $oid_agentSwitchCpuProcessMemAvailable], nothing_quit => 1); + + my $total = $snmp_result->{$oid_agentSwitchCpuProcessMemAvailable} * 1024; + $self->{memory} = { + prct_used => ($total - $snmp_result->{$oid_agentSwitchCpuProcessMemFree} * 1024) * 100 / $total, + total => $total, + }; +} + +1; + +__END__ + +=head1 MODE + +Check memory usage. + +=over 8 + +=item B<--warning-usage> + +Threshold warning (in percent). + +=item B<--critical-usage> + +Threshold critical (in percent). + +=back + +=cut diff --git a/centreon-plugins/centreon/common/fastpath/mode/components/fan.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/fan.pm similarity index 98% rename from centreon-plugins/centreon/common/fastpath/mode/components/fan.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/fan.pm index 1017e753f..564834bf9 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/components/fan.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/fan.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::components::fan; +package centreon::common::dell::fastpath::snmp::mode::components::fan; use strict; use warnings; @@ -87,4 +87,4 @@ sub check { } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/centreon/common/fastpath/mode/components/psu.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/psu.pm similarity index 97% rename from centreon-plugins/centreon/common/fastpath/mode/components/psu.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/psu.pm index 0882fa895..e5b675f6b 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/components/psu.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/psu.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::components::psu; +package centreon::common::dell::fastpath::snmp::mode::components::psu; use strict; use warnings; @@ -75,4 +75,4 @@ sub check { } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/centreon/common/fastpath/mode/components/temperature.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/temperature.pm similarity index 98% rename from centreon-plugins/centreon/common/fastpath/mode/components/temperature.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/temperature.pm index 6f9c999aa..d72626baa 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/components/temperature.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/components/temperature.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::components::temperature; +package centreon::common::dell::fastpath::snmp::mode::components::temperature; use strict; use warnings; @@ -96,4 +96,4 @@ sub check { } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/centreon/common/fastpath/mode/cpu.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/cpu.pm similarity index 99% rename from centreon-plugins/centreon/common/fastpath/mode/cpu.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/cpu.pm index ac99e514d..8a61c0251 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/cpu.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/cpu.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::cpu; +package centreon::common::dell::fastpath::snmp::mode::cpu; use base qw(centreon::plugins::mode); diff --git a/centreon-plugins/centreon/common/fastpath/mode/environment.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/environment.pm similarity index 95% rename from centreon-plugins/centreon/common/fastpath/mode/environment.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/environment.pm index 5957b2a36..569c85100 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/environment.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/environment.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::environment; +package centreon::common::dell::fastpath::snmp::mode::environment; use base qw(centreon::plugins::templates::hardware); @@ -54,7 +54,7 @@ sub set_system { ], }; - $self->{components_path} = 'centreon::common::fastpath::mode::components'; + $self->{components_path} = 'centreon::common::dell::fastpath::snmp::mode::components'; $self->{components_module} = ['fan', 'psu', 'temperature']; } @@ -126,4 +126,4 @@ Example: --critical='fan,.*,2000' =back -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/centreon/common/fastpath/mode/memory.pm b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/memory.pm similarity index 98% rename from centreon-plugins/centreon/common/fastpath/mode/memory.pm rename to centreon-plugins/centreon/common/dell/fastpath/snmp/mode/memory.pm index c643a841f..43d53bd20 100644 --- a/centreon-plugins/centreon/common/fastpath/mode/memory.pm +++ b/centreon-plugins/centreon/common/dell/fastpath/snmp/mode/memory.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package centreon::common::fastpath::mode::memory; +package centreon::common::dell::fastpath::snmp::mode::memory; use base qw(centreon::plugins::mode); diff --git a/centreon-plugins/centreon/common/jvm/mode/classcount.pm b/centreon-plugins/centreon/common/jvm/mode/classcount.pm index 9558c4260..9282f35c5 100644 --- a/centreon-plugins/centreon/common/jvm/mode/classcount.pm +++ b/centreon-plugins/centreon/common/jvm/mode/classcount.pm @@ -20,168 +20,79 @@ package centreon::common::jvm::mode::classcount; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::counter); use strict; use warnings; -use centreon::plugins::values; -use centreon::plugins::statefile; use Digest::MD5 qw(md5_hex); -my $instance_mode; +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', skipped_code => { -10 => 1 } }, + ]; -my $maps_counters = { - class => { - '000_current' => { set => { key_values => [ { name => 'current' } ], - output_template => 'Current : %s', - perfdatas => [ - { label => 'current', value => 'current_absolute', template => '%s', min => 0 }, - ], - } - }, - '001_loaded' => { set => { key_values => [ { name => 'loaded', diff => 1 } ], - output_template => 'Loaded : %s', - perfdatas => [ - { label => 'loaded', value => 'loaded_absolute', template => '%s', min => 0 }, - ], - } - }, - '003_unloaded' => { set => { key_values => [ { name => 'unloaded', diff => 1 } ], - output_template => 'Unloaded : %s', - perfdatas => [ - { label => 'unloaded', value => 'unloaded_absolute', template => '%s', min => 0 }, - ], - } - }, + $self->{maps_counters}->{global} = [ + { label => 'current', set => { + key_values => [ { name => 'LoadedClassCount' } ], + output_template => 'Current : %s', + perfdatas => [ + { label => 'current', value => 'LoadedClassCount_absolute', template => '%s', min => 0 }, + ], + } }, -}; + { label => 'loaded', set => { + key_values => [ { name => 'TotalLoadedClassCount', diff => 1 } ], + output_template => 'Loaded : %s', + perfdatas => [ + { label => 'loaded', value => 'TotalLoadedClassCount_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'unloaded', set => { + key_values => [ { name => 'UnloadedClassCount', diff => 1 } ], + output_template => 'Unloaded : %s', + perfdatas => [ + { label => 'unloaded', value => 'UnloadedClassCount_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; +} + +sub prefix_global_output { + my ($self, %options) = @_; + + return "Class "; +} sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); bless $self, $class; $self->{version} = '1.0'; $options{options}->add_options(arguments => { }); - $self->{statefile_value} = centreon::plugins::statefile->new(%options); - - foreach my $key (('class')) { - foreach (keys %{$maps_counters->{$key}}) { - my ($id, $name) = split /_/; - if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) { - $options{options}->add_options(arguments => { - 'warning-' . $name . ':s' => { name => 'warning-' . $name }, - 'critical-' . $name . ':s' => { name => 'critical-' . $name }, - }); - } - $maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new( - statefile => $self->{statefile_value}, - output => $self->{output}, perfdata => $self->{perfdata}, - label => $name); - $maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}}); - } - } return $self; } -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - foreach my $key (('class')) { - foreach (keys %{$maps_counters->{$key}}) { - $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); - } - } - - $self->{statefile_value}->check_options(%options); - $instance_mode = $self; - - $self->{overload_th} = {}; - foreach my $val (@{$self->{option_results}->{threshold_overload}}) { - if ($val !~ /^(.*?),(.*?),(.*)$/) { - $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); - $self->{output}->option_exit(); - } - my ($section, $status, $filter) = ($1, $2, $3); - if ($self->{output}->is_litteral_status(status => $status) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'."); - $self->{output}->option_exit(); - } - $self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section})); - push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status}; - } -} - -sub run { - my ($self, %options) = @_; - $self->{connector} = $options{custom}; - - $self->manage_selection(); - - $self->{new_datas} = {}; - $self->{statefile_value}->read(statefile => "jvm_standard_" . $self->{mode} . '_' . md5_hex($self->{connector}->{url})); - $self->{new_datas}->{last_timestamp} = time(); - - my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); - my @exits; - foreach (sort keys %{$maps_counters->{class}}) { - my $obj = $maps_counters->{class}->{$_}->{obj}; - $obj->set(instance => 'global'); - - my ($value_check) = $obj->execute(values => $self->{global}, - new_datas => $self->{new_datas}); - - if ($value_check != 0) { - $long_msg .= $long_msg_append . $obj->output_error(); - $long_msg_append = ', '; - next; - } - my $exit2 = $obj->threshold_check(); - push @exits, $exit2; - - my $output = $obj->output(); - $long_msg .= $long_msg_append . $output; - $long_msg_append = ', '; - - if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) { - $short_msg .= $short_msg_append . $output; - $short_msg_append = ', '; - } - - $obj->perfdata(); - } - - my $exit = $self->{output}->get_most_critical(status => [ @exits ]); - if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { - $self->{output}->output_add(severity => $exit, - short_msg => "Class $short_msg" - ); - } else { - $self->{output}->output_add(short_msg => "Class $long_msg"); - } - - $self->{statefile_value}->write(data => $self->{new_datas}); - $self->{output}->display(); - $self->{output}->exit(); -} - sub manage_selection { my ($self, %options) = @_; my $mbean = 'java.lang:type=ClassLoading'; - $self->{request} = [ + my $request = [ { mbean => $mbean, attributes => [ { name => 'UnloadedClassCount' }, { name => 'LoadedClassCount' }, { name => 'TotalLoadedClassCount' } ] }, ]; - my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 1); + my $result = $options{custom}->get_attributes(request => $request, nothing_quit => 1); + + $self->{global} = { %{$result->{$mbean}} }; - $self->{global} = {}; - $self->{global}->{unloaded} = $result->{$mbean}->{UnloadedClassCount} if (defined($result->{$mbean}->{UnloadedClassCount})); - $self->{global}->{loaded} = $result->{$mbean}->{TotalLoadedClassCount} if (defined($result->{$mbean}->{TotalLoadedClassCount})); - $self->{global}->{current} = $result->{$mbean}->{LoadedClassCount} if (defined($result->{$mbean}->{LoadedClassCount})); + $self->{cache_name} = "jvm_standard_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); } 1; @@ -194,6 +105,11 @@ Check Java Class Loading Mbean. =over 8 +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='current' + =item B<--warning-*> Threshold warning. @@ -206,4 +122,4 @@ Can be: 'unloaded', 'loaded', 'current'. =back -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/centreon/common/jvm/mode/gcusage.pm b/centreon-plugins/centreon/common/jvm/mode/gcusage.pm index 129f2f2f3..786add013 100644 --- a/centreon-plugins/centreon/common/jvm/mode/gcusage.pm +++ b/centreon-plugins/centreon/common/jvm/mode/gcusage.pm @@ -100,7 +100,7 @@ sub manage_selection { $self->{output}->option_exit(); } - $self->{cache_name} = "jvm_standard_" . $self->{mode} . '_' . md5_hex($options{custom}->{url}) . '_' . + $self->{cache_name} = "jvm_standard_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); } @@ -136,4 +136,4 @@ Can be: 'count', 'time' (ms). =back -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/centreon/common/jvm/mode/memorydetailed.pm b/centreon-plugins/centreon/common/jvm/mode/memorydetailed.pm index c9817e8e4..62ed2883d 100644 --- a/centreon-plugins/centreon/common/jvm/mode/memorydetailed.pm +++ b/centreon-plugins/centreon/common/jvm/mode/memorydetailed.pm @@ -36,7 +36,9 @@ my %mapping_memory = ( 'PS Perm Gen' => 'permanent', 'Perm Gen' => 'permanent', 'Metaspace' => 'permanent', + 'JIT data cache' => 'permanent', 'Code Cache' => 'code', + 'JIT Code Cache' => 'code', 'CMS Old Gen' => 'tenured', 'PS Old Gen' => 'tenured', 'Tenured Gen' => 'tenured', diff --git a/centreon-plugins/centreon/common/jvm/mode/threads.pm b/centreon-plugins/centreon/common/jvm/mode/threads.pm index c5e913ffa..544f0d21e 100644 --- a/centreon-plugins/centreon/common/jvm/mode/threads.pm +++ b/centreon-plugins/centreon/common/jvm/mode/threads.pm @@ -20,168 +20,79 @@ package centreon::common::jvm::mode::threads; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::counter); use strict; use warnings; -use centreon::plugins::values; -use centreon::plugins::statefile; use Digest::MD5 qw(md5_hex); -my $instance_mode; +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_global_output', skipped_code => { -10 => 1 } }, + ]; -my $maps_counters = { - threads => { - '000_active' => { set => { key_values => [ { name => 'active' } ], - output_template => 'Active : %s', - perfdatas => [ - { label => 'active', value => 'active_absolute', template => '%s', min => 0 }, - ], - } - }, - '001_started' => { set => { key_values => [ { name => 'started', diff => 1 } ], - output_template => 'Started : %s', - perfdatas => [ - { label => 'started', value => 'started_absolute', template => '%s', min => 0 }, - ], - } - }, - '003_daemon' => { set => { key_values => [ { name => 'daemon' } ], - output_template => 'Daemon : %s', - perfdatas => [ - { label => 'daemon', value => 'daemon_absolute', template => '%s', min => 0 }, - ], - } - }, + $self->{maps_counters}->{global} = [ + { label => 'active', set => { + key_values => [ { name => 'ThreadCount' } ], + output_template => 'Active : %s', + perfdatas => [ + { label => 'active', value => 'ThreadCount_absolute', template => '%s', min => 0 }, + ], + } }, -}; + { label => 'started', set => { + key_values => [ { name => 'TotalStartedThreadCount', diff => 1 } ], + output_template => 'Started : %s', + perfdatas => [ + { label => 'started', value => 'TotalStartedThreadCount_absolute', template => '%s', min => 0 }, + ], + } + }, + { label => 'daemon', set => { + key_values => [ { name => 'DaemonThreadCount' } ], + output_template => 'Daemon : %s', + perfdatas => [ + { label => 'daemon', value => 'DaemonThreadCount_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; +} + +sub prefix_global_output { + my ($self, %options) = @_; + + return "Threads "; +} sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); bless $self, $class; $self->{version} = '1.0'; $options{options}->add_options(arguments => { }); - $self->{statefile_value} = centreon::plugins::statefile->new(%options); - - foreach my $key (('threads')) { - foreach (keys %{$maps_counters->{$key}}) { - my ($id, $name) = split /_/; - if (!defined($maps_counters->{$key}->{$_}->{threshold}) || $maps_counters->{$key}->{$_}->{threshold} != 0) { - $options{options}->add_options(arguments => { - 'warning-' . $name . ':s' => { name => 'warning-' . $name }, - 'critical-' . $name . ':s' => { name => 'critical-' . $name }, - }); - } - $maps_counters->{$key}->{$_}->{obj} = centreon::plugins::values->new( - statefile => $self->{statefile_value}, - output => $self->{output}, perfdata => $self->{perfdata}, - label => $name); - $maps_counters->{$key}->{$_}->{obj}->set(%{$maps_counters->{$key}->{$_}->{set}}); - } - } return $self; } -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); - - foreach my $key (('threads')) { - foreach (keys %{$maps_counters->{$key}}) { - $maps_counters->{$key}->{$_}->{obj}->init(option_results => $self->{option_results}); - } - } - - $self->{statefile_value}->check_options(%options); - $instance_mode = $self; - - $self->{overload_th} = {}; - foreach my $val (@{$self->{option_results}->{threshold_overload}}) { - if ($val !~ /^(.*?),(.*?),(.*)$/) { - $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload option '" . $val . "'."); - $self->{output}->option_exit(); - } - my ($section, $status, $filter) = ($1, $2, $3); - if ($self->{output}->is_litteral_status(status => $status) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong threshold-overload status '" . $val . "'."); - $self->{output}->option_exit(); - } - $self->{overload_th}->{$section} = [] if (!defined($self->{overload_th}->{$section})); - push @{$self->{overload_th}->{$section}}, {filter => $filter, status => $status}; - } -} - -sub run { - my ($self, %options) = @_; - $self->{connector} = $options{custom}; - - $self->manage_selection(); - - $self->{new_datas} = {}; - $self->{statefile_value}->read(statefile => "jvm_standard_" . $self->{mode} . '_' . md5_hex($self->{connector}->{url})); - $self->{new_datas}->{last_timestamp} = time(); - - my ($short_msg, $short_msg_append, $long_msg, $long_msg_append) = ('', '', '', ''); - my @exits; - foreach (sort keys %{$maps_counters->{threads}}) { - my $obj = $maps_counters->{threads}->{$_}->{obj}; - $obj->set(instance => 'global'); - - my ($value_check) = $obj->execute(values => $self->{global}, - new_datas => $self->{new_datas}); - - if ($value_check != 0) { - $long_msg .= $long_msg_append . $obj->output_error(); - $long_msg_append = ', '; - next; - } - my $exit2 = $obj->threshold_check(); - push @exits, $exit2; - - my $output = $obj->output(); - $long_msg .= $long_msg_append . $output; - $long_msg_append = ', '; - - if (!$self->{output}->is_status(litteral => 1, value => $exit2, compare => 'ok')) { - $short_msg .= $short_msg_append . $output; - $short_msg_append = ', '; - } - - $obj->perfdata(); - } - - my $exit = $self->{output}->get_most_critical(status => [ @exits ]); - if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { - $self->{output}->output_add(severity => $exit, - short_msg => "Threads $short_msg" - ); - } else { - $self->{output}->output_add(short_msg => "Threads $long_msg"); - } - - $self->{statefile_value}->write(data => $self->{new_datas}); - $self->{output}->display(); - $self->{output}->exit(); -} - sub manage_selection { my ($self, %options) = @_; my $mbean = 'java.lang:type=Threading'; - $self->{request} = [ - { mbean => $mbean, attributes => [ { name => 'TotalStartedThreadCount' }, { name => 'ThreadCount' }, { name => 'DaemonThreadCount' } ] }, + my $request = [ + { mbean => $mbean, attributes => [ { name => 'TotalStartedThreadCount' }, { name => 'ThreadCount' }, { name => 'DaemonThreadCount' } ] }, ]; - my $result = $self->{connector}->get_attributes(request => $self->{request}, nothing_quit => 1); + my $result = $options{custom}->get_attributes(request => $request, nothing_quit => 1); + + $self->{global} = { %{$result->{$mbean}} }; - $self->{global} = {}; - $self->{global}->{started} = $result->{$mbean}->{TotalStartedThreadCount} if (defined($result->{$mbean}->{TotalStartedThreadCount})); - $self->{global}->{active} = $result->{$mbean}->{ThreadCount} if (defined($result->{$mbean}->{ThreadCount})); - $self->{global}->{daemon} = $result->{$mbean}->{DaemonThreadCount} if (defined($result->{$mbean}->{DaemonThreadCount})); + $self->{cache_name} = "jvm_standard_" . $self->{mode} . '_' . md5_hex($options{custom}->get_connection_info()) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); } 1; @@ -206,4 +117,4 @@ Can be: 'active', 'started', 'daemon'. =back -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/centreon/common/powershell/hyperv/2012/nodevmstatus.pm b/centreon-plugins/centreon/common/powershell/hyperv/2012/nodevmstatus.pm index 23ac2ced5..4a4a792db 100644 --- a/centreon-plugins/centreon/common/powershell/hyperv/2012/nodevmstatus.pm +++ b/centreon-plugins/centreon/common/powershell/hyperv/2012/nodevmstatus.pm @@ -39,10 +39,21 @@ Try { $ErrorActionPreference = "Stop" $vms = Get-VM + $node_is_clustered = 0 + Try { + If (@(Get-ClusterNode -ea Ignore).Count -ne 0) { + $node_is_clustered = 1 + } + } Catch { + } Foreach ($vm in $vms) { $note = $vm.Notes -replace "\r","" $note = $note -replace "\n"," - " - Write-Host "[name=" $vm.VMName "][state=" $vm.State "][status=" $vm.Status "][IsClustered=" $vm.IsClustered "][note=" $note "]" + $isClustered = $vm.IsClustered + if ($node_is_clustered -eq 0) { + $isClustered = "nodeNotClustered" + } + Write-Host "[name=" $vm.VMName "][state=" $vm.State "][status=" $vm.Status "][IsClustered=" $isClustered "][note=" $note "]" } } Catch { Write-Host $Error[0].Exception @@ -63,4 +74,4 @@ __END__ Method to get hyper-v informations. -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/centreon/common/protocols/jmx/custom/jolokia.pm b/centreon-plugins/centreon/common/protocols/jmx/custom/jolokia.pm index fb1f83915..2d1a96b9d 100644 --- a/centreon-plugins/centreon/common/protocols/jmx/custom/jolokia.pm +++ b/centreon-plugins/centreon/common/protocols/jmx/custom/jolokia.pm @@ -146,6 +146,14 @@ sub check_options { return 1; } +sub get_connection_info { + my ($self, %options) = @_; + + my $connection_info = $self->{url}; + $connection_info .= '_' . $self->{proxy_url} if (defined($self->{proxy_url})); + return $connection_info; +} + sub connect { my ($self, %options) = @_; diff --git a/centreon-plugins/centreon/common/protocols/sql/mode/sqlstring.pm b/centreon-plugins/centreon/common/protocols/sql/mode/sqlstring.pm new file mode 100644 index 000000000..827c99918 --- /dev/null +++ b/centreon-plugins/centreon/common/protocols/sql/mode/sqlstring.pm @@ -0,0 +1,217 @@ +# +# Copyright 2017 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::common::protocols::sql::mode::sqlstring; + +use base qw(centreon::plugins::templates::counter); +use strict; +use warnings; + +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'rows', type => 1, message_multiple => "SQL Query is OK" }, + ]; + + $self->{maps_counters}->{rows} = [ + { label => 'string', threshold => 0, set => { + key_values => [ { name => 'key_field' }, { name => 'value_field' } ], + closure_custom_calc => $self->can('custom_string_calc'), + closure_custom_output => $self->can('custom_string_output'), + closure_custom_threshold_check => $self->can('custom_string_threshold'), + closure_custom_perfdata => sub { return 0; }, + } + }, + ]; +} + +sub custom_string_calc { + my ($self, %options) = @_; + + $self->{result_values}->{key_field} = $options{new_datas}->{$self->{instance} . '_key_field'}; + $self->{result_values}->{value_field} = $options{new_datas}->{$self->{instance} . '_value_field'}; + + return 0; +} + +sub custom_string_output { + my ($self, %options) = @_; + + my $msg; + my $message; + + if (defined($instance_mode->{option_results}->{printf_format}) && $instance_mode->{option_results}->{printf_format} ne '') { + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + $msg = sprintf("$instance_mode->{option_results}->{printf_format}", eval $instance_mode->{option_results}->{printf_value}); + }; + } else { + $msg = sprintf("'%s'", $self->{result_values}->{value_field}); + } + + if (defined($message)) { + $self->{output}->output_add(long_msg => 'output value issue: ' . $message); + } + return $msg; +} + +sub custom_string_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_string}) && $instance_mode->{option_results}->{critical_string} ne '' && + eval "$instance_mode->{option_results}->{critical_string}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_string}) && $instance_mode->{option_results}->{warning_string} ne '' && + eval "$instance_mode->{option_results}->{warning_string}") { + $status = 'warning'; + } + }; + + if (defined($message)) { + $self->{output}->output_add(long_msg => 'threshold regex issue: ' . $message); + } + + return $status; +} + +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 => + { + "sql-statement:s" => { name => 'sql_statement' }, + "key-column:s" => { name => 'key_column' }, + "value-column:s" => { name => 'value_column' }, + "warning-string:s" => { name => 'warning_string', default => '' }, + "critical-string:s" => { name => 'critical_string', default => '' }, + "printf-format:s" => { name => 'printf_format' }, + "printf-value:s" => { name => 'printf_value' }, + }); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + #$self->SUPER::init(%options); + $self->SUPER::check_options(%options); + $instance_mode = $self; + + if (!defined($instance_mode->{option_results}->{sql_statement}) || $instance_mode->{option_results}->{sql_statement} eq '') { + $instance_mode->{output}->add_option_msg(short_msg => "Need to specify '--sql-statement' option."); + $instance_mode->{output}->option_exit(); + } + + $instance_mode->change_macros(); +} + +sub change_macros { + my ($self, %options) = @_; + foreach (('warning_string', 'critical_string')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub manage_selection { + my ($self, %options) = @_; + $self->{sql} = $options{sql}; + $self->{sql}->connect(); + $self->{sql}->query(query => $self->{option_results}->{sql_statement}); + $self->{rows} = {}; + my $row_count = 0; + + while (my $row = $self->{sql}->fetchrow_hashref()) { + if (!defined($self->{option_results}->{key_column})) { + $self->{rows}->{$self->{option_results}->{value_column} . $row_count} = { key_field => $row->{$self->{option_results}->{value_column}}, + value_field => $row->{$self->{option_results}->{value_column}}}; + $row_count++; + } else { + $self->{rows}->{$self->{option_results}->{key_column} . $row_count} = { key_field => $row->{$self->{option_results}->{key_column}}, + value_field => $row->{$self->{option_results}->{value_column}}}; + $row_count++; + } + } + + if (scalar(keys %{$self->{rows}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No row returned or --key-column/--value-column do not correctly match selected field"); + $self->{output}->option_exit(); + } + +} + +1; + +__END__ + +=head1 MODE + +Check SQL statement to query string pattern (You cannot have more than to fiels in select) + +=over 8 + +=item B<--sql-statement> + +SQL statement that returns a string. + +=item B<--key-column> + +Key column (must be one of the selected field). NOT mandatory if you select only one field + +=item B<--value-column> + +Value column (must be one of the selected field). MANDATORY + +=item B<--printf-format> + +Specify a custom output message relying on printf formatting + +=item B<--printf-value> + +Specify scalar used to replace in printf +(Can be: $self->{result_values}->{key_field}, $self->{result_values}->{value_field}) + +=item B<--warning-string> + +Set warning condition (if statement syntax) for status evaluation. +(Can be: %{key_field}, %{value_field}) +e.g --warning-string '%{key_field} eq 'Central' && %{value_field} =~ /127.0.0.1/' + +=item B<--critical-string> + +Set critical condition (if statement syntax) for status evaluation. +(Can be: %{key_field} or %{value_field}) + +=back + +=cut diff --git a/centreon-plugins/centreon/plugins/script.pm b/centreon-plugins/centreon/plugins/script.pm index f652738d0..9c6dbf490 100644 --- a/centreon-plugins/centreon/plugins/script.pm +++ b/centreon-plugins/centreon/plugins/script.pm @@ -30,7 +30,7 @@ use Pod::Find qw(pod_where); my %handlers = (DIE => {}); -my $global_version = 20171013; +my $global_version = 20171208; my $alternative_fatpacker = 0; sub new { diff --git a/centreon-plugins/centreon/plugins/statefile.pm b/centreon-plugins/centreon/plugins/statefile.pm index 0275fa778..0915ee50a 100644 --- a/centreon-plugins/centreon/plugins/statefile.pm +++ b/centreon-plugins/centreon/plugins/statefile.pm @@ -37,6 +37,9 @@ sub new { $options{options}->add_options(arguments => { "memcached:s" => { name => 'memcached' }, + "redis-server:s" => { name => 'redis_server' }, + 'redis-attribute:s%' => { name => 'redis_attribute' }, + "memexpiration:s" => { name => 'memexpiration', default => 86400 }, "statefile-dir:s" => { name => 'statefile_dir', default => $default_dir }, "statefile-suffix:s" => { name => 'statefile_suffix', default => '' }, "statefile-concat-cwd" => { name => 'statefile_concat_cwd' }, @@ -67,6 +70,24 @@ sub check_options { $self->{memcached} = Memcached::libmemcached->new(); Memcached::libmemcached::memcached_server_add($self->{memcached}, $options{option_results}->{memcached}); } + + # Check redis + if (defined($options{option_results}->{redis_server})) { + $self->{redis_attributes} = ''; + if (defined($options{option_results}->{redis_attribute})) { + foreach (keys %{$options{option_results}->{redis_attribute}}) { + $self->{redis_attributes} .= "$_ => " . $options{option_results}->{redis_attribute}->{$_} . ", "; + } + } + + 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->{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', @@ -79,6 +100,7 @@ sub check_options { $self->{storable} = 1; } $self->{statefile_suffix} = $options{option_results}->{statefile_suffix}; + $self->{memexpiration} = $options{option_results}->{memexpiration}; } sub error { @@ -113,6 +135,18 @@ sub read { } } + if (defined($self->{redis_cnx})) { + my $val = $self->{redis_cnx}->get($self->{statefile_dir} . "/" . $self->{statefile}); + if (defined($val)) { + eval($val); + $self->{datas} = $datas; + $datas = {}; + return 1; + } + + return 0; + } + if (! -e $self->{statefile_dir} . "/" . $self->{statefile}) { if (! -w $self->{statefile_dir}) { $self->error(1); @@ -188,11 +222,15 @@ sub write { if ($self->{memcached_ok} == 1) { Memcached::libmemcached::memcached_set($self->{memcached}, $self->{statefile_dir} . "/" . $self->{statefile}, - Data::Dumper->Dump([$options{data}], ["datas"])); + 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}))); + } open FILE, ">", $self->{statefile_dir} . "/" . $self->{statefile}; if ($self->{storable} == 1) { Storable::store_fd($options{data}, *FILE); @@ -222,6 +260,18 @@ Statefile class Memcached server to use (only one server). +=item B<--redis-server> + +Redis server to use (only one server). + +=item B<--redis-attribute> + +Set Redis Options (--redis-attribute="cnx_timeout=5"). + +=item B<--memexpiration> + +Time to keep data in seconds (Default: 86400). + =item B<--statefile-dir> Directory for statefile (Default: '/var/lib/centreon/centplugins'). diff --git a/centreon-plugins/centreon/plugins/templates/hardware.pm b/centreon-plugins/centreon/plugins/templates/hardware.pm index 3223b5d27..a716f5791 100644 --- a/centreon-plugins/centreon/plugins/templates/hardware.pm +++ b/centreon-plugins/centreon/plugins/templates/hardware.pm @@ -442,4 +442,4 @@ Example: --critical='xxxxx,.*,40' =back -=cut \ No newline at end of file +=cut diff --git a/centreon-plugins/changelog b/centreon-plugins/changelog index d3f82b033..ae6d22143 100644 --- a/centreon-plugins/changelog +++ b/centreon-plugins/changelog @@ -1,3 +1,20 @@ +2017-12-08 Quentin Garnier + * Plugin added: Kingdee Rest API + * Plugin added: Redis Cli + * Plugin added: Ubiquiti Edge SNMP + * Plugin added: Arista SNMP + * Plugin added: JBoss JMX + * Plugin added: NSClient Query + * Break: Renamed Asterisk AMI + * Break: Renamed Dell n4000 + * Break: Renamed Dell 62000 + +2017-11-23 Quentin Garnier + * Plugin added: Freebox Rest API + * Plugin added: Netgear Mseries SNMP + * Plugin added: Zyxel SNMP + * Add redis support for temporary datas + 2017-10-13 Quentin Garnier * Plugin added: Kaminario Rest API * Plugin added: Protocol SSH diff --git a/centreon-plugins/database/mssql/plugin.pm b/centreon-plugins/database/mssql/plugin.pm index f2e7a8761..a114cffd0 100644 --- a/centreon-plugins/database/mssql/plugin.pm +++ b/centreon-plugins/database/mssql/plugin.pm @@ -43,6 +43,7 @@ sub new { 'dead-locks' => 'database::mssql::mode::deadlocks', 'backup-age' => 'database::mssql::mode::backupage', 'sql' => 'centreon::common::protocols::sql::mode::sql', + 'sql-string' => 'centreon::common::protocols::sql::mode::sqlstring', ); return $self; diff --git a/centreon-plugins/database/mysql/mode/opentables.pm b/centreon-plugins/database/mysql/mode/opentables.pm new file mode 100644 index 000000000..09e74f1cc --- /dev/null +++ b/centreon-plugins/database/mysql/mode/opentables.pm @@ -0,0 +1,118 @@ +# +# Copyright 2017 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 database::mysql::mode::opentables; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning', }, + "critical:s" => { name => 'critical', }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + # $options{sql} = sqlmode object + $self->{sql} = $options{sql}; + + $self->{sql}->connect(); + + if (!($self->{sql}->is_version_minimum(version => '5'))) { + $self->{output}->add_option_msg(short_msg => "MySQL version '" . $self->{sql}->{version} . "' is not supported (need version >= '5.x')."); + $self->{output}->option_exit(); + } + + $self->{sql}->query(query => q{SHOW VARIABLES LIKE 'table_open_cache'}); + my ($dummy, $open_tables_limit) = $self->{sql}->fetchrow_array(); + if (!defined($open_tables_limit)) { + $self->{output}->add_option_msg(short_msg => "Cannot get open table limit."); + $self->{output}->option_exit(); + } + $self->{sql}->query(query => q{SHOW /*!50000 global */ STATUS LIKE 'Open_tables'}); + ($dummy, my $open_tables) = $self->{sql}->fetchrow_array(); + if (!defined($open_tables)) { + $self->{output}->add_option_msg(short_msg => "Cannot get open tables."); + $self->{output}->option_exit(); + } + + my $prct_open = int(100 * $open_tables / $open_tables_limit); + my $exit_code = $self->{perfdata}->threshold_check(value => $prct_open, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + $self->{output}->output_add(severity => $exit_code, + short_msg => sprintf("%.2f%% of the open files limit reached (%d of max. %d)", + $prct_open, $open_tables, $open_tables_limit)); + $self->{output}->perfdata_add(label => 'open_tables', + value => $open_tables, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', total => $open_tables_limit, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', total => $open_tables_limit, cast_int => 1), + min => 0); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check number of open tables. + +=over 8 + +=item B<--warning> + +Threshold warning in percent. + +=item B<--critical> + +Threshold critical in percent. + +=back + +=cut diff --git a/centreon-plugins/database/mysql/mode/tablescount.pm b/centreon-plugins/database/mysql/mode/tablescount.pm new file mode 100644 index 000000000..54d857205 --- /dev/null +++ b/centreon-plugins/database/mysql/mode/tablescount.pm @@ -0,0 +1,118 @@ +# +# Copyright 2017 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 database::mysql::mode::tablescount; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning:s" => { name => 'warning', }, + "critical:s" => { name => 'critical', }, + "filter:s" => { name => 'filter', }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + # $options{sql} = sqlmode object + $self->{sql} = $options{sql}; + + $self->{sql}->connect(); + $self->{sql}->query(query => 'SELECT table_schema AS NAME, COUNT(*) + FROM information_schema.tables + GROUP BY table_schema'); + my $result = $self->{sql}->fetchall_arrayref(); + + $self->{output}->output_add(severity => 'OK', + short_msg => "All databases are ok."); + foreach my $row (@$result) { + next if (defined($self->{option_results}->{filter}) && + $$row[0] !~ /$self->{option_results}->{filter}/); + + my $exit_code = $self->{perfdata}->threshold_check(value => $$row[1], threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + + my $value = $$row[1]; + $self->{output}->output_add(long_msg => sprintf("DB '" . $$row[0] . "' tables count: %s", $value)); + if (!$self->{output}->is_status(value => $exit_code, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit_code, + short_msg => sprintf("DB '" . $$row[0] . "' tables count: %s", $value)); + } + $self->{output}->perfdata_add(label => $$row[0] . '_tablescount', unit => '', + value => $$row[1], + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), + min => 0); + } + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check MySQL tables count by db. + +=over 8 + +=item B<--warning> + +Threshold warning. + +=item B<--critical> + +Threshold critical. + +=item B<--filter> + +Filter database to checks. + +=back + +=cut diff --git a/centreon-plugins/database/mysql/mode/tablessize.pm b/centreon-plugins/database/mysql/mode/tablessize.pm index f57998c2d..297b113b1 100644 --- a/centreon-plugins/database/mysql/mode/tablessize.pm +++ b/centreon-plugins/database/mysql/mode/tablessize.pm @@ -81,15 +81,13 @@ sub prefix_table_output { sub manage_selection { my ($self, %options) = @_; - # $options{sql} = sqlmode object - $self->{sql} = $options{sql}; - $self->{sql}->connect(); - $self->{sql}->query(query => "SELECT table_schema AS DB, table_name AS NAME, ROUND(data_length + index_length) - FROM information_schema.TABLES"); - my $result = $self->{sql}->fetchall_arrayref(); + $options{sql}->connect(); + $options{sql}->query(query => "SELECT table_schema AS DB, table_name AS NAME, ROUND(data_length + index_length) + FROM information_schema.TABLES"); + my $result = $options{sql}->fetchall_arrayref(); - if (!($self->{sql}->is_version_minimum(version => '5'))) { + if (!($options{sql}->is_version_minimum(version => '5'))) { $self->{output}->add_option_msg(short_msg => "MySQL version '" . $self->{sql}->{version} . "' is not supported."); $self->{output}->option_exit(); } @@ -101,12 +99,12 @@ sub manage_selection { next if (!defined($$row[2])); if (defined($self->{option_results}->{filter_table}) && $self->{option_results}->{filter_table} ne '' && $$row[1] !~ /$self->{option_results}->{filter_table}/) { - $self->{output}->output_add(long_msg => "Skipping '" . $$row[0].'.'.$$row[1] . "': no matching filter.", debug => 1); + $self->{output}->output_add(long_msg => "skipping '" . $$row[0].'.'.$$row[1] . "': no matching filter.", debug => 1); next; } if (defined($self->{option_results}->{filter_db}) && $self->{option_results}->{filter_db} ne '' && $$row[0] !~ /$self->{option_results}->{filter_db}/) { - $self->{output}->output_add(long_msg => "Skipping '" . $$row[0].'.'.$$row[1] . "': no matching filter.", debug => 1); + $self->{output}->output_add(long_msg => "skipping '" . $$row[0].'.'.$$row[1] . "': no matching filter.", debug => 1); next } $self->{table}->{$$row[0].'.'.$$row[1]} = { size => $$row[2], display => $$row[0].'.'.$$row[1] }; diff --git a/centreon-plugins/database/mysql/mode/threadsconnected.pm b/centreon-plugins/database/mysql/mode/threadsconnected.pm index e8741983f..6111424fe 100644 --- a/centreon-plugins/database/mysql/mode/threadsconnected.pm +++ b/centreon-plugins/database/mysql/mode/threadsconnected.pm @@ -56,26 +56,21 @@ sub check_options { sub run { my ($self, %options) = @_; - # $options{sql} = sqlmode object - $self->{sql} = $options{sql}; - $self->{sql}->connect(); + $options{sql}->connect(); - if (!($self->{sql}->is_version_minimum(version => '5'))) { + if (!($options{sql}->is_version_minimum(version => '5'))) { $self->{output}->add_option_msg(short_msg => "MySQL version '" . $self->{sql}->{version} . "' is not supported (need version >= '5.x')."); $self->{output}->option_exit(); } - $self->{sql}->query(query => q{SHOW /*!50000 global */ STATUS LIKE 'Threads_connected'}); - my ($dummy, $result) = $self->{sql}->fetchrow_array(); - if (!defined($result)) { + $options{sql}->query(query => q{SHOW /*!50000 global */ STATUS LIKE 'Threads_connected'}); + my ($name, $value) = $options{sql}->fetchrow_array(); + if (!defined($value)) { $self->{output}->add_option_msg(short_msg => "Cannot get number of open connections."); $self->{output}->option_exit(); } - - my $value = $result; - my $exit_code = $self->{perfdata}->threshold_check(value => $value, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); $self->{output}->output_add(severity => $exit_code, short_msg => sprintf("%d client connection threads", $value) diff --git a/centreon-plugins/database/mysql/mode/uptime.pm b/centreon-plugins/database/mysql/mode/uptime.pm index 5c0a622f6..f27c1e4a7 100644 --- a/centreon-plugins/database/mysql/mode/uptime.pm +++ b/centreon-plugins/database/mysql/mode/uptime.pm @@ -58,24 +58,19 @@ sub check_options { sub run { my ($self, %options) = @_; - # $options{sql} = sqlmode object - $self->{sql} = $options{sql}; - $self->{sql}->connect(); - - if (!($self->{sql}->is_version_minimum(version => '5'))) { + $options{sql}->connect(); + if (!($options{sql}->is_version_minimum(version => '5'))) { $self->{output}->add_option_msg(short_msg => "MySQL version '" . $self->{sql}->{version} . "' is not supported (need version >= '5.x')."); $self->{output}->option_exit(); } - $self->{sql}->query(query => q{SHOW /*!50000 global */ STATUS LIKE 'Uptime'}); - my ($dummy, $result) = $self->{sql}->fetchrow_array(); - if (!defined($result)) { + $options{sql}->query(query => q{SHOW /*!50000 global */ STATUS LIKE 'Uptime'}); + my ($name, $value) = $options{sql}->fetchrow_array(); + if (!defined($value)) { $self->{output}->add_option_msg(short_msg => "Cannot get uptime."); $self->{output}->option_exit(); } - - my $value = $result; my $exit_code = $self->{perfdata}->threshold_check(value => $value, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); my $msg = sprintf("database is up since %d days", floor($value / 86400)); diff --git a/centreon-plugins/database/mysql/plugin.pm b/centreon-plugins/database/mysql/plugin.pm index f9ac4003f..bd1055248 100644 --- a/centreon-plugins/database/mysql/plugin.pm +++ b/centreon-plugins/database/mysql/plugin.pm @@ -44,10 +44,12 @@ sub new { 'replication-master-master' => 'database::mysql::mode::replicationmastermaster', 'slow-queries' => 'database::mysql::mode::slowqueries', 'sql' => 'centreon::common::protocols::sql::mode::sql', + 'sql-string' => 'centreon::common::protocols::sql::mode::sqlstring', + 'tables-size' => 'database::mysql::mode::tablessize', 'threads-connected' => 'database::mysql::mode::threadsconnected', 'uptime' => 'database::mysql::mode::uptime', - 'tables-size' => 'database::mysql::mode::tablessize', - ); + ); + $self->{sql_modes}{mysqlcmd} = 'database::mysql::mysqlcmd'; return $self; diff --git a/centreon-plugins/database/oracle/mode/invalidobject.pm b/centreon-plugins/database/oracle/mode/invalidobject.pm new file mode 100644 index 000000000..92b198274 --- /dev/null +++ b/centreon-plugins/database/oracle/mode/invalidobject.pm @@ -0,0 +1,204 @@ +# +# Copyright 2017 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 database::oracle::mode::invalidobject; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_invalid_output', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'objects', set => { + key_values => [ { name => 'invalid_objects' } ], + output_template => 'objects : %s', + perfdatas => [ + { label => 'invalid_objects', value => 'invalid_objects_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'indexes', set => { + key_values => [ { name => 'invalid_indexes' } ], + output_template => 'indexes : %s', + perfdatas => [ + { label => 'invalid_indexes', value => 'invalid_indexes_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'ind-partitions', set => { + key_values => [ { name => 'invalid_ind_partitions' } ], + output_template => 'index partitions : %s', + perfdatas => [ + { label => 'invalid_ind_partitions', value => 'invalid_ind_partitions_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'ind-subpartitions', set => { + key_values => [ { name => 'invalid_ind_subpartitions' } ], + output_template => 'index subpartitions : %s', + perfdatas => [ + { label => 'invalid_ind_subpartitions', value => 'invalid_ind_subpartitions_absolute', template => '%d', min => 0 }, + ], + } + }, + { label => 'registry-components', set => { + key_values => [ { name => 'invalid_registry_components' } ], + output_template => 'registry components : %s', + perfdatas => [ + { label => 'invalid_registry_components', value => 'invalid_registry_components_absolute', template => '%d', min => 0 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-message:s" => { name => 'filter_message' }, + "retention-objects:s" => { name => 'retention_objects', default => 3}, + }); + + return $self; +} + +sub prefix_invalid_output { + my ($self, %options) = @_; + + return "Invalid "; +} + +sub get_invalids { + my ($self, %options) = @_; + + $self->{global}->{$options{type}} = 0; + $options{sql}->query(query => $options{query}); + my $result = $options{sql}->fetchall_arrayref(); + foreach (@$result) { + if (defined($self->{option_results}->{filter_message}) && $self->{option_results}->{filter_message} ne '' && + $_->[0] !~ /$self->{option_results}->{filter_message}/) { + $self->{output}->output_add(long_msg => "skipping $options{type} => '" . $_->[0] . "': no matching filter.", debug => 1); + next; + } + + $self->{global}->{$options{type}}++; + } +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{global} = {}; + $options{sql}->connect(); + + $self->get_invalids(%options, type => 'invalid_objects', query => q{ + SELECT + O.object_type||' '||O.owner||'.'||O.object_name||' is '||O.status + FROM dba_objects O + LEFT OUTER JOIN DBA_MVIEW_refresh_times V ON O.object_name = V.NAME AND O.owner = V.owner + WHERE (LAST_REFRESH <= (SELECT sysdate - } . $self->{option_results}->{retention_objects} . q{ FROM dual) OR LAST_REFRESH is null) AND + STATUS = 'INVALID' AND O.object_name NOT LIKE 'BIN$%' + }); + + $self->get_invalids(%options, type => 'invalid_indexes', query => q{ + SELECT index_type||' index '||owner||'.'||index_name||' of '||table_owner||'.'||table_name||' is '||status + FROM dba_indexes + WHERE status <> 'VALID' AND status <> 'N/A' + }); + + $self->get_invalids(%options, type => 'invalid_ind_partitions', query => q{ + SELECT partition_name||' of '||index_owner||'.'||index_name||' is '||status + FROM dba_ind_partitions + WHERE status <> 'USABLE' AND status <> 'N/A' + }); + + if ($options{sql}->is_version_minimum(version => '10.x')) { + $self->get_invalids(%options, type => 'invalid_ind_subpartitions', query => q{ + SELECT subpartition_name||' of '||partition_name||' of '||index_owner||'.'||index_name||' is '||status + FROM dba_ind_subpartitions + WHERE status <> 'USABLE' AND status <> 'N/A' + }); + } + + if ($options{sql}->is_version_minimum(version => '10.x')) { + $self->get_invalids(%options, type => 'invalid_registry_components', query => q{ + SELECT namespace||'.'||comp_name||'-'||version||' is '||status + FROM dba_registry + WHERE status <> 'VALID' AND status <> 'OPTION OFF' + }); + } else { + $self->get_invalids(%options, type => 'invalid_registry_components', query => q{ + SELECT 'SCHEMA.'||comp_name||'-'||version||' is '||status + FROM dba_registry + WHERE status <> 'VALID' AND status <> 'OPTION OFF' + }); + } +} + +1; + +__END__ + +=head1 MODE + +Check faulty objects, indices, partitions. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^indexes$' + +=item B<--retention-objects> + +Retention in days for invalid objects (default : 3). + +=item B<--filter-message> + +Filter by message (can be a regexp). + +=item B<--warning-*> + +Threshold warning. +Can be: 'objects', 'indexes', 'ind-partitions', 'ind-subpartitions', +'registry-components'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'objects', 'indexes', 'ind-partitions', 'ind-subpartitions', +'registry-components'. + +=back + +=cut diff --git a/centreon-plugins/database/oracle/plugin.pm b/centreon-plugins/database/oracle/plugin.pm index ad0cb4bae..f212c23c8 100644 --- a/centreon-plugins/database/oracle/plugin.pm +++ b/centreon-plugins/database/oracle/plugin.pm @@ -39,6 +39,7 @@ sub new { 'data-files-status' => 'database::oracle::mode::datafilesstatus', 'datacache-hitratio' => 'database::oracle::mode::datacachehitratio', 'event-waits-usage' => 'database::oracle::mode::eventwaitsusage', + 'invalid-object' => 'database::oracle::mode::invalidobject', 'long-queries' => 'database::oracle::mode::longqueries', 'process-usage' => 'database::oracle::mode::processusage', 'rman-backup-problems' => 'database::oracle::mode::rmanbackupproblems', @@ -48,6 +49,7 @@ sub new { 'tablespace-usage' => 'database::oracle::mode::tablespaceusage', 'session-usage' => 'database::oracle::mode::sessionusage', 'sql' => 'centreon::common::protocols::sql::mode::sql', + 'sql-string' => 'centreon::common::protocols::sql::mode::sqlstring', 'tnsping' => 'database::oracle::mode::tnsping', ); diff --git a/centreon-plugins/docs/en/developer/guide.rst b/centreon-plugins/docs/en/developer/guide.rst index 41dc32334..a38fb50cd 100644 --- a/centreon-plugins/docs/en/developer/guide.rst +++ b/centreon-plugins/docs/en/developer/guide.rst @@ -1479,7 +1479,7 @@ Then, edit **plugin.pm** and add the following lines: .. code-block:: perl # - # Copyright 2016 Centreon (http://www.centreon.com/) + # Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -1569,7 +1569,7 @@ Edit **memorydroppedpackets.pm** and add the following lines: .. code-block:: perl # - # Copyright 2016 Centreon (http://www.centreon.com/) + # Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -2233,4 +2233,4 @@ The following example show 4 new attributes: Class hardware -------------- -TODO \ No newline at end of file +TODO diff --git a/centreon-plugins/docs/en/user/guide.rst b/centreon-plugins/docs/en/user/guide.rst index 992736529..36ad83640 100644 --- a/centreon-plugins/docs/en/user/guide.rst +++ b/centreon-plugins/docs/en/user/guide.rst @@ -1119,33 +1119,44 @@ Design of configuration file Command line, output, threshold ... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Sample command : +Sample command: :: /usr/lib/nagios/plugins/centreon_plugins.pl --plugin database::mysql::plugin --dyn-mode apps::centreon::sql::mode::multiservices --host localhost --username centreon --password c3ntreon --config-file '/root/global-services.json' --verbose -Sample output : +Sample output: :: OK: Hosts state summary [up:4][down:2][unreachable:0] - Services state summary [ok:4][warning:0][critical:2][unknown:0] - Nothing special on groups | -Perfdatas : +Perfdatas: :: 'total_host_up'=4;;;0; 'total_host_down'=2;;;0; 'total_host_unreachable'=0;;;0; 'total_host_ok'=4;;;0; 'total_host_warning'=0;;;0; 'total_host_critical'=2;;;0; 'total_host_unknown'=0;;;0; 'host_up_ESX'=4;;;0; 'host_down_ESX'=0;;;0; 'host_unreachable_ESX'=0;;;0; 'service_ok_ESX'=4;;;0; 'service_warning_ESX'=0;;;0; 'service_critical_ESX'=0;;;0; 'service_unknown_ESX'=0;;;0; 'host_up_XIVO'=0;;;0; 'host_down_XIVO'=2;;;0; 'host_unreachable_XIVO'=0;;;0; 'service_ok_XIVO'=0;;;0; 'service_warning_XIVO'=0;;;0; 'service_critical_XIVO'=2;;;0; 'service_unknown_XIVO'=0;;;0; -Verbose mode (with display details set as true) : +Verbose mode (with display details set as true): :: Group 'ESX': HOSTS: [up: 4 (clus-esx-n1.com - clus-esx-n2.com - clus-esx-n3.com - clus-esx-n4.com)][down: 0][unreachable: 0] - SERVICES: [ok: 4 (clus-esx-n1.com/Esx-Status - clus-esx-n2.com/Esx-Status - clus-esx-n3.com/Esx-Status - clus-esx-n4.com/Esx-Status)][warning: 0][critical: 0][unknown: 0] Group 'XIVO': HOSTS: [up: 0][down: 2 (srvi-xivo-n1 - srvi-xivo-n2)][unreachable: 0] - SERVICES: [ok: 0][warning: 0][critical: 2 (srvi-xivo-n1/Ping - srvi-xivo-n2/Ping)][unknown: 0] -Concerning the threshold, you can use some example below : +Concerning the threshold, you can use some example below: :: --critical-total '%{total_down} > 4' --critical-groups '%{instance} eq 'ESX' && %{unknown} > 5' + +-------- +NSClient +-------- + +You can monitor Windows/Linux system with the Rest API of NSClient. Commands and arguments are the same than NRPE (look the NSClient documentation for more informations): + +:: + + $ perl centreon_plugins.pl --plugin=apps::nsclient::restapi::plugin --mode=query --hostname="10.30.2.10" --port=443 --legacy-password=centreon --command=check_drivesize --arg="drive=*" --arg="perf-config=used(unit:B)used %(ignored:true)" --arg="filter=type = 'fixed' and name not regexp '.*yst.*'" --arg="warning=total_used>80%" --arg="critical=total_used>90%" + OK All 2 drive(s) are ok | '\\?\Volume{7cd2d555-9868-11e7-8199-806e6f6e6963}\ used'=289468416.000B;293598003.000;330297753.000;0.000;366997504.000 'C:\ used'=23285907456.000B;42654390681.000;47986189516.000;0.000;53317988352.000 diff --git a/centreon-plugins/docs/fr/developer/guide.rst b/centreon-plugins/docs/fr/developer/guide.rst index 7f54ffaa5..6a1f4cf67 100644 --- a/centreon-plugins/docs/fr/developer/guide.rst +++ b/centreon-plugins/docs/fr/developer/guide.rst @@ -1469,7 +1469,7 @@ Ensuite, éditer le fichier **plugin.pm** et ajouter les lignes suivantes : .. code-block:: perl # - # Copyright 2016 Centreon (http://www.centreon.com/) + # Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for @@ -1559,7 +1559,7 @@ Editer le fichier **memorydroppedpackets.pm** et ajouter les lignes suivantes : .. code-block:: perl # - # Copyright 2016 Centreon (http://www.centreon.com/) + # Copyright 2017 Centreon (http://www.centreon.com/) # # Centreon is a full-fledged industry-strength solution that meets # the needs in IT infrastructure and application monitoring for diff --git a/centreon-plugins/docs/fr/user/guide.rst b/centreon-plugins/docs/fr/user/guide.rst index b31d74e55..706615686 100644 --- a/centreon-plugins/docs/fr/user/guide.rst +++ b/centreon-plugins/docs/fr/user/guide.rst @@ -1150,3 +1150,14 @@ Voici la manière de définir les seuils (total_statut pour les warning/critical :: --critical-total '%{total_down} > 4' --critical-groups '%{instance} eq 'ESX' && %{unknown} > 5' + +-------- +NSClient +-------- + +Vous pouvez superviser des systèmes Windows/Linux via l'API Rest de NSClient. Les commandes et arguments sont les mêmes que via NRPE (veuillez lire la documentation NSClient pour plus d'informations) : + +:: + + $ perl centreon_plugins.pl --plugin=apps::nsclient::restapi::plugin --mode=query --hostname="10.30.2.10" --port=443 --legacy-password=centreon --command=check_drivesize --arg="drive=*" --arg="perf-config=used(unit:B)used %(ignored:true)" --arg="filter=type = 'fixed' and name not regexp '.*yst.*'" --arg="warning=total_used>80%" --arg="critical=total_used>90%" + OK All 2 drive(s) are ok | '\\?\Volume{7cd2d555-9868-11e7-8199-806e6f6e6963}\ used'=289468416.000B;293598003.000;330297753.000;0.000;366997504.000 'C:\ used'=23285907456.000B;42654390681.000;47986189516.000;0.000;53317988352.000 diff --git a/centreon-plugins/hardware/devices/video/appeartv/snmp/mode/alarms.pm b/centreon-plugins/hardware/devices/video/appeartv/snmp/mode/alarms.pm index 7f62447a4..cadb15ed3 100644 --- a/centreon-plugins/hardware/devices/video/appeartv/snmp/mode/alarms.pm +++ b/centreon-plugins/hardware/devices/video/appeartv/snmp/mode/alarms.pm @@ -154,7 +154,7 @@ sub manage_selection { { oid => $mapping->{msgText}->{oid} }, { oid => $mapping->{msgGenerationTime}->{oid} }, { oid => $mapping->{msgSeverity}->{oid} }, - ], nothing_quit => 1, return_type => 1); + ], return_type => 1); my $last_time; if (defined($self->{option_results}->{memory})) { diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/fan.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/fan.pm index f6e6ca03d..8f306419d 100644 --- a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/fan.pm +++ b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/fan.pm @@ -24,40 +24,59 @@ use strict; use warnings; use centreon::plugins::misc; +my $mapping = { + fanDescr => { oid => '.1.3.6.1.4.1.2.3.51.3.1.3.2.1.2' }, + fanSpeed => { oid => '.1.3.6.1.4.1.2.3.51.3.1.3.2.1.3' }, +}; +my $oid_fanEntry = '.1.3.6.1.4.1.2.3.51.3.1.3.2.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_fanEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{fans} = {name => 'fans', total => 0}; $self->{output}->output_add(long_msg => "Checking fans"); - return if ($self->check_exclude('fans')); + $self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; + return if ($self->check_filter(section => 'fan')); - my $oid_fanEntry = '.1.3.6.1.4.1.2.3.51.3.1.3.2.1'; - my $oid_fanDescr = '.1.3.6.1.4.1.2.3.51.3.1.3.2.1.2'; - my $oid_fanSpeed = '.1.3.6.1.4.1.2.3.51.3.1.3.2.1.3'; - - my $result = $self->{snmp}->get_table(oid => $oid_fanEntry); - return if (scalar(keys %$result) <= 0); - - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_fanDescr\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_fanEntry}})) { + next if ($oid !~ /^$mapping->{fanSpeed}->{oid}\.(.*)$/); my $instance = $1; - - my $fan_descr = centreon::plugins::misc::trim($result->{$oid_fanDescr . '.' . $instance}); - my $fan_speed = centreon::plugins::misc::trim($result->{$oid_fanSpeed . '.' . $instance}); + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_fanEntry}, instance => $instance); + $result->{fanDescr} = centreon::plugins::misc::trim($result->{fanDescr}); + $result->{fanSpeed} = centreon::plugins::misc::trim($result->{fanSpeed}); + + next if ($self->check_filter(section => 'fan', instance => $instance)); - $self->{components}->{fans}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Fan '%s' speed is %s.", - $fan_descr, $fan_speed)); - if ($fan_speed =~ /offline/i) { - $self->{output}->output_add(severity => 'WARNING', - short_msg => sprintf("Fan '%s' is offline", $fan_descr)); - } else { - $fan_speed =~ /(\d+)/; - $self->{output}->perfdata_add(label => 'fan_' . $fan_descr, unit => '%', - value => $1, - min => 0, max => 100); + $self->{components}->{fan}->{total}++; + $self->{output}->output_add(long_msg => sprintf("Fan '%s' speed is '%s' [instance = %s]", + $result->{fanDescr}, $result->{fanSpeed}, $instance)); + if ($result->{fanSpeed} =~ /offline/i) { + my $exit = $self->get_severity(section => 'fan', value => $result->{fanSpeed}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' is offline", $result->{fanDescr})); + } } + + next if ($result->{fanSpeed} !~ /(\d+)/); + + my $fan_speed = $1; + my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $fan_speed); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' is '%s' %%", $result->{fanDescr}, $fan_speed)); + } + $self->{output}->perfdata_add(label => 'fan_' . $result->{fanDescr}, unit => '%', + value => $fan_speed, + warning => $warn, + critical => $crit, min => 0, max => 100 + ); } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/global.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/global.pm new file mode 100644 index 000000000..46e607410 --- /dev/null +++ b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/global.pm @@ -0,0 +1,67 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::global; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +my %map_global_status = ( + 0 => 'non recoverable', + 2 => 'critical', + 4 => 'non critical', + 255 => 'nominal', +); + +my $mapping = { + systemHealthStat => { oid => '.1.3.6.1.4.1.2.3.51.3.1.4.1', map => \%map_global_status }, +}; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $mapping->{systemHealthStat}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking system health"); + $self->{components}->{global} = {name => 'system health', total => 0, skip => 0}; + return if ($self->check_filter(section => 'global')); + + return if (!defined($self->{results}->{$mapping->{systemHealthStat}->{oid}}) || scalar(keys %{$self->{results}->{$mapping->{systemHealthStat}->{oid}}}) <= 0); + + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{systemHealthStat}->{oid}}, instance => '0'); + $self->{components}->{global}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("system health status is '%s'", + $result->{systemHealthStat})); + my $exit = $self->get_severity(section => 'global', value => $result->{systemHealthStat}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("System health status is '%s'.", + $result->{systemHealthStat})); + } +} + +1; diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/globalstatus.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/globalstatus.pm deleted file mode 100644 index 6abed82cc..000000000 --- a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/globalstatus.pm +++ /dev/null @@ -1,51 +0,0 @@ -# -# Copyright 2017 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::globalstatus; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; - -my %states = ( - 0 => ['non recoverable', 'CRITICAL'], - 2 => ['critical', 'CRITICAL'], - 4 => ['non critical', 'WARNING'], - 255 => ['nominal', 'OK'], -); - -sub check { - my ($self) = @_; - - my $oid_systemHealthStat = '.1.3.6.1.4.1.2.3.51.3.1.4.1.0'; - my $result = $self->{snmp}->get_leef(oids => [$oid_systemHealthStat], nothing_quit => 1); - - $self->{components}->{global} = {name => 'system health', total => 1}; - $self->{output}->output_add(long_msg => sprintf("System health status is '%s'.", - ${$states{$result->{$oid_systemHealthStat}}}[0])); - if (${$states{$result->{$oid_systemHealthStat}}}[1] ne 'OK') { - $self->{output}->output_add(severity => ${$states{$result->{$oid_systemHealthStat}}}[1], - short_msg => sprintf("System health status is '%s'.", - ${$states{$result->{$oid_systemHealthStat}}}[0])); - } -} - -1; \ No newline at end of file diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/temperature.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/temperature.pm index 410cd3c0c..b632d4e3b 100644 --- a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/temperature.pm +++ b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/temperature.pm @@ -24,59 +24,66 @@ use strict; use warnings; use centreon::plugins::misc; +my $mapping = { + tempDescr => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.2' }, + tempReading => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.3' }, + tempCritLimitHigh => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.6' }, + tempNonCritLimitHigh => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.7' }, + tempCritLimitLow => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.9' }, + tempNonCritLimitLow => { oid => '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.10' }, +}; +my $oid_tempEntry = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_tempEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{temperatures} = {name => 'temperatures', total => 0}; $self->{output}->output_add(long_msg => "Checking temperatures"); - return if ($self->check_exclude('temperatures')); + $self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0}; + return if ($self->check_filter(section => 'temperature')); - my $oid_tempEntry = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1'; - my $oid_tempDescr = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.2'; - my $oid_tempReading = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.3'; - my $oid_tempCritLimitHigh = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.6'; - my $oid_tempNonCritLimitHigh = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.7'; - my $oid_tempCritLimitLow = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.9'; - my $oid_tempNonCritLimitLow = '.1.3.6.1.4.1.2.3.51.3.1.1.2.1.10'; - - my $result = $self->{snmp}->get_table(oid => $oid_tempEntry); - return if (scalar(keys %$result) <= 0); - - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_tempDescr\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_tempEntry}})) { + next if ($oid !~ /^$mapping->{tempDescr}->{oid}\.(.*)$/); my $instance = $1; - - my $temp_descr = centreon::plugins::misc::trim($result->{$oid_tempDescr . '.' . $instance}); - my $temp_value = $result->{$oid_tempReading . '.' . $instance}; - my $temp_crit_high = $result->{$oid_tempCritLimitHigh . '.' . $instance}; - my $temp_warn_high = $result->{$oid_tempNonCritLimitHigh . '.' . $instance}; - my $temp_crit_low = $result->{$oid_tempCritLimitLow . '.' . $instance}; - my $temp_warn_low = $result->{$oid_tempNonCritLimitLow . '.' . $instance}; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_tempEntry}, instance => $instance); + + next if ($self->check_filter(section => 'temperature', instance => $instance)); + $result->{tempDescr} = centreon::plugins::misc::trim($result->{tempDescr}); + $self->{components}->{temperature}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("temperature '%s' value is %s C [instance: %s].", + $result->{tempDescr}, $result->{tempReading}, $instance)); - my $warn_threshold = ''; - $warn_threshold = $temp_warn_low . ':' . $temp_warn_high; - my $crit_threshold = ''; - $crit_threshold = $temp_crit_low . ':' . $temp_crit_high; - - $self->{perfdata}->threshold_validate(label => 'warning_' . $instance, value => $warn_threshold); - $self->{perfdata}->threshold_validate(label => 'critical_' . $instance, value => $crit_threshold); - - my $exit = $self->{perfdata}->threshold_check(value => $temp_value, threshold => [ { label => 'critical_' . $instance, 'exit_litteral' => 'critical' }, { label => 'warning_' . $instance, exit_litteral => 'warning' } ]); - - $self->{components}->{temperatures}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Temperature '%s' value is %s C.", - $temp_descr, $temp_value)); - if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Temperature '%s' value is %s C", $temp_descr, $temp_value)); + if (defined($result->{tempReading})) { + my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{tempReading}); + if ($checked == 0) { + my $warn_th = $result->{tempNonCritLimitLow} . ':' . $result->{tempNonCritLimitHigh}; + my $crit_th = $result->{tempCritLimitLow} . ':' . $result->{tempCritLimitHigh}; + $self->{perfdata}->threshold_validate(label => 'warning-temperature-instance-' . $instance, value => $warn_th); + $self->{perfdata}->threshold_validate(label => 'critical-temperature-instance-' . $instance, value => $crit_th); + $exit = $self->{perfdata}->threshold_check( + value => $result->{tempReading}, + threshold => [ { label => 'critical-temperature-instance-' . $instance, exit_litteral => 'critical' }, + { label => 'warning-temperature-instance-' . $instance, exit_litteral => 'warning' } ]); + + $warn = $self->{perfdata}->get_perfdata_for_output(label => 'warning-temperature-instance-' . $instance); + $crit = $self->{perfdata}->get_perfdata_for_output(label => 'critical-temperature-instance-' . $instance); + } + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Temperature '%s' is %s C", $result->{tempDescr}, $result->{tempReading})); + } + $self->{output}->perfdata_add(label => "temp_" . $result->{tempDescr}, unit => 'C', + value => $result->{tempReading}, + warning => $warn, + critical => $crit); } - - $self->{output}->perfdata_add(label => 'temp_' . $temp_descr, unit => 'C', - value => $temp_value, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning_' . $instance), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical_' . $instance), - ); } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/voltage.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/voltage.pm index accca707f..4c3fe85c8 100644 --- a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/voltage.pm +++ b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/components/voltage.pm @@ -24,61 +24,66 @@ use strict; use warnings; use centreon::plugins::misc; +my $mapping = { + voltDescr => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.2' }, + voltReading => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.3' }, + voltCritLimitHigh => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.6' }, + voltNonCritLimitHigh => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.7' }, + voltCritLimitLow => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.9' }, + voltNonCritLimitLow => { oid => '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.10' }, +}; +my $oid_voltEntry = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_voltEntry }; +} + sub check { my ($self) = @_; - $self->{components}->{voltages} = {name => 'voltages', total => 0}; $self->{output}->output_add(long_msg => "Checking voltages"); - return if ($self->check_exclude('voltages')); + $self->{components}->{voltage} = {name => 'voltages', total => 0, skip => 0}; + return if ($self->check_filter(section => 'voltage')); - my $oid_voltEntry = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1'; - my $oid_voltDescr = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.2'; - my $oid_voltReading = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.3'; - my $oid_voltCritLimitHigh = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.6'; - my $oid_voltNonCritLimitHigh = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.7'; - my $oid_voltCritLimitLow = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.9'; - my $oid_voltNonCritLimitLow = '.1.3.6.1.4.1.2.3.51.3.1.2.2.1.10'; - - my $result = $self->{snmp}->get_table(oid => $oid_voltEntry); - return if (scalar(keys %$result) <= 0); - - foreach my $key ($self->{snmp}->oid_lex_sort(keys %$result)) { - next if ($key !~ /^$oid_voltDescr\.(\d+)$/); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_voltEntry}})) { + next if ($oid !~ /^$mapping->{voltDescr}->{oid}\.(.*)$/); my $instance = $1; - - my $volt_descr = centreon::plugins::misc::trim($result->{$oid_voltDescr . '.' . $instance}); - my $volt_value = $result->{$oid_voltReading . '.' . $instance}; - my $volt_crit_high = $result->{$oid_voltCritLimitHigh . '.' . $instance}; - my $volt_warn_high = $result->{$oid_voltNonCritLimitHigh . '.' . $instance}; - my $volt_crit_low = $result->{$oid_voltCritLimitLow . '.' . $instance}; - my $volt_warn_low = $result->{$oid_voltNonCritLimitLow . '.' . $instance}; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_voltEntry}, instance => $instance); + + next if ($self->check_filter(section => 'voltage', instance => $instance)); + $result->{voltDescr} = centreon::plugins::misc::trim($result->{voltDescr}); + $self->{components}->{voltage}->{total}++; + + $self->{output}->output_add(long_msg => sprintf("voltage '%s' value is %s [instance: %s].", + $result->{voltDescr}, $result->{voltReading}, $instance)); - my $warn_threshold = ''; - $warn_threshold = $volt_warn_low . ':' if ($volt_warn_low != 0); - $warn_threshold .= $volt_warn_high if ($volt_warn_high != 0); - my $crit_threshold = ''; - $crit_threshold = $volt_crit_low . ':' if ($volt_crit_low != 0); - $crit_threshold .= $volt_crit_high if ($volt_crit_high != 0); - - $self->{perfdata}->threshold_validate(label => 'warning_' . $instance, value => $warn_threshold); - $self->{perfdata}->threshold_validate(label => 'critical_' . $instance, value => $crit_threshold); - - my $exit = $self->{perfdata}->threshold_check(value => $volt_value, threshold => [ { label => 'critical_' . $instance, 'exit_litteral' => 'critical' }, { label => 'warning_' . $instance, exit_litteral => 'warning' } ]); - - $self->{components}->{temperatures}->{total}++; - $self->{output}->output_add(long_msg => sprintf("Voltage '%s' value is %s.", - $volt_descr, $volt_value)); - if (!$self->{output}->is_status(litteral => 1, value => $exit, compare => 'ok')) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Voltage '%s' value is %s", $volt_descr, $volt_value)); + if (defined($result->{voltReading})) { + my ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'voltage', instance => $instance, value => $result->{voltReading}); + if ($checked == 0) { + my $warn_th = $result->{voltNonCritLimitLow} . ':' . ($result->{voltNonCritLimitHigh} > 0 ? $result->{voltNonCritLimitHigh} : ''); + my $crit_th = $result->{voltCritLimitLow} . ':' . ($result->{voltCritLimitHigh} > 0 ? $result->{voltCritLimitHigh} : ''); + $self->{perfdata}->threshold_validate(label => 'warning-voltage-instance-' . $instance, value => $warn_th); + $self->{perfdata}->threshold_validate(label => 'critical-voltage-instance-' . $instance, value => $crit_th); + $exit = $self->{perfdata}->threshold_check( + value => $result->{voltReading}, + threshold => [ { label => 'critical-voltage-instance-' . $instance, exit_litteral => 'critical' }, + { label => 'warning-voltage-instance-' . $instance, exit_litteral => 'warning' } ]); + + $warn = $self->{perfdata}->get_perfdata_for_output(label => 'warning-voltage-instance-' . $instance); + $crit = $self->{perfdata}->get_perfdata_for_output(label => 'critical-voltage-instance-' . $instance); + } + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Voltage '%s' is %s", $result->{voltDescr}, $result->{voltReading})); + } + $self->{output}->perfdata_add(label => "volt_" . $result->{voltDescr}, + value => $result->{voltReading}, + warning => $warn, + critical => $crit); } - - $self->{output}->perfdata_add(label => 'volt_' . $volt_descr, - value => $volt_value, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning_' . $instance), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical_' . $instance), - ); } } -1; \ No newline at end of file +1; diff --git a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/environment.pm b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/environment.pm index bd32acdf2..81e25d826 100644 --- a/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/environment.pm +++ b/centreon-plugins/hardware/server/ibm/mgmt_cards/imm/snmp/mode/environment.pm @@ -20,15 +20,42 @@ package hardware::server::ibm::mgmt_cards::imm::snmp::mode::environment; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::hardware); use strict; use warnings; -use hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::globalstatus; -use hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::temperature; -use hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::voltage; -use hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::fan; +sub set_system { + my ($self, %options) = @_; + + $self->{regexp_threshold_overload_check_section_option} = '^(global|temperature|voltage|fan)$'; + $self->{regexp_threshold_numeric_check_section_option} = '^(temperature|voltage|fan)$'; + + $self->{cb_hook2} = 'snmp_execute'; + + $self->{thresholds} = { + global => [ + ['non recoverable', 'CRITICAL'], + ['non critical', 'WARNING'], + ['critical', 'CRITICAL'], + ['nominal', 'OK'], + ], + fan => [ + ['offline', 'WARNING'], + ['.*', 'OK'], + ], + }; + + $self->{components_path} = 'hardware::server::ibm::mgmt_cards::imm::snmp::mode::components'; + $self->{components_module} = ['global', 'temperature', 'voltage', 'fan']; +} + +sub snmp_execute { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); +} sub new { my ($class, %options) = @_; @@ -38,78 +65,11 @@ sub new { $self->{version} = '1.0'; $options{options}->add_options(arguments => { - "exclude:s" => { name => 'exclude' }, - "component:s" => { name => 'component', default => 'all' }, }); - $self->{components} = {}; + return $self; } -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub global { - my ($self, %options) = @_; - - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::globalstatus::check($self); - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::temperature::check($self); - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::voltage::check($self); - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::fan::check($self); -} - -sub run { - my ($self, %options) = @_; - $self->{snmp} = $options{snmp}; - - if ($self->{option_results}->{component} eq 'all') { - $self->global(); - } elsif ($self->{option_results}->{component} eq 'globalstatus') { - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::globalstatus::check($self); - } elsif ($self->{option_results}->{component} eq 'temperature') { - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::temperature::check($self); - } elsif ($self->{option_results}->{component} eq 'voltage') { - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::voltage::check($self); - } elsif ($self->{option_results}->{component} eq 'fan') { - hardware::server::ibm::mgmt_cards::imm::snmp::mode::components::fan::check($self); - } else { - $self->{output}->add_option_msg(short_msg => "Wrong option. Cannot find component '" . $self->{option_results}->{component} . "'."); - $self->{output}->option_exit(); - } - - my $total_components = 0; - my $display_by_component = ''; - my $display_by_component_append = ''; - foreach my $comp (sort(keys %{$self->{components}})) { - # Skipping short msg when no components - next if ($self->{components}->{$comp}->{total} == 0); - $total_components += $self->{components}->{$comp}->{total}; - $display_by_component .= $display_by_component_append . $self->{components}->{$comp}->{total} . ' ' . $self->{components}->{$comp}->{name}; - $display_by_component_append = ', '; - } - - $self->{output}->output_add(severity => 'OK', - short_msg => sprintf("All %s components [%s] are ok.", - $total_components, - $display_by_component - ) - ); - - $self->{output}->display(); - $self->{output}->exit(); -} - -sub check_exclude { - my ($self, $section) = @_; - - if (defined($self->{option_results}->{exclude}) && $self->{option_results}->{exclude} =~ /(^|\s|,)$section(\s|,|$)/) { - $self->{output}->output_add(long_msg => sprintf("Skipping $section section.")); - return 1; - } - return 0; -} - 1; __END__ @@ -122,14 +82,36 @@ Check sensors (Fans, Temperatures, Voltages). =item B<--component> -Which component to check (Default: 'all'). -Can be: 'globalstatus', 'fan', 'temperature', 'voltage'. +Which component to check (Default: '.*'). +Can be: 'global', 'fan', 'temperature', 'voltage'. -=item B<--exclude> +=item B<--filter> -Exclude some parts (comma seperated list) (Example: --exclude=temperatures,fans). +Exclude some parts (comma seperated list) (Example: --filter=fan --filter=temperature) +Can also exclude specific instance: --filter=fan,1 + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='fan,OK,offline' + +=item B<--warning> + +Set warning threshold for 'temperature', 'fan', 'voltage' (syntax: type,regexp,threshold) +Example: --warning='temperature,.*,30' + +=item B<--critical> + +Set critical threshold for temperature', 'fan', 'voltage' (syntax: type,regexp,threshold) +Example: --critical='temperature,.*,40' =back =cut - \ No newline at end of file + diff --git a/centreon-plugins/hardware/ups/powerware/snmp/mode/batterystatus.pm b/centreon-plugins/hardware/ups/powerware/snmp/mode/batterystatus.pm index 30ec2b627..6dad01e53 100644 --- a/centreon-plugins/hardware/ups/powerware/snmp/mode/batterystatus.pm +++ b/centreon-plugins/hardware/ups/powerware/snmp/mode/batterystatus.pm @@ -28,7 +28,7 @@ use warnings; my %battery_status = ( 1 => ['batteryCharging', 'OK'], 2 => ['batteryDischarging', 'WARNING'], - 3 => ['batteryFloating', 'WARNING'], + 3 => ['batteryFloating', 'OK'], 4 => ['batteryResting', 'OK'], 5 => ['unknown', 'UNKNOWN'], ); diff --git a/centreon-plugins/network/arista/snmp/mode/memory.pm b/centreon-plugins/network/arista/snmp/mode/memory.pm new file mode 100644 index 000000000..786638057 --- /dev/null +++ b/centreon-plugins/network/arista/snmp/mode/memory.pm @@ -0,0 +1,98 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::arista::snmp::mode::memory; + +use base qw(snmp_standard::mode::storage); + +use strict; +use warnings; + +sub default_storage_type { + my ($self, %options) = @_; + + return '^(hrStorageRam|hrStorageFlashMemory)'; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + return $self; +} + +1; + +__END__ + +=head1 MODE + +Check memory. + +=over 8 + +=item B<--warning-usage> + +Threshold warning. + +=item B<--critical-usage> + +Threshold critical. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'B'). + +=item B<--free> + +Thresholds are on free space left. + +=item B<--storage> + +Set the storage (number expected) ex: 1, 2,... (empty means 'check all storage'). + +=item B<--name> + +Allows to use storage name with option --storage instead of storage oid index. + +=item B<--regexp> + +Allows to use regexp to filter storage (with option --name). + +=item B<--regexp-isensitive> + +Allows to use regexp non case-sensitive (with --regexp). + +=item B<--reload-cache-time> + +Time in minutes before reloading cache file (default: 180). + +=item B<--show-cache> + +Display cache storage datas. + +=item B<--filter-storage-type> + +Filter storage types with a regexp (Default: '^(hrStorageRam|hrStorageFlashMemory)$'). + +=back + +=cut diff --git a/centreon-plugins/network/arista/snmp/plugin.pm b/centreon-plugins/network/arista/snmp/plugin.pm new file mode 100644 index 000000000..0f4ff1738 --- /dev/null +++ b/centreon-plugins/network/arista/snmp/plugin.pm @@ -0,0 +1,54 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::arista::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'cpu' => 'snmp_standard::mode::cpu', + 'entity' => 'snmp_standard::mode::entity', + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'memory' => 'network::arista::snmp::mode::memory', + 'tcpcon' => 'snmp_standard::mode::tcpcon', + 'uptime' => 'snmp_standard::mode::uptime', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Arista equipments in SNMP. + +=cut diff --git a/centreon-plugins/network/cisco/standard/snmp/plugin.pm b/centreon-plugins/network/cisco/standard/snmp/plugin.pm index f44b873c1..fbc57a62f 100644 --- a/centreon-plugins/network/cisco/standard/snmp/plugin.pm +++ b/centreon-plugins/network/cisco/standard/snmp/plugin.pm @@ -42,6 +42,7 @@ sub new { 'qos-usage' => 'centreon::common::cisco::standard::snmp::mode::qosusage', 'spanning-tree' => 'snmp_standard::mode::spanningtree', 'stack' => 'centreon::common::cisco::standard::snmp::mode::stack', + 'uptime' => 'snmp_standard::mode::uptime', ); return $self; diff --git a/centreon-plugins/network/dell/6200/plugin.pm b/centreon-plugins/network/dell/6200/snmp/plugin.pm similarity index 90% rename from centreon-plugins/network/dell/6200/plugin.pm rename to centreon-plugins/network/dell/6200/snmp/plugin.pm index 198d0f68f..e321b9244 100644 --- a/centreon-plugins/network/dell/6200/plugin.pm +++ b/centreon-plugins/network/dell/6200/snmp/plugin.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::dell::6200::plugin; +package network::dell::6200::snmp::plugin; use strict; use warnings; @@ -32,10 +32,10 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( 'global-status' => 'centreon::common::dell::powerconnect3000::mode::globalstatus', - 'environment' => 'centreon::common::fastpath::mode::environment', + 'environment' => 'centreon::common::dell::fastpath::snmp::mode::environment', 'interfaces' => 'snmp_standard::mode::interfaces', - 'memory' => 'centreon::common::fastpath::mode::memory', - 'cpu' => 'centreon::common::fastpath::mode::cpu', + 'memory' => 'centreon::common::dell::fastpath::snmp::mode::memory', + 'cpu' => 'centreon::common::dell::fastpath::snmp::mode::cpu', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', ); diff --git a/centreon-plugins/network/dell/n4000/plugin.pm b/centreon-plugins/network/dell/n4000/snmp/plugin.pm similarity index 90% rename from centreon-plugins/network/dell/n4000/plugin.pm rename to centreon-plugins/network/dell/n4000/snmp/plugin.pm index e5b0e53b9..c0a0ad767 100644 --- a/centreon-plugins/network/dell/n4000/plugin.pm +++ b/centreon-plugins/network/dell/n4000/snmp/plugin.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::dell::n4000::plugin; +package network::dell::n4000::snmp::plugin; use strict; use warnings; @@ -32,10 +32,10 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( 'global-status' => 'centreon::common::dell::powerconnect3000::mode::globalstatus', - 'environment' => 'centreon::common::fastpath::mode::environment', + 'environment' => 'centreon::common::dell::fastpath::snmp::mode::environment', 'interfaces' => 'snmp_standard::mode::interfaces', - 'memory' => 'centreon::common::fastpath::mode::memory', - 'cpu' => 'centreon::common::fastpath::mode::cpu', + 'memory' => 'centreon::common::dell::fastpath::snmp::mode::memory', + 'cpu' => 'centreon::common::dell::fastpath::snmp::mode::cpu', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', ); diff --git a/centreon-plugins/network/f5/bigip/snmp/mode/listpools.pm b/centreon-plugins/network/f5/bigip/snmp/mode/listpools.pm index b0117b22d..c2f2ef5f3 100644 --- a/centreon-plugins/network/f5/bigip/snmp/mode/listpools.pm +++ b/centreon-plugins/network/f5/bigip/snmp/mode/listpools.pm @@ -88,7 +88,7 @@ sub run { } $self->{output}->output_add(severity => 'OK', - short_msg => 'List Nodes:'); + short_msg => 'List Pools:'); $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); $self->{output}->exit(); } @@ -132,4 +132,4 @@ Allows to use regexp to filter pool name (with option --name). =back =cut - \ No newline at end of file + diff --git a/centreon-plugins/network/freebox/restapi/custom/api.pm b/centreon-plugins/network/freebox/restapi/custom/api.pm new file mode 100644 index 000000000..b75c9cfaa --- /dev/null +++ b/centreon-plugins/network/freebox/restapi/custom/api.pm @@ -0,0 +1,306 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::freebox::restapi::custom::api; + +use strict; +use warnings; +use centreon::plugins::http; +use JSON; +use Digest::SHA qw(hmac_sha1_hex); + +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' }, + "freebox-app-id:s@" => { name => 'freebox_app_id' }, + "freebox-app-token:s@" => { name => 'freebox_app_token' }, + "freebox-api-version:s@" => { name => 'freebox_api_version', }, + "proxyurl:s@" => { name => 'proxyurl' }, + "timeout:s@" => { name => 'timeout' }, + "resolution:s@" => { name => 'resolution' }, + }); + } + $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); + + $self->{output} = $options{output}; + $self->{mode} = $options{mode}; + $self->{http} = centreon::plugins::http->new(output => $self->{output}); + + $self->{session_token} = undef; + + return $self; + +} + +sub set_options { + my ($self, %options) = @_; + + $self->{option_results} = $options{option_results}; +} + +sub set_defaults { + my ($self, %options) = @_; + + foreach (keys %{$options{default}}) { + if ($_ eq $self->{mode}) { + for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { + foreach my $opt (keys %{$options{default}->{$_}[$i]}) { + if (!defined($self->{option_results}->{$opt}[$i])) { + $self->{option_results}->{$opt}[$i] = $options{default}->{$_}[$i]->{$opt}; + } + } + } + } + } +} + +sub check_options { + my ($self, %options) = @_; + + $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : 'mafreebox.free.fr'; + $self->{freebox_app_id} = (defined($self->{option_results}->{freebox_app_id})) ? shift(@{$self->{option_results}->{freebox_app_id}}) : undef; + $self->{freebox_app_token} = (defined($self->{option_results}->{freebox_app_token})) ? shift(@{$self->{option_results}->{freebox_app_token}}) : undef; + $self->{freebox_api_version} = (defined($self->{option_results}->{freebox_api_version})) ? shift(@{$self->{option_results}->{freebox_api_version}}) : 'v4'; + $self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10; + $self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef; + $self->{resolution} = (defined($self->{option_results}->{resolution})) ? shift(@{$self->{option_results}->{resolution}}) : 300; + + if (!defined($self->{hostname})) { + $self->{output}->add_option_msg(short_msg => "Need to specify hostname option."); + $self->{output}->option_exit(); + } + if (!defined($self->{freebox_app_id})) { + $self->{output}->add_option_msg(short_msg => "Need to specify freebox-app-id option."); + $self->{output}->option_exit(); + } + if (!defined($self->{freebox_app_token})) { + $self->{output}->add_option_msg(short_msg => "Need to specify freebox-app-token option."); + $self->{output}->option_exit(); + } + + if (!defined($self->{option_results}->{freebox_app_id}) || + scalar(@{$self->{option_results}->{freebox_app_id}}) == 0) { + return 0; + } + return 1; +} + +sub build_options_for_httplib { + my ($self, %options) = @_; + + $self->{option_results}->{hostname} = $self->{hostname}; + $self->{option_results}->{timeout} = $self->{timeout}; + $self->{option_results}->{port} = 80; + $self->{option_results}->{proto} = 'http'; + $self->{option_results}->{proxyurl} = $self->{proxyurl}; +} + +sub settings { + my ($self, %options) = @_; + + $self->build_options_for_httplib(); + if (defined($self->{session_token})) { + $self->{http}->add_header(key => 'X-Fbx-App-Auth', value => $self->{session_token}); + } + $self->{http}->add_header(key => 'Accept', value => 'application/json'); + $self->{http}->add_header(key => 'Content-type', value => 'application/json'); + $self->{http}->set_options(%{$self->{option_results}}); +} + +sub manage_response { + my ($self, %options) = @_; + + my $response = $self->{http}->get_response(); + if ($response->code() != 200) { + $self->{output}->add_option_msg(short_msg => "Connection issue: " . $options{content}); + $self->{output}->option_exit(); + } + + my $decoded; + eval { + $decoded = decode_json($options{content}); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); + $self->{output}->option_exit(); + } + + if (!$decoded->{success}) { + $self->{output}->add_option_msg(short_msg => "Unsuccessful $options{type} response"); + $self->{output}->option_exit(); + } + + return $decoded; +} + +sub get_session { + my ($self, %options) = @_; + + $self->settings(); + my $content = $self->{http}->request(url_path => '/api/' . $self->{freebox_api_version} . '/login/', + critical_status => '', warning_status => '', unknown_status => ''); + my $decoded = $self->manage_response(content => $content, type => 'login'); + my $challenge = $decoded->{result}->{challenge}; + my $password = hmac_sha1_hex($challenge, $self->{freebox_app_token}); + + my $json_request = { app_id => $self->{freebox_app_id}, password => $password }; + my $encoded; + eval { + $encoded = encode_json($json_request); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot encode json request"); + $self->{output}->option_exit(); + } + + $content = $self->{http}->request(url_path => '/api/' . $self->{freebox_api_version} . '/login/session/', method => 'POST', + query_form_post => $encoded, critical_status => '', warning_status => '', unknown_status => ''); + $decoded = $self->manage_response(content => $content, type => 'login/session'); + + $self->{session_token} = $decoded->{result}->{session_token}; +} + +sub get_data { + my ($self, %options) = @_; + + if (!defined($self->{session_token})) { + $self->get_session(); + } + + $self->settings(); + my $content = $self->{http}->request(url_path => '/api/' . $self->{freebox_api_version} . '/' . $options{path}, + critical_status => '', warning_status => '', unknown_status => ''); + my $decoded = $self->manage_response(content => $content, type => $options{path}); + return $decoded->{result}; +} + +sub get_performance { + my ($self, %options) = @_; + + if (!defined($self->{session_token})) { + $self->get_session(); + } + + my $json_request = { db => $options{db}, date_start => time() - $self->{resolution}, precision => 100 }; + my $encoded; + eval { + $encoded = encode_json($json_request); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot encode json request"); + $self->{output}->option_exit(); + } + + $self->settings(); + my $content = $self->{http}->request(url_path => '/api/' . $self->{freebox_api_version} . '/' . $options{path}, + method => 'POST', query_form_post => $encoded, + critical_status => '', warning_status => '', unknown_status => ''); + my $decoded = $self->manage_response(content => $content); + my ($datas, $total) = ({}, 0); + foreach my $data (@{$decoded->{result}->{data}}) { + foreach my $label (keys %$data) { + next if ($label eq 'time'); + $datas->{$label} = 0 if (!defined($datas->{$label})); + $datas->{$label} += $data->{$label}; + } + $total++; + } + + foreach (keys %$datas) { + $datas->{$_} /= $total; + } + + return $datas; +} + +sub DESTROY { + my $self = shift; + + if (defined($self->{session_token})) { + $self->{http}->request(url_path => '/api/' . $self->{freebox_api_version} . '/login/logout/', method => 'POST'); + } +} + +1; + +__END__ + +=head1 NAME + +FREEBOX REST API + +=head1 SYNOPSIS + +Freebox Rest API custom mode + +=head1 REST API OPTIONS + +=over 8 + +=item B<--hostname> + +Freebox hostname (Default: 'mafreebox.free.fr'). + +=item B<--freebox-app-id> + +Freebox App ID. + +=item B<--freebox-app-token> + +Freebox App Token. + +=item B<--freebox-api-version> + +Freebox API version (Default: 'v4'). + +=item B<--proxyurl> + +Proxy URL if any. + +=item B<--timeout> + +Set HTTP timeout in seconds (Default: '10'). + +=item B<--resolution> + +Selected data performance resolution in seconds (Default: '300'). + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon-plugins/network/freebox/restapi/mode/dslusage.pm b/centreon-plugins/network/freebox/restapi/mode/dslusage.pm new file mode 100644 index 000000000..cc804e111 --- /dev/null +++ b/centreon-plugins/network/freebox/restapi/mode/dslusage.pm @@ -0,0 +1,128 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::freebox::restapi::mode::dslusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'rate-up', set => { + key_values => [ { name => 'rate_up' } ], + output_template => 'Dsl available upload bandwidth : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'rate_up', value => 'rate_up_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'rate-down', set => { + key_values => [ { name => 'rate_down' } ], + output_template => 'Dsl available download bandwidth : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'rate_down', value => 'rate_down_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'snr-up', set => { + key_values => [ { name => 'snr_up' } ], + output_template => 'Dsl upload signal/noise ratio : %.2f dB', + output_change_bytes => 2, + perfdatas => [ + { label => 'snr_up', value => 'snr_up_absolute', template => '%.2f', + unit => 'dB' }, + ], + } + }, + { label => 'snr-down', set => { + key_values => [ { name => 'snr_down' } ], + output_template => 'Dsl download signal/noise ratio : %.2f dB', + output_change_bytes => 2, + perfdatas => [ + { label => 'snr_down', value => 'snr_down_absolute', template => '%.2f', + unit => 'dB' }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->get_performance(db => 'dsl', path => 'rrd/'); + $result->{snr_up} *= 10 if (defined($result->{snr_up})); + $result->{snr_down} *= 10 if (defined($result->{snr_down})); + $self->{global} = { %{$result} }; +} + +1; + +__END__ + +=head1 MODE + +Check dsl usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^rate-up$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'rate-up', 'rate-down', 'snr-up', 'snr-down'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'rate-up', 'rate-down', 'snr-up', 'snr-down'. + +=back + +=cut diff --git a/centreon-plugins/network/freebox/restapi/mode/netusage.pm b/centreon-plugins/network/freebox/restapi/mode/netusage.pm new file mode 100644 index 000000000..f241dbfb2 --- /dev/null +++ b/centreon-plugins/network/freebox/restapi/mode/netusage.pm @@ -0,0 +1,146 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::freebox::restapi::mode::netusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'bw-up', set => { + key_values => [ { name => 'bw_up' } ], + output_template => 'Upload available bandwidth : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'bw_up', value => 'bw_up_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'bw-down', set => { + key_values => [ { name => 'bw_down' } ], + output_template => 'Download available bandwidth : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'bw_down', value => 'bw_down_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'rate-up', set => { + key_values => [ { name => 'rate_up' } ], + output_template => 'Upload rate : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'rate_up', value => 'rate_up_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'rate-down', set => { + key_values => [ { name => 'rate_down' } ], + output_template => 'Download rate : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'rate_down', value => 'rate_down_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'vpn-rate-up', set => { + key_values => [ { name => 'vpn_rate_up' } ], + output_template => 'Vpn client upload rate : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'vpn_rate_up', value => 'vpn_rate_up_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + { label => 'vpn-rate-down', set => { + key_values => [ { name => 'vpn_rate_down' } ], + output_template => 'Vpn client download rate : %.2f %s/s', + output_change_bytes => 2, + perfdatas => [ + { label => 'vpn_rate_down', value => 'vpn_rate_down_absolute', template => '%.2f', + unit => 'b/s', min => 0 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->get_performance(db => 'net', path => 'rrd/'); + $self->{global} = { %{$result} }; +} + +1; + +__END__ + +=head1 MODE + +Check network usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^bw-up$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'bw-up', 'bw-down', 'rate-up', 'rate-down', 'vpn-rate-up', 'vpn-rate-down'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'bw-up', 'bw-down', 'rate-up', 'rate-down', 'vpn-rate-up', 'vpn-rate-down'. + +=back + +=cut diff --git a/centreon-plugins/network/freebox/restapi/mode/system.pm b/centreon-plugins/network/freebox/restapi/mode/system.pm new file mode 100644 index 000000000..4f11eb1ab --- /dev/null +++ b/centreon-plugins/network/freebox/restapi/mode/system.pm @@ -0,0 +1,252 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::freebox::restapi::mode::system; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +my $instance_mode; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'wifi', type => 1, cb_prefix_output => 'prefix_wifi_output', message_multiple => 'All wifis are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'temperature-cpum', set => { + key_values => [ { name => 'temp_cpum' } ], + output_template => 'Temperature cpum : %s C', + perfdatas => [ + { label => 'temp_cpum', value => 'temp_cpum_absolute', template => '%s', + unit => 'C' }, + ], + } + }, + { label => 'temperature-cpub', set => { + key_values => [ { name => 'temp_cpub' } ], + output_template => 'Temperature cpub : %s C', + perfdatas => [ + { label => 'temp_cpub', value => 'temp_cpub_absolute', template => '%s', + unit => 'C' }, + ], + } + }, + { label => 'temperature-switch', set => { + key_values => [ { name => 'temp_sw' } ], + output_template => 'Temperature switch : %s C', + perfdatas => [ + { label => 'temp_sw', value => 'temp_sw_absolute', template => '%s', + unit => 'C' }, + ], + } + }, + { label => 'fan-speed', set => { + key_values => [ { name => 'fan_rpm' } ], + output_template => 'fan speed : %s rpm', + perfdatas => [ + { label => 'fan_rpm', value => 'fan_rpm_absolute', template => '%s', + min => 0, unit => 'rpm' }, + ], + } + }, + { label => 'disk-status', threshold => 0, set => { + key_values => [ { name => 'disk_status' } ], + closure_custom_calc => $self->can('custom_disk_status_calc'), + closure_custom_output => $self->can('custom_disk_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + + ]; + + $self->{maps_counters}->{wifi} = [ + { label => 'wifi-status', threshold => 0, set => { + key_values => [ { name => 'wifi_status' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_wifi_status_calc'), + closure_custom_output => $self->can('custom_wifi_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + ]; +} + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + my $label = $self->{label}; + $label =~ s/-/_/g; + if (defined($instance_mode->{option_results}->{'critical_' . $label}) && $instance_mode->{option_results}->{'critical_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'critical_' . $label}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{'warning_' . $label}) && $instance_mode->{option_results}->{'warning_' . $label} ne '' && + eval "$instance_mode->{option_results}->{'warning_' . $label}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_disk_status_output { + my ($self, %options) = @_; + my $msg = 'Disk status : ' . $self->{result_values}->{status}; + + return $msg; +} + +sub custom_disk_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_disk_status'}; + return 0; +} + +sub custom_wifi_status_output { + my ($self, %options) = @_; + my $msg = "Wifi '" . $self->{result_values}->{display} . "' status : " . $self->{result_values}->{status}; + + return $msg; +} + +sub custom_wifi_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_wifi_status'}; + return 0; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning-wifi-status:s" => { name => 'warning_wifi_status', default => '%{status} =~ /bad_param/i' }, + "critical-wifi-status:s" => { name => 'critical_wifi_status', default => '%{status} =~ /failed/i' }, + "warning-disk-status:s" => { name => 'warning_disk_status', default => '' }, + "critical-disk-status:s" => { name => 'critical_disk_status', default => '%{status} =~ /error/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_wifi_status', 'critical_wifi_status', 'warning_disk_status', 'critical_disk_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->get_data(path => 'system/'); + $self->{global} = { %{$result} }; + + $result = $options{custom}->get_data(path => 'wifi/ap/'); + $self->{wifi} = {}; + + $result = [$result] if (ref($result) ne 'ARRAY'); + foreach (@$result) { + $self->{wifi}->{$_->{id}} = { + display => $_->{name}, + wifi_status => $_->{status}->{state}, + }; + } +} + +1; + +__END__ + +=head1 MODE + +Check system. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^temperature-cpum$' + +=item B<--warning-wifi-status> + +Set warning threshold for wifi status (Default: '%{status} =~ /bad_param/i'). +Can used special variables like: %{status}, %{display} + +=item B<--critical-wifi-status> + +Set critical threshold for wifi status (Default: '%{status} =~ /failed/i'). +Can used special variables like: %{status}, %{display} + +=item B<--warning-disk-status> + +Set warning threshold for disk status. +Can used special variables like: %{status} + +=item B<--critical-disk-status> + +Set critical threshold for disk status (Default: '%{status} =~ /error/i'). +Can used special variables like: %{status} + +=item B<--warning-*> + +Threshold warning. +Can be: 'temperature-cpum', 'temperature-cpub', 'temperature-switch', 'fan-speed'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'temperature-cpum', 'temperature-cpub', 'temperature-switch', 'fan-speed'. + +=back + +=cut diff --git a/centreon-plugins/network/freebox/restapi/plugin.pm b/centreon-plugins/network/freebox/restapi/plugin.pm new file mode 100644 index 000000000..e88849059 --- /dev/null +++ b/centreon-plugins/network/freebox/restapi/plugin.pm @@ -0,0 +1,51 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::freebox::restapi::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_custom); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'dsl-usage' => 'network::freebox::restapi::mode::dslusage', + 'net-usage' => 'network::freebox::restapi::mode::netusage', + 'system' => 'network::freebox::restapi::mode::system', + ); + + $self->{custom_modes}{api} = 'network::freebox::restapi::custom::api'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Freebox through HTTP/REST API. + +=cut diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/components/fan.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/components/fan.pm new file mode 100644 index 000000000..04ab649b7 --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/components/fan.pm @@ -0,0 +1,86 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::components::fan; + +use strict; +use warnings; + +my %map_fan_status = ( + 1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering', + 5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible' +); + +my $mapping = { + boxServicesFanItemState => { oid => '.1.3.6.1.4.1.4526.10.43.1.6.1.3', map => \%map_fan_status }, + boxServicesFanSpeed => { oid => '.1.3.6.1.4.1.4526.10.43.1.6.1.4' }, +}; +my $oid_boxServicesFansEntry = '.1.3.6.1.4.1.4526.10.43.1.6.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_boxServicesFansEntry, begin => $mapping->{boxServicesFanItemState}->{oid}, end => $mapping->{boxServicesFanSpeed}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking fans"); + $self->{components}->{fan} = {name => 'fans', total => 0, skip => 0}; + return if ($self->check_filter(section => 'fan')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesFansEntry}})) { + next if ($oid !~ /^$mapping->{boxServicesFanItemState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesFansEntry}, instance => $instance); + + next if ($self->check_filter(section => 'fan', instance => $instance)); + if ($result->{boxServicesFanItemState} =~ /notpresent/i) { + $self->absent_problem(section => 'fan', instance => $instance); + next; + } + + $self->{components}->{fan}->{total}++; + $self->{output}->output_add(long_msg => sprintf("fan '%s' status is '%s' [instance = %s, speed = %s]", + $instance, $result->{boxServicesFanItemState}, $instance, defined($result->{boxServicesFanSpeed}) ? $result->{boxServicesFanSpeed} : 'unknown')); + $exit = $self->get_severity(label => 'default', section => 'fan', value => $result->{boxServicesFanItemState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' status is '%s'", $instance, $result->{boxServicesFanItemState})); + } + + next if (!defined($result->{boxServicesFanSpeed}) || $result->{boxServicesFanSpeed} !~ /[0-9]+/); + + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'fan', instance => $instance, value => $result->{boxServicesFanSpeed}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Fan '%s' is '%s' rpm", $instance, $result->{boxServicesFanSpeed})); + } + $self->{output}->perfdata_add(label => 'fan_' . $instance, unit => 'rpm', + value => $result->{boxServicesFanSpeed}, + warning => $warn, + critical => $crit, min => 0 + ); + } +} + +1; diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/components/psu.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/components/psu.pm new file mode 100644 index 000000000..e7e0ef28a --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/components/psu.pm @@ -0,0 +1,71 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::components::psu; + +use strict; +use warnings; + +my %map_psu_status = ( + 1 => 'notpresent', 2 => 'operational', 3 => 'failed', 4 => 'powering', + 5 => 'nopower', 6 => 'notpowering', 7 => 'incompatible' +); + +my $mapping = { + boxServicesPowSupplyItemState => { oid => '.1.3.6.1.4.1.4526.10.43.1.7.1.3', map => \%map_psu_status }, +}; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $mapping->{boxServicesPowSupplyItemState}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking power supplies"); + $self->{components}->{psu} = {name => 'psu', total => 0, skip => 0}; + return if ($self->check_filter(section => 'psu')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}})) { + next if ($oid !~ /^$mapping->{boxServicesPowSupplyItemState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$mapping->{boxServicesPowSupplyItemState}->{oid}}, instance => $instance); + + next if ($self->check_filter(section => 'psu', instance => $instance)); + if ($result->{boxServicesPowSupplyItemState} =~ /notpresent/i) { + $self->absent_problem(section => 'psu', instance => $instance); + next; + } + + $self->{components}->{psu}->{total}++; + $self->{output}->output_add(long_msg => sprintf("power supply '%s' status is '%s' [instance = %s]", + $instance, $result->{boxServicesPowSupplyItemState}, $instance)); + $exit = $self->get_severity(label => 'default', section => 'psu', value => $result->{boxServicesPowSupplyItemState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Power supply '%s' status is '%s'", $instance, $result->{boxServicesPowSupplyItemState})); + } + } +} + +1; diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/components/temperature.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/components/temperature.pm new file mode 100644 index 000000000..36a1a6603 --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/components/temperature.pm @@ -0,0 +1,86 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::components::temperature; + +use strict; +use warnings; + +my %map_temp_status = ( + 0 => 'low', 1 => 'normal', 2 => 'warning', 3 => 'critical', + 4 => 'shutdown', 5 => 'notpresent', 6 => 'notoperational', +); + +my $mapping = { + boxServicesTempSensorState => { oid => '.1.3.6.1.4.1.4526.10.43.1.8.1.4', map => \%map_temp_status }, + boxServicesTempSensorTemperature => { oid => '.1.3.6.1.4.1.4526.10.43.1.8.1.5' }, +}; +my $oid_boxServicesTempSensorsEntry = '.1.3.6.1.4.1.4526.10.43.1.8.1'; + +sub load { + my ($self) = @_; + + push @{$self->{request}}, { oid => $oid_boxServicesTempSensorsEntry, begin => $mapping->{boxServicesTempSensorState}->{oid}, end => $mapping->{boxServicesTempSensorTemperature}->{oid} }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => "Checking temperatures"); + $self->{components}->{temperature} = {name => 'temperatures', total => 0, skip => 0}; + return if ($self->check_filter(section => 'temperature')); + + my ($exit, $warn, $crit, $checked); + foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_boxServicesTempSensorsEntry}})) { + next if ($oid !~ /^$mapping->{boxServicesTempSensorState}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $self->{snmp}->map_instance(mapping => $mapping, results => $self->{results}->{$oid_boxServicesTempSensorsEntry}, instance => $instance); + + next if ($self->check_filter(section => 'temperature', instance => $instance)); + if ($result->{boxServicesTempSensorState} =~ /notpresent/i) { + $self->absent_problem(section => 'temperature', instance => $instance); + next; + } + + $self->{components}->{temperature}->{total}++; + $self->{output}->output_add(long_msg => sprintf("temperature '%s' status is '%s' [instance = %s, temperature = %s]", + $instance, $result->{boxServicesTempSensorState}, $instance, defined($result->{boxServicesTempSensorTemperature}) ? $result->{boxServicesTempSensorTemperature} : 'unknown')); + $exit = $self->get_severity(section => 'temperature', value => $result->{boxServicesTempSensorState}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Temperature '%s' status is '%s'", $instance, $result->{boxServicesTempSensorState})); + } + + next if (!defined($result->{boxServicesTempSensorTemperature}) || $result->{boxServicesTempSensorTemperature} !~ /[0-9]+/); + + ($exit, $warn, $crit, $checked) = $self->get_severity_numeric(section => 'temperature', instance => $instance, value => $result->{boxServicesTempSensorTemperature}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Temperature '%s' is '%s' rpm", $instance, $result->{boxServicesTempSensorTemperature})); + } + $self->{output}->perfdata_add(label => 'temp_' . $instance, unit => 'C', + value => $result->{boxServicesTempSensorTemperature}, + warning => $warn, + critical => $crit, + ); + } +} + +1; diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/cpu.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/cpu.pm new file mode 100644 index 000000000..4ad787a62 --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/cpu.pm @@ -0,0 +1,123 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::cpu; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_cpu_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => '5s', set => { + key_values => [ { name => 'usage_5s' } ], + output_template => '%.2f %% (5sec)', output_error_template => "%s (5sec)", + perfdatas => [ + { label => 'cpu_5s', value => 'usage_5s_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '1m', set => { + key_values => [ { name => 'usage_1m' } ], + output_template => '%.2f %% (1m)', output_error_template => "%s (1min)", + perfdatas => [ + { label => 'cpu_1m', value => 'usage_1m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '5m', set => { + key_values => [ { name => 'usage_5m' } ], + output_template => '%.2f %% (5min)', output_error_template => "%s (5min)", + perfdatas => [ + { label => 'cpu_5m', value => 'usage_5m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + ]; +} + +sub prefix_cpu_output { + my ($self, %options) = @_; + + return "CPU "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + # STRING: " 5 Secs ( 43.2625%) 60 Secs ( 13.9157%) 300 Secs ( 8.9274%)" + my $oid_agentSwitchCpuProcessTotalUtilization = '.1.3.6.1.4.1.4526.10.1.1.4.9.0'; + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_agentSwitchCpuProcessTotalUtilization], nothing_quit => 1); + + $snmp_result->{$oid_agentSwitchCpuProcessTotalUtilization} =~ /\s*5\s*Secs\s*\(\s*(.*?)%\s*\)\s*60\s*Secs\s*\(\s*(.*?)%\s*\)\s*300\s*Secs\s*\(\s*(.*?)%\s*\)/i; + $self->{global} = { usage_5s => $1, usage_1m => $2, usage_5m => $3 }; +} + +1; + +__END__ + +=head1 MODE + +Check CPU usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='5m' + +=item B<--warning-*> + +Threshold warning. +Can be: '5s', '1m', '5m'. + +=item B<--critical-*> + +Threshold critical. +Can be: '5s', '1m', '5m'. + +=back + +=cut diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/hardware.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/hardware.pm new file mode 100644 index 000000000..3f48cfb07 --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/hardware.pm @@ -0,0 +1,129 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::hardware; + +use base qw(centreon::plugins::templates::hardware); + +use strict; +use warnings; + +sub set_system { + my ($self, %options) = @_; + + $self->{regexp_threshold_overload_check_section_option} = '^(temperature|fan|psu)$'; + $self->{regexp_threshold_numeric_check_section_option} = '^(temperature|fan)$'; + + $self->{cb_hook2} = 'snmp_execute'; + + $self->{thresholds} = { + default => [ + ['notPresent', 'OK'], + ['operational', 'OK'], + ['failed', 'CRITICAL'], + ['notpowering', 'WARNING'], + ['powering', 'OK'], + ['nopower', 'OK'], + ['incompatible', 'WARNING'], + ], + temperature => [ + ['low', 'OK'], + ['normal', 'OK'], + ['warning', 'WARNING'], + ['critical', 'CRITICAL'], + ['notpresent', 'OK'], + ['shutdown', 'OK'], + ['notoperational', 'WARNING'], + ], + }; + + $self->{components_path} = 'network::netgear::mseries::snmp::mode::components'; + $self->{components_module} = ['fan', 'psu', 'temperature']; +} + +sub snmp_execute { + my ($self, %options) = @_; + + $self->{snmp} = $options{snmp}; + $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +1; + +__END__ + +=head1 MODE + +Check hardware. + +=over 8 + +=item B<--component> + +Which component to check (Default: '.*'). +Can be: 'fan', 'psu', 'temperature'. + +=item B<--filter> + +Exclude some parts (comma seperated list) (Example: --filter=fan --filter=psu) +Can also exclude specific instance: --filter=fan,1.1 + +=item B<--absent-problem> + +Return an error if an entity is not 'present' (default is skipping) (comma seperated list) +Can be specific or global: --absent-problem=fan,1 + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='psu,CRITICAL,^(?!(operational)$)' + +=item B<--warning> + +Set warning threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) +Example: --warning='temperature,.*,40' + +=item B<--critical> + +Set critical threshold for 'temperature', 'fan' (syntax: type,regexp,threshold) +Example: --critical='temperature,.*,50' + +=back + +=cut diff --git a/centreon-plugins/network/netgear/mseries/snmp/mode/memory.pm b/centreon-plugins/network/netgear/mseries/snmp/mode/memory.pm new file mode 100644 index 000000000..d2e2e646e --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/mode/memory.pm @@ -0,0 +1,138 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::mode::memory; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + $self->{output}->perfdata_add(label => 'used', unit => 'B', + value => $self->{result_values}->{used}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + min => 0, max => $self->{result_values}->{total}); +} + +sub custom_usage_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free}); + + my $msg = sprintf("Memory Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free}); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_total'}; + $self->{result_values}->{prct_used} = $options{new_datas}->{$self->{instance} . '_prct_used'}; + + $self->{result_values}->{used} = int($self->{result_values}->{prct_used} * $self->{result_values}->{total} / 100); + $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used}; + $self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'memory', type => 0 } + ]; + + $self->{maps_counters}->{memory} = [ + { label => 'usage', set => { + key_values => [ { name => 'prct_used' }, { name => 'total' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_agentSwitchCpuProcessMemFree = '.1.3.6.1.4.1.4526.10.1.1.4.1.0'; # KB + my $oid_agentSwitchCpuProcessMemAvailable = '.1.3.6.1.4.1.4526.10.1.1.4.2.0'; # KB + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_agentSwitchCpuProcessMemFree, $oid_agentSwitchCpuProcessMemAvailable], nothing_quit => 1); + + my $total = $snmp_result->{$oid_agentSwitchCpuProcessMemAvailable} * 1024; + $self->{memory} = { + prct_used => ($total - $snmp_result->{$oid_agentSwitchCpuProcessMemFree} * 1024) * 100 / $total, + total => $total, + }; +} + +1; + +__END__ + +=head1 MODE + +Check memory usage. + +=over 8 + +=item B<--warning-usage> + +Threshold warning (in percent). + +=item B<--critical-usage> + +Threshold critical (in percent). + +=back + +=cut diff --git a/centreon-plugins/network/netgear/mseries/snmp/plugin.pm b/centreon-plugins/network/netgear/mseries/snmp/plugin.pm new file mode 100644 index 000000000..454375a16 --- /dev/null +++ b/centreon-plugins/network/netgear/mseries/snmp/plugin.pm @@ -0,0 +1,52 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::netgear::mseries::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'cpu' => 'network::netgear::mseries::snmp::mode::cpu', + 'hardware' => 'network::netgear::mseries::snmp::mode::hardware', + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'memory' => 'network::netgear::mseries::snmp::mode::memory', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Netgear Fully Managed Switches (M4200, M4300, M6100,...) in SNMP. + +=cut diff --git a/centreon-plugins/network/paloalto/snmp/mode/memory.pm b/centreon-plugins/network/paloalto/snmp/mode/memory.pm new file mode 100644 index 000000000..4384a87f7 --- /dev/null +++ b/centreon-plugins/network/paloalto/snmp/mode/memory.pm @@ -0,0 +1,98 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::paloalto::snmp::mode::memory; + +use base qw(snmp_standard::mode::storage); + +use strict; +use warnings; + +sub default_storage_type { + my ($self, %options) = @_; + + return '^(hrStorageRam|hrStorageFlashMemory)'; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + return $self; +} + +1; + +__END__ + +=head1 MODE + +Check memory. + +=over 8 + +=item B<--warning-usage> + +Threshold warning. + +=item B<--critical-usage> + +Threshold critical. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'B'). + +=item B<--free> + +Thresholds are on free space left. + +=item B<--storage> + +Set the storage (number expected) ex: 1, 2,... (empty means 'check all storage'). + +=item B<--name> + +Allows to use storage name with option --storage instead of storage oid index. + +=item B<--regexp> + +Allows to use regexp to filter storage (with option --name). + +=item B<--regexp-isensitive> + +Allows to use regexp non case-sensitive (with --regexp). + +=item B<--reload-cache-time> + +Time in minutes before reloading cache file (default: 180). + +=item B<--show-cache> + +Display cache storage datas. + +=item B<--filter-storage-type> + +Filter storage types with a regexp (Default: '^(hrStorageRam|hrStorageFlashMemory)$'). + +=back + +=cut diff --git a/centreon-plugins/network/paloalto/snmp/plugin.pm b/centreon-plugins/network/paloalto/snmp/plugin.pm index a65a3a281..42e4a13cb 100644 --- a/centreon-plugins/network/paloalto/snmp/plugin.pm +++ b/centreon-plugins/network/paloalto/snmp/plugin.pm @@ -31,14 +31,15 @@ sub new { $self->{version} = '0.5'; %{$self->{modes}} = ( - 'cluster-status' => 'network::paloalto::snmp::mode::clusterstatus', - 'cpu' => 'snmp_standard::mode::cpu', - 'interfaces' => 'snmp_standard::mode::interfaces', - 'list-interfaces' => 'snmp_standard::mode::listinterfaces', - 'hardware' => 'snmp_standard::mode::hardwaredevice', - 'panorama' => 'network::paloalto::snmp::mode::panorama', - 'sessions' => 'network::paloalto::snmp::mode::sessions', - ); + 'cluster-status' => 'network::paloalto::snmp::mode::clusterstatus', + 'cpu' => 'snmp_standard::mode::cpu', + 'hardware' => 'snmp_standard::mode::hardwaredevice', + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'memory' => 'network::paloalto::snmp::mode::memory', + 'panorama' => 'network::paloalto::snmp::mode::panorama', + 'sessions' => 'network::paloalto::snmp::mode::sessions', + ); return $self; } diff --git a/centreon-plugins/network/radware/alteon/snmp/mode/cpu.pm b/centreon-plugins/network/radware/alteon/snmp/mode/cpu.pm index 17952b101..2f74dcacd 100644 --- a/centreon-plugins/network/radware/alteon/snmp/mode/cpu.pm +++ b/centreon-plugins/network/radware/alteon/snmp/mode/cpu.pm @@ -29,46 +29,120 @@ sub set_counters { my ($self, %options) = @_; $self->{maps_counters_type} = [ - { name => 'global', type => 0, cb_prefix_output => 'prefix_cpu_output' } + { name => 'mp_cpu', type => 0, cb_prefix_output => 'prefix_mp_cpu_output', skipped_code => { -10 => 1 } }, + { name => 'sp_ga_avg', type => 0, skipped_code => { -10 => 1 } }, + { name => 'sp_ga', type => 1, cb_init => 'skip_sp_ga', cb_prefix_output => 'prefix_sp_ga_output', message_multiple => 'All SP GA CPU are ok' }, ]; - $self->{maps_counters}->{global} = [ - { label => '1s', set => { - key_values => [ { name => '1s' } ], + $self->{maps_counters}->{mp_cpu} = [ + { label => 'mp-1s', set => { + key_values => [ { name => 'mp_1s' } ], output_template => '%.2f%% (1sec)', perfdatas => [ - { label => 'cpu_1s', value => '1s_absolute', template => '%.2f', + { label => 'mp_cpu_1s', value => 'mp_1s_absolute', template => '%.2f', min => 0, max => 100, unit => '%' }, ], } }, - { label => '4s', set => { - key_values => [ { name => '4s' } ], + { label => 'mp-4s', set => { + key_values => [ { name => 'mp_4s' } ], output_template => '%.2f%% (4sec)', perfdatas => [ - { label => 'cpu_4s', value => '4s_absolute', template => '%.2f', + { label => 'mp_cpu_4s', value => 'mp_4s_absolute', template => '%.2f', min => 0, max => 100, unit => '%' }, ], } }, - { label => '64s', set => { - key_values => [ { name => '64s' } ], + { label => 'mp-64s', set => { + key_values => [ { name => 'mp_64s' } ], output_template => '%.2f%% (64sec)', perfdatas => [ - { label => 'cpu_64s', value => '64s_absolute', template => '%.2f', + { label => 'mp_cpu_64s', value => 'mp_64s_absolute', template => '%.2f', min => 0, max => 100, unit => '%' }, ], } }, ]; + + $self->{maps_counters}->{sp_ga_avg} = [ + { label => 'sp-ga-avg-1s', set => { + key_values => [ { name => 'sp_1s' } ], + output_template => 'SP GA Average CPU Usage: %.2f%% (1sec)', + perfdatas => [ + { label => 'avg_spga_cpu_1s', value => 'sp_1s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'sp-ga-avg-4s', set => { + key_values => [ { name => 'sp_4s' } ], + output_template => '%.2f%% (4sec)', + perfdatas => [ + { label => 'avg_spga_cpu_4s', value => 'sp_4s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'sp-ga-avg-64s', set => { + key_values => [ { name => 'sp_64s' } ], + output_template => '%.2f%% (64sec)', + perfdatas => [ + { label => 'avg_spga_cpu_64s', value => 'sp_64s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + ]; + + $self->{maps_counters}->{sp_ga} = [ + { label => 'sp-ga-1s', set => { + key_values => [ { name => 'sp_1s' }, { name => 'display' } ], + output_template => '%.2f%% (1sec)', + perfdatas => [ + { label => 'spga_cpu_1s', value => 'sp_1s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'sp-ga-4s', set => { + key_values => [ { name => 'sp_4s' }, { name => 'display' } ], + output_template => '%.2f%% (4sec)', + perfdatas => [ + { label => 'spga_cpu_4s', value => 'sp_4s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'sp-ga-64s', set => { + key_values => [ { name => 'sp_64s' }, { name => 'display' } ], + output_template => '%.2f%% (64sec)', + perfdatas => [ + { label => 'spga_cpu_64s', value => 'sp_64s_absolute', template => '%.2f', + min => 0, max => 100, unit => '%', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; } -sub prefix_cpu_output { +sub prefix_mp_cpu_output { my ($self, %options) = @_; return "MP CPU Usage: "; } +sub prefix_sp_ga_output { + my ($self, %options) = @_; + + return "SP GA CPU '" . $options{instance_value}->{display} . "' Usage: "; +} + +sub skip_sp_ga { + my ($self, %options) = @_; + + scalar(keys %{$self->{sp_ga}}) <= 0 ? return(1) : return(0); +} + sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); @@ -82,18 +156,56 @@ sub new { return $self; } +my $mapping = { + mpCpuStatsUtil1Second => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.2.1' }, + mpCpuStatsUtil4Seconds => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.2.2' }, + mpCpuStatsUtil64Seconds => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.2.3' }, +}; +my $mapping2 = { + spGAStatsCpuUtil1Second => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.13.1.1.3' }, + spGAStatsCpuUtil4Seconds => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.13.1.1.4' }, + spGAStatsCpuUtil64Seconds => { oid => '.1.3.6.1.4.1.1872.2.5.1.2.13.1.1.5' }, +}; +my $oid_mpCpuStats = '.1.3.6.1.4.1.1872.2.5.1.2.2'; +my $oid_spGAStatsCpuUtilTableEntry = '.1.3.6.1.4.1.1872.2.5.1.2.13.1.1'; + sub manage_selection { my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ { oid => $oid_mpCpuStats }, { oid => $oid_spGAStatsCpuUtilTableEntry } ], + return_type => 1, nothing_quit => 1); + $self->{sp_ga} = {}; + my ($avg_sp_1s, $avg_sp_4s, $avg_sp_64s) = (0, 0, 0); + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping2->{spGAStatsCpuUtil64Seconds}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping2, results => $snmp_result, instance => $instance); - my $oid_mpCpuStatsUtil1Second = '.1.3.6.1.4.1.1872.2.5.1.2.2.1.0'; - my $oid_mpCpuStatsUtil4Seconds = '.1.3.6.1.4.1.1872.2.5.1.2.2.2.0'; - my $oid_mpCpuStatsUtil64Seconds = '.1.3.6.1.4.1.1872.2.5.1.2.2.3.0'; - my $snmp_result = $options{snmp}->get_leef(oids => [ - $oid_mpCpuStatsUtil1Second, $oid_mpCpuStatsUtil4Seconds, - $oid_mpCpuStatsUtil64Seconds], nothing_quit => 1); + $self->{sp_ga}->{$instance} = { + display => $instance, + sp_1s => $result->{spGAStatsCpuUtil1Second}, + sp_4s => $result->{spGAStatsCpuUtil4Seconds}, + sp_64s => $result->{spGAStatsCpuUtil64Seconds}, + }; + $avg_sp_1s += $result->{spGAStatsCpuUtil1Second}; + $avg_sp_4s += $result->{spGAStatsCpuUtil4Seconds}; + $avg_sp_64s += $result->{spGAStatsCpuUtil64Seconds}; + } - $self->{global} = { '1s' => $snmp_result->{$oid_mpCpuStatsUtil1Second}, '4s' => $snmp_result->{$oid_mpCpuStatsUtil4Seconds}, - '64s' => $snmp_result->{$oid_mpCpuStatsUtil64Seconds} }; + $self->{sp_ga_avg} = {}; + if (scalar(keys %{$self->{sp_ga}}) > 1) { + $self->{sp_ga_avg} = { + sp_1s => $avg_sp_1s / scalar(keys %{$self->{sp_ga}}), + sp_4s => $avg_sp_4s / scalar(keys %{$self->{sp_ga}}), + sp_64s => $avg_sp_64s / scalar(keys %{$self->{sp_ga}}), + }; + } + + $self->{mp_cpu} = { + mp_1s => $snmp_result->{$mapping->{mpCpuStatsUtil1Second}->{oid} . '.0'}, + mp_4s => $snmp_result->{$mapping->{mpCpuStatsUtil4Seconds}->{oid} . '.0'}, + mp_64s => $snmp_result->{$mapping->{mpCpuStatsUtil64Seconds}->{oid} . '.0'}, + }; } 1; @@ -114,14 +226,18 @@ Example: --filter-counters='^(64s)$' =item B<--warning-*> Threshold warning. -Can be: '1s', '4s', '64s'. +Can be: 'mp-1s', 'mp-4s', 'mp-64s', +'sp-ga-1s', 'sp-ga-4s', 'sp-ga-64s', +'sp-ga-avg-1s', 'sp-ga-avg-4s', 'sp-ga-avg-64s'. =item B<--critical-*> Threshold critical. -Can be: '1s', '4s', '64s'. +Can be: 'mp-1s', 'mp-4s', 'mp-64s', +'sp-ga-1s', 'sp-ga-4s', 'sp-ga-64s', +'sp-ga-avg-1s', 'sp-ga-avg-4s', 'sp-ga-avg-64s'. =back =cut - \ No newline at end of file + diff --git a/centreon-plugins/network/ubiquiti/edge/snmp/plugin.pm b/centreon-plugins/network/ubiquiti/edge/snmp/plugin.pm new file mode 100644 index 000000000..c3cf26c72 --- /dev/null +++ b/centreon-plugins/network/ubiquiti/edge/snmp/plugin.pm @@ -0,0 +1,52 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::ubiquiti::edge::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'cpu' => 'centreon::common::broadcom::fastpath::snmp::mode::cpu', + 'hardware' => 'centreon::common::broadcom::fastpath::snmp::mode::hardware', + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'memory' => 'centreon::common::broadcom::fastpath::snmp::mode::memory', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Ubiquiti Edge Router in SNMP. + +=cut diff --git a/centreon-plugins/network/zyxel/snmp/mode/cpu.pm b/centreon-plugins/network/zyxel/snmp/mode/cpu.pm new file mode 100644 index 000000000..88dcbc887 --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/mode/cpu.pm @@ -0,0 +1,132 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::mode::cpu; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0, cb_prefix_output => 'prefix_cpu_output' } + ]; + + $self->{maps_counters}->{global} = [ + { label => '5s', set => { + key_values => [ { name => 'usage_5s' } ], + output_template => '%.2f %% (5sec)', output_error_template => "%s (5sec)", + perfdatas => [ + { label => 'cpu_5s', value => 'usage_5s_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '1m', set => { + key_values => [ { name => 'usage_1m' } ], + output_template => '%.2f %% (1m)', output_error_template => "%s (1min)", + perfdatas => [ + { label => 'cpu_1m', value => 'usage_1m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + { label => '5m', set => { + key_values => [ { name => 'usage_5m' } ], + output_template => '%.2f %% (5min)', output_error_template => "%s (5min)", + perfdatas => [ + { label => 'cpu_5m', value => 'usage_5m_absolute', template => '%.2f', + unit => '%', min => 0, max => 100 }, + ], + } + }, + ]; +} + +sub prefix_cpu_output { + my ($self, %options) = @_; + + return "CPU "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_sysCPU5SecUsage = '.1.3.6.1.4.1.890.1.6.22.1.3.0'; + my $oid_sysCPU1MinUsage = '.1.3.6.1.4.1.890.1.6.22.1.4.0'; + my $oid_sysCPU5MinUsage = '.1.3.6.1.4.1.890.1.6.22.1.5.0'; + my $oid_sysMgmtCPU5SecUsage = '.1.3.6.1.4.1.890.1.15.3.2.7.0'; + my $oid_sysMgmtCPU1MinUsage = '.1.3.6.1.4.1.890.1.15.3.2.8.0'; + my $oid_sysMgmtCPU5MinUsage = '.1.3.6.1.4.1.890.1.15.3.2.9.0'; + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_sysCPU5SecUsage, + $oid_sysCPU1MinUsage, $oid_sysCPU5MinUsage, $oid_sysMgmtCPU5SecUsage, + $oid_sysMgmtCPU1MinUsage, $oid_sysMgmtCPU5MinUsage], nothing_quit => 1); + + $self->{global} = { + usage_5s => defined($snmp_result->{$oid_sysCPU5SecUsage}) ? $snmp_result->{$oid_sysCPU5SecUsage} : $snmp_result->{$oid_sysMgmtCPU5SecUsage}, + usage_1m => defined($snmp_result->{$oid_sysCPU1MinUsage}) ? $snmp_result->{$oid_sysCPU1MinUsage} : $snmp_result->{$oid_sysMgmtCPU1MinUsage}, + usage_5m => defined($snmp_result->{$oid_sysCPU5MinUsage}) ? $snmp_result->{$oid_sysCPU5MinUsage} : $snmp_result->{$oid_sysMgmtCPU5MinUsage}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check CPU usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='5m' + +=item B<--warning-*> + +Threshold warning. +Can be: '5s', '1m', '5m'. + +=item B<--critical-*> + +Threshold critical. +Can be: '5s', '1m', '5m'. + +=back + +=cut diff --git a/centreon-plugins/network/zyxel/snmp/mode/listvpn.pm b/centreon-plugins/network/zyxel/snmp/mode/listvpn.pm new file mode 100644 index 000000000..2b9323f09 --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/mode/listvpn.pm @@ -0,0 +1,132 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::mode::listvpn; + +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 => + { + "filter-name:s" => { name => 'filter_name' }, + }); + $self->{vpn} = {}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +my %map_active_status = (0 => 'inactive', 1 => 'active'); +my %map_connect_status = (0 => 'disconnected', 1 => 'connected'); + +my $mapping = { + vpnStatusConnectionName => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.2' }, + vpnStatusActiveStatus => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.5', map => \%map_active_status }, + vpnStatusConnectStatus => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.6', map => \%map_connect_status }, +}; + +my $oid_vpnStatusEntry = '.1.3.6.1.4.1.890.1.6.22.2.4.1'; + +sub manage_selection { + my ($self, %options) = @_; + + my $snmp_result = $options{snmp}->get_table(oid => $oid_vpnStatusEntry, nothing_quit => 1); + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{vpnStatusConnectionName}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{vpnStatusConnectionName} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{vpnStatusConnectionName} . "': no matching filter.", debug => 1); + next; + } + + $self->{vpn}->{$result->{vpnStatusConnectionName}} = { + name => $result->{vpnStatusConnectionName}, + active_status => $result->{vpnStatusActiveStatus}, + connect_status => $result->{vpnStatusConnectStatus}, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{vpn}}) { + $self->{output}->output_add(long_msg => '[name = ' . $self->{vpn}->{$instance}->{name} . "]" . + " [active status = '" . $self->{vpn}->{$instance}->{active_status} . "']" . + " [connect status = '" . $self->{vpn}->{$instance}->{connect_status} . "']" + ); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List VPNs:'); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => ['name', 'active_status', 'connect_status']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{vpn}}) { + $self->{output}->add_disco_entry( + %{$self->{vpn}->{$instance}} + ); + } +} + +1; + +__END__ + +=head1 MODE + +List VPNs. + +=over 8 + +=item B<--filter-name> + +Filter by VPN name. + +=back + +=cut + diff --git a/centreon-plugins/network/zyxel/snmp/mode/memory.pm b/centreon-plugins/network/zyxel/snmp/mode/memory.pm new file mode 100644 index 000000000..5bfe7eb76 --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/mode/memory.pm @@ -0,0 +1,111 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::mode::memory; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'memory', type => 0 } + ]; + + $self->{maps_counters}->{memory} = [ + { label => 'mem-usage', set => { + key_values => [ { name => 'ram_used' } ], + output_template => 'Memory Used: %.2f%%', + perfdatas => [ + { label => 'memory_used', value => 'ram_used_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'flash-usage', set => { + key_values => [ { name => 'flash_used' } ], + output_template => 'Flash Used: %.2f%%', + perfdatas => [ + { label => 'flash_used', value => 'flash_used_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_sysRAMUsage = '.1.3.6.1.4.1.890.1.6.22.1.2.0'; + my $oid_sysFLASHUsage = '.1.3.6.1.4.1.890.1.6.22.1.7.0'; + my $oid_sysMgmtMemUsage = '.1.3.6.1.4.1.890.1.15.3.2.5.0'; + my $oid_sysMgmtFlashUsage = '.1.3.6.1.4.1.890.1.15.3.2.6.0'; + my $snmp_result = $options{snmp}->get_leef(oids => [ + $oid_sysRAMUsage, $oid_sysFLASHUsage, + $oid_sysMgmtMemUsage, $oid_sysMgmtFlashUsage, + ], nothing_quit => 1); + + $self->{memory} = { + ram_used => defined($snmp_result->{$oid_sysRAMUsage}) ? $snmp_result->{$oid_sysRAMUsage} : $snmp_result->{$oid_sysMgmtMemUsage}, + flash_used => defined($snmp_result->{$oid_sysFLASHUsage}) ? $snmp_result->{$oid_sysFLASHUsage} : $snmp_result->{$oid_sysMgmtFlashUsage}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check memory usage. + +=over 8 + +=item B<--warning-*> + +Threshold warning. +Can be: 'mem-usage' (%), 'flash-usage' (%). + +=item B<--critical-*> + +Threshold critical. +Can be: 'mem-usage' (%), 'flash-usage' (%). + + +=back + +=cut diff --git a/centreon-plugins/network/zyxel/snmp/mode/sessions.pm b/centreon-plugins/network/zyxel/snmp/mode/sessions.pm new file mode 100644 index 000000000..a26c71883 --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/mode/sessions.pm @@ -0,0 +1,92 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::mode::sessions; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'usage', set => { + key_values => [ { name => 'sessions' } ], + output_template => 'Current active sessions : %s', + perfdatas => [ + { label => 'sessions', value => 'sessions_absolute', template => '%s', min => 0 }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_sysSessionNum = '.1.3.6.1.4.1.890.1.6.22.1.6.0'; + my $oid_sysActiveSessionNum = '.1.3.6.1.4.1.890.1.6.22.1.6.0'; + my $snmp_result = $options{snmp}->get_leef(oids => [$oid_sysSessionNum, $oid_sysActiveSessionNum], nothing_quit => 1); + + $self->{global} = { + sessions => defined($snmp_result->{$oid_sysSessionNum}) ? $snmp_result->{$oid_sysSessionNum} : $snmp_result->{$oid_sysActiveSessionNum}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check sessions. + +=over 8 + +=item B<--warning-usage> + +Threshold warning. + +=item B<--critical-usage> + +Threshold critical. + +=back + +=cut diff --git a/centreon-plugins/network/zyxel/snmp/mode/vpnstatus.pm b/centreon-plugins/network/zyxel/snmp/mode/vpnstatus.pm new file mode 100644 index 000000000..4671aef59 --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/mode/vpnstatus.pm @@ -0,0 +1,249 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::mode::vpnstatus; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = 'connection status : ' . $self->{result_values}->{connectstatus} . ' [activation status: ' . $self->{result_values}->{activestatus} . ']'; + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{activestatus} = $options{new_datas}->{$self->{instance} . '_activestatus'}; + $self->{result_values}->{connectstatus} = $options{new_datas}->{$self->{instance} . '_connectstatus'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'vpn', type => 1, cb_prefix_output => 'prefix_vpn_output', message_multiple => 'All VPN tunnels are OK' }, + ]; + + $self->{maps_counters}->{vpn} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'activestatus' }, { name => 'connectstatus' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => $self->can('custom_status_threshold'), + } + }, + { label => 'traffic-in', set => { + key_values => [ { name => 'traffic_in', diff => 1 }, { name => 'display' } ], + per_second => 1, output_change_bytes => 2, + output_template => 'Traffic In: %s %s/s', + perfdatas => [ + { label => 'traffic_in', value => 'traffic_in_per_second', template => '%.2f', + min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'traffic-out', set => { + key_values => [ { name => 'traffic_out', diff => 1 }, { name => 'display' } ], + per_second => 1, output_change_bytes => 2, + output_template => 'Traffic Out: %s %s/s', + perfdatas => [ + { label => 'traffic_out', value => 'traffic_out_per_second', template => '%.2f', + min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + } + ]; +} + +sub prefix_vpn_output { + my ($self, %options) = @_; + + return "VPN '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '%{connectstatus} eq "disconnected"' }, + }); + return $self; +} + +sub change_macros { + my ($self, %options) = @_; + + foreach (('warning_status', 'critical_status')) { + if (defined($self->{option_results}->{$_})) { + $self->{option_results}->{$_} =~ s/%\{(.*?)\}/\$self->{result_values}->{$1}/g; + } + } +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(); + $instance_mode = $self; +} + +my %map_active_status = (0 => 'inactive', 1 => 'active'); +my %map_connect_status = (0 => 'disconnected', 1 => 'connected'); + +my $mapping = { + vpnStatusConnectionName => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.2' }, + vpnStatusActiveStatus => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.5', map => \%map_active_status }, + vpnStatusConnectStatus => { oid => '.1.3.6.1.4.1.890.1.6.22.2.4.1.6', map => \%map_connect_status }, +}; + +my $mapping2 = { + vpnSaMonitorConnectionName => { oid => '.1.3.6.1.4.1.890.1.6.22.2.6.1.2' }, + vpnSaMonitorInBytes => { oid => '.1.3.6.1.4.1.890.1.6.22.2.6.1.7' }, + vpnSaMonitorOutBytes => { oid => '.1.3.6.1.4.1.890.1.6.22.2.6.1.9' }, +}; + +my $oid_vpnStatusEntry = '.1.3.6.1.4.1.890.1.6.22.2.4.1'; +my $oid_vpnSaMonitorEntry = '.1.3.6.1.4.1.890.1.6.22.2.6.1'; + +sub manage_selection { + my ($self, %options) = @_; + + $self->{cache_name} = "zyxel_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')); + + $self->{vpn} = {}; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_vpnStatusEntry }, + { oid => $oid_vpnSaMonitorEntry }, + ], nothing_quit => 1); + + foreach my $oid (sort keys %{$snmp_result->{$oid_vpnStatusEntry}}) { + next if ($oid !~ /^$mapping->{vpnStatusConnectionName}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result->{$oid_vpnStatusEntry}, instance => $instance); + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{vpnStatusConnectionName} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{vpnStatusConnectionName} . "': no matching filter.", debug => 1); + next; + } + + $self->{vpn}->{$result->{vpnStatusConnectionName}} = { + display => $result->{vpnStatusConnectionName}, + activestatus => $result->{vpnStatusActiveStatus}, + connectstatus => $result->{vpnStatusConnectStatus}, + }; + } + + foreach my $oid (sort keys %{$snmp_result->{$oid_vpnSaMonitorEntry}}) { + next if ($oid !~ /^$mapping2->{vpnSaMonitorConnectionName}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping2, results => $snmp_result->{$oid_vpnSaMonitorEntry}, instance => $instance); + next if (!defined($self->{vpn}->{$result->{vpnSaMonitorConnectionName}})); + + $self->{vpn}->{$result->{vpnSaMonitorConnectionName}}->{traffic_in} = $result->{vpnSaMonitorInBytes} * 8; + $self->{vpn}->{$result->{vpnSaMonitorConnectionName}}->{traffic_out} = $result->{vpnSaMonitorOutBytes} * 8; + } + + if (scalar(keys %{$self->{vpn}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No vpn found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check VPN state and traffic. + +=over 8 + +=item B<--filter-name> + +Filter vpn name with regexp. + +=item B<--warning-*> + +Threshold warning. +Can be: 'traffic-in', 'traffic-out'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'traffic-in', 'traffic-out'. + +=item B<--warning-status> + +Set warning threshold for status. +Can used special variables like: %{activestatus}, %{connectstatus}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{connectstatus} eq "disconnected"'). +Can used special variables like: %{activestatus}, %{connectstatus}, %{display} + +=back + +=cut diff --git a/centreon-plugins/network/zyxel/snmp/plugin.pm b/centreon-plugins/network/zyxel/snmp/plugin.pm new file mode 100644 index 000000000..1a58c741b --- /dev/null +++ b/centreon-plugins/network/zyxel/snmp/plugin.pm @@ -0,0 +1,54 @@ +# +# Copyright 2017 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package network::zyxel::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + %{$self->{modes}} = ( + 'cpu' => 'network::zyxel::snmp::mode::cpu', + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'list-vpn' => 'network::zyxel::snmp::mode::listvpn', + 'memory' => 'network::zyxel::snmp::mode::memory', + 'sessions' => 'network::zyxel::snmp::mode::sessions', + 'vpn-status' => 'network::zyxel::snmp::mode::vpnstatus', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Zyxel equipments in SNMP. + +=cut diff --git a/centreon-plugins/os/windows/local/mode/cmdreturn.pm b/centreon-plugins/os/windows/local/mode/cmdreturn.pm new file mode 100644 index 000000000..e03be3dd7 --- /dev/null +++ b/centreon-plugins/os/windows/local/mode/cmdreturn.pm @@ -0,0 +1,173 @@ +# +# Copyright 2017 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 os::windows::local::mode::cmdreturn; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::misc; +use Time::HiRes qw(gettimeofday tv_interval); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "warning-time:s" => { name => 'warning_time' }, + "critical-time:s" => { name => 'critical_time' }, + "timeout:s" => { name => 'timeout', default => 30 }, + "command:s" => { name => 'command' }, + "command-path:s" => { name => 'command_path' }, + "command-options:s" => { name => 'command_options' }, + "manage-returns:s" => { name => 'manage_returns', default => '' }, + }); + $self->{manage_returns} = {}; + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + + if (!defined($self->{option_results}->{command})) { + $self->{output}->add_option_msg(short_msg => "Need to specify command option."); + $self->{output}->option_exit(); + } + + foreach my $entry (split(/#/, $self->{option_results}->{manage_returns})) { + next if (!($entry =~ /(.*?),(.*?),(.*)/)); + next if (!$self->{output}->is_litteral_status(status => $2)); + if ($1 ne '') { + $self->{manage_returns}->{$1} = {return => $2, msg => $3}; + } else { + $self->{manage_returns}->{default} = {return => $2, msg => $3}; + } + } + if ($self->{option_results}->{manage_returns} eq '' || scalar(keys %{$self->{manage_returns}}) == 0) { + $self->{output}->add_option_msg(short_msg => "Need to specify manage-returns option correctly."); + $self->{output}->option_exit(); + } + + if (($self->{perfdata}->threshold_validate(label => 'warning-time', value => $self->{option_results}->{warning_time})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning_time} . "'."); + $self->{output}->option_exit(); + } + if (($self->{perfdata}->threshold_validate(label => 'critical-time', value => $self->{option_results}->{critical_time})) == 0) { + $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical_time} . "'."); + $self->{output}->option_exit(); + } +} + +sub run { + my ($self, %options) = @_; + + my $timing0 = [gettimeofday]; + my ($stdout, $exit_code) = centreon::plugins::misc::execute(output => $self->{output}, + options => $self->{option_results}, + command => $self->{option_results}->{command}, + command_path => $self->{option_results}->{command_path}, + command_options => $self->{option_results}->{command_options}, + no_quit => 1); + my $timeelapsed = tv_interval($timing0, [gettimeofday]); + + my $long_msg = $stdout; + $long_msg =~ s/\|/-/mg; + $self->{output}->output_add(long_msg => $long_msg); + + if (defined($self->{manage_returns}->{$exit_code})) { + $self->{output}->output_add(severity => $self->{manage_returns}->{$exit_code}->{return}, + short_msg => $self->{manage_returns}->{$exit_code}->{msg}); + } elsif (defined($self->{manage_returns}->{default})) { + $self->{output}->output_add(severity => $self->{manage_returns}->{default}->{return}, + short_msg => $self->{manage_returns}->{default}->{msg}); + } else { + $self->{output}->output_add(severity => 'UNKNWON', + short_msg => 'Exit code from command'); + } + + if (defined($exit_code)) { + $self->{output}->perfdata_add(label => "code", + value => $exit_code); + } + + my $exit = $self->{perfdata}->threshold_check(value => $timeelapsed, + threshold => [ { label => 'critical-time', exit_litteral => 'critical' }, { label => 'warning-time', exit_litteral => 'warning' } ]); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("Response time %.3fs", $timeelapsed)); + } + + $self->{output}->perfdata_add(label => 'time', unit => 's', + value => sprintf('%.3f', $timeelapsed), + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning_time'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical_time'), + min => 0); + + $self->{output}->display(); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Check command returns. + +=over 8 + +=item B<--manage-returns> + +Set action according command exit code. +Example: 0,OK,File xxx exist#1,CRITICAL,File xxx not exist#,UNKNOWN,Command problem + +=item B<--timeout> + +Timeout in seconds for the command (Default: 30). + +=item B<--command> + +Command to test (Default: none). + +=item B<--command-path> + +Command path (Default: none). + +=item B<--command-options> + +Command options (Default: none). + +=item B<--warning-time> + +Threshold warning in seconds. + +=item B<--critical-time> + +Threshold critical in seconds. + +=back + +=cut diff --git a/centreon-plugins/os/windows/local/mode/sessions.pm b/centreon-plugins/os/windows/local/mode/sessions.pm index a9d87dd29..e9b0d573e 100644 --- a/centreon-plugins/os/windows/local/mode/sessions.pm +++ b/centreon-plugins/os/windows/local/mode/sessions.pm @@ -285,12 +285,14 @@ Filter session name (can be a regexp). =item B<--warning-*> Threshold warning. -Can be: 'inactive', 'active'. +Can be: 'sessions-created', 'sessions-disconnected', +'sessions-reconnected', 'sessions-active'. =item B<--critical-*> Threshold critical. -Can be: 'inactive', 'active', 'time' (in seconds since the session starts). +Can be: 'sessions-created', 'sessions-disconnected', +'sessions-reconnected', 'sessions-active'. =back diff --git a/centreon-plugins/os/windows/local/plugin.pm b/centreon-plugins/os/windows/local/plugin.pm index 71795803d..0d428c699 100644 --- a/centreon-plugins/os/windows/local/plugin.pm +++ b/centreon-plugins/os/windows/local/plugin.pm @@ -31,6 +31,7 @@ sub new { $self->{version} = '0.1'; %{$self->{modes}} = ( + 'cmd-return' => 'os::windows::local::mode::cmdreturn', 'pending-reboot' => 'os::windows::local::mode::pendingreboot', 'sessions' => 'os::windows::local::mode::sessions', 'time' => 'os::windows::local::mode::ntp', diff --git a/centreon-plugins/snmp_standard/mode/entity.pm b/centreon-plugins/snmp_standard/mode/entity.pm index de889ac4f..8610e38f9 100644 --- a/centreon-plugins/snmp_standard/mode/entity.pm +++ b/centreon-plugins/snmp_standard/mode/entity.pm @@ -62,9 +62,10 @@ sub new { sub snmp_execute { my ($self, %options) = @_; - my $oid_entPhysicalName = '.1.3.6.1.2.1.47.1.1.1.1.7'; + my $oid_entPhysicalName = '.1.3.6.1.2.1.47.1.1.1.1.7'; + my $oid_entPhysicalDescr = '.1.3.6.1.2.1.47.1.1.1.1.2'; $self->{snmp} = $options{snmp}; - push @{$self->{request}}, { oid => $oid_entPhysicalName}; + push @{$self->{request}}, { oid => $oid_entPhysicalName }, { oid => $oid_entPhysicalDescr }; $self->{results} = $self->{snmp}->get_multiple_table(oids => $self->{request}); } @@ -186,6 +187,7 @@ sub check { return if ($self->check_filter(section => 'sensor')); my $oid_entPhysicalName = '.1.3.6.1.2.1.47.1.1.1.1.7'; + my $oid_entPhysicalDescr = '.1.3.6.1.2.1.47.1.1.1.1.2'; foreach my $oid ($self->{snmp}->oid_lex_sort(keys %{$self->{results}->{$oid_entPhysicalName}})) { next if ($oid !~ /^$oid_entPhysicalName\.(.*)$/); my $instance = $1; @@ -194,7 +196,8 @@ sub check { next if ($self->check_filter(section => 'sensor', instance => $result->{entPhySensorType} . '.' . $instance)); - my $name = $self->{results}->{$oid_entPhysicalName}->{$oid}; + my $name = $self->{results}->{$oid_entPhysicalName}->{$oid} ne '' ? + $self->{results}->{$oid_entPhysicalName}->{$oid} : $self->{results}->{$oid_entPhysicalDescr}->{$oid_entPhysicalDescr . '.' . $instance}; # It seems there is no scale if (!defined($self->{option_results}->{sensor_scale})) { $result->{entPhySensorValue} = defined($result->{entPhySensorValue}) ? diff --git a/centreon-plugins/snmp_standard/mode/printererror.pm b/centreon-plugins/snmp_standard/mode/printererror.pm index a0b4688f8..0cea63e51 100644 --- a/centreon-plugins/snmp_standard/mode/printererror.pm +++ b/centreon-plugins/snmp_standard/mode/printererror.pm @@ -73,20 +73,11 @@ sub run { my $result = $self->{snmp}->get_table(oid => $oid_hrPrinterDetectedErrorState, nothing_quit => 1); foreach (keys %$result) { - my ($value1, $value2) = unpack('C', $result->{$_}); + # 16 bits value + my $value = unpack('S', $result->{$_}); - foreach my $key (keys %errors_printer) { - my ($byte_check, $pos); - if ($key >= 8) { - next if (!defined($value2)); - $byte_check = $value2; - $pos = $key - 8; - } else { - $byte_check = $value1; - $pos = $key - } - - if (($byte_check & (1 << $pos)) && + foreach my $key (keys %errors_printer) { + if (($value & (1 << $key)) && (!$self->{output}->is_status(value => ${$errors_printer{$key}}[1], compare => 'ok', litteral => 1))) { $self->{output}->output_add(severity => ${$errors_printer{$key}}[1], short_msg => sprintf(${$errors_printer{$key}}[0])); diff --git a/centreon-plugins/snmp_standard/mode/storage.pm b/centreon-plugins/snmp_standard/mode/storage.pm index 1c696d937..6a99caa69 100644 --- a/centreon-plugins/snmp_standard/mode/storage.pm +++ b/centreon-plugins/snmp_standard/mode/storage.pm @@ -20,13 +20,15 @@ package snmp_standard::mode::storage; -use base qw(centreon::plugins::mode); +use base qw(centreon::plugins::templates::counter); use strict; use warnings; use centreon::plugins::statefile; use Digest::MD5 qw(md5_hex); +my $instance_mode; + my %oids_hrStorageTable = ( 'hrstoragedescr' => '.1.3.6.1.2.1.25.2.3.1.3', 'hrfsmountpoint' => '.1.3.6.1.2.1.25.3.8.1.2', @@ -69,6 +71,113 @@ my %storage_types_manage = ( '.1.3.6.1.2.1.25.3.9.23' => 'hrFSLinuxExt2', ); +sub custom_usage_perfdata { + my ($self, %options) = @_; + + my $label = 'used'; + my $value_perf = $self->{result_values}->{used}; + if (defined($instance_mode->{option_results}->{free})) { + $label = 'free'; + $value_perf = $self->{result_values}->{free}; + } + my $extra_label = ''; + $extra_label = '_' . $self->{result_values}->{display} if (!defined($options{extra_instance}) || $options{extra_instance} != 0); + my %total_options = (); + if ($instance_mode->{option_results}->{units} eq '%') { + $total_options{total} = $self->{result_values}->{total}; + $total_options{cast_int} = 1; + } + + $self->{output}->perfdata_add(label => $label . $extra_label, unit => 'B', + value => $value_perf, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, %total_options), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, %total_options), + min => 0, max => $self->{result_values}->{total}); +} + +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($instance_mode->{option_results}->{free})); + if ($instance_mode->{option_results}->{units} eq '%') { + $threshold_value = $self->{result_values}->{prct_used}; + $threshold_value = $self->{result_values}->{prct_free} if (defined($instance_mode->{option_results}->{free})); + } + $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-'. $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free}); + my $msg = sprintf("Usage Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free}); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_size'} * $options{new_datas}->{$self->{instance} . '_allocation_units'}; + my $reserved_value = 0; + if (defined($instance_mode->{option_results}->{space_reservation})) { + $reserved_value = $instance_mode->{option_results}->{space_reservation} * $self->{result_values}->{total} / 100; + } + + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'} * $options{new_datas}->{$self->{instance} . '_allocation_units'}; + $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used} - $reserved_value; + $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / ($self->{result_values}->{total} - $reserved_value); + $self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used}; + + # limit to 100. Better output. + if ($self->{result_values}->{prct_used} > 100) { + $self->{result_values}->{free} = 0; + $self->{result_values}->{prct_used} = 100; + $self->{result_values}->{prct_free} = 0; + } + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'storage', type => 1, cb_prefix_output => 'prefix_storage_output', message_multiple => 'All storages are ok' }, + ]; + + $self->{maps_counters}->{storage} = [ + { label => 'usage', set => { + key_values => [ { name => 'display' }, { name => 'used' }, { name => 'size' }, { name => 'allocation_units' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + ]; +} + +sub prefix_storage_output { + my ($self, %options) = @_; + + return "Storage '" . $options{instance_value}->{display} . "' "; +} + +sub default_storage_type { + my ($self, %options) = @_; + + return '^(hrStorageFixedDisk|hrStorageNetworkDisk|hrFSBerkeleyFFS)$'; +} + sub new { my ($class, %options) = @_; my $self = $class->SUPER::new(package => __PACKAGE__, %options); @@ -77,8 +186,6 @@ sub new { $self->{version} = '1.0'; $options{options}->add_options(arguments => { - "warning:s" => { name => 'warning' }, - "critical:s" => { name => 'critical' }, "units:s" => { name => 'units', default => '%' }, "free" => { name => 'free' }, "reload-cache-time:s" => { name => 'reload_cache_time', default => 180 }, @@ -92,7 +199,7 @@ sub new { "display-transform-dst:s" => { name => 'display_transform_dst' }, "show-cache" => { name => 'show_cache' }, "space-reservation:s" => { name => 'space_reservation' }, - "filter-storage-type:s" => { name => 'filter_storage_type', default => '^(hrStorageFixedDisk|hrStorageNetworkDisk|hrFSBerkeleyFFS)$' }, + "filter-storage-type:s" => { name => 'filter_storage_type', default => $self->default_storage_type() }, }); $self->{storage_id_selected} = []; @@ -103,43 +210,34 @@ sub new { sub check_options { my ($self, %options) = @_; - $self->SUPER::init(%options); + $self->SUPER::check_options(%options); - if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{option_results}->{warning})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'."); - $self->{output}->option_exit(); - } - if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{option_results}->{critical})) == 0) { - $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); - $self->{output}->option_exit(); - } if (defined($self->{option_results}->{space_reservation}) && ($self->{option_results}->{space_reservation} < 0 || $self->{option_results}->{space_reservation} > 100)) { - $self->{output}->add_option_msg(short_msg => "Space reservation argument must be between 0 and 100 percent."); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "Space reservation argument must be between 0 and 100 percent."); + $self->{output}->option_exit(); } $self->{option_results}->{oid_filter} = lc($self->{option_results}->{oid_filter}); if ($self->{option_results}->{oid_filter} !~ /^(hrstoragedescr|hrfsmountpoint)$/) { - $self->{output}->add_option_msg(short_msg => "Unsupported --oid-filter option."); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "Unsupported --oid-filter option."); + $self->{output}->option_exit(); } $self->{option_results}->{oid_display} = lc($self->{option_results}->{oid_display}); if ($self->{option_results}->{oid_display} !~ /^(hrstoragedescr|hrfsmountpoint)$/) { - $self->{output}->add_option_msg(short_msg => "Unsupported --oid-display option."); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "Unsupported --oid-display option."); + $self->{output}->option_exit(); } - + $self->{statefile_cache}->check_options(%options); + $instance_mode = $self; } -sub run { +sub manage_selection { my ($self, %options) = @_; + $self->{snmp} = $options{snmp}; - $self->{hostname} = $self->{snmp}->get_hostname(); - $self->{snmp_port} = $self->{snmp}->get_port(); - - $self->manage_selection(); + $self->get_selection(); my $oid_hrStorageAllocationUnits = '.1.3.6.1.2.1.25.2.3.1.4'; my $oid_hrStorageSize = '.1.3.6.1.2.1.25.2.3.1.5'; @@ -149,109 +247,37 @@ sub run { $self->{snmp}->load(oids => [$oid_hrStorageAllocationUnits, $oid_hrStorageSize, $oid_hrStorageUsed], instances => $self->{storage_id_selected}, nothing_quit => 1); my $result = $self->{snmp}->get_leef(); - my $multiple = 0; - if (scalar(@{$self->{storage_id_selected}}) > 1) { - $multiple = 1; - } - if ($multiple == 1) { - $self->{output}->output_add(severity => 'OK', - short_msg => 'All storages are ok.'); - } - + $self->{storage} = {}; foreach (sort @{$self->{storage_id_selected}}) { my $name_storage = $self->get_display_value(id => $_); if (!defined($result->{$oid_hrStorageAllocationUnits . "." . $_})) { - if ($multiple == 0) { - $self->{output}->add_option_msg(severity => 'UNKNOWN', - short_msg => sprintf("Skipping storage '%s': not found (need to reload the cache)", - $name_storage)); - } else { - $self->{output}->add_option_msg(long_msg => sprintf("Skipping storage '%s': not found (need to reload the cache)", - $name_storage)); - } + $self->{output}->add_option_msg(long_msg => sprintf("skipping storage '%s': not found (need to reload the cache)", + $name_storage)); next; } # in bytes hrStorageAllocationUnits my $total_size = $result->{$oid_hrStorageSize . "." . $_} * $result->{$oid_hrStorageAllocationUnits . "." . $_}; if ($total_size <= 0) { - if ($multiple == 0) { - $self->{output}->add_option_msg(severity => 'UNKNOWN', - short_msg => sprintf("Skipping storage '%s': total size is <= 0 (%s)", - $name_storage, int($total_size))); - } else { - $self->{output}->add_option_msg(long_msg => sprintf("Skipping storage '%s': total size is <= 0 (%s)", - $name_storage, int($total_size))); - } + $self->{output}->add_option_msg(long_msg => sprintf("skipping storage '%s': total size is <= 0 (%s)", + $name_storage, int($total_size))); next; } - my $reserved_value = 0; - if (defined($self->{option_results}->{space_reservation})) { - $reserved_value = $self->{option_results}->{space_reservation} * $total_size / 100; - } - my $total_used = $result->{$oid_hrStorageUsed . "." . $_} * $result->{$oid_hrStorageAllocationUnits . "." . $_}; - my $total_free = $total_size - $total_used - $reserved_value; - my $prct_used = $total_used * 100 / ($total_size - $reserved_value); - my $prct_free = 100 - $prct_used; - - # limit to 100. Better output. - if ($prct_used > 100) { - $total_free = 0; - $prct_used = 100; - $prct_free = 0; - } - - my ($exit, $threshold_value); - - $threshold_value = $total_used; - $threshold_value = $total_free if (defined($self->{option_results}->{free})); - if ($self->{option_results}->{units} eq '%') { - $threshold_value = $prct_used; - $threshold_value = $prct_free if (defined($self->{option_results}->{free})); - } - $exit = $self->{perfdata}->threshold_check(value => $threshold_value, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - - my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $total_size); - my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $total_used); - my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $total_free); - - $self->{output}->output_add(long_msg => sprintf("Storage '%s' Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $name_storage, - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $prct_used, - $total_free_value . " " . $total_free_unit, $prct_free)); - if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1) || ($multiple == 0)) { - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("Storage '%s' Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", $name_storage, - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $prct_used, - $total_free_value . " " . $total_free_unit, $prct_free)); - } - - my $label = 'used'; - my $value_perf = $total_used; - if (defined($self->{option_results}->{free})) { - $label = 'free'; - $value_perf = $total_free; - } - my $extra_label = ''; - $extra_label = '_' . $name_storage if ($multiple == 1); - my %total_options = (); - if ($self->{option_results}->{units} eq '%') { - $total_options{total} = $total_size - $reserved_value; - $total_options{cast_int} = 1; - } - $self->{output}->perfdata_add(label => $label . $extra_label, unit => 'B', - value => $value_perf, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning', %total_options), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical', %total_options), - min => 0, max => int($total_size - $reserved_value)); + $self->{storage}->{$_} = { + display => $name_storage, + allocation_units => $result->{$oid_hrStorageAllocationUnits . "." . $_}, + size => $result->{$oid_hrStorageSize . "." . $_}, + used => $result->{$oid_hrStorageUsed . "." . $_}, + }; + } + + if (scalar(keys %{$self->{storage}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "Issue with storage information (see details)"); + $self->{output}->option_exit(); } - - $self->{output}->display(); - $self->{output}->exit(); } sub reload_cache { @@ -311,11 +337,11 @@ sub filter_type { return 0; } -sub manage_selection { +sub get_selection { my ($self, %options) = @_; # init cache file - my $has_cache_file = $self->{statefile_cache}->read(statefile => 'cache_snmpstandard_' . $self->{hostname} . '_' . $self->{snmp_port} . '_' . $self->{mode}); + my $has_cache_file = $self->{statefile_cache}->read(statefile => 'cache_snmpstandard_' . $self->{snmp}->get_hostname() . '_' . $self->{snmp}->get_port() . '_' . $self->{mode}); if (defined($self->{option_results}->{show_cache})) { $self->{output}->add_option_msg(long_msg => $self->{statefile_cache}->get_string_content()); $self->{output}->option_exit(); @@ -382,11 +408,11 @@ __END__ =over 8 -=item B<--warning> +=item B<--warning-usage> Threshold warning. -=item B<--critical> +=item B<--critical-usage> Threshold critical. diff --git a/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm b/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm index 5ddc0815c..af3ba4ac0 100644 --- a/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm +++ b/centreon-plugins/storage/emc/xtremio/restapi/custom/xtremioapi.pm @@ -23,16 +23,13 @@ package storage::emc::xtremio::restapi::custom::xtremioapi; use strict; use warnings; use centreon::plugins::http; +use centreon::plugins::statefile; use JSON; sub new { my ($class, %options) = @_; my $self = {}; bless $self, $class; - # $options{options} = options object - # $options{output} = output object - # $options{exit_value} = integer - # $options{noptions} = integer if (!defined($options{output})) { print "Class Custom: Need to specify 'output' argument.\n"; @@ -46,11 +43,12 @@ sub new { if (!defined($options{noptions})) { $options{options}->add_options(arguments => { - "hostname:s@" => { name => 'hostname', }, - "xtremio-username:s@" => { name => 'xtremio_username', }, - "xtremio-password:s@" => { name => 'xtremio_password', }, - "proxyurl:s@" => { name => 'proxyurl', }, - "timeout:s@" => { name => 'timeout', }, + "hostname:s@" => { name => 'hostname', }, + "xtremio-username:s@" => { name => 'xtremio_username', }, + "xtremio-password:s@" => { name => 'xtremio_password', }, + "proxyurl:s@" => { name => 'proxyurl', }, + "timeout:s@" => { name => 'timeout', }, + "reload-cache-time:s" => { name => 'reload_cache_time' }, }); } $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); @@ -58,25 +56,21 @@ sub new { $self->{output} = $options{output}; $self->{mode} = $options{mode}; $self->{http} = centreon::plugins::http->new(output => $self->{output}); + $self->{statefile_cache_cluster} = centreon::plugins::statefile->new(%options); return $self; } -# Method to manage multiples sub set_options { my ($self, %options) = @_; - # options{options_result} $self->{option_results} = $options{option_results}; } -# Method to manage multiples sub set_defaults { my ($self, %options) = @_; - # options{default} - - # Manage default value + foreach (keys %{$options{default}}) { if ($_ eq $self->{mode}) { for (my $i = 0; $i < scalar(@{$options{default}->{$_}}); $i++) { @@ -92,14 +86,13 @@ sub set_defaults { sub check_options { my ($self, %options) = @_; -# # return 1 = ok still hostname -# # return 0 = no hostname left $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef; $self->{xtremio_username} = (defined($self->{option_results}->{xtremio_username})) ? shift(@{$self->{option_results}->{xtremio_username}}) : ''; $self->{xtremio_password} = (defined($self->{option_results}->{xtremio_password})) ? shift(@{$self->{option_results}->{xtremio_password}}) : ''; $self->{timeout} = (defined($self->{option_results}->{timeout})) ? shift(@{$self->{option_results}->{timeout}}) : 10; $self->{proxyurl} = (defined($self->{option_results}->{proxyurl})) ? shift(@{$self->{option_results}->{proxyurl}}) : undef; + $self->{reload_cache_time} = (defined($self->{option_results}->{reload_cache_time})) ? shift(@{$self->{option_results}->{reload_cache_time}}) : 180; if (!defined($self->{hostname})) { $self->{output}->add_option_msg(short_msg => "Need to specify hostname option."); @@ -113,6 +106,7 @@ sub check_options { if (!defined($self->{hostname}) || scalar(@{$self->{option_results}->{hostname}}) == 0) { + $self->{statefile_cache_cluster}->check_options(option_results => $self->{option_results}); return 0; } return 1; @@ -136,6 +130,26 @@ sub settings { $self->{http}->set_options(%{$self->{option_results}}); } +sub cache_clusters { + my ($self, %options) = @_; + + my $has_cache_file = $self->{statefile_cache_cluster}->read(statefile => 'cache_xtremio_clusters_' . $self->{hostname}); + my $timestamp_cache = $self->{statefile_cache_cluster}->get(name => 'last_timestamp'); + my $clusters = $self->{statefile_cache_cluster}->get(name => 'clusters'); + if ($has_cache_file == 0 || !defined($timestamp_cache) || ((time() - $timestamp_cache) > (($self->{reload_cache_time}) * 60))) { + $clusters = {}; + my $datas = { last_timestamp => time(), clusters => $clusters }; + my @items = $self->get_items(url => '/api/json/types/', + obj => 'clusters'); + foreach (@items) { + $clusters->{$_} = 1; + } + $self->{statefile_cache_cluster}->write(data => $datas); + } + + return $clusters; +} + sub get_items { my ($self, %options) = @_; @@ -157,28 +171,76 @@ sub get_items { my @items; foreach my $context (@{$decoded->{$options{obj}}}) { - push @items,$context->{name}; + push @items, $context->{name}; } return @items; } +sub get_details_data { + my ($self, %options) = @_; + + my $response = $self->{http}->request(url_path => $options{url}, + critical_status => '', warning_status => '', unknown_status => ''); + my $decoded; + eval { + $decoded = decode_json($response); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); + $self->{output}->option_exit(); + } + + return $decoded; +} + + +sub get_details_lookup_clusters { + my ($self, %options) = @_; + + #Message if object not found: + #{ + # "message": "obj_not_found", + # "error_code": 400 + #} + # + if (!defined($self->{cache_clusters})) { + $self->{cache_clusters} = $self->cache_clusters(); + } + foreach my $cluster_name (keys %{$self->{cache_clusters}}) { + my $url = $options{url} . $options{append} . 'cluster-name=' . $cluster_name; + my $decoded = $self->get_details_data(url => $url); + return $decoded if (!defined($decoded->{error_code})); + } + + # object is not found. + $self->{output}->add_option_msg(short_msg => "xtremio api issue: cannot found object details"); + $self->{output}->option_exit(); +} + sub get_details { my ($self, %options) = @_; $self->settings(); + my $append = '?'; if ((defined($options{obj}) && $options{obj} ne '') && (defined($options{name}) && $options{name} ne '')) { - $options{url} .= $options{obj} . '/?name=' . $options{name} ; - } + $options{url} .= $options{obj} . '/?name=' . $options{name}; + $append = '&'; + } - my $response = $self->{http}->request(url_path => $options{url}); - my $decoded; - eval { - $decoded = decode_json($response); - }; - if ($@) { - $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); + #Message when cluster id needed: + #{ + # "message": "cluster_id_is_required", + # "error_code": 400 + #} + # + my $decoded = $self->get_details_data(%options); + if (defined($decoded->{error_code}) && + ($decoded->{error_code} == 400 && $decoded->{message} eq 'cluster_id_is_required')) { + $decoded = $self->get_details_lookup_clusters(%options, append => $append); + } elsif (defined($decoded->{error_code})) { + $self->{output}->add_option_msg(short_msg => "xtremio api issue: $decoded->{message}"); $self->{output}->option_exit(); } @@ -222,6 +284,11 @@ Proxy URL if any Set HTTP timeout +=item B<--reload-cache-time> + +Time in seconds before reloading cache file (default: 180). +The cache is used when XMS manages multiple clusters. + =back =head1 DESCRIPTION diff --git a/centreon-plugins/storage/kaminario/restapi/custom/api.pm b/centreon-plugins/storage/kaminario/restapi/custom/api.pm index 4ea8dd4a8..022bfdc2d 100644 --- a/centreon-plugins/storage/kaminario/restapi/custom/api.pm +++ b/centreon-plugins/storage/kaminario/restapi/custom/api.pm @@ -129,18 +129,9 @@ sub get_performance { my ($self, %options) = @_; $self->settings(); - #my $content = $self->{http}->request(url_path => '/api/v2' . $options{path} . '&__resolution=' . $self->{resolution}, - # critical_status => '', warning_status => ''); - my $content = do { - local $/ = undef; - if (!open my $fh, "<", '/tmp/4.json') { - $self->{output}->add_option_msg(short_msg => "Could not open file toto : $!"); - $self->{output}->option_exit(); - } - <$fh>; - }; - - #my $response = $self->{http}->get_response(); + my $content = $self->{http}->request(url_path => '/api/v2' . $options{path} . '&__resolution=' . $self->{resolution}, + critical_status => '', warning_status => ''); + my $response = $self->{http}->get_response(); my $decoded; eval { @@ -151,10 +142,10 @@ sub get_performance { $self->{output}->option_exit(); } - #if ($response->code() != 200) { - # $self->{output}->add_option_msg(short_msg => "Connection issue: " . $decoded->{message}); - # $self->{output}->option_exit(); - #} + if ($response->code() != 200) { + $self->{output}->add_option_msg(short_msg => "Connection issue: " . $decoded->{message}); + $self->{output}->option_exit(); + } return $decoded; }