diff --git a/network/f5/bigip/mode/components/fan.pm b/network/f5/bigip/snmp/mode/components/fan.pm similarity index 100% rename from network/f5/bigip/mode/components/fan.pm rename to network/f5/bigip/snmp/mode/components/fan.pm diff --git a/network/f5/bigip/mode/components/psu.pm b/network/f5/bigip/snmp/mode/components/psu.pm similarity index 100% rename from network/f5/bigip/mode/components/psu.pm rename to network/f5/bigip/snmp/mode/components/psu.pm diff --git a/network/f5/bigip/mode/components/temperature.pm b/network/f5/bigip/snmp/mode/components/temperature.pm similarity index 100% rename from network/f5/bigip/mode/components/temperature.pm rename to network/f5/bigip/snmp/mode/components/temperature.pm diff --git a/network/f5/bigip/mode/connections.pm b/network/f5/bigip/snmp/mode/connections.pm similarity index 99% rename from network/f5/bigip/mode/connections.pm rename to network/f5/bigip/snmp/mode/connections.pm index 6010a4b41..95bef7211 100644 --- a/network/f5/bigip/mode/connections.pm +++ b/network/f5/bigip/snmp/mode/connections.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::connections; +package network::f5::bigip::snmp::mode::connections; use base qw(centreon::plugins::templates::counter); diff --git a/network/f5/bigip/mode/failover.pm b/network/f5/bigip/snmp/mode/failover.pm similarity index 99% rename from network/f5/bigip/mode/failover.pm rename to network/f5/bigip/snmp/mode/failover.pm index 26327e892..82fefe609 100644 --- a/network/f5/bigip/mode/failover.pm +++ b/network/f5/bigip/snmp/mode/failover.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::failover; +package network::f5::bigip::snmp::mode::failover; use base qw(centreon::plugins::mode); diff --git a/network/f5/bigip/mode/hardware.pm b/network/f5/bigip/snmp/mode/hardware.pm similarity index 95% rename from network/f5/bigip/mode/hardware.pm rename to network/f5/bigip/snmp/mode/hardware.pm index c51f37685..0ca255cd5 100644 --- a/network/f5/bigip/mode/hardware.pm +++ b/network/f5/bigip/snmp/mode/hardware.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::hardware; +package network::f5::bigip::snmp::mode::hardware; use base qw(centreon::plugins::templates::hardware); @@ -46,7 +46,7 @@ sub set_system { ], }; - $self->{components_path} = 'network::f5::bigip::mode::components'; + $self->{components_path} = 'network::f5::bigip::snmp::mode::components'; $self->{components_module} = ['fan', 'psu', 'temperature']; } diff --git a/network/f5/bigip/mode/listnodes.pm b/network/f5/bigip/snmp/mode/listnodes.pm similarity index 98% rename from network/f5/bigip/mode/listnodes.pm rename to network/f5/bigip/snmp/mode/listnodes.pm index 32ed77ba2..a06d6c607 100644 --- a/network/f5/bigip/mode/listnodes.pm +++ b/network/f5/bigip/snmp/mode/listnodes.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::listnodes; +package network::f5::bigip::snmp::mode::listnodes; use base qw(centreon::plugins::mode); diff --git a/network/f5/bigip/mode/listpools.pm b/network/f5/bigip/snmp/mode/listpools.pm similarity index 98% rename from network/f5/bigip/mode/listpools.pm rename to network/f5/bigip/snmp/mode/listpools.pm index d4ad36a37..b0117b22d 100644 --- a/network/f5/bigip/mode/listpools.pm +++ b/network/f5/bigip/snmp/mode/listpools.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::listpools; +package network::f5::bigip::snmp::mode::listpools; use base qw(centreon::plugins::mode); diff --git a/network/f5/bigip/mode/listvirtualservers.pm b/network/f5/bigip/snmp/mode/listvirtualservers.pm similarity index 98% rename from network/f5/bigip/mode/listvirtualservers.pm rename to network/f5/bigip/snmp/mode/listvirtualservers.pm index 7d753d50a..6e781e32e 100644 --- a/network/f5/bigip/mode/listvirtualservers.pm +++ b/network/f5/bigip/snmp/mode/listvirtualservers.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::listvirtualservers; +package network::f5::bigip::snmp::mode::listvirtualservers; use base qw(centreon::plugins::mode); diff --git a/network/f5/bigip/mode/nodestatus.pm b/network/f5/bigip/snmp/mode/nodestatus.pm similarity index 99% rename from network/f5/bigip/mode/nodestatus.pm rename to network/f5/bigip/snmp/mode/nodestatus.pm index c68df6fd9..145891fb3 100644 --- a/network/f5/bigip/mode/nodestatus.pm +++ b/network/f5/bigip/snmp/mode/nodestatus.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::nodestatus; +package network::f5::bigip::snmp::mode::nodestatus; use base qw(centreon::plugins::templates::counter); diff --git a/network/f5/bigip/mode/poolstatus.pm b/network/f5/bigip/snmp/mode/poolstatus.pm similarity index 99% rename from network/f5/bigip/mode/poolstatus.pm rename to network/f5/bigip/snmp/mode/poolstatus.pm index 4d69e0350..00cced8e7 100644 --- a/network/f5/bigip/mode/poolstatus.pm +++ b/network/f5/bigip/snmp/mode/poolstatus.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::poolstatus; +package network::f5::bigip::snmp::mode::poolstatus; use base qw(centreon::plugins::templates::counter); diff --git a/network/f5/bigip/snmp/mode/tmmusage.pm b/network/f5/bigip/snmp/mode/tmmusage.pm new file mode 100644 index 000000000..a41e918e5 --- /dev/null +++ b/network/f5/bigip/snmp/mode/tmmusage.pm @@ -0,0 +1,237 @@ +# +# Copyright 2017 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::f5::bigip::snmp::mode::tmmusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub custom_usage_perfdata { + my ($self, %options) = @_; + + my $extra_label = ''; + if (!defined($options{extra_instance}) || $options{extra_instance} != 0) { + $extra_label .= '_' . $self->{result_values}->{display}; + } + $self->{output}->perfdata_add(label => 'memory_used' . $extra_label, unit => 'B', + value => $self->{result_values}->{used}, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-' . $self->{label}, total => $self->{result_values}->{total}, cast_int => 1), + min => 0, max => $self->{result_values}->{total}); +} + +sub custom_usage_threshold { + my ($self, %options) = @_; + + my $exit = $self->{perfdata}->threshold_check(value => $self->{result_values}->{prct_used}, threshold => [ { label => 'critical-' . $self->{label}, exit_litteral => 'critical' }, { label => 'warning-' . $self->{label}, exit_litteral => 'warning' } ]); + return $exit; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free}); + + my $msg = sprintf("Memory Total: %s Used: %s (%.2f%%) Free: %s (%.2f%%)", + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free}); + return $msg; +} + +sub custom_usage_calc { + my ($self, %options) = @_; + + return - 10 if ($options{new_datas}->{$self->{instance} . '_sysTmmStatMemoryTotal'} == 0); + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + $self->{result_values}->{total} = $options{new_datas}->{$self->{instance} . '_sysTmmStatMemoryTotal'}; + $self->{result_values}->{used} = $options{new_datas}->{$self->{instance} . '_sysTmmStatMemoryUsed'}; + $self->{result_values}->{free} = $self->{result_values}->{total} - $self->{result_values}->{used}; + $self->{result_values}->{prct_free} = $self->{result_values}->{free} * 100 / $self->{result_values}->{total}; + $self->{result_values}->{prct_used} = $self->{result_values}->{used} * 100 / $self->{result_values}->{total}; + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'tmm', type => 1, cb_prefix_output => 'prefix_tmm_output', message_multiple => 'All TMM are ok', skipped_code => { -10 => 1 } }, + ]; + + $self->{maps_counters}->{tmm} = [ + { label => 'memory-usage', set => { + key_values => [ { name => 'display' }, { name => 'sysTmmStatMemoryTotal' }, { name => 'sysTmmStatMemoryUsed' } ], + closure_custom_calc => $self->can('custom_usage_calc'), + closure_custom_output => $self->can('custom_usage_output'), + closure_custom_perfdata => $self->can('custom_usage_perfdata'), + closure_custom_threshold_check => $self->can('custom_usage_threshold'), + } + }, + { label => 'current-client-connections', set => { + key_values => [ { name => 'sysTmmStatClientCurConns' }, { name => 'display' } ], + output_template => 'Current Client Connections : %s', output_error_template => "Current Client Connections : %s", + perfdatas => [ + { label => 'current_client_connections', value => 'sysTmmStatClientCurConns_absolute', template => '%s', + min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'total-client-connections', set => { + key_values => [ { name => 'sysTmmStatClientTotConns', diff => 1 }, { name => 'display' } ], + output_template => 'Total Client Connections : %s', output_error_template => "Total Client Connections : %s", + perfdatas => [ + { label => 'total_client_connections', value => 'sysTmmStatClientTotConns_absolute', template => '%s', + min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'current-server-connections', set => { + key_values => [ { name => 'sysTmmStatServerCurConns' }, { name => 'display' } ], + output_template => 'Current Server Connections : %s', output_error_template => "Current Server Connections : %s", + perfdatas => [ + { label => 'current_server_connections', value => 'sysTmmStatServerCurConns_absolute', template => '%s', + min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'total-server-connections', set => { + key_values => [ { name => 'sysTmmStatServerTotConns', diff => 1 }, { name => 'display' } ], + output_template => 'Total Server Connections : %s', output_error_template => "Total Server Connections : %s", + perfdatas => [ + { label => 'total_server_connections', value => 'sysTmmStatServerTotConns_absolute', template => '%s', + min => 0, label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_tmm_output { + my ($self, %options) = @_; + + return "TMM '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, statefile => 1); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => + { + "filter-name:s" => { name => 'filter_name' }, + }); + + return $self; +} + +my $mapping = { + sysTmmStatTmmId => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.1' }, + sysTmmStatClientTotConns => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.11' }, + sysTmmStatClientCurConns => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.12' }, + sysTmmStatServerTotConns => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.18' }, + sysTmmStatServerCurConns => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.19' }, + sysTmmStatMemoryTotal => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.31' }, # KB + sysTmmStatMemoryUsed => { oid => '.1.3.6.1.4.1.3375.2.1.8.2.3.1.32' }, # KB +}; +my $oid_sysTmmStatEntry = '.1.3.6.1.4.1.3375.2.1.8.2.3.1'; + +sub manage_selection { + my ($self, %options) = @_; + + if ($options{snmp}->is_snmpv1()) { + $self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3."); + $self->{output}->option_exit(); + } + + my $results = $options{snmp}->get_table(oid => $oid_sysTmmStatEntry, + nothing_quit => 1); + + $self->{tmm} = {}; + foreach my $oid (keys %$results) { + next if ($oid !~ /^$mapping->{sysTmmStatTmmId}->{oid}\.(.*)$/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $results, instance => $instance); + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $result->{sysTmmStatTmmId} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $result->{Name} . "': no matching filter name.", debug => 1); + next; + } + + $result->{sysTmmStatMemoryTotal} *= 1024; + $result->{sysTmmStatMemoryUsed} *= 1024; + $self->{tmm}->{$result->{sysTmmStatTmmId}} = { + display => $result->{sysTmmStatTmmId}, + %$result + }; + } + + if (scalar(keys %{$self->{tmm}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No TMM found."); + $self->{output}->option_exit(); + } + + $self->{cache_name} = "f5_bipgip_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_name}) ? md5_hex($self->{option_results}->{filter_name}) : md5_hex('all')) . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check TMM usages. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example : --filter-counters='^memory-usage$' + +=item B<--filter-name> + +Filter by TMM name (regexp can be used). + +=item B<--warning-*> + +Threshold warning. +Can be: 'memory-usage' (%), 'total-client-connections', 'current-client-connections', +'total-server-connections', 'current-server-connections'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'memory-usage' (%), 'total-client-connections', 'current-client-connections', +'total-server-connections', 'current-server-connections'. + +=back + +=cut diff --git a/network/f5/bigip/mode/virtualserverstatus.pm b/network/f5/bigip/snmp/mode/virtualserverstatus.pm similarity index 99% rename from network/f5/bigip/mode/virtualserverstatus.pm rename to network/f5/bigip/snmp/mode/virtualserverstatus.pm index 4dbaa1212..a73f19a9a 100644 --- a/network/f5/bigip/mode/virtualserverstatus.pm +++ b/network/f5/bigip/snmp/mode/virtualserverstatus.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::mode::virtualserverstatus; +package network::f5::bigip::snmp::mode::virtualserverstatus; use base qw(centreon::plugins::templates::counter); diff --git a/network/f5/bigip/plugin.pm b/network/f5/bigip/snmp/plugin.pm similarity index 80% rename from network/f5/bigip/plugin.pm rename to network/f5/bigip/snmp/plugin.pm index 6993c3e7d..73cd5dcf3 100644 --- a/network/f5/bigip/plugin.pm +++ b/network/f5/bigip/snmp/plugin.pm @@ -18,7 +18,7 @@ # limitations under the License. # -package network::f5::bigip::plugin; +package network::f5::bigip::snmp::plugin; use strict; use warnings; @@ -31,15 +31,16 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( - 'connections' => 'network::f5::bigip::mode::connections', - 'failover' => 'network::f5::bigip::mode::failover', - 'hardware' => 'network::f5::bigip::mode::hardware', - 'list-nodes' => 'network::f5::bigip::mode::listnodes', - 'list-pools' => 'network::f5::bigip::mode::listpools', - 'list-virtualservers' => 'network::f5::bigip::mode::listvirtualservers', - 'node-status' => 'network::f5::bigip::mode::nodestatus', - 'pool-status' => 'network::f5::bigip::mode::poolstatus', - 'virtualserver-status' => 'network::f5::bigip::mode::virtualserverstatus', + 'connections' => 'network::f5::bigip::snmp::mode::connections', + 'failover' => 'network::f5::bigip::snmp::mode::failover', + 'hardware' => 'network::f5::bigip::snmp::mode::hardware', + 'list-nodes' => 'network::f5::bigip::snmp::mode::listnodes', + 'list-pools' => 'network::f5::bigip::snmp::mode::listpools', + 'list-virtualservers' => 'network::f5::bigip::snmp::mode::listvirtualservers', + 'node-status' => 'network::f5::bigip::snmp::mode::nodestatus', + 'pool-status' => 'network::f5::bigip::snmp::mode::poolstatus', + 'tmm-usage' => 'network::f5::bigip::snmp::mode::tmmusage', + 'virtualserver-status' => 'network::f5::bigip::snmp::mode::virtualserverstatus', ); return $self;