From 86b997f3b48d5ee6b5b6145e74db050c0f40524c Mon Sep 17 00:00:00 2001 From: Colin Gagnaire Date: Tue, 19 Mar 2019 09:38:40 +0100 Subject: [PATCH 1/2] add get_message method for http backends --- centreon/plugins/backend/http/curl.pm | 11 ++++++++--- centreon/plugins/backend/http/lwp.pm | 10 ++++++++-- centreon/plugins/http.pm | 6 ++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/centreon/plugins/backend/http/curl.pm b/centreon/plugins/backend/http/curl.pm index 3250e5f76..00bf1c279 100644 --- a/centreon/plugins/backend/http/curl.pm +++ b/centreon/plugins/backend/http/curl.pm @@ -359,10 +359,10 @@ sub request { eval "$options{request}->{critical_status}") { $status = 'critical'; } elsif (defined($options{request}->{warning_status}) && $options{request}->{warning_status} ne '' && - eval "$options{request}->{warning_status}") { + eval "$options{request}->{warning_status}") { $status = 'warning'; } elsif (defined($options{request}->{unknown_status}) && $options{request}->{unknown_status} ne '' && - eval "$options{request}->{unknown_status}") { + eval "$options{request}->{unknown_status}") { $status = 'unknown'; } }; @@ -398,8 +398,13 @@ sub get_code { return $self->{response_code}; } -1; +sub get_message { + my ($self, %options) = @_; + + return $http_code_explained->{$self->{response_code}}; +} +1; __END__ diff --git a/centreon/plugins/backend/http/lwp.pm b/centreon/plugins/backend/http/lwp.pm index 553f1261f..b8237339b 100644 --- a/centreon/plugins/backend/http/lwp.pm +++ b/centreon/plugins/backend/http/lwp.pm @@ -208,10 +208,10 @@ sub request { eval "$request_options->{critical_status}") { $status = 'critical'; } elsif (defined($request_options->{warning_status}) && $request_options->{warning_status} ne '' && - eval "$request_options->{warning_status}") { + eval "$request_options->{warning_status}") { $status = 'warning'; } elsif (defined($request_options->{unknown_status}) && $request_options->{unknown_status} ne '' && - eval "$request_options->{unknown_status}") { + eval "$request_options->{unknown_status}") { $status = 'unknown'; } }; @@ -250,6 +250,12 @@ sub get_code { return $self->{response}->code(); } +sub get_message { + my ($self, %options) = @_; + + return $self->{response}->message(); +} + 1; __END__ diff --git a/centreon/plugins/http.pm b/centreon/plugins/http.pm index 9520205f5..8c8c4f456 100644 --- a/centreon/plugins/http.pm +++ b/centreon/plugins/http.pm @@ -190,6 +190,12 @@ sub get_code { return $self->{'backend_' . $self->{http_backend}}->get_code(); } +sub get_message { + my ($self, %options) = @_; + + return $self->{'backend_' . $self->{http_backend}}->get_message(); +} + 1; __END__ From 5cbce02f28e67d591dddfaf4914a2c3f553f40bb Mon Sep 17 00:00:00 2001 From: Colin Gagnaire Date: Tue, 19 Mar 2019 09:39:10 +0100 Subject: [PATCH 2/2] better response handling of azure apis --- cloud/azure/custom/api.pm | 23 +++++++++++++++++++---- cloud/azure/custom/azcli.pm | 36 ++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/cloud/azure/custom/api.pm b/cloud/azure/custom/api.pm index 43a4fdcb7..c1710fd45 100644 --- a/cloud/azure/custom/api.pm +++ b/cloud/azure/custom/api.pm @@ -181,18 +181,23 @@ sub get_access_token { full_url => $self->{login_endpoint} . '/' . $self->{tenant} . '/oauth2/token', hostname => ''); + if (!defined($content) || $content eq '' || $self->{http}->get_header(name => 'content-length') == 0) { + $self->{output}->add_option_msg(short_msg => "Login endpoint API returns empty content [code: '" . $self->{http}->get_code() . "'] [message: '" . $self->{http}->get_message() . "']"); + $self->{output}->option_exit(); + } + my $decoded; eval { $decoded = JSON::XS->new->utf8->decode($content); }; if ($@) { $self->{output}->output_add(long_msg => $content, debug => 1); - $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); + $self->{output}->add_option_msg(short_msg => "Cannot decode response (add --debug option to display returned content)"); $self->{output}->option_exit(); } if (defined($decoded->{error})) { $self->{output}->output_add(long_msg => "Error message : " . $decoded->{error_description}, debug => 1); - $self->{output}->add_option_msg(short_msg => "Login endpoint API return error code '" . $decoded->{error} . "' (add --debug option for detailed message)"); + $self->{output}->add_option_msg(short_msg => "Login endpoint API returns error code '" . $decoded->{error} . "' (add --debug option for detailed message)"); $self->{output}->option_exit(); } @@ -217,18 +222,28 @@ sub request_api { my $content = $self->{http}->request(%options); + if (!defined($content) || $content eq '' || $self->{http}->get_header(name => 'content-length') == 0) { + $self->{output}->add_option_msg(short_msg => "Management endpoint API returns empty content [code: '" . $self->{http}->get_code() . "'] [message: '" . $self->{http}->get_message() . "']"); + $self->{output}->option_exit(); + } + my $decoded; eval { $decoded = JSON::XS->new->utf8->decode($content); }; if ($@) { $self->{output}->output_add(long_msg => $content, debug => 1); - $self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@"); + $self->{output}->add_option_msg(short_msg => "Cannot decode response (add --debug option to display returned content)"); $self->{output}->option_exit(); } if (defined($decoded->{error})) { $self->{output}->output_add(long_msg => "Error message : " . $decoded->{error}->{message}, debug => 1); - $self->{output}->add_option_msg(short_msg => "Management endpoint API return error code '" . $decoded->{error}->{code} . "' (add --debug option for detailed message)"); + $self->{output}->add_option_msg(short_msg => "Management endpoint API returns error code '" . $decoded->{error}->{code} . "' (add --debug option for detailed message)"); + $self->{output}->option_exit(); + } + if (defined($decoded->{code})) { + $self->{output}->output_add(long_msg => "Message : " . $decoded->{message}, debug => 1); + $self->{output}->add_option_msg(short_msg => "Management endpoint API returns code '" . $decoded->{code} . "' (add --debug option for detailed message)"); $self->{output}->option_exit(); } diff --git a/cloud/azure/custom/azcli.pm b/cloud/azure/custom/azcli.pm index 0b2ee85a7..6e5af2429 100644 --- a/cloud/azure/custom/azcli.pm +++ b/cloud/azure/custom/azcli.pm @@ -40,23 +40,22 @@ sub new { } if (!defined($options{noptions})) { - $options{options}->add_options(arguments => - { - "subscription:s" => { name => 'subscription' }, - "tenant:s" => { name => 'tenant' }, - "client-id:s" => { name => 'client_id' }, - "client-secret:s" => { name => 'client_secret' }, - "timeframe:s" => { name => 'timeframe' }, - "interval:s" => { name => 'interval' }, - "aggregation:s@" => { name => 'aggregation' }, - "zeroed" => { name => 'zeroed' }, - "timeout:s" => { name => 'timeout', default => 50 }, - "sudo" => { name => 'sudo' }, - "command:s" => { name => 'command', default => 'az' }, - "command-path:s" => { name => 'command_path' }, - "command-options:s" => { name => 'command_options', default => '' }, - "proxyurl:s" => { name => 'proxyurl' }, - }); + $options{options}->add_options(arguments => { + "subscription:s" => { name => 'subscription' }, + "tenant:s" => { name => 'tenant' }, + "client-id:s" => { name => 'client_id' }, + "client-secret:s" => { name => 'client_secret' }, + "timeframe:s" => { name => 'timeframe' }, + "interval:s" => { name => 'interval' }, + "aggregation:s@" => { name => 'aggregation' }, + "zeroed" => { name => 'zeroed' }, + "timeout:s" => { name => 'timeout', default => 50 }, + "sudo" => { name => 'sudo' }, + "command:s" => { name => 'command', default => 'az' }, + "command-path:s" => { name => 'command_path' }, + "command-options:s" => { name => 'command_options', default => '' }, + "proxyurl:s" => { name => 'proxyurl' }, + }); } $options{options}->add_help(package => __PACKAGE__, sections => 'AZCLI OPTIONS', once => 1); @@ -129,7 +128,8 @@ sub execute { $raw_results = JSON::XS->new->utf8->decode($response); }; if ($@) { - $self->{output}->add_option_msg(short_msg => "Cannot decode json response: $@"); + $self->{output}->output_add(long_msg => $response, debug => 1); + $self->{output}->add_option_msg(short_msg => "Cannot decode response (add --debug option to display returned content)"); $self->{output}->option_exit(); }