From 0328e13c79f853573fb177319e99721767d874b0 Mon Sep 17 00:00:00 2001 From: qgarnier Date: Mon, 5 Jun 2017 20:05:24 +0200 Subject: [PATCH] add zixi restapi plugin --- .../apps/video/zixi/restapi/custom/api.pm | 209 ++++++++++++ .../restapi/mode/broadcasterinputusage.pm | 241 ++++++++++++++ .../restapi/mode/broadcasterlicenseusage.pm | 303 ++++++++++++++++++ .../restapi/mode/broadcasteroutputusage.pm | 252 +++++++++++++++ .../restapi/mode/broadcastersystemusage.pm | 113 +++++++ .../zixi/restapi/mode/feederinputusage.pm | 212 ++++++++++++ .../zixi/restapi/mode/feederoutputusage.pm | 211 ++++++++++++ .../apps/video/zixi/restapi/plugin.pm | 54 ++++ 8 files changed, 1595 insertions(+) create mode 100644 centreon-plugins/apps/video/zixi/restapi/custom/api.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/broadcasterinputusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/broadcasterlicenseusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/broadcasteroutputusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/broadcastersystemusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/feederinputusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/mode/feederoutputusage.pm create mode 100644 centreon-plugins/apps/video/zixi/restapi/plugin.pm diff --git a/centreon-plugins/apps/video/zixi/restapi/custom/api.pm b/centreon-plugins/apps/video/zixi/restapi/custom/api.pm new file mode 100644 index 000000000..ede50ee12 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/custom/api.pm @@ -0,0 +1,209 @@ +# +# 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::video::zixi::restapi::custom::api; + +use strict; +use warnings; +use centreon::plugins::http; +use JSON::XS; + +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' }, + "proto:s@" => { name => 'proto' }, + "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; + +} + +# 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++) { + 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) = @_; + # return 1 = ok still hostname + # return 0 = no hostname left + + $self->{hostname} = (defined($self->{option_results}->{hostname})) ? shift(@{$self->{option_results}->{hostname}}) : undef; + $self->{port} = (defined($self->{option_results}->{port})) ? shift(@{$self->{option_results}->{port}}) : 4444; + $self->{proto} = (defined($self->{option_results}->{proto})) ? shift(@{$self->{option_results}->{proto}}) : 'http'; + $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->{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 get { + my ($self, %options) = @_; + + $self->settings(); + + my $response = $self->{http}->request(url_path => $options{path}, + critical_status => '', warning_status => ''); + my $content; + eval { + $content = JSON::XS->new->utf8->decode($response); + }; + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@"); + $self->{output}->option_exit(); + } + if (defined($content->{errmsg})) { + $self->{output}->add_option_msg(short_msg => "Cannot get data: " . $content->{errmsg}); + $self->{output}->option_exit(); + } + + return $content; +} + +1; + +__END__ + +=head1 NAME + +Zixi REST API + +=head1 SYNOPSIS + +Zixi Rest API custom mode + +=head1 REST API OPTIONS + +=over 8 + +=item B<--hostname> + +Zixi hostname. + +=item B<--port> + +Port used (Default: 4444) + +=item B<--proto> + +Specify https if needed (Default: 'http') + +=item B<--username> + +Zixi username. + +=item B<--password> + +Zixi password. + +=item B<--proxyurl> + +Proxy URL if any + +=item B<--timeout> + +Set HTTP timeout + +=back + +=head1 DESCRIPTION + +B. + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterinputusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterinputusage.pm new file mode 100644 index 000000000..755669d8a --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterinputusage.pm @@ -0,0 +1,241 @@ +# +# 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::video::zixi::restapi::mode::broadcasterinputusage; + +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 = 'status : ' . $self->{result_values}->{status} . ' [error: ' . $self->{result_values}->{error} . ']'; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{source} = $options{new_datas}->{$self->{instance} . '_source'}; + $self->{result_values}->{error} = $options{new_datas}->{$self->{instance} . '_error'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'input', type => 1, cb_prefix_output => 'prefix_input_output', message_multiple => 'All inputs are ok', skipped_code => { -11 => 1 } }, + ]; + + $self->{maps_counters}->{input} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'status' }, { name => 'source' }, { name => 'error' } ], + 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 => 'source' } ], + 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 => 'source_absolute' }, + ], + } + }, + { label => 'traffic-out', set => { + key_values => [ { name => 'traffic_out', diff => 1 }, { name => 'source' } ], + 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 => 'source_absolute' }, + ], + } + }, + ]; +} + +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-source:s" => { name => 'filter_source' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} !~ /Connecting|Connected/i || %{error} !~ /none/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_input_output { + my ($self, %options) = @_; + + return "Input '" . $options{instance_value}->{source} . "' "; +} + +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 %mapping_input_status = (0 => 'none', 1 => 'unknown', + 2 => 'resolve error', 3 => 'timeout', 4 => 'network error', 5 => 'protocol error', + 6 => 'server is full', 7 => 'connection rejected', 8 => 'authentication error', 9 => 'license error', + 10 => 'end of file', 11 => 'flood error', 12 => 'redirect', 13 => 'stopped', + 14 => 'limit', 15 => 'not found', 16 => 'not supported', 17 => 'local file system error', + 18 => 'remote file system error', 19 => 'stream replaced', 20 => 'p2p abort', + 21 => 'compression error', 22 => 'source collision error', 23 => 'adaptive', + 24 => 'tcp connection error', 25 => 'rtmp connection error', 26 => 'rtmp handshake error', + 27 => 'tcp connection closed', 28 => 'rtmp stream error', 29 => 'rtmp publish error', + 30 => 'rtmp stream closed', 31 => 'rtmp play error', 32 => 'rtmp protocol error', + 33 => 'rtmp analyze timeout', 34 => 'busy', 35 => 'encryption error', + 36 => 'transcoder error', 37 => 'error in invocation a transcoder subprocess', + 38 => 'error communicating with a transcoder subprocess', 39 => 'error in RTMP Akamai authentication', + 40 => 'maximum outputs for the source reached', 41 => 'generic error', + 42 => 'zero bitrate warning', 43 => 'low bitrate warning', 44 => 'multicast join failed', +); + +sub manage_selection { + my ($self, %options) = @_; + + $self->{input} = {}; + my $result = $options{custom}->get(path => '/zixi/streams.json?complete=1'); + + foreach my $entry (@{$result->{streams}}) { + if (defined($self->{option_results}->{filter_source}) && $self->{option_results}->{filter_source} ne '' && + $entry->{source} !~ /$self->{option_results}->{filter_source}/) { + $self->{output}->output_add(long_msg => "skipping '" . $entry->{source} . "': no matching filter.", debug => 1); + next; + } + + $self->{input}->{$entry->{id}} = { + source => $entry->{source}, + status => $entry->{status}, + error => $mapping_input_status{$entry->{error_code}}, + traffic_in => $entry->{stats}->{net_recv}->{bytes} * 8, + traffic_out => $entry->{stats}->{net_send}->{bytes} * 8, + }; + } + + if (scalar(keys %{$self->{input}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No input found."); + $self->{output}->option_exit(); + } + + $self->{cache_name} = "zixi_" . $self->{mode} . '_' . $options{custom}->{hostname} . '_' . $options{custom}->{port} . '_' . + (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 input usage. + +=over 8 + +=item B<--filter-source> + +Filter source (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=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 (Default: -) +Can used special variables like: %{source}, %{status}, %{error}. + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} !~ /Connecting|Connected/i || %{error} !~ /none/i'). +Can used special variables like: %{source}, %{status}, %{error}. + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterlicenseusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterlicenseusage.pm new file mode 100644 index 000000000..720c193d6 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasterlicenseusage.pm @@ -0,0 +1,303 @@ +# +# 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::video::zixi::restapi::mode::broadcasterlicenseusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +my $instance_mode; + +sub custom_status_threshold { + my ($self, %options) = @_; + my $status = 'ok'; + my $message; + + eval { + local $SIG{__WARN__} = sub { $message = $_[0]; }; + local $SIG{__DIE__} = sub { $message = $_[0]; }; + + if (defined($instance_mode->{option_results}->{critical_status}) && $instance_mode->{option_results}->{critical_status} ne '' && + eval "$instance_mode->{option_results}->{critical_status}") { + $status = 'critical'; + } elsif (defined($instance_mode->{option_results}->{warning_status}) && $instance_mode->{option_results}->{warning_status} ne '' && + eval "$instance_mode->{option_results}->{warning_status}") { + $status = 'warning'; + } + }; + if (defined($message)) { + $self->{output}->output_add(long_msg => 'filter status issue: ' . $message); + } + + return $status; +} + +sub custom_status_output { + my ($self, %options) = @_; + my $info = $self->{result_values}->{info} eq '' ? '-' : $self->{result_values}->{info}; + my $error = $self->{result_values}->{error} eq '' ? '-' : $self->{result_values}->{error}; + my $msg = 'information : ' . $info . ' [error: ' . $error . ']'; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{info} = $options{new_datas}->{$self->{instance} . '_info'}; + $self->{result_values}->{name} = $options{new_datas}->{$self->{instance} . '_name'}; + $self->{result_values}->{error} = $options{new_datas}->{$self->{instance} . '_error'}; + + return 0; +} + +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 ($self->{result_values}->{total} =~ /[0-9]/ && $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, + 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} =~ /[0-9]/ ? $self->{result_values}->{total} : undef); +} + +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 ($self->{result_values}->{total} =~ /[0-9]/ && $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 $msg = sprintf("Total: %s Used: %s (%s) Free: %s (%s)", + $self->{result_values}->{total}, + $self->{result_values}->{used}, + defined($self->{result_values}->{prct_used}) ? sprintf("%.2f%%", $self->{result_values}->{prct_used}) : '-', + defined($self->{result_values}->{free}) ? $self->{result_values}->{free} : '-', + defined($self->{result_values}->{prct_free}) ? sprintf("%.2f%%", $self->{result_values}->{prct_free}) : '-'); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + return -10 if ($options{new_datas}->{$self->{instance} . '_info'} =~ /disabled/i || + $options{new_datas}->{$self->{instance} . '_used'} eq '' || + ($options{new_datas}->{$self->{instance} . '_used'} =~ /^0$/ && $options{new_datas}->{$self->{instance} . '_limit'} =~ /^0$/)); + + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_limit'}; + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_used'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_name'}; + + # Can be 'unlimited' + if ($self->{result_values}->{total} =~ /[0-9]/) { + $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total}; + $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used}; + $self->{result_values}->{prct_free} = 100 - $self->{result_values}->{prct_used}; + if ($self->{result_values}->{free} < 0) { + $self->{result_values}->{free} = 0; + $self->{result_values}->{prct_free} = 0; + } + } + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'license', type => 1, cb_prefix_output => 'prefix_license_output', message_multiple => 'All licenses are ok', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{license} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'info' }, { name => 'name' }, { name => 'error' } ], + 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 => 'usage', set => { + key_values => [ { name => 'used' }, { name => 'limit' }, { name => 'name' }, { name => 'info' } ], + 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'), + } + }, + { label => 'days', set => { + key_values => [ { name => 'days' } ], + output_template => '%d days remaining before expiration', + closure_custom_perfdata => sub { 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 => + { + "filter-name:s" => { name => 'filter_name' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status' }, + "units:s" => { name => 'units', default => '%' }, + "free" => { name => 'free' }, + }); + centreon::plugins::misc::mymodule_load(output => $self->{output}, module => 'Date::Parse', + error_msg => "Cannot load module 'Date::Parse'."); + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_license_output { + my ($self, %options) = @_; + + return "License '" . $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) = @_; + + $self->{license} = {}; + my $result = $options{custom}->get(path => '/licensing_info'); + + my $current_time = time(); + foreach my $entry (@{$result->{lics}}) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $entry->{name} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $entry->{name} . "': no matching filter.", debug => 1); + next; + } + + # Format 09-dec-2017. Can be also 'permanent' (so dont care) + my $days_remaining; + if ($entry->{exp} =~ /\d+-\S+-\d+/) { + my $create_time = Date::Parse::str2time($entry->{exp}); + $days_remaining = ($create_time - $current_time) / 86400; + } + + $self->{license}->{$entry->{name}} = { %{$entry}, days => $days_remaining }; + } + + if (scalar(keys %{$self->{license}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No license found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check license usage. + +=over 8 + +=item B<--filter-source> + +Filter source (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'usage', 'days'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'usage', 'days'. + +=item B<--units> + +Units of thresholds (Default: '%') ('%', 'absolute'). + +=item B<--free> + +Thresholds are on free license left. + +=item B<--warning-status> + +Set warning threshold for status (Default: -) +Can used special variables like: %{name}, %{error}, %{info}. + +=item B<--critical-status> + +Set critical threshold for status (Default: -). +Can used special variables like: %{name}, %{error}, %{info}. + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/broadcasteroutputusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasteroutputusage.pm new file mode 100644 index 000000000..9973a7637 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/broadcasteroutputusage.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::video::zixi::restapi::mode::broadcasteroutputusage; + +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 = 'status : ' . $self->{result_values}->{status} . ' [error: ' . $self->{result_values}->{error} . ']'; + + 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'}; + $self->{result_values}->{error} = $options{new_datas}->{$self->{instance} . '_error'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'output_stream', type => 1, cb_prefix_output => 'prefix_output_output', message_multiple => 'All outputs are ok', skipped_code => { -11 => 1 } }, + ]; + + $self->{maps_counters}->{output_stream} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'status' }, { name => 'name' }, { name => 'error' } ], + 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 => 'name' } ], + 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 => 'name_absolute' }, + ], + } + }, + { label => 'traffic-out', set => { + key_values => [ { name => 'traffic_out', diff => 1 }, { name => 'name' } ], + 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 => 'name_absolute' }, + ], + } + }, + { label => 'dropped-in', set => { + key_values => [ { name => 'dropped_in', diff => 1 }, { name => 'name' } ], + output_template => 'Packets Dropped In : %s', + perfdatas => [ + { label => 'dropped_in', value => 'dropped_in_absolute', template => '%.2f', + min => 0, label_extra_instance => 1, instance_use => 'name_absolute' }, + ], + } + }, + ]; +} + +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' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} !~ /Connecting|Connected/i || %{error} !~ /none/i' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_output_output { + my ($self, %options) = @_; + + return "Output '" . $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; + } + } +} + +my %mapping_output_status = (0 => 'none', 1 => 'unknown', + 2 => 'resolve error', 3 => 'timeout', 4 => 'network error', 5 => 'protocol error', + 6 => 'server is full', 7 => 'connection rejected', 8 => 'authentication error', 9 => 'license error', + 10 => 'end of file', 11 => 'flood error', 12 => 'redirect', 13 => 'stopped', + 14 => 'limit', 15 => 'not found', 16 => 'not supported', 17 => 'local file system error', + 18 => 'remote file system error', 19 => 'stream replaced', 20 => 'p2p abort', + 21 => 'compression error', 22 => 'source collision error', 23 => 'adaptive', + 24 => 'tcp connection error', 25 => 'rtmp connection error', 26 => 'rtmp handshake error', + 27 => 'tcp connection closed', 28 => 'rtmp stream error', 29 => 'rtmp publish error', + 30 => 'rtmp stream closed', 31 => 'rtmp play error', 32 => 'rtmp protocol error', + 33 => 'rtmp analyze timeout', 34 => 'busy', 35 => 'encryption error', + 36 => 'transcoder error', 37 => 'error in invocation a transcoder subprocess', + 38 => 'error communicating with a transcoder subprocess', 39 => 'error in RTMP Akamai authentication', + 40 => 'maximum outputs for the source reached', 41 => 'generic error', + 42 => 'zero bitrate warning', 43 => 'low bitrate warning', 44 => 'multicast join failed', +); + +sub manage_selection { + my ($self, %options) = @_; + + $self->{output_stream} = {}; + my $result = $options{custom}->get(path => '/zixi/outputs.json?complete=1'); + + foreach my $entry (@{$result->{outputs}}) { + my $name = $entry->{name} . '/' . $entry->{requested_stream_id}; + 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->{output_stream}->{$entry->{id}} = { + name => $name, + status => $entry->{status}, + error => $mapping_output_status{$entry->{error_code}}, + traffic_in => $entry->{stats}->{net_recv}->{bytes} * 8, + traffic_out => $entry->{stats}->{net_send}->{bytes} * 8, + dropped_in => $entry->{stats}->{net_recv}->{dropped}, + }; + } + + if (scalar(keys %{$self->{output_stream}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No output found."); + $self->{output}->option_exit(); + } + + $self->{cache_name} = "zixi_" . $self->{mode} . '_' . $options{custom}->{hostname} . '_' . $options{custom}->{port} . '_' . + (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 output usage. + +=over 8 + +=item B<--filter-name> + +Filter name (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'traffic-in', 'traffic-out', 'dropped-in'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'traffic-in', 'traffic-out', 'dropped-in'. + +=item B<--warning-status> + +Set warning threshold for status (Default: -) +Can used special variables like: %{name}, %{status}, %{error}. + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} !~ /Connecting|Connected/i || %{error} !~ /none/i'). +Can used special variables like: %{name}, %{status}, %{error}. + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/broadcastersystemusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/broadcastersystemusage.pm new file mode 100644 index 000000000..75bef28f9 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/broadcastersystemusage.pm @@ -0,0 +1,113 @@ +# +# 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::video::zixi::restapi::mode::broadcastersystemusage; + +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, message_separator => ' - ' }, + ]; + + $self->{maps_counters}->{global} = [ + { label => 'cpu-load', set => { + key_values => [ { name => 'cpu_load' } ], + output_template => 'Cpu Load : %.2f %%', + perfdatas => [ + { label => 'cpu_load', value => 'cpu_load_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'memory-usage', set => { + key_values => [ { name => 'memory_used' } ], + output_template => 'Memory Used : %.2f %%', + perfdatas => [ + { label => 'memory_used', value => 'memory_used_absolute', template => '%.2f', + min => 0, max => 100, unit => '%' }, + ], + } + }, + { label => 'disk-usage', set => { + key_values => [ { name => 'disk_used' } ], + output_template => 'Disk Used : %.2f %%', + perfdatas => [ + { label => 'disk_used', value => 'disk_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 $result = $options{custom}->get(path => '/sys_load.json'); + $self->{global} = { disk_used => $result->{disk_space}, cpu_load => $result->{cpu_load}, memory_used => $result->{memory_use} }; +} + +1; + +__END__ + +=head1 MODE + +Check system usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^disk-usage$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'disk-usage' (%), 'memory-usage' (%), 'cpu-load' (%). + +=item B<--critical-*> + +Threshold critical. +Can be: 'disk-usage' (%), 'memory-usage' (%), 'cpu-load' (%). + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/feederinputusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/feederinputusage.pm new file mode 100644 index 000000000..559a86cd4 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/feederinputusage.pm @@ -0,0 +1,212 @@ +# +# 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::video::zixi::restapi::mode::feederinputusage; + +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 = 'active : ' . $self->{result_values}->{active} . ' [error: ' . ($self->{result_values}->{error} ne '' ? $self->{result_values}->{error} : '-') . ']'; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{active} = $options{new_datas}->{$self->{instance} . '_active'}; + $self->{result_values}->{name} = $options{new_datas}->{$self->{instance} . '_name'}; + $self->{result_values}->{error} = $options{new_datas}->{$self->{instance} . '_error'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'input', type => 1, cb_prefix_output => 'prefix_input_output', message_multiple => 'All inputs are ok', skipped_code => { -11 => 1 } }, + ]; + + $self->{maps_counters}->{input} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'active' }, { name => 'name' }, { name => 'error' } ], + 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 => 'name' } ], + 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 => 'name_absolute' }, + ], + } + }, + ]; +} + +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' }, + "critical-status:s" => { name => 'critical_status' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_input_output { + my ($self, %options) = @_; + + return "Input '" . $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) = @_; + + $self->{input} = {}; + my $result = $options{custom}->get(path => '/inputs_data'); + foreach my $entry (@{$result->{inputs}}) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $entry->{name} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $entry->{source} . "': no matching filter.", debug => 1); + next; + } + + $self->{input}->{$entry->{name}} = { + name => $entry->{name}, + active => $entry->{active} == 0 ? 'false' : 'true', + error => $entry->{error}, + traffic_in => $entry->{bytes} * 8, + }; + } + + if (scalar(keys %{$self->{input}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No input found."); + $self->{output}->option_exit(); + } + + $self->{cache_name} = "zixi_" . $self->{mode} . '_' . $options{custom}->{hostname} . '_' . $options{custom}->{port} . '_' . + (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 feeder input usage. + +=over 8 + +=item B<--filter-name> + +Filter name (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'traffic-in'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'traffic-in'. + +=item B<--warning-status> + +Set warning threshold for status (Default: -) +Can used special variables like: %{name}, %{active}, %{error}. + +=item B<--critical-status> + +Set critical threshold for status (Default: -). +Can used special variables like: %{name}, %{active}, %{error}. + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/mode/feederoutputusage.pm b/centreon-plugins/apps/video/zixi/restapi/mode/feederoutputusage.pm new file mode 100644 index 000000000..a4fc8339a --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/mode/feederoutputusage.pm @@ -0,0 +1,211 @@ +# +# 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::video::zixi::restapi::mode::feederoutputusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::misc; + +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 = 'active : ' . $self->{result_values}->{active} . ' [error: ' . ($self->{result_values}->{error} ne '' ? $self->{result_values}->{error} : '-') . ']'; + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{active} = $options{new_datas}->{$self->{instance} . '_active'}; + $self->{result_values}->{name} = $options{new_datas}->{$self->{instance} . '_name'}; + $self->{result_values}->{error} = $options{new_datas}->{$self->{instance} . '_error'}; + $self->{result_values}->{con_stat} = $options{new_datas}->{$self->{instance} . '_con_stat'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'output_stream', type => 1, cb_prefix_output => 'prefix_output_output', message_multiple => 'All outputs are ok' }, + ]; + + $self->{maps_counters}->{output_stream} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'active' }, { name => 'name' }, { name => 'error' }, { name => 'con_stat' } ], + 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 => 'current-bitrate', set => { + key_values => [ { name => 'bitrate' }, { name => 'name' } ], + output_change_bytes => 2, + output_template => 'Current Bitrate : %s %s/s', + perfdatas => [ + { label => 'current_bitrate', value => 'bitrate_absolute', template => '%.2f', + min => 0, unit => 'b/s', label_extra_instance => 1, instance_use => 'name_absolute' }, + ], + } + }, + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $instance_mode = $self; + $self->change_macros(); +} + +sub prefix_output_output { + my ($self, %options) = @_; + + return "Output '" . $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) = @_; + + $self->{output_stream} = {}; + my $result = $options{custom}->get(path => '/outs'); + foreach my $entry (@{$result->{outs}}) { + $entry->{name} = centreon::plugins::misc::trim($entry->{name}); + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $entry->{name} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $entry->{source} . "': no matching filter.", debug => 1); + next; + } + + $self->{output_stream}->{$entry->{name}} = { + name => $entry->{name}, + active => $entry->{active} == 0 ? 'false' : 'true', + error => $entry->{error}, + con_stat => $entry->{con_stat}, + bitrate => $entry->{bitrate}, + }; + } + + if (scalar(keys %{$self->{output_stream}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No output found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check feeder output usage. + +=over 8 + +=item B<--filter-source> + +Filter source (can be a regexp). + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^status$' + +=item B<--warning-*> + +Threshold warning. +Can be: 'current-birate'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'current-birate'. + +=item B<--warning-status> + +Set warning threshold for status (Default: -) +Can used special variables like: %{name}, %{active}, %{error}, %{con_stat}. + +=item B<--critical-status> + +Set critical threshold for status (Default: -). +Can used special variables like: %{name}, %{active}, %{error}, %{con_stat}. + +=back + +=cut diff --git a/centreon-plugins/apps/video/zixi/restapi/plugin.pm b/centreon-plugins/apps/video/zixi/restapi/plugin.pm new file mode 100644 index 000000000..feaa65522 --- /dev/null +++ b/centreon-plugins/apps/video/zixi/restapi/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::video::zixi::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}} = ( + 'broadcaster-input-usage' => 'apps::video::zixi::restapi::mode::broadcasterinputusage', + 'broadcaster-license-usage' => 'apps::video::zixi::restapi::mode::broadcasterlicenseusage', + 'broadcaster-output-usage' => 'apps::video::zixi::restapi::mode::broadcasteroutputusage', + 'broadcaster-system-usage' => 'apps::video::zixi::restapi::mode::broadcastersystemusage', + 'feeder-input-usage' => 'apps::video::zixi::restapi::mode::feederinputusage', + 'feeder-output-usage' => 'apps::video::zixi::restapi::mode::feederoutputusage', + ); + + $self->{custom_modes}{api} = 'apps::video::zixi::restapi::custom::api'; + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Zixi through HTTP/REST API. + +=cut