From 9124c6d8848427ca5f09b948dbea06c151ff8a89 Mon Sep 17 00:00:00 2001 From: qgarnier Date: Tue, 12 Jan 2021 11:49:34 +0100 Subject: [PATCH] enhance meraki (#2500) --- .../cloudcontroller/restapi/mode/devices.pm | 22 ++- .../cloudcontroller/restapi/mode/listtags.pm | 156 ++++++++++++++++++ .../meraki/cloudcontroller/restapi/plugin.pm | 3 +- 3 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 network/cisco/meraki/cloudcontroller/restapi/mode/listtags.pm diff --git a/network/cisco/meraki/cloudcontroller/restapi/mode/devices.pm b/network/cisco/meraki/cloudcontroller/restapi/mode/devices.pm index c5ce72ecb..1108b3b61 100644 --- a/network/cisco/meraki/cloudcontroller/restapi/mode/devices.pm +++ b/network/cisco/meraki/cloudcontroller/restapi/mode/devices.pm @@ -113,6 +113,14 @@ sub set_counters { ] } }, + { label => 'total-online-prct', nlabel => 'devices.total.online.percentage', display_ok => 0, set => { + key_values => [ { name => 'online_prct' } ], + output_template => 'online: %.2f%%', + perfdatas => [ + { template => '%.2f', unit => '%', min => 0, max => 100 } + ] + } + }, { label => 'total-offline', nlabel => 'devices.total.offline.count', display_ok => 0, set => { key_values => [ { name => 'offline' }, { name => 'total' } ], output_template => 'offline: %s', @@ -121,6 +129,14 @@ sub set_counters { ] } }, + { label => 'total-offline-prct', nlabel => 'devices.total.offline.percentage', display_ok => 0, set => { + key_values => [ { name => 'offline_prct' } ], + output_template => 'offline: %.2f%%', + perfdatas => [ + { template => '%.2f', unit => '%', min => 0, max => 100 } + ] + } + }, { label => 'total-alerting', nlabel => 'devices.total.alerting.count', display_ok => 0, set => { key_values => [ { name => 'alerting' }, { name => 'total' } ], output_template => 'alerting: %s', @@ -404,6 +420,7 @@ sub add_switch_port_statuses { timespan => $options{timespan}, serial => $options{serial} ); + foreach (@$ports) { $self->{devices}->{ $options{serial} }->{device_ports}->{ $_->{portId} } = { display => $_->{portId}, @@ -543,6 +560,9 @@ sub manage_selection { if (scalar(keys %{$self->{devices}}) <= 0) { $self->{output}->output_add(short_msg => 'no devices found'); } + + $self->{global}->{online_prct} = $self->{global}->{online} * 100 / $self->{global}->{total}; + $self->{global}->{offline_prct} = $self->{global}->{offline} * 100 / $self->{global}->{total}; } 1; @@ -631,7 +651,7 @@ Can used special variables like: %{port_status}, %{port_enabled}, %{display} =item B<--warning-*> B<--critical-*> Thresholds. -Can be: 'total-online', 'total-offline', 'total-alerting', +Can be: 'total-online', 'total-online-prct', 'total-offline', 'total-offline-prct', 'total-alerting', 'traffic-in', 'traffic-out', 'connections-success', 'connections-auth', 'connections-assoc', 'connections-dhcp', 'connections-dns', 'load', 'link-latency' (ms), ''link-loss' (%), diff --git a/network/cisco/meraki/cloudcontroller/restapi/mode/listtags.pm b/network/cisco/meraki/cloudcontroller/restapi/mode/listtags.pm new file mode 100644 index 000000000..991833c99 --- /dev/null +++ b/network/cisco/meraki/cloudcontroller/restapi/mode/listtags.pm @@ -0,0 +1,156 @@ +# +# 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::cisco::meraki::cloudcontroller::restapi::mode::listtags; + +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 => { + 'filter-network-id:s' => { name => 'filter_network_id' }, + 'filter-organization-name:s' => { name => 'filter_organization_name' }, + 'filter-organization-id:s' => { name => 'filter_organization_id' }, + 'filter-tags:s' => { name => 'filter_tags' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $organizations = $options{custom}->get_organizations(disable_cache => 1); + my $networks = $options{custom}->get_networks( + organizations => [keys %$organizations], + disable_cache => 1 + ); + my $devices = $options{custom}->get_devices( + organizations => [keys %$organizations], + disable_cache => 1 + ); + + my $results = {}; + foreach (keys %$devices) { + next if (!defined($devices->{$_}->{tags})); + next if (defined($self->{option_results}->{filter_network_id}) && $self->{option_results}->{filter_network_id} ne '' && + $devices->{$_}->{networkId} !~ /$self->{option_results}->{filter_network_id}/); + next if (defined($self->{option_results}->{filter_organization_id}) && $self->{option_results}->{filter_organization_id} ne '' && + $networks->{ $devices->{$_}->{networkId} }->{organizationId} !~ /$self->{option_results}->{filter_organization_id}/); + + my $organization_name = $organizations->{ $networks->{ $devices->{$_}->{networkId} }->{organizationId} }->{name}; + next if (defined($self->{option_results}->{filter_organization_name}) && $self->{option_results}->{filter_organization_name} ne '' && + $organization_name !~ /$self->{option_results}->{filter_organization_name}/); + + while ($devices->{$_}->{tags} =~ /(\S+)/g) { + my $tag = $1; + if (!defined($results->{$tag})) { + $results->{$tag} = { + network_names => {}, + organization_names => {} + }; + } + $results->{$tag}->{network_names}->{ $networks->{ $devices->{$_}->{networkId} }->{name} } = 1; + $results->{$tag}->{organization_names}->{$organization_name} = 1; + } + } + + return $results; +} + +sub run { + my ($self, %options) = @_; + + my $tags = $self->manage_selection(%options); + foreach (keys %$tags) { + $self->{output}->output_add(long_msg => sprintf( + '[name: %s][organization_names: %s][network_names: %s]', + $_, + join(',', keys %{$tags->{$_}->{organization_names}}), + join(',', keys %{$tags->{$_}->{network_names}}) + ) + ); + } + + $self->{output}->output_add( + severity => 'OK', + short_msg => 'List tags:' + ); + $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); + $self->{output}->exit(); +} + +sub disco_format { + my ($self, %options) = @_; + + $self->{output}->add_disco_format(elements => [ + 'name', 'organization_names', 'network_names' + ]); +} + +sub disco_show { + my ($self, %options) = @_; + + my $tags = $self->manage_selection(%options); + foreach (keys %$tags) { + $self->{output}->add_disco_entry( + name => $_, + network_names => join(',', keys %{$tags->{$_}->{network_names}}), + organization_names => join(',', keys %{$tags->{$_}->{network_names}}) + ); + } +} + +1; + +__END__ + +=head1 MODE + +List tags. + +=over 8 + +=item B<--filter-network-id> + +Filter tags by network id (Can be a regexp). + +=item B<--filter-organization-id> + +Filter tags by organization id (Can be a regexp). + +=item B<--filter-organization-name> + +Filter tags by organization name (Can be a regexp). + +=back + +=cut diff --git a/network/cisco/meraki/cloudcontroller/restapi/plugin.pm b/network/cisco/meraki/cloudcontroller/restapi/plugin.pm index 14f3bc530..33edd6e06 100644 --- a/network/cisco/meraki/cloudcontroller/restapi/plugin.pm +++ b/network/cisco/meraki/cloudcontroller/restapi/plugin.pm @@ -35,10 +35,11 @@ sub new { 'devices' => 'network::cisco::meraki::cloudcontroller::restapi::mode::devices', 'discovery' => 'network::cisco::meraki::cloudcontroller::restapi::mode::discovery', 'list-devices' => 'network::cisco::meraki::cloudcontroller::restapi::mode::listdevices', + 'list-tags' => 'network::cisco::meraki::cloudcontroller::restapi::mode::listtags', 'networks' => 'network::cisco::meraki::cloudcontroller::restapi::mode::networks' ); - $self->{custom_modes}{api} = 'network::cisco::meraki::cloudcontroller::restapi::custom::api'; + $self->{custom_modes}->{api} = 'network::cisco::meraki::cloudcontroller::restapi::custom::api'; return $self; }