From 63957685b8f6f49620bd854aaa84321c1c50fdec Mon Sep 17 00:00:00 2001 From: qgarnier Date: Fri, 16 Jul 2021 14:32:03 +0200 Subject: [PATCH] add(plugin): fortinet fortiweb snmp (#2972) --- network/fortinet/fortiweb/snmp/mode/proxy.pm | 144 +++++++++++++++ network/fortinet/fortiweb/snmp/mode/system.pm | 173 ++++++++++++++++++ network/fortinet/fortiweb/snmp/plugin.pm | 51 ++++++ 3 files changed, 368 insertions(+) create mode 100644 network/fortinet/fortiweb/snmp/mode/proxy.pm create mode 100644 network/fortinet/fortiweb/snmp/mode/system.pm create mode 100644 network/fortinet/fortiweb/snmp/plugin.pm diff --git a/network/fortinet/fortiweb/snmp/mode/proxy.pm b/network/fortinet/fortiweb/snmp/mode/proxy.pm new file mode 100644 index 000000000..ef6f0db32 --- /dev/null +++ b/network/fortinet/fortiweb/snmp/mode/proxy.pm @@ -0,0 +1,144 @@ +# +# Copyright 2021 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::fortinet::fortiweb::snmp::mode::proxy; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub system_long_output { + my ($self, %options) = @_; + + return 'checking proxy'; +} + +sub prefix_connections_output { + my ($self, %options) = @_; + + return 'number of connections '; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'proxy', type => 3, cb_long_output => 'proxy_long_output', indent_long_output => ' ', + group => [ + { name => 'connection', type => 0, cb_prefix_output => 'prefix_connections_output', display_short => 0, skipped_code => { -10 => 1 } }, + { name => 'service', type => 0, display_short => 0, skipped_code => { -10 => 1 } } + ] + } + ]; + + $self->{maps_counters}->{connection} = [ + { label => 'connections', nlabel => 'proxy.connections.count', set => { + key_values => [ { name => 'con_current' } ], + output_template => 'current: %s', + perfdatas => [ + { template => '%s', min => 0 } + ] + } + }, + { label => 'connections-average', nlabel => 'proxy.connections.persecond', set => { + key_values => [ { name => 'con_psec' } ], + output_template => 'average: %s/s', + perfdatas => [ + { template => '%s', unit => '/s', min => 0 } + ] + } + }, + ]; + + $self->{maps_counters}->{service} = [ + { label => 'services', nlabel => 'proxy.services.count', set => { + key_values => [ { name => 'services_num' } ], + output_template => 'number of services: %s', + perfdatas => [ + { template => '%s', min => 0 } + ] + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $mapping = { + services_num => { oid => '.1.3.6.1.4.1.12356.107.3.5' }, # fwServiceNumber + con_current => { oid => '.1.3.6.1.4.1.12356.107.3.7' }, # fwTotalConnectNumber + con_psec => { oid => '.1.3.6.1.4.1.12356.107.3.8' } # fwTotalConnectNumberPerSecond + }; + + my $snmp_result = $options{snmp}->get_leef( + oids => [ map($_->{oid} . '.0', values(%$mapping)) ], + nothing_quit => 1 + ); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => 0); + + $self->{output}->output_add(short_msg => 'proxy usage is ok'); + + $self->{proxy} = { + global => { + connection => { + con_current => $result->{con_current}, + con_psec => $result->{con_psec} + }, + service => { services_num => $result->{services_num} } + } + }; +} + +1; + +__END__ + +=head1 MODE + +Check proxy. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='connections' + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'connections', 'connections-average', 'services'. + +=back + +=cut diff --git a/network/fortinet/fortiweb/snmp/mode/system.pm b/network/fortinet/fortiweb/snmp/mode/system.pm new file mode 100644 index 000000000..b9df32329 --- /dev/null +++ b/network/fortinet/fortiweb/snmp/mode/system.pm @@ -0,0 +1,173 @@ +# +# Copyright 2021 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::fortinet::fortiweb::snmp::mode::system; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold_ng); + +sub custom_ha_status_output { + my ($self, %options) = @_; + + return sprintf('high-availability mode: %s', $self->{result_values}->{ha_mode}); +} + +sub system_long_output { + my ($self, %options) = @_; + + return 'checking system'; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'system', type => 3, cb_long_output => 'system_long_output', indent_long_output => ' ', + group => [ + { name => 'ha', type => 0, display_short => 0, skipped_code => { -10 => 1 } }, + { name => 'cpu', type => 0, display_short => 0, skipped_code => { -10 => 1 } }, + { name => 'memory', type => 0, display_short => 0, skipped_code => { -10 => 1 } }, + { name => 'disk', type => 0, display_short => 0, skipped_code => { -10 => 1 } } + ] + } + ]; + + $self->{maps_counters}->{ha} = [ + { label => 'ha-status', type => 2, set => { + key_values => [ { name => 'ha_mode' }, ], + closure_custom_output => $self->can('custom_ha_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold_ng + } + } + ]; + + $self->{maps_counters}->{cpu} = [ + { label => 'cpu-load', nlabel => 'cpu.utilization.percentage', set => { + key_values => [ { name => 'cpu_load' } ], + output_template => 'cpu load: %.2f %%', + perfdatas => [ + { template => '%.2f', min => 0, max => 100, unit => '%' } + ] + } + } + ]; + + $self->{maps_counters}->{memory} = [ + { label => 'memory-usage', nlabel => 'memory.usage.percentage', set => { + key_values => [ { name => 'memory_used' } ], + output_template => 'memory used: %.2f %%', + perfdatas => [ + { template => '%.2f', min => 0, max => 100, unit => '%' } + ] + } + } + ]; + + $self->{maps_counters}->{disk} = [ + { label => 'disk-usage', nlabel => 'disk.log.space.usage.percentage', set => { + key_values => [ { name => 'disk_used' } ], + output_template => 'disk log space used: %.2f %%', + perfdatas => [ + { template => '%.2f', min => 0, max => 100, unit => '%' } + ] + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +sub manage_selection { + my ($self, %options) = @_; + + my $mapping_ha_mode = { + 1 => 'standalone', 2 => 'master', 3 => 'slave' + }; + my $mapping = { + ha_mode => { oid => '.1.3.6.1.4.1.12356.107.2.1.3', map => $mapping_ha_mode }, # fwSysHaMode + cpu_load => { oid => '.1.3.6.1.4.1.12356.107.2.1.5' }, # fwSysCpuUsage + memory_used => { oid => '.1.3.6.1.4.1.12356.107.2.1.7' }, # fwSysMemUsage + disk_used => { oid => '.1.3.6.1.4.1.12356.107.2.1.9' } # fwSysDiskUsage + }; + + my $snmp_result = $options{snmp}->get_leef( + oids => [ map($_->{oid} . '.0', values(%$mapping)) ], + nothing_quit => 1 + ); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => 0); + + $self->{output}->output_add(short_msg => 'system usage is ok'); + + $self->{system} = { + global => { + ha => { ha_mode => $result->{ha_mode} }, + cpu => { cpu_load => $result->{cpu_load} }, + memory => { memory_used => $result->{memory_used} }, + disk => { disk_used => $result->{disk_used} } + } + }; +} + +1; + +__END__ + +=head1 MODE + +Check system usage. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='memory-usage' + +=item B<--warning-ha-status> + +Set warning threshold for status. +Can used special variables like: %{ha_mode} + +=item B<--critical-ha-status> + +Set critical threshold for status. +Can used special variables like: %{ha_mode} + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'disk-usage' (%), 'memory-usage' (%), 'cpu-load' (%). + +=back + +=cut diff --git a/network/fortinet/fortiweb/snmp/plugin.pm b/network/fortinet/fortiweb/snmp/plugin.pm new file mode 100644 index 000000000..c956b0354 --- /dev/null +++ b/network/fortinet/fortiweb/snmp/plugin.pm @@ -0,0 +1,51 @@ +# +# Copyright 2021 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::fortinet::fortiweb::snmp::plugin; + +use strict; +use warnings; +use base qw(centreon::plugins::script_snmp); + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $self->{modes} = { + 'interfaces' => 'snmp_standard::mode::interfaces', + 'list-interfaces' => 'snmp_standard::mode::listinterfaces', + 'proxy' => 'network::fortinet::fortiweb::snmp::mode::proxy', + 'system' => 'network::fortinet::fortiweb::snmp::mode::system' + }; + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Fortinet FortiWeb in SNMP. + +=cut