Nagios check_http en regexp

Pagina: 1
Acties:

  • Ierlandfan
  • Registratie: Augustus 2002
  • Laatst online: 21:33
Wat ik wil in Nagios en wat handmatig werkt:


code:
1
2
3
GET IPADRESS/link-naar-status-pagina
Insert Login. login
Insert password pasword

Ik kan daar de status =UP (of niet) zien.
(Er is geen snmp of (veilige) telnet functie voor beschikbaar in het apparaat, de user login heeft RO rechten)
Dit werkt dus.

wat niet werkt:

code:
1
2
Check_HTTP -a login:password -commando link-naar-staus-pagina -commando-voor-regexp=down
(Als status down dan report=critical)


Hij logt namelijk niet in op die manier. Geen basic authenticatie en dat is alles wat check_http kan.

Dus dacht ik:
Ik bouw handmatig een script dat de GET functie en het inloggen verzorgt. Dat lukt.

Alleen hoe bouw ik daar een
code:
1
2
3
4
regexp=$string 
if $string=match
then report status=critical if $string=no-match
then report status=OK! in?


in?

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

Geen ervaring met Nagios, maar het netste leukt me "expect":

iets van (pseudo-code) :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spawn telnet $hostname

expect {
   timeout                               {exit 1}
   "Geen reactie"    {exit 2}
   "login: "                             {send -- "$user\r"}
   }
expect {
   timeout                               {exit 1}
   "password: "                             {send -- "$pass\r"}
   }

expect {
   timeout                               {exit 1}
   "[user@hostname]"               {send -- "/bin/getinfo\r"}
   }


En dan in het shellscript:

code:
1
$OUPUTVANSYSTEEM = ./script.expect

We are pentium of borg. Division is futile. You will be approximated.


  • Kokkers
  • Registratie: Oktober 2000
  • Laatst online: 18:56
Hoe regular expressions werken in jouw scripttaal naar keuze (die je voor het gemak niet noemt) kun je prima zelf uitzoeken. Voorbeelden in overvloed te vinden op het net.

Script requests worden hier meestal niet op prijs gesteld, dit word je geacht zelf uit te kunnen zoeken.

Wat ik je wel als tip mee kan geven is dat Nagios het resultaat interpreteert aan de hand van de door jouw script gegeven 'exit code'. Hier heb ik ooit een tijdje mee zitten stoeien voordat ik hier achter was.
bron: http://www.knudde.be/inde...ge_name=monitoring&page=7

Natuurlijk bestaat er niet voor alles een gepaste plugin a.k.a. monitor script.
Wegens het open karakter van Nagios is het zeer eenvoudig om zelf een plugin te schrijven, en daarover gaat dan ook dit deel van deze tekst.

Nagios voert een pluging uit. De plugin doet zijn ding en de exit code bepaalde de status:

0: OK
1: Warning
2: Critical
3: Unknown
Je kan een regel tekst meegeven die dan ook getoond zordt door Nagios, dit is meestal de reden waarom een bepaalde service zich in een bepaalde staat bevind.

Om aan performance monitoring te doen, gebruik je een pipe symbool, ¦, in de output, gevolgd door de performance waarden.
Meer informatie vind je in de, goede en zeer volledige, Nagios documentatie

Een goede plugin begint met het denkwerk: Wat wil ik meten, en welke manier is daar het meest geschikt voor.

Eens je daar uit bent, kun je beginnen met het schrijven van de check. Je kan best de volgende wenken in acht nemen:

In het begin ga je er van uit dat de status "critical" is.
Je voert het commando uit dat je gebruikt om de meting te doen. Je hebt de manual gelezen en weet welke exit codes het commando kan geven. Je script kan ze allemaal afhandelen.
Een fout bij het meten resulteert in een "unknown" status.
Indien je een meting hebt, ga je na of deze binnen de normen valt en ze je de overeenkomstige status: OK, warning of Critical.
Het monitoringscript geeft een duidelijke melding bij de output.
Ga na of je daadwerkelijk meet wat je denkt te meten.
Test je script!!! Je moet ervan uit gaan dat hetgeen je niet getest hebt, niet zal werken.

  • Kokkers
  • Registratie: Oktober 2000
  • Laatst online: 18:56
Goed, er lag hier nog iets op de plank wat je wellicht gedeeltelijk kan gebruiken.

Onderstaande voorbeeld is 'quick & dirty' maar met behulp van een lokaal PHP script zou je het als volgt kunnen doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/php -f
<?php
if (isset($argv[1])&&isset($argv[2])&&isset($argv[3])&&isset($argv[4]))
{
$server = $argv[1];
$port = $argv[2];
$method = $argv[3];
$path = $argv[4];

$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp) {
        echo "$errstr ($errno)\r\n";
        exit(2);
}

else {

   $out = $method." ".$path." HTTP/1.1\r\n";
   $out .= "Host: ".$server."\r\n";
   $out .= "User-Agent: Nagios-script\r\n";
   $out .= "Content-type: text/html\r\n";
   $out .= "Connection: Close\r\n\r\n";

        fwrite($fp, $out);
        $result = fgets($fp, 128);
        fclose($fp);
        }

if($result=="HTTP/1.0 200 OK\r\n"||$result=="HTTP/1.1 200 OK\r\n"){
        echo "HTTP OK\r\n";
        exit(0);
        }

else{
//        echo "Invalid HTTP response received from $server on port ".$port."\r\n";
        echo $result;
        exit(2);
        }
}
else{
echo "*Not enough arguments specified*\n";
echo "Usage: check_httpmethod *server *port *method *path\n";
echo "Example: \"check_customhttp www.tweakers.net 80 GET /check.txt\"\n";
}
exit(3);
?>


Ik heb een paar regels uit het script moeten verwijderen maar het idee is duidelijk volgens mij.

Hoe jij het oplost in Perl, PHP, Python of Bash moet je zelf weten :).

[ Voor 8% gewijzigd door Kokkers op 04-07-2008 16:19 ]


  • Ierlandfan
  • Registratie: Augustus 2002
  • Laatst online: 21:33
Script requests worden hier meestal niet op prijs gesteld, dit word je geacht zelf uit te kunnen zoeken
Dat was een beetje overbodig om te vermelden aangezien ik niet vroeg of iemand een script voor me wilde schrijven. Ik vroeg om een voorzetje, maar dit terzijde. Dat van de status codes weet ik, is dan ook geen probleem. Het probleem was een opzetje voor de regexp.

Ik heb iets simpel in bash (sh) gemaakt aangezien ik dat het makkelijkste vond.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[code#!/bin/sh
# Usage: check_http_device.sh -u -s -p -h
#
#
# help_device_check() To print help
#

help_device_check()
{
  echo "Options: argument"
  echo "Usage: $0 -u -s -p -h"
    echo " -port =web interface port of device (default=80) "
  echo " -h hostname/IP"
  exit 1
}



 while getopts "p:h:u:s:vv" opt ; do
  case $opt in
    p)port="$OPTARG";;
    h)hostname="$OPTARG";;
    u)username="$OPTARG";;
    s)secret="$OPTARG";;
     \?) help_device_check;;
esac
done

output1=$(GET http://$username:$secret@$link-naar-status-gateway=SIP $port
echo $output1  //  ###tijdelijke debug


Hierbij moet dus het stukje regexp.