KsI-wiki online documents

Nagios check http header

Материал из Ksimute

Перейти к: навигация, поиск

Коробанов Сергей
Август 15, 2010

Задача. Некоторое приложение имеет статус страницу и в http header возвращает некую пару Переменная:Значение надо проверять ее наличие и соответственно оформить это в виде плагина к нагиосу.

Стандартный nagios плагин check_http не может парсить хедер. Только статус отслеживает и может в request header значения передавать всякие. Вообщем задача специфическая.

Выложил на exchange.nagios.org http://exchange.nagios.org/directory/Plugins/Websites,-Forms-and-Transactions/check_http_header/details


Вот так примерно выглядит наш злой HTML

 # /usr/lib/nagios/plugins/check_http -I server.net -p 80 -u '/URL'  -v
 GET /URL HTTP/1.0
 User-Agent: check_http/v1991 (nagios-plugins 1.4.12)
 Connection: close
 
 http://server.net:80/URL is 418 characters
 STATUS: HTTP/1.1 200 OK
 **** HEADER ****
 Server: nginx/0.7.63
 Date: Wed, 11 Aug 2010 15:09:43 GMT
 Content-Type: text/plain;charset=UTF-8
 Connection: close
 VALUE-1: 17
 VALUE-2: 1
 Content-Length: 43
 Expires: Wed, 11 Aug 2010 15:10:43 GMT
 Cache-Control: max-age=60
 **** CONTENT ****
 [{"Date":"2010-08-11","megavalue":48002051}]
 
 HTTP OK HTTP/1.1 200 OK - 418 bytes in 0.013 seconds |time=0.013146s;;;0.000000 size=418B;;;0
 # 

Ставим curl


 ksi:~# aptitude install libwww-curl-perl

Пишем скрипт:

#!/usr/bin/perl -w

use strict;
use warnings;
use WWW::Curl::Easy;
use Getopt::Std;

my $plugin_name = 'check_http_header';
my $VERSION             = '0.01';

# getopt module config
$Getopt::Std::STANDARD_HELP_VERSION = 1;

# nagios exit codes
use constant EXIT_OK            => 0;
use constant EXIT_WARNING       => 1;
use constant EXIT_CRITICAL      => 2;
use constant EXIT_UNKNOWN       => 3;

# parse cmd opts
my %opts;
getopts('vI:u:t:r:p:', \%opts);
$opts{t} = 60 unless (defined $opts{t});
$opts{u} = "/" unless (defined $opts{u});

if (not (defined $opts{I} and defined $opts{r})) {
        print "ERROR: INVALID USAGE\n";
        HELP_MESSAGE();
        exit EXIT_CRITICAL;
}


      # Setting the options
        my $curl = new WWW::Curl::Easy;

        $curl->setopt(CURLOPT_HEADER,1);
        $curl->setopt(CURLOPT_NOBODY,1);
        $curl->setopt(CURLOPT_TIMEOUT,$opts{t});

        $curl->setopt(CURLOPT_URL, "$opts{I}:$opts{p}$opts{u}");

        my $response_body;

        # NOTE - do not use a typeglob here. A reference to a typeglob is okay though.
        open (my $fileb, ">", \$response_body);
        $curl->setopt(CURLOPT_WRITEDATA,$fileb);

        # Starts the actual request
        my $retcode = $curl->perform;

        # Looking at the results...
        if ($retcode == 0) {
                my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
                # judge result and next action based on $response_code

          if ($response_body =~ m/$opts{r}/){print "OK REGEXP FOUND \n";exit EXIT_OK ;}
                else {
                print "REGEXP NOT FOUND \n"; exit EXIT_CRITICAL;
                     }
        } else {
                print("An error happened: ".$curl->strerror($retcode)." ($retcode)\n");
                exit EXIT_UNKNOWN;
        }


sub HELP_MESSAGE
{
        print <<EOHELP
        Retrieve an http/s URL and looks in its header (ACHTUNG HTTP header not content!) Output for a given text.
        Returns CRITICAL is not found, OK if found, UNKNOWN otherwise.

        --help      shows this message
        --version   shows version information

        -I              IP address or name (use numeric address if possible to bypass DNS lookup).
        -u          URL to GET

        -r <text>   regexp to match in the output of http header
        -t          Timeout in seconds to wait for the URL to load. If the page fails to l
oad,
                    $plugin_name will exit with UNKNOWN state (default 60)
        -p          Port


EOHELP
;

}

sub VERSION_MESSAGE
{
        print <<EOVM
$plugin_name v. $VERSION
Copyright 2010,  KsI  - http://ksimute.trancom.ru - Licensed under GPLv2

EOVM
;
}


Помошь по нему:

Retrieve an http/s URL and looks in its header (ACHTUNG HTTP header not content!) Output for a given text.
        Returns CRITICAL is not found, OK if found, UNKNOWN otherwise.

        --help      shows this message
        --version   shows version information

        -I              IP address or name (use numeric address if possible to bypass DNS lookup).
        -u          URL to GET
        -r <text>   regexp to match in the output of http header
        -t          Timeout in seconds to wait for the URL to load. If the page fails to l
oad,
                    check_http_header will exit with UNKNOWN state (default 60)
        -p          Port

Пример использования:

$ curl -I ksimute.trancom.ru
HTTP/1.1 301 Moved Permanently
.....
Vary: Accept-Encoding,Cookie
X-Vary-Options: Accept-Encoding;
.....
......

$ ./check_http_header.pl -I ksimute.trancom.ru -r Vary -p 80 -u / -t 20
OK REGEXP FOUND

$ ./check_http_header.pl -I ksimute.trancom.ru -r Varyddd -p 80 -u / -t 20
REGEXP NOT FOUND

Hint:

Если скрипт не заработает с ошибкой: (Service check did not exit properly) это проблема встроенного perl в nagios (embedded perl) что-то он там криво интерпретирует. Это тема баян возникает часто с perl скриптами для нагиоса. Вызывайте его следующим образом:

 define command{ 
 command_name check_header 
 command_line /usr/bin/perl /usr/lib/nagios/plugins/my/check_http_header.pl -I $HOSTADDRESS$ 
 -p 80 -u '/myurl' -r     Regexp -t 20 
 } 

i.e. Вызывайте внешний perl для интерпретации.