diff --git a/notification/prowl/mode/alert.pm b/notification/prowl/mode/alert.pm new file mode 100644 index 000000000..b0e75d1bf --- /dev/null +++ b/notification/prowl/mode/alert.pm @@ -0,0 +1,180 @@ +# +# Copyright 2020 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package notification::prowl::mode::alert; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; +use centreon::plugins::http; +use XML::Simple; + +my %priority = ( + up => '0', + down => '2', + unreachable => '-1', + ok => '0', + warning => '1', + critical => '2', + unknown => '-2', +); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + "hostname:s" => { name => 'hostname', default => 'api.prowlapp.com' }, + "port:s" => { name => 'port', default => 443 }, + "proto:s" => { name => 'proto', default => 'https' }, + "urlpath:s" => { name => 'url_path', default => "/publicapi/add" }, + "apikey:s" => { name => 'apikey' }, + "providerkey:s" => { name => 'providerkey' }, + "priority:s" => { name => 'priority' }, + "application:s" => { name => 'application' }, + "event:s" => { name => 'event' }, + "message:s" => { name => 'message' }, + "timeout:s" => { name => 'timeout' }, + }); + + $self->{http} = centreon::plugins::http->new(%options); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + + $self->SUPER::init(%options); + if (!defined($self->{option_results}->{apikey})) { + $self->{output}->add_option_msg(short_msg => "You need to set --apikey option"); + $self->{output}->option_exit(); + } + if (!defined($self->{option_results}->{priority})) { + $self->{output}->add_option_msg(short_msg => "You need to set --priority option"); + $self->{output}->option_exit(); + } + if (!defined($self->{option_results}->{application})) { + $self->{output}->add_option_msg(short_msg => "You need to set --application option"); + $self->{output}->option_exit(); + } + if (!defined($self->{option_results}->{event})) { + $self->{output}->add_option_msg(short_msg => "You need to set --event option"); + $self->{output}->option_exit(); + } + if (!defined($self->{option_results}->{message})) { + $self->{output}->add_option_msg(short_msg => "You need to set --message option"); + $self->{output}->option_exit(); + } + + $self->{http}->set_options(%{$self->{option_results}}); +} + +sub run { + my ($self, %options) = @_; + + my $notification_param = [ + "apikey=$self->{option_results}->{apikey}", + "providerkey=" . (defined($self->{option_results}->{providerkey}) ? $self->{option_results}->{providerkey} : ''), + "priority=$priority{lc($self->{option_results}->{priority})}", + "application=$self->{option_results}->{application}", + "event=$self->{option_results}->{event}", + "description=$self->{option_results}->{message}", + ]; + my $response = $self->{http}->request(method => 'POST', post_param => $notification_param); + + my $decoded; + eval { + $decoded = XMLin($response); + }; + if ($@) { + $self->{output}->output_add(long_msg => $response, debug => 1); + $self->{output}->add_option_msg(short_msg => "Cannot decode xml response: $@"); + $self->{output}->option_exit(); + } + + $self->{output}->output_add(short_msg => $decoded->{success}->{remaining} . ' notifications remaining until ' . gmtime($decoded->{success}->{resetdate})); + $self->{output}->display(force_ignore_perfdata => 1); + $self->{output}->exit(); +} + +1; + +__END__ + +=head1 MODE + +Send iOS push notifications via Prowl API (https://www.prowlapp.com/api.php). + +=over 6 + +=item B<--hostname> + +Hostname of the Prowl API (Default: 'api.prowlapp.com') + +=item B<--port> + +Port used by API (Default: '443') + +=item B<--proto> + +Specify https if needed (Default: 'https'). + +=item B<--urlpath> + +Set path to the notifications API (Default: '/publicapi/add'). + +=item B<--apikey> + +Specify API key(s), separated by commas. + +=item B<--apikey> + +Specify API providerkey. + +=item B<--priority> + +The priority of the notification to send. + +=item B<--application> + +The application part of the notification to send. + +=item B<--event> + +The event part of the notification to send. + +=item B<--message> + +The message part of the notification to send. + +=item B<--url> + +The URL which should be attached to the notification. + +=item B<--timeout> + +Threshold for HTTP timeout + +=back + +=cut diff --git a/notification/prowl/plugin.pm b/notification/prowl/plugin.pm new file mode 100644 index 000000000..95ada7b73 --- /dev/null +++ b/notification/prowl/plugin.pm @@ -0,0 +1,48 @@ +# +# Copyright 2020 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package notification::prowl::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} = '1.0'; + %{$self->{modes}} = ( + 'alert' => 'notification::prowl::mode::alert', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Send iOS push notifications via Prowl API. + +=cut