From 07340426fa9536322eaf5300561c5dae3745f9a4 Mon Sep 17 00:00:00 2001 From: Simon Bomm Date: Tue, 4 Mar 2014 16:27:05 +0100 Subject: [PATCH] Better error catch and connect library --- .../apache/serverstatus/mode/libconnect.pm | 83 ++++++++++ .../apps/apache/serverstatus/mode/requests.pm | 115 +++++++------- .../apache/serverstatus/mode/responsetime.pm | 78 +++------- .../apache/serverstatus/mode/slotstates.pm | 144 ++++++++---------- .../apps/apache/serverstatus/mode/workers.pm | 113 +++++++------- 5 files changed, 277 insertions(+), 256 deletions(-) create mode 100644 centreon-plugins/apps/apache/serverstatus/mode/libconnect.pm 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