This commit is contained in:
Kevin Duret 2014-05-09 12:28:31 +02:00
commit 0077d34315
16 changed files with 439 additions and 105 deletions

View File

@ -161,8 +161,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -243,8 +243,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -42,6 +42,7 @@ use centreon::plugins::httplib;
use centreon::plugins::statefile;
use Digest::MD5 qw(md5_hex);
use XML::XPath;
use URI::Escape;
sub new {
my ($class, %options) = @_;
@ -203,6 +204,7 @@ sub manage_selection {
my $connector_name = $node->getParentNode()->getParentNode()->getAttribute("name");
$connector_name =~ s/^["'\s]+//;
$connector_name =~ s/["'\s]+$//;
$connector_name = uri_unescape($connector_name);
next if (defined($self->{option_results}->{name}) && defined($self->{option_results}->{use_regexp}) && defined($self->{option_results}->{use_regexpi})
&& $connector_name !~ /$self->{option_results}->{name}/i);
@ -236,7 +238,7 @@ sub run {
$self->manage_selection();
my $new_datas = {};
$self->{statefile_value}->read(statefile => "cache_apps_tomcat_web_" . $self->{hostname} . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$self->{statefile_value}->read(statefile => 'cache_apps_tomcat_web_' . $self->{option_results}->{hostname} . '_' . $self->{option_results}->{port} . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$new_datas->{last_timestamp} = time();
my $old_timestamp = $self->{statefile_value}->get(name => 'last_timestamp');

View File

@ -40,6 +40,7 @@ use strict;
use warnings;
use centreon::plugins::httplib;
use XML::XPath;
use URI::Escape;
sub new {
my ($class, %options) = @_;
@ -160,6 +161,7 @@ sub manage_selection {
my $connector_name = $node->getParentNode()->getParentNode()->getAttribute("name");
$connector_name =~ s/^["'\s]+//;
$connector_name =~ s/["'\s]+$//;
$connector_name = uri_unescape($connector_name);
next if (defined($self->{option_results}->{name}) && defined($self->{option_results}->{use_regexp}) && defined($self->{option_results}->{use_regexpi})
&& $connector_name !~ /$self->{option_results}->{name}/i);

View File

@ -43,6 +43,7 @@ use centreon::plugins::misc;
use centreon::plugins::statefile;
use Digest::MD5 qw(md5_hex);
use XML::XPath;
use URI::Escape;
sub new {
my ($class, %options) = @_;
@ -188,6 +189,7 @@ sub manage_selection {
my $connector_name = $node->getParentNode()->getParentNode()->getAttribute("name");
$connector_name =~ s/^["'\s]+//;
$connector_name =~ s/["'\s]+$//;
$connector_name = uri_unescape($connector_name);
next if (defined($self->{option_results}->{name}) && defined($self->{option_results}->{use_regexp}) && defined($self->{option_results}->{use_regexpi})
&& $connector_name !~ /$self->{option_results}->{name}/i);
@ -221,7 +223,7 @@ sub run {
$self->manage_selection();
my $new_datas = {};
$self->{statefile_value}->read(statefile => "cache_apps_tomcat_web_" . $self->{hostname} . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$self->{statefile_value}->read(statefile => 'cache_apps_tomcat_web_' . $self->{option_results}->{hostname} . '_' . $self->{option_results}->{port} . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$new_datas->{last_timestamp} = time();
my $old_timestamp = $self->{statefile_value}->get(name => 'last_timestamp');

View File

@ -34,11 +34,14 @@
####################################################################################
package centreon::plugins::options;
use Pod::Usage;
use Pod::Find qw(pod_where);
use Getopt::Long;
Getopt::Long::Configure("pass_through");
Getopt::Long::Configure('bundling');
use strict;
use warnings;
sub new {
my $class = shift;
@ -61,9 +64,9 @@ sub set_output {
sub display_help {
my ($self, %options) = @_;
my $stdout;
foreach (@{$self->{pod_package}}) {
my $stdout;
{
local *STDOUT;
open STDOUT, '>', \$stdout;
@ -88,9 +91,9 @@ sub add_help {
}
if (defined($options{help_first})) {
shift @{$self->{pod_package}}, {package => $options{package}, sections => $options{sections}};
unshift @{$self->{pod_package}}, {package => $options{package}, sections => $options{sections}};
} else {
push @{$self->{pod_package}}, {package => $options{package}, sections => $options{sections}};
push @{$self->{pod_package}}, { package => $options{package}, sections => $options{sections} };
}
$self->{pod_packages_once}->{$options{package}} = 1;

View File

@ -34,8 +34,11 @@
####################################################################################
package centreon::plugins::output;
use Encode;
use centreon::plugins::misc;
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
@ -381,7 +384,7 @@ sub output_txt {
print (($options{nolabel} == 0 ? 'UNKNOWN: ' : '') . $self->{global_short_concat_outputs}->{UNKNOWN} . " ");
}
if (uc($options{exit_litteral}) eq 'OK') {
print (($options{nolabel} == 0 ? 'OK: ' : '') . $self->{global_short_concat_outputs}->{OK} . " ");
print (($options{nolabel} == 0 ? 'OK: ' : '') . (defined($self->{global_short_concat_outputs}->{OK}) ? $self->{global_short_concat_outputs}->{OK} : '') . " ");
}
if ($force_ignore_perfdata == 1) {

View File

@ -35,6 +35,9 @@
package centreon::plugins::perfdata;
use strict;
use warnings;
sub new {
my ($class, %options) = @_;
my $self = {};
@ -109,42 +112,10 @@ sub trim {
return $value;
}
sub continue_to {
my $self = shift;
my ($forbidden, $stop1, $not_stop_after) = @_;
my $value = "";
while ($self->{perfdata_pos} < $self->{perfdata_size}) {
if (defined($forbidden) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] =~ /$forbidden/) {
return undef;
}
if (${$self->{perfdata_chars}}[$self->{perfdata_pos}] =~ /$stop1/) {
if (!defined($not_stop_after)) {
return $value;
}
if (!($self->{perfdata_pos} + 1 < $self->{perfdata_size} && ${$self->{perfdata_chars}}[$self->{perfdata_pos} + 1] =~ /$not_stop_after/)) {
$self->{perfdata_pos}++;
return $value;
}
$self->{perfdata_pos}++;
}
$value .= ${$self->{perfdata_chars}}[$self->{perfdata_pos}];
$self->{perfdata_pos}++;
}
return $value;
}
sub parse_threshold {
my $self = shift;
@{$self->{perfdata_chars}} = split //, $self->trim($_[0]);
$self->{perfdata_pos} = 0;
$self->{perfdata_size} = scalar(@{$self->{perfdata_chars}});
my $neg = 1;
my $value_tmp = "";
my $perf = $self->trim($_[0]);
my $arobase = 0;
my $infinite_neg = 0;
@ -153,63 +124,28 @@ sub parse_threshold {
my $value_end = "";
my $global_status = 1;
if (defined(${$self->{perfdata_chars}}[$self->{perfdata_pos}]) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] eq "@") {
$arobase = 1;
$self->{perfdata_pos}++;
}
if (defined(${$self->{perfdata_chars}}[$self->{perfdata_pos}]) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] eq "~") {
$infinite_neg = 1;
$self->{perfdata_pos}++;
} else {
if (defined(${$self->{perfdata_chars}}[$self->{perfdata_pos}]) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] eq "-") {
$neg = -1;
$self->{perfdata_pos}++;
}
$value_tmp = $self->continue_to(undef, "[^0-9\.,]");
if (defined($value_tmp) && $value_tmp ne "") {
$value_tmp =~ s/,/./g;
$value_tmp = $value_tmp * $neg;
}
$neg = 1;
}
if (defined(${$self->{perfdata_chars}}[$self->{perfdata_pos}]) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] eq ":") {
if ($value_tmp ne "") {
$value_start = $value_tmp;
} else {
$value_start = 0;
}
$self->{perfdata_pos}++;
if (defined(${$self->{perfdata_chars}}[$self->{perfdata_pos}]) && ${$self->{perfdata_chars}}[$self->{perfdata_pos}] eq "-") {
$neg = -1;
$self->{perfdata_pos}++;
}
$value_end = $self->continue_to(undef, "[^0-9\.,]");
if (defined($value_tmp) && $value_end ne "") {
$value_end =~ s/,/./g;
$value_end = $value_end * $neg;
} else {
if ($perf =~ /^(\@?)((?:~|(?:\+|-)?\d+(?:[\.,]\d+)?|):)?((?:\+|-)?\d+(?:[\.,]\d+)?)?$/) {
$value_start = $2 if (defined($2));
$value_end = $3 if (defined($3));
$arobase = 1 if (defined($1) && $1 eq '@');
$value_start =~ s/[\+:]//g;
$value_end =~ s/\+//;
if ($value_end eq '') {
$value_end = 1e500;
$infinite_pos = 1;
}
$value_start = 0 if ($value_start eq '');
$value_start =~ s/,/\./;
$value_end =~ s/,/\./;
if ($value_start eq '~') {
$value_start = -1e500;
$infinite_neg = 1;
}
} else {
$value_start = 0;
$value_end = $value_tmp;
}
my $value = $self->continue_to(undef, "[ \t;]");
if ($value ne '') {
$global_status = 0;
}
if ($infinite_neg == 1) {
$value_start = '-1e500';
}
if ($infinite_pos == 1) {
$value_end = '1e500';
}
return ($global_status, $value_start, $value_end, $arobase, $infinite_neg, $infinite_pos);
}

View File

@ -34,6 +34,9 @@
####################################################################################
package centreon::plugins::statefile;
use strict;
use warnings;
use Data::Dumper;
use vars qw($datas);

View File

@ -156,8 +156,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -157,8 +157,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -157,8 +157,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -156,8 +156,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -157,8 +157,6 @@ Specify username for basic authentification (Mandatory if --credentials is speci
Specify password for basic authentification (Mandatory if --credentials is specidied)
=item B<--password>
=item B<--timeout>
Threshold for HTTP timeout

View File

@ -61,6 +61,7 @@ sub new {
'processcount' => 'snmp_standard::mode::processcount',
'storage' => 'snmp_standard::mode::storage',
'swap' => 'snmp_standard::mode::swap',
'tcpcon' => 'snmp_standard::mode::tcpcon',
'traffic' => 'snmp_standard::mode::traffic',
'uptime' => 'snmp_standard::mode::uptime',
);

View File

@ -0,0 +1,396 @@
################################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Authors : Quentin Garnier <qgarnier@merethis.com>
#
####################################################################################
package snmp_standard::mode::tcpcon;
use base qw(centreon::plugins::mode);
use strict;
use warnings;
my %map_states = (
1 => 'closed',
2 => 'listen',
3 => 'synSent',
4 => 'synReceived',
5 => 'established',
6 => 'finWait1',
7 => 'finWait2',
8 => 'closeWait',
9 => 'lastAck',
10 => 'closing',
11 => 'timeWait',
12 => 'deleteTCB',
);
my %map_addr_type = (
0 => 'unknown',
1 => 'ipv4',
2 => 'ipv6',
3 => 'ipv4z',
4 => 'ipv6z',
16 => 'dns',
);
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 =>
{
"warning:s" => { name => 'warning', },
"critical:s" => { name => 'critical', },
"service:s@" => { name => 'service', },
"application:s@" => { name => 'application', },
});
@{$self->{connections}} = ();
$self->{services} = { total => { filter => '.*?#.*?#.*?#.*?#.*?#(?!(listen))', builtin => 1, number => 0, msg => 'Total connections: %d' } };
$self->{applications} = {};
return $self;
}
sub get_ipv6 {
my ($self, %options) = @_;
my $ipv6 = '';
my $num = 1;
foreach my $val (split /\./, $options{value}) {
if ($num % 3 == 0) {
$ipv6 .= ':';
$num++;
}
$ipv6 .= sprintf("%02x", $val);
$num++;
}
return $ipv6;
}
sub get_from_rfc4022 {
my ($self, %options) = @_;
my $oid_tcpConnectionState = '.1.3.6.1.2.1.6.19.1.7';
my $result = $self->{snmp}->get_table(oid => $oid_tcpConnectionState);
my $oid_tcpListenerProcess = '.1.3.6.1.2.1.6.20.1.4';
my $result2 = $self->{snmp}->get_table(oid => $oid_tcpListenerProcess);
return 0 if (scalar(keys %$result) + scalar(keys %$result2) == 0);
# Listener
foreach (keys %$result2) {
/^$oid_tcpListenerProcess\.(\d+)/;
my $ipv = $map_addr_type{$1};
next if ($ipv !~ /^ipv4|ipv6$/); # manage only 'ipv4' (1) and 'ipv6' (2) for now
my ($src_addr, $src_port, $dst_addr);
if ($ipv eq 'ipv6') {
$dst_addr = '0000:0000:0000:0000:0000:0000:0000:0000';
/^$oid_tcpListenerProcess\.\d+\.\d+\.((?:\d+\.){16})(\d+)/;
($src_addr, $src_port) = ($self->get_ipv6(value => $1), $2);
} else {
/^$oid_tcpListenerProcess\.\d+\.\d+\.(\d+\.\d+\.\d+\.\d+)\.(\d+)/;
$dst_addr = '0.0.0.0';
($src_addr, $src_port) = ($1, $2);
}
push @{$self->{connections}}, $ipv . "#$src_addr#$src_port#$dst_addr#0#listen";
}
foreach (keys %$result) {
/^$oid_tcpConnectionState\.(\d+)/;
my $ipv = $map_addr_type{$1};
next if ($ipv !~ /^ipv4|ipv6$/); # manage only 'ipv4' (1) and 'ipv6' (2) for now
my ($src_addr, $src_port, $dst_addr, $dst_port);
if ($ipv eq 'ipv6') {
/^$oid_tcpConnectionState\.\d+\.\d+\.((?:\d+\.){16})(\d+)\.\d+\.((?:\d+\.){16})(\d+)/;
($src_addr, $src_port, $dst_addr, $dst_port) = ($self->get_ipv6(value => $1), $2, $self->get_ipv6(value => $3), $4);
} else {
/^$oid_tcpConnectionState\.\d+\.\d+\.(\d+\.\d+\.\d+\.\d+)\.(\d+)\.\d+\.(\d+\.\d+\.\d+\.\d+)\.(\d+)/;
($src_addr, $src_port, $dst_addr, $dst_port) = ($1, $2, $3, $4);
}
push @{$self->{connections}}, $ipv . "#$src_addr#$src_port#$dst_addr#$dst_port#" . lc($map_states{$result->{$_}});
}
return 1;
}
sub get_from_rfc1213 {
my ($self, %options) = @_;
my $oid_tcpConnState = '.1.3.6.1.2.1.6.13.1.1';
my $result = $self->{snmp}->get_table(oid => $oid_tcpConnState, nothing_quit => 1);
# Construct
foreach (keys %$result) {
/(\d+\.\d+\.\d+\.\d+).(\d+)\.(\d+\.\d+\.\d+\.\d+).(\d+)$/;
push @{$self->{connections}}, "ipv4#$1#$2#$3#$4#" . lc($map_states{$result->{$_}});
}
}
sub build_connections {
my ($self, %options) = @_;
if ($self->get_from_rfc4022() == 0) {
$self->get_from_rfc1213();
}
}
sub check_services {
my ($self, %options) = @_;
foreach my $service (@{$self->{option_results}->{service}}) {
my ($tag, $ipv, $state, $port_src, $port_dst, $filter_ip_src, $filter_ip_dst, $warn, $crit) = split /,/, $service;
if (!defined($tag) || $tag eq '') {
$self->{output}->add_option_msg(short_msg => "Tag for service '" . $service . "' must be defined.");
$self->{output}->option_exit();
}
if (defined($self->{services}->{$tag})) {
$self->{output}->add_option_msg(short_msg => "Tag '" . $tag . "' (service) already exists.");
$self->{output}->option_exit();
}
$self->{services}->{$tag} = { filter => ((defined($ipv) && $ipv ne '') ? $ipv : '.*?') . '#' .
((defined($filter_ip_src) && $filter_ip_src ne '') ? $filter_ip_src : '.*?') . '#' .
((defined($port_src) && $port_src ne '') ? $port_src : '.*?') . '#' .
((defined($filter_ip_dst) && $filter_ip_dst ne '') ? $filter_ip_dst : '.*?') . '#' .
((defined($port_dst) && $port_dst ne '') ? $port_dst : '.*?') . '#' .
((defined($state) && $state ne '') ? lc($state) : '(?!(listen))')
,
builtin => 0, number => 0 };
if (($self->{perfdata}->threshold_validate(label => 'warning-service-' . $tag, value => $warn)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $warn . "' for service '$tag'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-service-' . $tag, value => $crit)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $crit . "' for service '$tag'.");
$self->{output}->option_exit();
}
}
}
sub check_applications {
my ($self, %options) = @_;
foreach my $app (@{$self->{option_results}->{application}}) {
my ($tag, $services, $warn, $crit) = split /,/, $app;
if (!defined($tag) || $tag eq '') {
$self->{output}->add_option_msg(short_msg => "Tag for application '" . $app . "' must be defined.");
$self->{output}->option_exit();
}
if (defined($self->{applications}->{$tag})) {
$self->{output}->add_option_msg(short_msg => "Tag '" . $tag . "' (application) already exists.");
$self->{output}->option_exit();
}
$self->{applications}->{$tag} = {
services => {},
};
foreach my $service (split /\|/, $services) {
if (!defined($self->{services}->{$service})) {
$self->{output}->add_option_msg(short_msg => "Service '" . $service . "' is not defined.");
$self->{output}->option_exit();
}
$self->{applications}->{$tag}->{services}->{$service} = 1;
}
if (($self->{perfdata}->threshold_validate(label => 'warning-app-' . $tag, value => $warn)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $warn . "' for application '$tag'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-app-' . $tag, value => $crit)) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $crit . "' for application '$tag'.");
$self->{output}->option_exit();
}
}
}
sub test_services {
my ($self, %options) = @_;
foreach my $tag (keys %{$self->{services}}) {
foreach (@{$self->{connections}}) {
if (/$self->{services}->{$tag}->{filter}/) {
$self->{services}->{$tag}->{number}++;
}
}
my $exit_code = $self->{perfdata}->threshold_check(value => $self->{services}->{$tag}->{number},
threshold => [ { label => 'critical-service-' . $tag, 'exit_litteral' => 'critical' }, { label => 'warning-service-' . $tag, exit_litteral => 'warning' } ]);
my ($perf_label, $msg) = ('service_' . $tag, "Service '$tag' connections: %d");
if ($self->{services}->{$tag}->{builtin} == 1) {
($perf_label, $msg) = ($tag, $self->{services}->{$tag}->{msg});
}
$self->{output}->output_add(severity => $exit_code,
short_msg => sprintf($msg, $self->{services}->{$tag}->{number}));
$self->{output}->perfdata_add(label => $perf_label,
value => $self->{services}->{$tag}->{number},
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-service-' . $tag),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-service-' . $tag),
min => 0);
}
}
sub test_applications {
my ($self, %options) = @_;
foreach my $tag (keys %{$self->{applications}}) {
my $number = 0;
foreach (keys %{$self->{applications}->{$tag}->{services}}) {
$number += $self->{services}->{$_}->{number};
}
my $exit_code = $self->{perfdata}->threshold_check(value => $number,
threshold => [ { label => 'critical-app-' . $tag, 'exit_litteral' => 'critical' }, { label => 'warning-app-' . $tag, exit_litteral => 'warning' } ]);
$self->{output}->output_add(severity => $exit_code,
short_msg => sprintf("Applicatin '%s' connections: %d", $tag, $number));
$self->{output}->perfdata_add(label => 'app_' . $tag,
value => $number,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-app-' . $tag),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-app-' . $tag),
min => 0);
}
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning-service-total', value => $self->{option_results}->{warning})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-service-total', value => $self->{option_results}->{critical})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
$self->{output}->option_exit();
}
$self->check_services();
$self->check_applications();
}
sub run {
my ($self, %options) = @_;
# $options{snmp} = snmp object
$self->{snmp} = $options{snmp};
$self->build_connections();
$self->test_services();
$self->test_applications();
$self->{output}->display();
$self->{output}->exit();
}
1;
__END__
=head1 MODE
Check tcp connections.
=over 8
=item B<--warning>
Threshold warning for total connections.
=item B<--critical>
Threshold critical for total connections.
=item B<--service>
Check tcp connections following rules:
tag,[type],[state],[port-src],[port-dst],[filter-ip-src],[filter-ip-dst],[threshold-warning],[threshold-critical]
Example to test SSH connections on the server: --service="ssh,,,22,,,,10,20"
=over 16
=item <tag>
Name to identify service (must be unique and couldn't be 'total').
=item <type>
regexp - can use 'ipv4', 'ipv6'. Empty means all.
=item <state>
regexp - can use 'finWait1', 'established',... Empty means all (minus listen).
=item <filter-ip-*>
regexp - can use to exclude or include some IPs.
=item <threshold-*>
nagios-perfdata - number of connections.
=back
=item B<--application>
Check tcp connections of mutiple services:
tag,[services],[threshold-warning],[threshold-critical]
Example:
--application="web,http|https,100,200"
=over 16
=item <tag>
Name to identify application (must be unique).
=item <services>
List of services (used the tag name. Separated by '|').
=item <threshold-*>
nagios-perfdata - number of connections.
=back
=back
=cut