diff --git a/apps/apache/serverstatus/mode/libconnect.pm b/apps/apache/serverstatus/mode/libconnect.pm index 747e83eab..5bdaa1277 100644 --- a/apps/apache/serverstatus/mode/libconnect.pm +++ b/apps/apache/serverstatus/mode/libconnect.pm @@ -43,6 +43,7 @@ use LWP::UserAgent; sub connect { my ($self, %options) = @_; my $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout}); + my $connection_exit = defined($options{connection_exit}) ? $options{connection_exit} : 'unknown'; my $response; my $content; @@ -71,8 +72,8 @@ sub connect { $content = $response->content; return $content; } else { - $self->{output}->output_add(severity => 'CRITICAL', - short_msg => $response->status_line); + $self->{output}->output_add(severity => $connection_exit, + short_msg => $response->status_line); $self->{output}->display(); $self->{output}->exit(); } diff --git a/apps/apache/serverstatus/mode/requests.pm b/apps/apache/serverstatus/mode/requests.pm index 32f3ccd1c..21256d7f3 100644 --- a/apps/apache/serverstatus/mode/requests.pm +++ b/apps/apache/serverstatus/mode/requests.pm @@ -53,9 +53,9 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port', default => '80' }, "proto:s" => { name => 'proto', default => "http" }, - "credentials" => { name => 'credentials' }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, @@ -107,7 +107,7 @@ sub run { my @webcontentarr = split("\n", $webcontent); my $i = 0; my ($rPerSec, $rPerSecSfx, $bPerSec, $bPerSecSfx, $bPerReq, $bPerReqSfx); - + while (($i < @webcontentarr) && ((!defined($rPerSec)) || (!defined($bPerSec)) || (!defined($bPerReq)))) { if ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/sec\s-\s([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/second\s-\s([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/request/) { ($rPerSec, $rPerSecSfx, $bPerSec, $bPerSecSfx, $bPerReq, $bPerReqSfx) = ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/sec\s-\s([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/second\s-\s([0-9]*\.?[0-9]+)\s([A-Za-z]+)\/request/); @@ -115,6 +115,14 @@ sub run { $i++; } + if (!defined($rPerSec)) { + $self->{output}->add_option_msg(short_msg => "Apache 'ExtendedStatus' option is off."); + $self->{output}->option_exit(); + } + if ($rPerSec =~ /^\./) { + $rPerSec = '0' . $rPerSec; + } + if ($bPerReqSfx eq 'kB') { $bPerReq = $bPerReq * 1024; } elsif ($bPerReqSfx eq 'mB') { @@ -135,9 +143,14 @@ sub run { my $exit2 = $self->{perfdata}->threshold_check(value => $bPerReq, threshold => [ { label => 'critical-bytes', 'exit_litteral' => 'critical' }, { label => 'warning-bytes', exit_litteral => 'warning' } ]); my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2 ]); - + + my ($bPerSec_value, $bPerSec_unit) = $self->{perfdata}->change_bytes(value => $bPerSec); + my ($bPerReq_value, $bPerReq_unit) = $self->{perfdata}->change_bytes(value => $bPerReq); + $self->{output}->output_add(severity => $exit, - short_msg => sprintf("RequestPerSec: %f BytesPerSecond: %d BytesPerRequest: %d", $self->{perfdata}->change_bytes($rPerSec), $self->{perfdata}->change_bytes($bPerSec), $self->{perfdata}->change_bytes($bPerReq))); + short_msg => sprintf("RequestPerSec: %s BytesPerSecond: %s BytesPerRequest: %s", $rPerSec, + $bPerSec_value . ' ' . $bPerSec_unit, + $bPerReq_value . ' ' . $bPerReq_unit)); $self->{output}->perfdata_add(label => "requestPerSec", value => $rPerSec, unit => $rPerSecSfx, @@ -147,11 +160,11 @@ sub run { $self->{output}->perfdata_add(label => "bytesPerSec", value => $bPerSec, unit => 'B'); - $self->{output}->perfdata_add(label => "bytesPerRequest", + $self->{output}->perfdata_add(label => "bytesPerRequest", unit => 'B', value => $bPerReq, warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-bytes'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-bytes'), - unit => 'B'); + ); $self->{output}->display(); $self->{output}->exit(); diff --git a/apps/apache/serverstatus/mode/responsetime.pm b/apps/apache/serverstatus/mode/responsetime.pm index 63d669b94..7f7a5827f 100644 --- a/apps/apache/serverstatus/mode/responsetime.pm +++ b/apps/apache/serverstatus/mode/responsetime.pm @@ -54,10 +54,10 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port', default => '80' }, "proto:s" => { name => 'proto', default => "http" }, - "credentials" => { name => 'credentials' }, + "credentials" => { name => 'credentials' }, "username:s" => { name => 'username' }, "password:s" => { name => 'password' }, - "proxyurl:s" => { name => 'proxyurl' }, + "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, "timeout:s" => { name => 'timeout', default => '3' }, @@ -98,7 +98,7 @@ sub run { my $timing0 = [gettimeofday]; - my $webcontent = apps::apache::serverstatus::mode::libconnect::connect($self); + my $webcontent = apps::apache::serverstatus::mode::libconnect::connect($self, connection_exit => 'critical'); my $timeelapsed = tv_interval ($timing0, [gettimeofday]); diff --git a/apps/apache/serverstatus/mode/slotstates.pm b/apps/apache/serverstatus/mode/slotstates.pm index 84ed9ccee..1bb81396b 100644 --- a/apps/apache/serverstatus/mode/slotstates.pm +++ b/apps/apache/serverstatus/mode/slotstates.pm @@ -53,9 +53,9 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port', default => '80' }, "proto:s" => { name => 'proto', default => "http" }, - "credentials" => { name => 'credentials' }, - "username:s" => { name => 'username' }, - "password:s" => { name => 'password' }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, @@ -108,7 +108,7 @@ sub run { if ( $webcontentarr[$i] =~ m/
/i ) {
                 $PosPreBegin = $i;
             }
-	}
+        }
         if (defined($PosPreBegin)) {
             if ( $webcontentarr[$i] =~ m/<\/pre>/i ) {
                 $PosPreEnd = $i;
@@ -123,6 +123,8 @@ sub run {
   
     $ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//;
     $ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//;
+    
+    my $srvLimit = length($ScoreBoard);
 
     my $CountOpenSlots = ($ScoreBoard =~ tr/\.//);
 
@@ -134,7 +136,9 @@ sub run {
     $self->{output}->perfdata_add(label => "freeSlots",
                                   value => $CountOpenSlots,
                                   warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
-                                  critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'));
+                                  critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
+                                  min => 0,
+                                  max => $srvLimit);
     $self->{output}->perfdata_add(label => "waiting",
             value => ($ScoreBoard =~ tr/\_//));
     $self->{output}->perfdata_add(label => "starting",
diff --git a/apps/apache/serverstatus/mode/workers.pm b/apps/apache/serverstatus/mode/workers.pm
deleted file mode 100644
index 936a7baf7..000000000
--- a/apps/apache/serverstatus/mode/workers.pm
+++ /dev/null
@@ -1,212 +0,0 @@
-###############################################################################
-# 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 .
-# 
-# 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 timeelapsedutable, 
-# regardless of the license terms of these independent modules, and to copy and 
-# distribute the resulting timeelapsedutable 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
-# Author : Simon BOMM 
-#
-# Based on De Bodt Lieven plugin
-####################################################################################
-
-package apps::apache::serverstatus::mode::workers;
-
-use base qw(centreon::plugins::mode);
-
-use strict;
-use warnings;
-use LWP::UserAgent;
-use apps::apache::serverstatus::mode::libconnect;
-
-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 =>
-            {
-            "hostname:s"    => { name => 'hostname' },
-            "port:s"        => { name => 'port', default => '80' },
-            "proto:s"       => { name => 'proto', default => "http" },
-            "proxyurl:s"    => { name => 'proxyurl' },
-            "warning:s"     => { name => 'warning' },
-            "critical:s"    => { name => 'critical' },
-            "timeout:s"     => { name => 'timeout', default => '3' },
-            });
-    return $self;
-}
-
-sub check_options {
-    my ($self, %options) = @_;
-    $self->SUPER::init(%options);
-
-    if (($self->{perfdata}->threshold_validate(label => 'warning', 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', value => $self->{option_results}->{critical})) == 0) {
-        $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'.");
-        $self->{output}->option_exit();
-    }
-    if (($self->{option_results}->{proto} ne 'http') && ($self->{option_results}->{proto} ne 'https')) {
-        $self->{output}->add_option_msg(short_msg => "Unsupported protocol specified '" . $self->{option_results}->{proto} . "'.");
-        $self->{output}->option_exit();
-    }
-    if (!defined($self->{option_results}->{hostname})) {
-        $self->{output}->add_option_msg(short_msg => "Please set the hostname option");
-        $self->{output}->option_exit();
-    }
-    if ((defined($self->{option_results}->{credentials})) && (!defined($self->{option_results}->{username}) || !defined($self->{option_results}->{password}))) {
-        $self->{output}->add_option_msg(short_msg => "You need to set --username= and --password= options when --credentials is used");
-        $self->{output}->option_exit();
-    }
-
-}
-
-sub run {
-    my ($self, %options) = @_;
-        
-    my $webcontent = apps::apache::serverstatus::mode::libconnect::connect($self);
-    my @webcontentarr = split("\n", $webcontent);
-    my $i = 0;
-    my $ScoreBoard = "";
-    my $PosPreBegin = undef;
-    my $PosPreEnd = undef;
-    my $BusyWorkers;
-    my $IdleWorkers;
-    my $prct_busy;    
-    
-    while ($i < @webcontentarr) {
-        if ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/) {
-            ($BusyWorkers, $IdleWorkers) = ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/);
-        }
-            $i++;
-    }
-
-    $i = 0;
-
-    while (($i < @webcontentarr) && ((!defined($PosPreBegin)) || (!defined($PosPreEnd)))) {
-        if (!defined($PosPreBegin)) {
-            if ( $webcontentarr[$i] =~ m/
/i ) {
-                $PosPreBegin = $i;
-            }
-        }
-        if (defined($PosPreBegin)) {
-            if ( $webcontentarr[$i] =~ m/<\/pre>/i ) {
-                $PosPreEnd = $i;
-            }
-        }
-        $i++;
-    }
-    
-    for ($i = $PosPreBegin; $i <= $PosPreEnd; $i++) {
-        $ScoreBoard = $ScoreBoard . $webcontentarr[$i];
-    }
-
-    $ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//;
-    $ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//;
-
-    my $srvLimit = length($ScoreBoard);
-	
-    $prct_busy = $BusyWorkers / $srvLimit * 100;
-    
-    my $exit = $self->{perfdata}->threshold_check(value => $prct_busy,
-                                                 threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
-    $self->{output}->output_add(severity => $exit,
-                                short_msg => sprintf("Busy workers: %d Idle workers: %d ( %d %% )", $BusyWorkers, $IdleWorkers, $prct_busy));
-    $self->{output}->perfdata_add(label => "idle_workers",
-                                  value => $IdleWorkers,
-				  min => 0,
-                                  max => $srvLimit);
-    $self->{output}->perfdata_add(label => "busy_workers",
-                                  value => $BusyWorkers,
-                                  warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'),
-                                  critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'),
-				  min => 0,
-                                  max => $srvLimit);
-
-    $self->{output}->display();
-    $self->{output}->exit();
-}
-
-
-1;
-
-
-__END__
-
-=head1 MODE
-
-Check Apache WebServer busy processes. Graph Busy and Idle. Compute percentage over ServerLimit apache config file directive.
-
-=over 8
-
-=item B<--hostname>
-
-IP Addr/FQDN of the webserver host
-
-=item B<--port>
-
-Port used by Apache
-
-=item B<--proxyurl>
-
-Proxy URL if any
-
-=item B<--proto>
-
-Protocol to use http or https, http is default
-
-=item B<--credentials>
-
-Specify this option if you access server-status page over basic authentification
-
-=item B<--username>
-
-Specify username for basic authentification (Mandatory if --credentials is specidied)
-
-=item B<--password>
-
-Specify password for basic authentification (Mandatory if --credentials is specidied)
-
-=item B<--timeout>
-
-Threshold for HTTP timeout
-
-=item B<--warning>
-
-Warning Threshold (%) of busy workers
-
-=item B<--critical>
-
-Critical Threshold (%) of busy workers
-
-=back
-
-=cut
diff --git a/apps/apache/serverstatus/plugin.pm b/apps/apache/serverstatus/plugin.pm
index 6206e62cd..ae1288ff8 100644
--- a/apps/apache/serverstatus/plugin.pm
+++ b/apps/apache/serverstatus/plugin.pm
@@ -50,7 +50,6 @@ sub new {
 			'responsetime'	=> 'apps::apache::serverstatus::mode::responsetime',
 			'requests'	=> 'apps::apache::serverstatus::mode::requests',
 			'slotstates'	=> 'apps::apache::serverstatus::mode::slotstates',
-			'workers'	=> 'apps::apache::serverstatus::mode::workers',
 			);
 
 	return $self;