diff --git a/centreon-plugins/cloud/azure/custom/api.pm b/centreon-plugins/cloud/azure/custom/api.pm index 1952ecb86..819d16319 100644 --- a/centreon-plugins/cloud/azure/custom/api.pm +++ b/centreon-plugins/cloud/azure/custom/api.pm @@ -61,6 +61,7 @@ sub new { $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); $self->{output} = $options{output}; + $self->{mode_name} = $options{mode_name}; $self->{http} = centreon::plugins::http->new(%options, default_backend => 'curl'); $self->{cache} = centreon::plugins::statefile->new(%options); @@ -98,7 +99,7 @@ sub check_options { $self->{management_endpoint} = (defined($self->{option_results}->{management_endpoint})) ? $self->{option_results}->{management_endpoint} : 'https://management.azure.com'; $self->{api_version} = (defined($self->{option_results}->{api_version})) ? $self->{option_results}->{api_version} : undef; - if (!defined($self->{subscription}) || $self->{subscription} eq '') { + if ((!defined($self->{subscription}) || $self->{subscription} eq '') && $self->{mode_name} !~ /discovery-tenant/) { $self->{output}->add_option_msg(short_msg => "Need to specify --subscription option."); $self->{output}->option_exit(); } @@ -150,7 +151,6 @@ sub get_access_token { my $has_cache_file = $options{statefile}->read( statefile => 'azure_api_' . - md5_hex($self->{subscription}) . '_' . md5_hex($self->{tenant}) . '_' . md5_hex($self->{client_id}) . '_' . md5_hex($self->{management_endpoint}) @@ -396,6 +396,10 @@ sub azure_list_resources_set_url { $filter{location} = "location eq '" . $options{location} . "'" if (defined($options{location}) && $options{location} ne ''); my $append = ''; + + $self->{subscription} = (defined($options{subscription_id}) ? $options{subscription_id} : $self->{subscription}); + $self->{api_version} = (defined($options{api_version}) ? $options{api_version} : $self->{api_version}); + foreach (('resource_type', 'resource_group', 'location')) { next if (!defined($filter{$_})); $filter .= $append . $filter{$_}; @@ -415,6 +419,7 @@ sub azure_list_resources { my ($self, %options) = @_; my $full_response = []; + my $full_url = $self->azure_list_resources_set_url(%options); while (1) { my $response = $self->request_api(method => 'GET', full_url => $full_url, hostname => ''); @@ -429,6 +434,26 @@ sub azure_list_resources { return $full_response; } +sub azure_list_subscriptions_set_url { + my ($self, %options) = @_; + + my $url = $self->{management_endpoint} . "/subscriptions" . "?api-version=" . $options{api_version}; + + return $url; +} + +sub azure_list_subscriptions { + my ($self, %options) = @_; + + my $full_response = []; + my $full_url = $self->azure_list_subscriptions_set_url(%options); + + my $response = $self->request_api(method => 'GET', full_url => $full_url, hostname => ''); + + return $response->{value}; + +} + sub azure_list_vms_set_url { my ($self, %options) = @_; diff --git a/centreon-plugins/cloud/azure/management/discover/plugin.pm b/centreon-plugins/cloud/azure/management/discover/plugin.pm index 970b5ce6a..615c3cb51 100644 --- a/centreon-plugins/cloud/azure/management/discover/plugin.pm +++ b/centreon-plugins/cloud/azure/management/discover/plugin.pm @@ -31,11 +31,12 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( - 'discovery' => 'cloud::azure::management::monitor::mode::discovery', + 'discovery' => 'cloud::azure::management::monitor::mode::discovery', + 'discovery-tenant' => 'cloud::azure::management::monitor::mode::discovertenant' ); $self->{custom_modes}->{azcli} = 'cloud::azure::custom::azcli'; - $self->{custom_modes}->{api} = 'cloud::azure::custom::api'; + $self->{custom_modes}->{api} = 'cloud::azure::custom::api'; return $self; } @@ -43,7 +44,7 @@ sub init { my ($self, %options) = @_; $self->{options}->add_options(arguments => { - 'api-version:s' => { name => 'api_version', default => '2018-01-01' }, + 'api-version:s' => { name => 'api_version', default => '2018-01-01' } }); $self->SUPER::init(%options); diff --git a/centreon-plugins/cloud/azure/management/monitor/mode/discoverytenant.pm b/centreon-plugins/cloud/azure/management/monitor/mode/discoverytenant.pm new file mode 100644 index 000000000..6c5262b74 --- /dev/null +++ b/centreon-plugins/cloud/azure/management/monitor/mode/discoverytenant.pm @@ -0,0 +1,138 @@ +# +# Copyright 2022 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 cloud::azure::management::monitor::mode::discoverytenant; + +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; + + $options{options}->add_options(arguments => { + "prettify" => { name => 'prettify' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); + +} + +sub run { + my ($self, %options) = @_; + + my @disco_data; + my $disco_stats; + + $disco_stats->{start_time} = time(); + + my $subscriptions = $options{custom}->azure_list_subscriptions( + api_version => '2020-01-01' + ); + + foreach my $subscription (@$subscriptions) { + my $resources = $options{custom}->azure_list_resources( + subscription_id => $subscription->{subscriptionId}, + api_version => '2021-04-01' + ); + + foreach my $resource (@{$resources}) { + my $resource_group = ''; + $resource_group = $resource->{resourceGroup} if (defined($resource->{resourceGroup})); + $resource_group = $1 if ($resource_group eq '' && defined($resource->{id}) && $resource->{id} =~ /resourceGroups\/(.*)\/providers/); + $resource->{resourceGroup} = $resource_group; + + foreach my $entry (keys %{$resource}) { + next if (ref($resource->{$entry}) ne "HASH"); + my @array; + + foreach my $key (keys %{$resource->{$entry}}) { + push @array, { key => $key, value => $resource->{$entry}->{$key} }; + } + $resource->{$entry} = \@array; + } + $resource->{subscriptionId} = $subscription->{id}; + $resource->{subscriptionName} = $subscription->{displayName}; + + foreach my $tag (keys %{$subscription}) { + next if (ref($subscription->{$tag}) ne "HASH" || $tag !~ /tags/) ; + my @array; + + foreach my $key (keys %{$subscription->{$tag}}) { + push @array, { key => $key, value => $subscription->{$tag}->{$key} }; + } + $resource->{subscriptionTags} = \@array; + } + + push @disco_data, $resource; + + } + } + + $disco_stats->{end_time} = time(); + $disco_stats->{duration} = $disco_stats->{end_time} - $disco_stats->{start_time}; + + $disco_stats->{discovered_items} = @disco_data; + $disco_stats->{results} = \@disco_data; + + my $encoded_data; + eval { + if (defined($self->{option_results}->{prettify})) { + $encoded_data = JSON::XS->new->utf8->pretty->encode($disco_stats); + } else { + $encoded_data = JSON::XS->new->utf8->encode($disco_stats); + } + }; + if ($@) { + $encoded_data = '{"code":"encode_error","message":"Cannot encode discovered data into JSON format"}'; + } + + $self->{output}->output_add(short_msg => $encoded_data); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1); + $self->{output}->exit(); + +} + +1; + +__END__ + +=head1 MODE + +Discover all resources for every subscription related to a particular tenant. + +=over 8 + +=item B<--prettify> + +Prettify JSON output. + +=back + +=cut \ No newline at end of file diff --git a/centreon-plugins/cloud/azure/management/monitor/plugin.pm b/centreon-plugins/cloud/azure/management/monitor/plugin.pm index f5f861eec..a6baf7f49 100644 --- a/centreon-plugins/cloud/azure/management/monitor/plugin.pm +++ b/centreon-plugins/cloud/azure/management/monitor/plugin.pm @@ -31,14 +31,15 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( - 'alert' => 'cloud::azure::management::monitor::mode::alert', - 'discovery' => 'cloud::azure::management::monitor::mode::discovery', - 'get-metrics' => 'cloud::azure::management::monitor::mode::getmetrics', - 'health' => 'cloud::azure::management::monitor::mode::health', + 'alert' => 'cloud::azure::management::monitor::mode::alert', + 'discovery' => 'cloud::azure::management::monitor::mode::discovery', + 'get-metrics' => 'cloud::azure::management::monitor::mode::getmetrics', + 'health' => 'cloud::azure::management::monitor::mode::health', + 'discovery-tenant' => 'cloud::azure::management::monitor::mode::discoverytenant' ); $self->{custom_modes}{azcli} = 'cloud::azure::custom::azcli'; - $self->{custom_modes}{api} = 'cloud::azure::custom::api'; + $self->{custom_modes}{api} = 'cloud::azure::custom::api'; return $self; }