From 3a18ea8436e3daa535912e1493dc67688bd1aa01 Mon Sep 17 00:00:00 2001 From: garnier-quentin Date: Thu, 21 Feb 2019 13:17:44 +0100 Subject: [PATCH] add informix snmp plugin --- .../informix/snmp/mode/archivelevel0.pm | 165 ++++++++++++++++ .../informix/snmp/mode/chunkstatus.pm | 176 ++++++++++++++++++ .../informix/snmp/mode/dbspaceusage.pm | 138 ++++++++++++++ .../informix/snmp/mode/globalcache.pm | 158 ++++++++++++++++ .../informix/snmp/mode/listdbspaces.pm | 134 +++++++++++++ .../informix/snmp/mode/listinstances.pm | 114 ++++++++++++ .../database/informix/snmp/mode/lockstats.pm | 156 ++++++++++++++++ .../informix/snmp/mode/logfileusage.pm | 144 ++++++++++++++ .../database/informix/snmp/mode/sessions.pm | 119 ++++++++++++ .../database/informix/snmp/plugin.pm | 56 ++++++ 10 files changed, 1360 insertions(+) create mode 100644 centreon-plugins/database/informix/snmp/mode/archivelevel0.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/chunkstatus.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/dbspaceusage.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/globalcache.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/listdbspaces.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/listinstances.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/lockstats.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/logfileusage.pm create mode 100644 centreon-plugins/database/informix/snmp/mode/sessions.pm create mode 100644 centreon-plugins/database/informix/snmp/plugin.pm diff --git a/centreon-plugins/database/informix/snmp/mode/archivelevel0.pm b/centreon-plugins/database/informix/snmp/mode/archivelevel0.pm new file mode 100644 index 000000000..520491a58 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/archivelevel0.pm @@ -0,0 +1,165 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::archivelevel0; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::misc; +use DateTime; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'dbspace', type => 1, cb_prefix_output => 'prefix_dbspace_output', message_multiple => 'All dbspace backups are ok' } + ]; + + $self->{maps_counters}->{dbspace} = [ + { label => 'time', set => { + key_values => [ { name => 'seconds' }, { name => 'date'}, { name => 'display' } ], + output_template => "archive level0 last execution date '%s'", + output_use => 'date_absolute', + perfdatas => [ + { label => 'seconds', value => 'seconds_absolute', template => '%s', min => 0, unit => 's', + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_dbspace_output { + my ($self, %options) = @_; + + return "Dbspace '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-name:s" => { name => 'filter_name' }, + "unknown-status:s" => { name => 'unknown_status' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /inconsistent/' }, + "timezone:s" => { name => 'timezone' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => ['unknown_status', 'warning_status', 'critical_status']); + $self->{option_results}->{timezone} = 'GMT' if (!defined($self->{option_results}->{timezone}) || $self->{option_results}->{timezone} eq ''); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $oid_onDbspaceName = '.1.3.6.1.4.1.893.1.1.1.6.1.2'; + my $oid_onDbspaceLastFullBackupDate = '.1.3.6.1.4.1.893.1.1.1.6.1.15'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $oid_onDbspaceName }, + { oid => $oid_onDbspaceLastFullBackupDate }, + ], return_type => 1, nothing_quit => 1 + ); + + my $tz = centreon::plugins::misc::set_timezone(name => $self->{option_results}->{timezone}); + $self->{dbspace} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$oid_onDbspaceName\.(.*?)\.(.*)/); + my ($applIndex, $dbSpaceIndex) = ($1, $2); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName . '.' . $applIndex} + if (defined($snmp_result->{$oid_applName . '.' . $applIndex})); + $name .= '.' . $snmp_result->{$oid_onDbspaceName . '.' . $applIndex. '.' . $dbSpaceIndex}; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + my ($seconds, $date) = (-1, 'never'); + if (defined($snmp_result->{$oid_onDbspaceLastFullBackupDate . '.' . $applIndex. '.' . $dbSpaceIndex})) { + my @dates = unpack('n C6 a C2', $snmp_result->{$oid_onDbspaceLastFullBackupDate . '.' . $applIndex. '.' . $dbSpaceIndex}); + if ($dates[0] != 0) { + my $dt = DateTime->new(year => $dates[0], month => $dates[1], day => $dates[2], hour => $dates[3], minute => $dates[4], second => $dates[5], %$tz); + $seconds = time() - $dt->epoch; + $date = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $dates[0], $dates[1], $dates[2], $dates[3], $dates[4], $dates[5]); + } + } + $self->{dbspace}->{$name} = { + display => $name, + seconds => $seconds, + date => $date, + }; + } + + if (scalar(keys %{$self->{dbspace}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No dbspace found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check last full backup. + +=over 8 + +=item B<--filter-name> + +Filter dbspace name (can be a regexp). + +=item B<--unknown-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: %{status}, %{display} + +=item B<--warning-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: %{status}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /inconsistent/'). +Can used special variables like: %{status}, %{display} + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/chunkstatus.pm b/centreon-plugins/database/informix/snmp/mode/chunkstatus.pm new file mode 100644 index 000000000..aed7392d4 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/chunkstatus.pm @@ -0,0 +1,176 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::chunkstatus; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub custom_status_output { + my ($self, %options) = @_; + + my $msg = sprintf("status is '%s'", $self->{result_values}->{status}); + return $msg; +} + +sub custom_status_calc { + my ($self, %options) = @_; + + $self->{result_values}->{status} = $options{new_datas}->{$self->{instance} . '_status'}; + $self->{result_values}->{display} = $options{new_datas}->{$self->{instance} . '_display'}; + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'chunk', type => 1, cb_prefix_output => 'prefix_chunk_output', message_multiple => 'All chunks are ok' } + ]; + + $self->{maps_counters}->{chunk} = [ + { label => 'status', set => { + key_values => [ { name => 'status' }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_status_calc'), + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold, + } + }, + ]; +} + +sub prefix_chunk_output { + my ($self, %options) = @_; + + return "Chunk '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-name:s" => { name => 'filter_name' }, + "unknown-status:s" => { name => 'unknown_status' }, + "warning-status:s" => { name => 'warning_status' }, + "critical-status:s" => { name => 'critical_status', default => '%{status} =~ /inconsistent/' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => ['unknown_status', 'warning_status', 'critical_status']); +} + +my %mapping_status = ( + 1 => 'offline', 2 => 'online', 3 => 'recovering', 4 => 'inconsistent', 5 => 'dropped', +); + +my $mapping = { + onChunkFileName => { oid => '.1.3.6.1.4.1.893.1.1.1.7.1.2' }, + onChunkStatus => { oid => '.1.3.6.1.4.1.893.1.1.1.7.1.7', map => \%mapping_status }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $oid_onDbspaceName = '.1.3.6.1.4.1.893.1.1.1.6.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $oid_onDbspaceName }, + { oid => $mapping->{onChunkFileName}->{oid} }, + { oid => $mapping->{onChunkStatus}->{oid} }, + ], return_type => 1, nothing_quit => 1 + ); + + $self->{chunk} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{onChunkFileName}->{oid}\.(.*?)\.(.*?)\.(.*)/); + my ($applIndex, $dbSpaceIndex, $chunkIndex) = ($1, $2, $3); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $applIndex . '.' . $dbSpaceIndex . '.' . $chunkIndex); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName . '.' . $applIndex} + if (defined($snmp_result->{$oid_applName . '.' . $applIndex})); + $name .= '.' . $snmp_result->{$oid_onDbspaceName . '.' . $applIndex. '.' . $dbSpaceIndex}; + $name .= '.' . $result->{onChunkFileName}; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{chunk}->{$name} = { + display => $name, + status => $result->{onChunkStatus}, + }; + } + + if (scalar(keys %{$self->{chunk}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No chunk found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check chunck status. + +=over 8 + +=item B<--filter-name> + +Filter chunk name (can be a regexp). + +=item B<--unknown-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: %{status}, %{display} + +=item B<--warning-status> + +Set warning threshold for status (Default: ''). +Can used special variables like: %{status}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{status} =~ /inconsistent/'). +Can used special variables like: %{status}, %{display} + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/dbspaceusage.pm b/centreon-plugins/database/informix/snmp/mode/dbspaceusage.pm new file mode 100644 index 000000000..2e5a7774f --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/dbspaceusage.pm @@ -0,0 +1,138 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::dbspaceusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 1, cb_prefix_output => 'prefix_dbspace_output', message_multiple => 'All dbspaces usage are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'usage', set => { + key_values => [ { name => 'prct_used' }, { name => 'display' } ], + output_template => 'Used: %.2f%%', + perfdatas => [ + { label => 'used', value => 'prct_used_absolute', template => '%.2f', min => 0, max => 100, unit => '%', + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_dbspace_output { + my ($self, %options) = @_; + + return "Dbspace '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-name:s" => { name => 'filter_name' }, + }); + + return $self; +} + +my $mapping = { + onDbspaceName => { oid => '.1.3.6.1.4.1.893.1.1.1.6.1.2' }, + onDbspacePagesAllocated => { oid => '.1.3.6.1.4.1.893.1.1.1.6.1.11' }, + onDbspacePagesUsed => { oid => '.1.3.6.1.4.1.893.1.1.1.6.1.12' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $mapping->{onDbspaceName}->{oid} }, + { oid => $mapping->{onDbspacePagesAllocated}->{oid} }, + { oid => $mapping->{onDbspacePagesUsed}->{oid} }, + ], return_type => 1, nothing_quit => 1 + ); + + $self->{global} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{onDbspaceName}->{oid}\.(.*)/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName}->{$oid_applName . '.' . $instance} + if (defined($snmp_result->{$oid_applName}->{$oid_applName . '.' . $instance})); + $name .= '.' . $result->{onDbspaceName}; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{global}->{$name} = { + display => $name, + prct_used => $result->{onDbspacePagesUsed} * 100 / $result->{onDbspacePagesAllocated}, + }; + } + + if (scalar(keys %{$self->{global}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No dbspace found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check dbspaces usage. + +=over 8 + +=item B<--filter-name> + +Filter dbspace name (can be a regexp). + +=item B<--warning-usage> + +Threshold warning in percent. + +=item B<--critical-usage> + +Threshold critical in percent. + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/globalcache.pm b/centreon-plugins/database/informix/snmp/mode/globalcache.pm new file mode 100644 index 000000000..490ded242 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/globalcache.pm @@ -0,0 +1,158 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::globalcache; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub custom_usage_calc { + my ($self, %options) = @_; + + my $diff_logical = $options{new_datas}->{$self->{instance} . '_rdbmsSrvInfoLogical' . $options{extra_options}->{label_ref}} - + $options{old_datas}->{$self->{instance} . '_rdbmsSrvInfoLogical' . $options{extra_options}->{label_ref}}; + my $diff_disk = $options{new_datas}->{$self->{instance} . '_rdbmsSrvInfoDisk' . $options{extra_options}->{label_ref}} - + $options{old_datas}->{$self->{instance} . '_rdbmsSrvInfoDisk' . $options{extra_options}->{label_ref}}; + $self->{result_values}->{prct} = $diff_logical <= 0 ? 0 : (100 * ($diff_logical - $diff_disk) / $diff_logical); + + return 0; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 1, cb_prefix_output => 'prefix_instances_output', message_multiple => 'All instances are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'read', set => { + key_values => [ { name => 'rdbmsSrvInfoDiskReads', diff => 1 }, { name => 'rdbmsSrvInfoLogicalReads', diff => 1 }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'Reads' }, + output_template => 'Read Cached hitrate at %.2f%%', + threshold_use => 'prct', output_use => 'prct', + perfdatas => [ + { label => 'read', value => 'prct', template => '%.2f', min => 0, max => 100, unit => '%', + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'write', set => { + key_values => [ { name => 'rdbmsSrvInfoDiskWrites', diff => 1 }, { name => 'rdbmsSrvInfoLogicalWrites', diff => 1 }, { name => 'display' } ], + closure_custom_calc => $self->can('custom_usage_calc'), closure_custom_calc_extra_options => { label_ref => 'Writes' }, + output_template => 'Write Cached hitrate at %.2f%%', + threshold_use => 'prct', output_use => 'prct', + perfdatas => [ + { label => 'write', value => 'prct', template => '%.2f', min => 0, max => 100, unit => '%', + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_instances_output { + my ($self, %options) = @_; + + return "Instance '" . $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 => { + }); + + return $self; +} + +my $mapping = { + rdbmsSrvInfoDiskReads => { oid => '.1.3.6.1.2.1.39.1.6.1.3' }, + rdbmsSrvInfoLogicalReads => { oid => '.1.3.6.1.2.1.39.1.6.1.4' }, + rdbmsSrvInfoDiskWrites => { oid => '.1.3.6.1.2.1.39.1.6.1.5' }, + rdbmsSrvInfoLogicalWrites => { oid => '.1.3.6.1.2.1.39.1.6.1.6' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $oid_rdbmsSrvInfoEntry = '.1.3.6.1.2.1.39.1.6.1'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $oid_rdbmsSrvInfoEntry, start => $mapping->{rdbmsSrvInfoDiskReads}->{oid}, end => $mapping->{rdbmsSrvInfoLogicalWrites}->{oid} }, + ], nothing_quit => 1 + ); + + $self->{global} = {}; + foreach my $oid (keys %{$snmp_result->{$oid_rdbmsSrvInfoEntry}}) { + next if ($oid !~ /^$mapping->{rdbmsSrvInfoDiskReads}->{oid}\.(.*)/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result->{$oid_rdbmsSrvInfoEntry}, instance => $instance); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName}->{$oid_applName . '.' . $instance} + if (defined($snmp_result->{$oid_applName}->{$oid_applName . '.' . $instance})); + + $self->{global}->{$name} = { + display => $name, + %$result + }; + } + + $self->{cache_name} = "informix_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check write/read cached. + +=over 8 + +=item B<--warning-read> + +Threshold read cached warning in percent. + +=item B<--critical-read> + +Threshold read cached critical in percent. + +=item B<--warning-write> + +Threshold write cached warning in percent. + +=item B<--critical-write> + +Threshold write cached critical in percent. + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/listdbspaces.pm b/centreon-plugins/database/informix/snmp/mode/listdbspaces.pm new file mode 100644 index 000000000..5b4f9774e --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/listdbspaces.pm @@ -0,0 +1,134 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::listdbspaces; + +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; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-instance:s" => { name => 'filter_instance' }, + "filter-dbspace:s" => { name => 'filter_dbspace' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $oid_onDbspaceName = '.1.3.6.1.4.1.893.1.1.1.6.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $oid_onDbspaceName }, + ], nothing_quit => 1); + + $self->{dbspace} = {}; + foreach my $oid (keys %{$snmp_result->{$oid_onDbspaceName}}) { + $oid =~ /^$oid_onDbspaceName\.(.*?)\.(.*)/; + my ($applIndex, $dbSpaceIndex) = ($1, $2); + + my $instance = 'default'; + $instance = $snmp_result->{$oid_applName}->{$oid_applName . '.' . $applIndex} + if (defined($snmp_result->{$oid_applName}->{$oid_applName . '.' . $applIndex})); + my $dbspace = $snmp_result->{$oid_onDbspaceName}->{$oid}; + if (defined($self->{option_results}->{filter_instance}) && $self->{option_results}->{filter_instance} ne '' && + $instance !~ /$self->{option_results}->{filter_instance}/) { + $self->{output}->output_add(long_msg => "skipping instance '" . $instance . "': no matching filter.", debug => 1); + next; + } + if (defined($self->{option_results}->{filter_dbspace}) && $self->{option_results}->{filter_dbspace} ne '' && + $dbspace !~ /$self->{option_results}->{filter_dbspace}/) { + $self->{output}->output_add(long_msg => "skipping dbspace '" . $dbspace . "': no matching filter.", debug => 1); + next; + } + + $self->{dbspace}->{$applIndex . '.' . $dbSpaceIndex} = { + instance => $instance, + dbspace => $dbspace, + }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{dbspace}}) { + $self->{output}->output_add(long_msg => '[instance = ' . $self->{dbspace}->{$instance}->{instance} . + "] [dbspace = '" . $self->{dbspace}->{$instance}->{dbspace} . "']"); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List dbspaces:'); + $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 => ['instance', 'dbspace']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{dbspace}}) { + $self->{output}->add_disco_entry( + instance => $self->{dbspace}->{$instance}->{instance}, + dbspace => $self->{dbspace}->{$instance}->{dbspace}, + ); + } +} + +1; + +__END__ + +=head1 MODE + +List informix instances. + +=over 8 + +=item B<--filter-instance> + +Filter by instance name (can be a regexp). + +=back + +=cut + diff --git a/centreon-plugins/database/informix/snmp/mode/listinstances.pm b/centreon-plugins/database/informix/snmp/mode/listinstances.pm new file mode 100644 index 000000000..0a2b46736 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/listinstances.pm @@ -0,0 +1,114 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::listinstances; + +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; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-instance:s" => { name => 'filter_instance' }, + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $snmp_result = $options{snmp}->get_table(oid => $oid_applName); + $self->{instance} = {}; + foreach my $oid (keys %{$snmp_result}) { + my $name = $snmp_result->{$oid}; + if (defined($self->{option_results}->{filter_instance}) && $self->{option_results}->{filter_instance} ne '' && + $name !~ /$self->{option_results}->{filter_instance}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + $self->{instance}->{$name} = { instance => $name }; + } + + if (scalar(keys %{$self->{instance}}) == 0) { + $self->{instance}->{default} = { instance => 'default' }; + } +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{instance}}) { + $self->{output}->output_add(long_msg => '[instance = ' . $self->{instance}->{$instance}->{instance} . ']'); + } + + $self->{output}->output_add(severity => 'OK', + short_msg => 'List instances:'); + $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 => ['instance']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $instance (sort keys %{$self->{instance}}) { + $self->{output}->add_disco_entry(instance => $self->{instance}->{$instance}->{instance}); + } +} + +1; + +__END__ + +=head1 MODE + +List informix instances. + +=over 8 + +=item B<--filter-instance> + +Filter by instance name (can be a regexp). + +=back + +=cut + diff --git a/centreon-plugins/database/informix/snmp/mode/lockstats.pm b/centreon-plugins/database/informix/snmp/mode/lockstats.pm new file mode 100644 index 000000000..d4798c855 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/lockstats.pm @@ -0,0 +1,156 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::lockstats; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use Digest::MD5 qw(md5_hex); + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 1, cb_prefix_output => 'prefix_instances_output', message_multiple => 'All instances are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'deadlks', set => { + key_values => [ { name => 'onServerDeadLocks', diff => 1 }, { name => 'display' } ], + output_template => 'Deadlocks %d', + perfdatas => [ + { label => 'deadlks', value => 'onServerDeadLocks_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'lockwts', set => { + key_values => [ { name => 'onServerLockWaits', diff => 1 }, { name => 'display' } ], + output_template => 'Lock Waits %d', + perfdatas => [ + { label => 'lockwts', value => 'onServerLockWaits_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'lockreqs', set => { + key_values => [ { name => 'onServerLockRequests', diff => 1 }, { name => 'display' } ], + output_template => 'Lock Requests %d', + perfdatas => [ + { label => 'lockreqs', value => 'onServerLockRequests_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + { label => 'lktouts', set => { + key_values => [ { name => 'onServerLockTimeouts', diff => 1 }, { name => 'display' } ], + output_template => 'Lock Timeouts %d', + perfdatas => [ + { label => 'lktouts', value => 'onServerLockTimeouts_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_instances_output { + my ($self, %options) = @_; + + return "Instance '" . $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 => { + }); + + return $self; +} + +my $mapping = { + onServerLockRequests => { oid => '.1.3.6.1.4.1.893.1.1.1.1.1.11' }, + onServerLockWaits => { oid => '.1.3.6.1.4.1.893.1.1.1.1.1.12' }, + onServerDeadLocks => { oid => '.1.3.6.1.4.1.893.1.1.1.1.1.16' }, + onServerLockTimeouts => { oid => '.1.3.6.1.4.1.893.1.1.1.1.1.17' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $mapping->{onServerLockWaits}->{oid} }, + { oid => $mapping->{onServerLockRequests}->{oid} }, + { oid => $mapping->{onServerDeadLocks}->{oid} }, + { oid => $mapping->{onServerLockTimeouts}->{oid} }, + ], return_type => 1, nothing_quit => 1 + ); + + $self->{global} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{onServerLockRequests}->{oid}\.(.*)/); + my $instance = $1; + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $instance); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName . '.' . $instance} + if (defined($snmp_result->{$oid_applName . '.' . $instance})); + + $self->{global}->{$name} = { + display => $name, + %$result + }; + } + + $self->{cache_name} = "informix_" . $options{snmp}->get_hostname() . '_' . $options{snmp}->get_port() . '_' . $self->{mode} . '_' . + (defined($self->{option_results}->{filter_counters}) ? md5_hex($self->{option_results}->{filter_counters}) : md5_hex('all')); +} + +1; + +__END__ + +=head1 MODE + +Check instance locks. + +=over 8 + +=item B<--warning-*> + +Threshold warning. +Can be: 'deadlks', 'lockwts', 'lockreqs', 'lktouts'. + +=item B<--critical-*> + +Threshold critical. +Can be: 'deadlks', 'lockwts', 'lockreqs', 'lktouts'. + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/logfileusage.pm b/centreon-plugins/database/informix/snmp/mode/logfileusage.pm new file mode 100644 index 000000000..d7f68160e --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/logfileusage.pm @@ -0,0 +1,144 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::logfileusage; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 1, cb_prefix_output => 'prefix_dbspace_output', message_multiple => 'All dbspace log files usage are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'usage', set => { + key_values => [ { name => 'prct_used' }, { name => 'display' } ], + output_template => 'Log Files Used: %.2f%%', + perfdatas => [ + { label => 'used', value => 'prct_used_absolute', template => '%.2f', min => 0, max => 100, unit => '%', + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_dbspace_output { + my ($self, %options) = @_; + + return "Dbspace '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + "filter-name:s" => { name => 'filter_name' }, + }); + + return $self; +} + +my $mapping = { + onLogicalLogDbspace => { oid => '.1.3.6.1.4.1.893.1.1.1.8.1.3' }, + onLogicalLogPagesAllocated => { oid => '.1.3.6.1.4.1.893.1.1.1.8.1.7' }, + onLogicalLogPagesUsed => { oid => '.1.3.6.1.4.1.893.1.1.1.8.1.8' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $mapping->{onLogicalLogDbspace}->{oid} }, + { oid => $mapping->{onLogicalLogPagesAllocated}->{oid} }, + { oid => $mapping->{onLogicalLogPagesUsed}->{oid} }, + ], return_type => 1, nothing_quit => 1 + ); + + $self->{global} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{onLogicalLogDbspace}->{oid}\.(.*?)\.(.*)/); + my ($applIndex, $logIndex) = ($1, $2); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $applIndex . '.' . $logIndex); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName . '.' . $applIndex} + if (defined($snmp_result->{$oid_applName . '.' . $applIndex})); + $name .= '.' . $result->{onLogicalLogDbspace}; + + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $name !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping '" . $name . "': no matching filter.", debug => 1); + next; + } + + if (!defined($self->{global}->{$name})) { + $self->{global}->{$name} = { display => $name, allocated => 0, used => 0 }; + } + + $self->{global}->{$name}->{allocated} += $result->{onLogicalLogPagesAllocated}; + $self->{global}->{$name}->{used} += $result->{onLogicalLogPagesUsed}; + } + + foreach (keys %{$self->{global}}) { + $self->{global}->{$_}->{prct_used} = $self->{global}->{$_}->{used} * 100 / $self->{global}->{$_}->{allocated}; + } + + if (scalar(keys %{$self->{global}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No dbspace found."); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check log files usage. + +=over 8 + +=item B<--filter-name> + +Filter dbspace name (can be a regexp). + +=item B<--warning-usage> + +Threshold warning in percent. + +=item B<--critical-usage> + +Threshold critical in percent. + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/mode/sessions.pm b/centreon-plugins/database/informix/snmp/mode/sessions.pm new file mode 100644 index 000000000..c14682bdd --- /dev/null +++ b/centreon-plugins/database/informix/snmp/mode/sessions.pm @@ -0,0 +1,119 @@ +# +# Copyright 2019 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 database::informix::snmp::mode::sessions; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'global', type => 1, cb_prefix_output => 'prefix_instances_output', message_multiple => 'All instances are ok' } + ]; + + $self->{maps_counters}->{global} = [ + { label => 'sessions', set => { + key_values => [ { name => 'sessions' }, { name => 'display' } ], + output_template => '%d client sessions', + perfdatas => [ + { label => 'sessions', value => 'sessions_absolute', template => '%s', min => 0, + label_extra_instance => 1, instance_use => 'display_absolute' }, + ], + } + }, + ]; +} + +sub prefix_instances_output { + my ($self, %options) = @_; + + return "Instance '" . $options{instance_value}->{display} . "' "; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $self->{version} = '1.0'; + $options{options}->add_options(arguments => { + }); + + return $self; +} + +my $mapping = { + onSessionUserName => { oid => '.1.3.6.1.4.1.893.1.1.1.10.1.2' }, + onSessionUserProcessId => { oid => '.1.3.6.1.4.1.893.1.1.1.10.1.4' }, +}; + +sub manage_selection { + my ($self, %options) = @_; + + my $oid_applName = '.1.3.6.1.2.1.27.1.1.2'; + my $snmp_result = $options{snmp}->get_multiple_table(oids => [ + { oid => $oid_applName }, + { oid => $mapping->{onSessionUserName}->{oid} }, + { oid => $mapping->{onSessionUserProcessId}->{oid} }, + ], return_type => 1, nothing_quit => 1 + ); + + $self->{global} = {}; + foreach my $oid (keys %{$snmp_result}) { + next if ($oid !~ /^$mapping->{onSessionUserName}->{oid}\.(.*?)\.(.*)/); + my ($applIndex, $sessionIndex) = ($1, $2); + my $result = $options{snmp}->map_instance(mapping => $mapping, results => $snmp_result, instance => $applIndex . '.' . $sessionIndex); + + my $name = 'default'; + $name = $snmp_result->{$oid_applName . '.' . $applIndex} + if (defined($snmp_result->{$oid_applName . '.' . $applIndex})); + + if (!defined($self->{global}->{$name})) { + $self->{global}->{$name} = { display => $name, sessions => 0 }; + } + $self->{global}->{$name}->{sessions}++; + } +} + +1; + +__END__ + +=head1 MODE + +Check number of open sessions ('informix' user is not counted). + +=over 8 + +=item B<--warning-sessions> + +Threshold warning. + +=item B<--critical-sessions> + +Threshold critical. + +=back + +=cut diff --git a/centreon-plugins/database/informix/snmp/plugin.pm b/centreon-plugins/database/informix/snmp/plugin.pm new file mode 100644 index 000000000..75aeea450 --- /dev/null +++ b/centreon-plugins/database/informix/snmp/plugin.pm @@ -0,0 +1,56 @@ +# +# Copyright 2019 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 database::informix::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}} = ( + 'archivelevel0' => 'database::informix::snmp::mode::archivelevel0', + 'chunk-status' => 'database::informix::snmp::mode::chunkstatus', + 'dbspace-usage' => 'database::informix::snmp::mode::dbspaceusage', + 'global-cache' => 'database::informix::snmp::mode::globalcache', + 'list-dbspaces' => 'database::informix::snmp::mode::listdbspaces', + 'list-instances' => 'database::informix::snmp::mode::listinstances', + 'logfile-usage' => 'database::informix::snmp::mode::logfileusage', + 'sessions' => 'database::informix::snmp::mode::sessions', + 'lock-stats' => 'database::informix::snmp::mode::lockstats', + ); + + return $self; +} + +1; + +__END__ + +=head1 PLUGIN DESCRIPTION + +Check Informix in SNMP. + +=cut