From 1330090b0519add06594a28f2fd7a04fff621f94 Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Tue, 5 May 2020 09:33:43 +0200 Subject: [PATCH] Fix #1879 --- network/paloalto/ssh/custom/cli.pm | 2 +- network/paloalto/ssh/mode/licenses.pm | 159 ++++++++++++++++++++++++++ network/paloalto/ssh/plugin.pm | 1 + 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 network/paloalto/ssh/mode/licenses.pm diff --git a/network/paloalto/ssh/custom/cli.pm b/network/paloalto/ssh/custom/cli.pm index d3f6d83d5..9871ffbb3 100644 --- a/network/paloalto/ssh/custom/cli.pm +++ b/network/paloalto/ssh/custom/cli.pm @@ -138,7 +138,7 @@ sub execute_command { return $stdout; } - if ($stdout !~ /(.*<\/response>)/ms) { + if ($stdout !~ /(.*<\/response>)/ms) { $self->{output}->add_option_msg(short_msg => "Cannot find xml response"); $self->{output}->option_exit(); } diff --git a/network/paloalto/ssh/mode/licenses.pm b/network/paloalto/ssh/mode/licenses.pm new file mode 100644 index 000000000..e4a2837e6 --- /dev/null +++ b/network/paloalto/ssh/mode/licenses.pm @@ -0,0 +1,159 @@ +# +# 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 network::paloalto::ssh::mode::licenses; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use DateTime; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("expired status is '%s'", $self->{result_values}->{expired}); + if ($self->{result_values}->{expiry_date} eq '') { + $msg .= ', never expires'; + } else { + $msg .= sprintf( + ", expires in %d days [%s]", + $self->{result_values}->{expiry_days}, + $self->{result_values}->{expiry_date} + ); + } + + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{feature} = $options{new_datas}->{$self->{instance} . '_feature'}; + $self->{result_values}->{expired} = $options{new_datas}->{$self->{instance} . '_expired'}; + $self->{result_values}->{expiry_date} = $options{new_datas}->{$self->{instance} . '_expiry_date'}; + $self->{result_values}->{expiry_seconds} = $options{new_datas}->{$self->{instance} . '_expiry_seconds'}; + $self->{result_values}->{expiry_days} = ($self->{result_values}->{expiry_seconds} ne '') ? $self->{result_values}->{expiry_seconds} / 86400 : 0; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'features', type => 1, cb_prefix_output => 'prefix_feature_output', message_multiple => 'All features licensing are ok' }, + ]; + + $self->{maps_counters}->{features} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'feature' }, { name => 'expired' }, { name => 'expiry_date' }, { name => 'expiry_seconds' } ], + 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_feature_output { + my ($self, %options) = @_; + + return "Feature '" . $options{instance_value}->{feature} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + "warning-status:s" => { name => 'warning_status', default => '' }, + "critical-status:s" => { name => 'critical_status', default => '%{expired} eq "yes"' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => ['warning_status', 'critical_status']); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $result = $options{custom}->execute_command(command => 'request license info', ForceArray => ['entry']); + + my $months = { + january => 1, february => 2, march => 3, april => 4, may => 5, june => 6, + july => 7, august => 8, september => 9, october => 10, november => 11, december => 12 + }; + + $self->{features} = {}; + foreach my $feature (@{$result->{licenses}->{entry}}) { + $feature->{expires} = lc($feature->{expires}); + + # January 30, 2022 + my $dt; + if ($feature->{expires} =~ /^(\w+)\s+(\d+).*?(\d+)$/) { + $dt = DateTime->new(year => $3, month => $months->{$1}, day => $2); + } + + $self->{features}->{$feature->{feature}} = { + feature => $feature->{feature}, + expired => $feature->{expired}, + expiry_date => $feature->{expires} ne 'never' ? $feature->{expires} : '', + expiry_seconds => $feature->{expires} ne 'never' ? $dt->epoch - time() : '' + }; + } + + if (scalar(keys %{$self->{features}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No features found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check features licensing. + +=over 8 + +=item B<--warning-status> + +Set warning threshold for status. +Can use special variables like: %{expired}, %{expiry_days}, %{feature} + +=item B<--critical-status> + +Set critical threshold for status. (Default: '%{expired} eq "yes"'). +Can use special variables like: %{expired}, %{expiry_days}, %{feature} + +=back + +=cut diff --git a/network/paloalto/ssh/plugin.pm b/network/paloalto/ssh/plugin.pm index 52b69c872..3773ac63c 100644 --- a/network/paloalto/ssh/plugin.pm +++ b/network/paloalto/ssh/plugin.pm @@ -35,6 +35,7 @@ sub new { 'ha' => 'network::paloalto::ssh::mode::ha', 'interfaces' => 'network::paloalto::ssh::mode::interfaces', 'ipsec' => 'network::paloalto::ssh::mode::ipsec', + 'licenses' => 'network::paloalto::ssh::mode::licenses', 'system' => 'network::paloalto::ssh::mode::system' );