From da71126bd7c6281553e61761ccdb91b0eebafa7d Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Fri, 24 May 2019 15:29:37 +0200 Subject: [PATCH] enhance voip 3cx --- apps/voip/3cx/restapi/custom/api.pm | 16 +-- apps/voip/3cx/restapi/mode/status.pm | 85 ------------- apps/voip/3cx/restapi/mode/system.pm | 173 +++++++++++++++++++++++++++ apps/voip/3cx/restapi/plugin.pm | 11 +- 4 files changed, 184 insertions(+), 101 deletions(-) delete mode 100644 apps/voip/3cx/restapi/mode/status.pm create mode 100644 apps/voip/3cx/restapi/mode/system.pm diff --git a/apps/voip/3cx/restapi/custom/api.pm b/apps/voip/3cx/restapi/custom/api.pm index 4284beac0..3c3fb4e2d 100644 --- a/apps/voip/3cx/restapi/custom/api.pm +++ b/apps/voip/3cx/restapi/custom/api.pm @@ -123,9 +123,6 @@ sub build_options_for_httplib { $self->{option_results}->{proto} = $self->{proto}; $self->{option_results}->{ssl_opt} = $self->{ssl_opt}; $self->{option_results}->{timeout} = $self->{timeout}; - $self->{option_results}->{warning_status} = ''; - $self->{option_results}->{critical_status} = '%{http_code} < 200 or %{http_code} >= 300'; - $self->{option_results}->{unknown_status} = ''; } sub settings { @@ -154,8 +151,11 @@ sub authenticate { $self->settings(); - my $content = $self->{http}->request(method => 'POST', query_form_post => $post_data, - url_path => '/api/login'); + my $content = $self->{http}->request( + method => 'POST', query_form_post => $post_data, + url_path => '/api/login', + warning_status => '', unknown_status => '', critical_status => '%{http_code} < 200 or %{http_code} >= 300' + ); my $header = $self->{http}->get_header(name => 'Set-Cookie'); if (defined ($header) && $header =~ /(?:^| ).AspNetCore.Cookies=([^;]+);.*/) { @@ -190,7 +190,9 @@ sub request_api { $self->settings(); - my $content = $self->{http}->request(%options); + my $content = $self->{http}->request(%options, + warning_status => '', unknown_status => '', critical_status => '%{http_code} < 200 or %{http_code} >= 300' + ); my $decoded; eval { @@ -212,7 +214,7 @@ sub request_api { sub internal_single_status { my ($self, %options) = @_; - + my $status = $self->request_api(method => 'GET', url_path =>'/api/SystemStatus/GetSingleStatus'); return $status; } diff --git a/apps/voip/3cx/restapi/mode/status.pm b/apps/voip/3cx/restapi/mode/status.pm deleted file mode 100644 index 246a846b5..000000000 --- a/apps/voip/3cx/restapi/mode/status.pm +++ /dev/null @@ -1,85 +0,0 @@ -# -# Copyright 2019 Centreon (http://www.centreon.com/) -# -# Centreon is a full-fledged industry-strength solution that meets -# the needs in IT infrastructure and application monitoring for -# service performance. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -package apps::voip::3cx::restapi::mode::status; - -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 => - { - }); - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub manage_selection { - my ($self, %options) = @_; - - $self->{single} = $options{custom}->api_single_status(); - $self->{system} = $options{custom}->api_system_status(); -} - -sub run { - my ($self, %options) = @_; - - $self->manage_selection(%options); - foreach my $item (sort keys %{$self->{single}}) { - # As of 3CX 15.5 / 16, we have Firewall, Phones, Trunks - $self->{output}->output_add(severity => $self->{single}->{$item} ? 'OK' : 'CRITICAL', - short_msg => $item); - } - $self->{output}->output_add(severity => $self->{system}->{HasNotRunningServices} ? 'CRITICAL' : 'OK', - short_msg => 'Services'); - $self->{output}->output_add(severity => $self->{system}->{HasUnregisteredSystemExtensions} ? 'CRITICAL' : 'OK', - short_msg => 'Extensions'); - - $self->{output}->perfdata_add(label => "CallsActive", unit => '', value => $self->{system}->{CallsActive}); - $self->{output}->perfdata_add(label => "ExtensionsRegistered", unit => '', value => $self->{system}->{ExtensionsRegistered}); - - $self->{output}->display(); - $self->{output}->exit(); -} - -1; - -__END__ - -=head1 MODE - -List status - -=over 8 - -=back - -=cut diff --git a/apps/voip/3cx/restapi/mode/system.pm b/apps/voip/3cx/restapi/mode/system.pm new file mode 100644 index 000000000..b2b144306 --- /dev/null +++ b/apps/voip/3cx/restapi/mode/system.pm @@ -0,0 +1,173 @@ +# +# Copyright 2019 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package apps::voip::3cx::restapi::mode::system; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = 'health : ' . $self->{result_values}->{health}; + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{health} = $options{new_datas}->{$self->{instance} . '_health'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 0 }, + { name => 'service', type => 1, cb_prefix_output => 'prefix_service_output', message_multiple => 'All services are ok', skipped_code => { -10 => 1 } } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'calls-active', nlabel => 'system.calls.active.current', set => { + key_values => [ { name => 'calls_active' } ], + output_template => 'calls active : %s', + perfdatas => [ + { label => 'calls_active', template => '%s', value => 'calls_active_absolute', + min => 0 }, + ], + } + }, + { label => 'extensions-registered', nlabel => 'system.extensions.registered.current', set => { + key_values => [ { name => 'extensions_registered' } ], + output_template => 'extensions registered : %s', + perfdatas => [ + { label => 'extensions_registered', template => '%s', value => 'extensions_registered_absolute', + min => 0 }, + ], + } + }, + ]; + + $self->{maps_counters}->{service} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'health' }, { 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 => \&catalog_status_threshold, + } + }, + ]; +} + +sub prefix_service_output { + my ($self, %options) = @_; + + return "Service '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "unknown-status:s" => { name => 'unknown_status', default => '' }, + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '%{health} =~ /false/' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => [ + 'warning_status', 'critical_status', 'unknown_status', + ]); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $single = $options{custom}->api_single_status(); + my $system = $options{custom}->api_system_status(); + + $self->{service} = {}; + foreach my $item (keys %$single) { + # As of 3CX 15.5 / 16, we have Firewall, Phones, Trunks + $self->{service}->{$item} = { display => $item, health => $single->{$item} }; + } + $self->{service}->{HasNotRunningServices} = { + display => 'HasNotRunningServices', + health => $self->{system}->{HasNotRunningServices} ? 'false' : 'true', + }; + $self->{service}->{HasUnregisteredSystemExtensions} = { + display => 'HasUnregisteredSystemExtensions', + health => $self->{system}->{HasUnregisteredSystemExtensions} ? 'false' : 'true', + }; + + $self->{global} = { + calls_active => $system->{CallsActive}, + extensions_registered => $self->{system}->{ExtensionsRegistered}, + }; +} + +1; + +__END__ + +=head1 MODE + +Check system health + +=over 8 + +=item B<--unknown-status> + +Set warning threshold for status. +Can used special variables like: %{health}, %{display} + +=item B<--warning-status> + +Set warning threshold for status. +Can used special variables like: %{health}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{health} =~ /false/'). +Can used special variables like: %{health}, %{display} + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'calls-active', 'extensions-registred'. + +=back + +=cut diff --git a/apps/voip/3cx/restapi/plugin.pm b/apps/voip/3cx/restapi/plugin.pm index 7bd976b30..0bf65c482 100644 --- a/apps/voip/3cx/restapi/plugin.pm +++ b/apps/voip/3cx/restapi/plugin.pm @@ -32,20 +32,13 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( - 'status' => 'apps::voip::3cx::restapi::mode::status', - ); + 'system' => 'apps::voip::3cx::restapi::mode::system', + ); $self->{custom_modes}{api} = 'apps::voip::3cx::restapi::custom::api'; - return $self; } -sub init { - my ($self, %options) = @_; - - $self->SUPER::init(%options); -} - 1; __END__