diff --git a/centreon-plugins/apps/apache/serverstatus/mode/libconnect.pm b/centreon-plugins/apps/apache/serverstatus/mode/libconnect.pm new file mode 100644 index 000000000..747e83eab --- /dev/null +++ b/centreon-plugins/apps/apache/serverstatus/mode/libconnect.pm @@ -0,0 +1,83 @@ +############################################################################### +# 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::libconnect; + +use strict; +use warnings; +use LWP::UserAgent; + +sub connect { + my ($self, %options) = @_; + my $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout}); + + my $response; + my $content; + + if (defined $self->{option_results}->{credentials}) { + $ua->credentials($self->{option_results}->{hostname}.':'.$self->{option_results}->{port},$self->{option_results}->{username},$self->{option_results}->{password}); + } + + if ($self->{option_results}->{proto} eq "https") { + if (defined $self->{option_results}->{proxyurl}) { + $ua->proxy(['https'], $self->{option_results}->{proxyurl}); + $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); + } else { + $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); + } + } else { + if (defined $self->{option_results}->{proxyurl}) { + $ua->proxy(['http'], $self->{option_results}->{proxyurl}); + $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status'); + } else { + $response = $ua->get('http://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); + } + } + + if ($response->is_success) { + $content = $response->content; + return $content; + } else { + $self->{output}->output_add(severity => 'CRITICAL', + short_msg => $response->status_line); + $self->{output}->display(); + $self->{output}->exit(); + } + +} + +1; + diff --git a/centreon-plugins/apps/apache/serverstatus/mode/requests.pm b/centreon-plugins/apps/apache/serverstatus/mode/requests.pm index 7a5ec0fda..cb25fdfc9 100644 --- a/centreon-plugins/apps/apache/serverstatus/mode/requests.pm +++ b/centreon-plugins/apps/apache/serverstatus/mode/requests.pm @@ -40,7 +40,7 @@ use base qw(centreon::plugins::mode); use strict; use warnings; -use LWP::UserAgent; +use apps::apache::serverstatus::mode::libconnect; sub new { my ($class, %options) = @_; @@ -53,6 +53,9 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port' }, "proto:s" => { name => 'proto', default => "http" }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, @@ -88,75 +91,69 @@ sub check_options { $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 $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout}); + + my $webcontent = apps::apache::serverstatus::mode::libconnect::connect($self); - my $response = ''; + 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/); + } + $i++; + } - if ($self->{option_results}->{proto} eq "https") { - if (defined $self->{option_results}->{proxyurl}) { - $ua->proxy(['https'], $self->{option_results}->{proxyurl}); - } - if (!defined $self->{option_results}->{port}) { - $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status'); - } else { - $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); - } - } else { - if (defined $self->{option_results}->{proxyurl}) { - $ua->proxy(['http'], $self->{option_results}->{proxyurl}); - } - if (!defined $self->{option_results}->{port}) { - $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status'); - } else { - $response = $ua->get('http://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); - } + if ($bPerReqSfx eq 'kB') { + $bPerReq = $bPerReq * 1024; + } elsif ($bPerReqSfx eq 'mB') { + $bPerReq = $bPerReq * 1024 * 1024; + } elsif ($bPerReqSfx eq 'gB') { + $bPerReq = $bPerReq * 1024 * 1024 * 1024; } - if ($response->is_success) { - - my $webcontent=$response->content; - 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/); - } - $i++; - } - - my $exit1 = $self->{perfdata}->threshold_check(value => $rPerSec, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - 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 ]); - - $self->{output}->output_add(severity => $exit, - short_msg => sprintf("RequestPerSec: %f BytesPerSecond: %d BytesPerRequest: %d", $rPerSec, $bPerSec, $bPerReq)); - $self->{output}->perfdata_add(label => "requestPerSec", - value => $rPerSec, - unit => $rPerSecSfx, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical') - ); - $self->{output}->perfdata_add(label => "bytesPerSec", - value => $bPerSec, - unit => $bPerSecSfx); - $self->{output}->perfdata_add(label => "bytesPerRequest", - value => $bPerReq, - warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-bytes'), - critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-bytes'), - unit => $bPerReqSfx); - } else { - $self->{output}->output_add(severity => 'UNKNOWN', - short_msg => $response->status_line); + if ($bPerSecSfx eq 'kB') { + $bPerSec = $bPerSec * 1024; + } elsif ($bPerSecSfx eq 'mB') { + $bPerSec = $bPerSec * 1024 * 1024; + } elsif ($bPerSecSfx eq 'gB') { + $bPerSec = $bPerSec * 1024 * 1024 * 1024; } + my $exit1 = $self->{perfdata}->threshold_check(value => $rPerSec, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); + 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 ]); + + $self->{output}->output_add(severity => $exit, + short_msg => sprintf("RequestPerSec: %f BytesPerSecond: %d BytesPerRequest: %d", $rPerSec, $bPerSec, $bPerReq)); + $self->{output}->perfdata_add(label => "requestPerSec", + value => $rPerSec, + unit => $rPerSecSfx, + warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), + critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical') + ); + $self->{output}->perfdata_add(label => "bytesPerSec", + value => $bPerSec, + unit => 'B'); + $self->{output}->perfdata_add(label => "bytesPerRequest", + 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/centreon-plugins/apps/apache/serverstatus/mode/responsetime.pm b/centreon-plugins/apps/apache/serverstatus/mode/responsetime.pm index 2a0c5b57a..d21e3a2ce 100644 --- a/centreon-plugins/apps/apache/serverstatus/mode/responsetime.pm +++ b/centreon-plugins/apps/apache/serverstatus/mode/responsetime.pm @@ -40,8 +40,8 @@ use base qw(centreon::plugins::mode); use strict; use warnings; -use LWP::UserAgent; use Time::HiRes qw(gettimeofday tv_interval); +use apps::apache::serverstatus::mode::libconnect; sub new { my ($class, %options) = @_; @@ -54,7 +54,10 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port' }, "proto:s" => { name => 'proto', default => "http" }, - "proxyurl:s" => { name => 'proxyurl' }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, + "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, "timeout:s" => { name => 'timeout', default => '3' }, @@ -84,38 +87,23 @@ sub check_options { $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 $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout}); my $timing0 = [gettimeofday]; - my $response = ''; - if ($self->{option_results}->{proto} eq "https") { - if (defined $self->{option_results}->{proxyurl}) { - $ua->proxy(['https'], $self->{option_results}->{proxyurl}); - } - if (!defined $self->{option_results}->{port}) { - $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status'); - } else { - $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); - } - } else { - if (defined $self->{option_results}->{proxyurl}) { - $ua->proxy(['http'], $self->{option_results}->{proxyurl}); - } - if (!defined $self->{option_results}->{port}) { - $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status'); - } else { - $response = $ua->get('http://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status'); - } - } + my $webcontent = apps::apache::serverstatus::mode::libconnect::connect($self); my $timeelapsed = tv_interval ($timing0, [gettimeofday]); - if ($response->is_success) { - my $webcontent=$response->content; + + if (defined $webcontent) { my @webcontentarr = split("\n", $webcontent); my $i = 0; my $ScoreBoard = ""; @@ -134,56 +122,24 @@ sub run { } $i++; } - for ($i = $PosPreBegin; $i <= $PosPreEnd; $i++) { - $ScoreBoard = $ScoreBoard . $webcontentarr[$i]; + $ScoreBoard = $ScoreBoard . $webcontentarr[$i]; } - $ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//; $ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//; - my $CountOpenSlots = ($ScoreBoard =~ tr/\.//); - my $exit = $self->{perfdata}->threshold_check(value => $timeelapsed, threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); - $self->{output}->output_add(severity => $exit, short_msg => sprintf("Response time %fs ", $timeelapsed)); $self->{output}->perfdata_add(label => "time", value => $timeelapsed, warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical')); - $self->{output}->perfdata_add(label => "open_slots", - value => $CountOpenSlots); - $self->{output}->perfdata_add(label => "waiting", - value => ($ScoreBoard =~ tr/\_//)); - $self->{output}->perfdata_add(label => "starting", - value => ($ScoreBoard =~ tr/S//)); - $self->{output}->perfdata_add(label => "reading", - value => ($ScoreBoard =~ tr/R//)); - $self->{output}->perfdata_add(label => "sending", - value => ($ScoreBoard =~ tr/W//)); - $self->{output}->perfdata_add(label => "keepalive", - value => ($ScoreBoard =~ tr/K//)); - $self->{output}->perfdata_add(label => "dns_lookup", - value => ($ScoreBoard =~ tr/D//)); - $self->{output}->perfdata_add(label => "closing", - value => ($ScoreBoard =~ tr/C//)); - $self->{output}->perfdata_add(label => "logging", - value => ($ScoreBoard =~ tr/L//)); - $self->{output}->perfdata_add(label => "gracefuly_finished", - value => ($ScoreBoard =~ tr/G//)); - $self->{output}->perfdata_add(label => "idle_cleanup_worker", - value => ($ScoreBoard =~ tr/I//)); - $self->{output}->perfdata_add(label => "open_slots_without_process", - value => ($ScoreBoard =~ tr/R//)); - } else { - $self->{output}->output_add(severity => 'UNKNOWN', - short_msg => $response->status_line); - } + } - $self->{output}->display(); - $self->{output}->exit(); + $self->{output}->display(); + $self->{output}->exit(); } 1; diff --git a/centreon-plugins/apps/apache/serverstatus/mode/slotstates.pm b/centreon-plugins/apps/apache/serverstatus/mode/slotstates.pm index 7ef99df41..f23e406d6 100644 --- a/centreon-plugins/apps/apache/serverstatus/mode/slotstates.pm +++ b/centreon-plugins/apps/apache/serverstatus/mode/slotstates.pm @@ -40,7 +40,7 @@ use base qw(centreon::plugins::mode); use strict; use warnings; -use LWP::UserAgent; +use apps::apache::serverstatus::mode::libconnect; sub new { my ($class, %options) = @_; @@ -53,6 +53,9 @@ sub new { "hostname:s" => { name => 'hostname' }, "port:s" => { name => 'port' }, "proto:s" => { name => 'proto', default => "http" }, + "credentials" => { name => 'credentials' }, + "username:s" => { name => 'username' }, + "password:s" => { name => 'password' }, "proxyurl:s" => { name => 'proxyurl' }, "warning:s" => { name => 'warning' }, "critical:s" => { name => 'critical' }, @@ -84,97 +87,74 @@ sub check_options { $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 $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout}); - my $response = ''; - if ($self->{option_results}->{proto} eq "https") { - if (defined $self->{option_results}->{proxyurl}) { - $ua->proxy(['https'], $self->{option_results}->{proxyurl}); + 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; + + while (($i < @webcontentarr) && ((!defined($PosPreBegin)) || (!defined($PosPreEnd)))) { + if (!defined($PosPreBegin)) { + if ( $webcontentarr[$i] =~ m/
/i ) {
+                $PosPreBegin = $i;
         }
-        if (!defined $self->{option_results}->{port}) {
-            $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status');
-        } else  {
-            $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status');
-        }
-    } else {
-        if (defined $self->{option_results}->{proxyurl}) {
-            $ua->proxy(['http'], $self->{option_results}->{proxyurl});
-        }
-        if (!defined $self->{option_results}->{port}) {
-            $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status');
-        } else  {
-            $response = $ua->get('http://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status');
+        if (defined($PosPreBegin)) {
+            if ( $webcontentarr[$i] =~ m/<\/pre>/i ) {
+                $PosPreEnd = $i;
+            }
         }
+        $i++;
     }
 
-    if ($response->is_success) {
-        my $webcontent=$response->content;
-        my @webcontentarr = split("\n", $webcontent);
-        my $i = 0;
-        my $ScoreBoard = "";
-        my $PosPreBegin = undef;
-        my $PosPreEnd = undef;
-        
-        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 $CountOpenSlots = ($ScoreBoard =~ tr/\.//);
-
-        my $exit = $self->{perfdata}->threshold_check(value => $CountOpenSlots,
-                                                      threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
-
-        $self->{output}->output_add(severity => $exit,
-                                    short_msg => sprintf("Free slots: %d", $CountOpenSlots));
-        $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'));
-        $self->{output}->perfdata_add(label => "waiting",
-                value => ($ScoreBoard =~ tr/\_//));
-        $self->{output}->perfdata_add(label => "starting",
-                value => ($ScoreBoard =~ tr/S//));
-        $self->{output}->perfdata_add(label => "reading",
-                value => ($ScoreBoard =~ tr/R//));
-        $self->{output}->perfdata_add(label => "sending",
-                value => ($ScoreBoard =~ tr/W//));
-        $self->{output}->perfdata_add(label => "keepalive",
-                value => ($ScoreBoard =~ tr/K//));
-        $self->{output}->perfdata_add(label => "dns_lookup",
-                value => ($ScoreBoard =~ tr/D//));
-        $self->{output}->perfdata_add(label => "closing",
-                value => ($ScoreBoard =~ tr/C//));
-        $self->{output}->perfdata_add(label => "logging",
-                value => ($ScoreBoard =~ tr/L//));
-        $self->{output}->perfdata_add(label => "gracefuly_finished",
-                value => ($ScoreBoard =~ tr/G//));
-        $self->{output}->perfdata_add(label => "idle_cleanup_worker",
-                value => ($ScoreBoard =~ tr/I//));
-    } else {
-        $self->{output}->output_add(severity => 'UNKNOWN',
-                                    short_msg => $response->status_line);
+    for ($i = $PosPreBegin; $i <= $PosPreEnd; $i++) {
+        $ScoreBoard = $ScoreBoard . $webcontentarr[$i];
     }
+  
+    $ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//;
+    $ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//;
+
+    my $CountOpenSlots = ($ScoreBoard =~ tr/\.//);
+
+    my $exit = $self->{perfdata}->threshold_check(value => $CountOpenSlots,
+                                                 threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
+
+    $self->{output}->output_add(severity => $exit,
+                                short_msg => sprintf("Free slots: %d", $CountOpenSlots));
+    $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'));
+    $self->{output}->perfdata_add(label => "waiting",
+            value => ($ScoreBoard =~ tr/\_//));
+    $self->{output}->perfdata_add(label => "starting",
+            value => ($ScoreBoard =~ tr/S//));
+    $self->{output}->perfdata_add(label => "reading",
+            value => ($ScoreBoard =~ tr/R//));
+    $self->{output}->perfdata_add(label => "sending",
+            value => ($ScoreBoard =~ tr/W//));
+    $self->{output}->perfdata_add(label => "keepalive",
+            value => ($ScoreBoard =~ tr/K//));
+    $self->{output}->perfdata_add(label => "dns_lookup",
+            value => ($ScoreBoard =~ tr/D//));
+    $self->{output}->perfdata_add(label => "closing",
+            value => ($ScoreBoard =~ tr/C//));
+    $self->{output}->perfdata_add(label => "logging",
+            value => ($ScoreBoard =~ tr/L//));
+    $self->{output}->perfdata_add(label => "gracefuly_finished",
+            value => ($ScoreBoard =~ tr/G//));
+    $self->{output}->perfdata_add(label => "idle_cleanup_worker",
+            value => ($ScoreBoard =~ tr/I//));
 
     $self->{output}->display();
     $self->{output}->exit();
diff --git a/centreon-plugins/apps/apache/serverstatus/mode/workers.pm b/centreon-plugins/apps/apache/serverstatus/mode/workers.pm
index ebe83544e..c49cad96a 100644
--- a/centreon-plugins/apps/apache/serverstatus/mode/workers.pm
+++ b/centreon-plugins/apps/apache/serverstatus/mode/workers.pm
@@ -41,6 +41,7 @@ use base qw(centreon::plugins::mode);
 use strict;
 use warnings;
 use LWP::UserAgent;
+use apps::apache::serverstatus::mode::libconnect;
 
 sub new {
     my ($class, %options) = @_;
@@ -85,67 +86,71 @@ sub check_options {
 
 sub run {
     my ($self, %options) = @_;
-    my $ua = LWP::UserAgent->new( protocols_allowed => ['http','https'], timeout => $self->{option_results}->{timeout});
-    
-    my $response = '';
-    
-    if ($self->{option_results}->{proto} eq "https") {
-        if (defined $self->{option_results}->{proxyurl}) {
-            $ua->proxy(['https'], $self->{option_results}->{proxyurl});
-        }
-        if (!defined $self->{option_results}->{port}) {
-            $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status');
-        } else  {
-            $response = $ua->get('https://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status');
-        }
-    } else {
-        if (defined $self->{option_results}->{proxyurl}) {
-            $ua->proxy(['http'], $self->{option_results}->{proxyurl});
-        }
-        if (!defined $self->{option_results}->{port}) {
-            $response = $ua->get($self->{option_results}->{proto}."://" .$self->{option_results}->{hostname}.'/server-status');
-        } else  {
-            $response = $ua->get('http://'.$self->{option_results}->{hostname}.':'.$self->{option_results}->{port}.'/server-status');
-        }
-    }
-
-    if ($response->is_success) {   
-        my $BusyWorkers;
-        my $IdleWorkers;
-        my $webcontent=$response->content;
-        my @webcontentarr = split("\n", $webcontent);
-        my $i = 0;
-        my $prct_busy=0;
-
-        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++;
-        }
         
-        $prct_busy = $BusyWorkers / ($BusyWorkers + $IdleWorkers) * 100;
+    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;    
     
-        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);
-        $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'));
-    } else {
-        $self->{output}->output_add(severity => 'UNKNOWN',
-                                    short_msg => $response->status_line);
+    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;
 
 
@@ -153,7 +158,7 @@ __END__
 
 =head1 MODE
 
-Check Apache WebServer Workers and Open Slots
+Check Apache WebServer busy processes. Graph Busy and Idle. Compute percentage over ServerLimit apache config file directive.
 
 =over 8
 
diff --git a/centreon-plugins/network/cisco/WAAS/mode/transport.pm b/centreon-plugins/network/cisco/WAAS/mode/transport.pm
new file mode 100644
index 000000000..23c896c45
--- /dev/null
+++ b/centreon-plugins/network/cisco/WAAS/mode/transport.pm
@@ -0,0 +1,145 @@
+################################################################################
+# 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 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 : Simon Bomm  & Quentin Garnier 
+#
+####################################################################################
+
+package network::cisco::WAAS::mode::sessions;
+
+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 =>
+                                {
+                                  "warning:s"       => { name => 'warning', default => '' },
+                                  "critical:s"      => { name => 'critical', default => '' },
+                                });
+
+    return $self;
+}
+
+sub check_options {
+    my ($self, %options) = @_;
+    $self->SUPER::init(%options);
+    
+    $self->{warning} = $self->{option_results}->{warning};
+    $self->{critical} = $self->{option_results}->{critical};
+    
+    if (($self->{perfdata}->threshold_validate(label => 'warning', value => $self->{warning})) == 0) {
+       $self->{output}->add_option_msg(short_msg => "Wrong warning % threshold '" . $self->{warning} . "'.");
+       $self->{output}->option_exit();
+    }
+    if (($self->{perfdata}->threshold_validate(label => 'critical', value => $self->{critical})) == 0) {
+       $self->{output}->add_option_msg(short_msg => "Wrong critical % threshold'" . $self->{critical} . "'.");
+       $self->{output}->option_exit();
+	}
+}
+
+sub run {
+    my ($self, %options) = @_;
+    # $options{snmp} = snmp object
+    $self->{snmp} = $options{snmp};
+    
+    if ($self->{snmp}->is_snmpv1()) {
+           $self->{output}->add_option_msg(short_msg => "Need to use SNMP v2c or v3.");
+           $self->{output}->option_exit();
+    }
+
+#   Nombre de licences
+    my $oid_cwoTfoStatsMaxActiveConn = '.1.3.6.1.4.1.9.9.762.1.2.1.3.0';
+#   Nombre de sessions optimized
+    my $oid_cwoTfoStatsActiveOptConn = '.1.3.6.1.4.1.9.9.762.1.2.1.2.0';
+#   Nombre de session pass-through (non-optimized)
+    my $oid_cwoTfoStatsActivePTConn = '.1.3.6.1.4.1.9.9.762.1.2.1.10.0';
+
+    my $result = $self->{snmp}->get_leef(oids => [$oid_cwoTfoStatsMaxActiveConn, $oid_cwoTfoStatsActiveOptConn,
+                                                  $oid_cwoTfoStatsActivePTConn], nothing_quit => 1);
+
+    my $prct = $result->{$oid_cwoTfoStatsActiveOptConn} / $result->{$oid_cwoTfoStatsMaxActiveConn} * 100;
+    
+    my $abs_warning = $self->{perfdata}->get_perfdata_for_output(label => 'warning') / 100 * $result->{$oid_cwoTfoStatsMaxActiveConn};
+    my $abs_critical = $self->{perfdata}->get_perfdata_for_output(label => 'critical') / 100 * $result->{$oid_cwoTfoStatsMaxActiveConn};
+    
+    my $exit = $self->{perfdata}->threshold_check(value => $prct,
+                                        threshold => [ { label => 'critical', 'exit_litteral' => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]);
+
+    $self->{output}->output_add(severity => $exit,
+                                short_msg => sprintf("Passthrough_connections: %d Optimized_connections: %d / %d licences",
+                                                     $result->{$oid_cwoTfoStatsActivePTConn}, $result->{$oid_cwoTfoStatsActiveOptConn}, $result->{$oid_cwoTfoStatsMaxActiveConn})
+				);
+
+    $self->{output}->perfdata_add(label => "Passthrough_connections", unit => 'con',
+                                  value => $result->{$oid_cwoTfoStatsActivePTConn});
+    $self->{output}->perfdata_add(label => "Optimized_connections", unit => 'con',
+                                  value => $result->{$oid_cwoTfoStatsActiveOptConn},
+                                  warning => $abs_warning,
+                                  critical => $abs_critical,
+                                  min => 0,
+				  max => $result->{$oid_cwoTfoStatsMaxActiveConn});
+    
+    $self->{output}->display();
+    $self->{output}->exit();
+
+}
+
+1;
+
+__END__
+
+=head1 MODE
+
+Check optimized and passthrough sessions on Cisco WAAS equipments against total number of licence (CISCO-WAN-OPTIMIZATION-MIB).
+
+=over 8
+
+=item B<--warning>
+
+Threshold warning: Percentage value of passthrough sessions resulting in a warning state
+
+=item B<--critical-average>
+
+Threshold critical: Percentage value of passthrough sessions resulting in a critical state
+
+=back
+
+==cut
+
+
+    
diff --git a/centreon-plugins/network/cisco/WAAS/plugin.pm b/centreon-plugins/network/cisco/WAAS/plugin.pm
new file mode 100644
index 000000000..b8dbb6980
--- /dev/null
+++ b/centreon-plugins/network/cisco/WAAS/plugin.pm
@@ -0,0 +1,67 @@
+################################################################################
+# 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 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 
+#
+####################################################################################
+
+package network::cisco::WAAS::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;
+    # $options->{options} = options object
+
+    $self->{version} = '0.5';
+    %{$self->{modes}} = (
+                        'cpu' => 'network::cisco::common::mode::cpu', 
+			'sessions' => 'network::cisco::WAAS::mode::transport',
+			'memory' => 'network::cisco::common::mode::memory',
+			'traffic' => 'snmp_standard::mode::traffic' 
+                         );
+
+    return $self;
+}
+
+1;
+
+__END__
+
+=head1 PLUGIN DESCRIPTION
+
+Check Cisco WAAS Hardware Family in SNMP.
+
+=cut
diff --git a/centreon-plugins/snmp_standard/mode/loadaverage.pm b/centreon-plugins/snmp_standard/mode/loadaverage.pm
index 3fd28a90c..7abd28836 100644
--- a/centreon-plugins/snmp_standard/mode/loadaverage.pm
+++ b/centreon-plugins/snmp_standard/mode/loadaverage.pm
@@ -97,7 +97,7 @@ sub run {
     my $oid_CpuLoad5m = '.1.3.6.1.4.1.2021.10.1.3.2';
     my $oid_CpuLoad15m = '.1.3.6.1.4.1.2021.10.1.3.3';
 
-    my $result = $self->{snmp}->get_leef(oids => [$oid_CpuLoad1m, $oid_CpuLoad5m, $oid_CpuLoad15m]);
+    my $result = $self->{snmp}->get_leef(oids => [$oid_CpuLoad1m, $oid_CpuLoad5m, $oid_CpuLoad15m], nothing_quit => 1);
     
     my $exit1 = $self->{perfdata}->threshold_check(value => $result->{$oid_CpuLoad1m}, 
                                threshold => [ { label => 'crit1', 'exit_litteral' => 'critical' }, { label => 'warn1', exit_litteral => 'warning' } ]);