• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Nagios nutzen um über PHP - Skripte andere Server zu testen

rossixx

Newbie
Hallo, mein Ziel

ein PHP - Skript, das als Check in Nagios eingebunden wird und über die CURL - Funktion eine PHP - Skript auf einem anderen Server aufruft.

So soll nicht direkt vom Nagios-Server getestet werden sondern von da aus wo das andere Skript untergebracht ist.

Vielleicht so nagios_server.de ruft PHP-Skripe auf host.co.uk teste server.cn und server.de

Sinn soll sein von verschiedenen Ländern zu testen, ob eine Server erreichbar ist, bzw. die angefragten Dienste laufen.

Schwere Übung, aber vielleicht hat einer eine Idee ???
 

Leviathan

Hacker
Auf dem Nagiosserver rufst du einfach ein PHP Script auf, dass per CURL auf einen Fremdserver zugreift und wertest den das Ergebnis einfach aus.
Per exit(0,1,2) gibst du den Rückgabewert an Nagios zurueck.

Alternativ dazu, führst du das Plugin lokal auf den Servern aus und schickst per NSCA das ergebnis an den Nagiosserver zurueck.

Gruß Dominik
 
OP
R

rossixx

Newbie
erstmal ohne nagios nur zum verständnis :

Code:
<?php
// auf den entfernten rechner zugreifen

$ch = curl_init("http://www.mein rehcner.com/");
$fp = fopen("erstmal_hier_speichern.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);

// schliessen 
curl_close($ch);
fclose($fp);
?>

das greift dann auf das zu, liegt auf meinem server in der index.php :
Code:
<?
$stats = @exec("uptime");
echo $stats;
$loadavg = @file("/proc/loadavg");
$loadavg = @explode(" ",$loadavg[0]);
$load = $loadavg[0];
echo $load ;
$last_line = @system('uptime', $retval);
?>

soweit so gut, in die datei der das ganze aufruft landet auch die server-load-zeit.

wenn ich das bis hierher richtig verstanden habe.

aber irgendwie muß das doch auch einfacher gehen.

wie meinst du das mit den rückgabewerten ????[/code]
 

Leviathan

Hacker
Das geht mit PHP nur so. Einfacher (sehr viel einfacher) per NRPE und NSCA. Wenns dir nur um bunte Bilder geht, guck dir mal Cacti und serverstats an.

So ich werde eben abgeholt, ich schreib morgen noch was dazu.,

Gruß Dominik
 
OP
R

rossixx

Newbie
ich will eigentlich nur eine antwort vom angefragten server : ja ich funktioniere oder nein ich funktioniere nicht.

klar das geht auch mit nagios, aber ich will erstmal etwas kleines eigenes bauen / verstehen und dann mal schaun, wie und was ich mit nagios anstellen kann.

und da sind meine zwei skripte ja schon ein anfang in die richtige richtung, nur fehlt mir die idee, wie weiter oder wie besser machen

vor allem einfacher.
 

Leviathan

Hacker
Bei mir laeufts so:

Code:
<?php

$url="http://analyzer/getinfo.php";

function GetCurlPage ($pageSpec) {
    $ch = curl_init($pageSpec);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $tmp = curl_exec ($ch);
    curl_close ($ch);
    return $tmp;
}

$return=GetCurlPage($url);

$loadavg = @explode(" ",$return);
$load = $loadavg[15];

if ( $load > 1 ) {
        echo "Last groesser als 1 ($load%)";
        exit (2);
}
else
{
        echo "Last normal bei: $load%";
        exit (0);
}
?>


getinfo.php auf dem Analyzer ist:

Code:
<?php
$last_line = @system('uptime', $retval);

?>
 
OP
R

rossixx

Newbie
http://selfphp.com/kochbuch/kochbuch.php?code=65

wo sonst als im selfphp.... hätte ich auch mal früher drauf kommen können....



Code:
function pingSite($webserver) 
{ 

   foreach ($webserver as $key => $host) 
	{ 
   
		$fp = curl_init($host['url']);
		
		curl_setopt($fp,CURLOPT_TIMEOUT,10);
		
		curl_setopt($fp,CURLOPT_FAILONERROR,1);
		
		curl_setopt($fp,CURLOPT_RETURNTRANSFER,1);
		
		curl_exec($fp);
		
		if (curl_errno($fp) != 0)  
		{ 
			$webserver[$key]['status'] = false;
		} 
		else  
		{ 
			$webserver[$key]['status'] = true;
		} 
		
		curl_close($fp);
   
	}
	
	return $webserver;

}  

$pictureOnline = 'sonne_1.pnp';
$pictureOffline = 'sonne_0.png';

$webserver[0]['name'] = 'bigpoint.de';
$webserver[0]['url'] = 'http://www.bigpoint.de';

$webserver[1]['name'] = 'rassloff.info';
$webserver[1]['url'] = 'http://www.rassloff.info';

$webserver[2]['name'] = 'google.com';
$webserver[2]['url'] = 'http://www.google.com';

$webserver[3]['name'] = 'google.cn';
$webserver[3]['url'] = 'http://google.cn';

$webserver = pingSite($webserver);
?>
<html>
<head>
<title>Downloads</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="formStyle.css" rel="stylesheet" type="text/css">
</head>

<body>
<?PHP
foreach ($webserver as $key => $host) 
{ 
   if(!$host['status'])
   {
    echo '<img src="sonne_0.png"  align="absmiddle">  ';
    echo 'Name: ' . $host['name'] . ' ';
    echo '(Offline: ' . $host['url'] . ')<br><br>';
   }
   else
   {
   	echo '<img src="sonne_1.png"  align="absmiddle">  ';
    echo '<a href="'.$host['url'].'" target="_blank">' . $host['name'] . '</a> ';
    echo '<br><br>';
   }
}  

?>
</body>
</html>
 
OP
R

rossixx

Newbie
folgendem skript übergibt man in der konsole einen host und ein checkwert, oder per nagios, je nach dem....


Code:
#!/usr/bin/php
<?php

$url   = $_SERVER['argv'][1];
$check = $_SERVER['argv'][2];
$host  = $_SERVER['argv'][3];


$url = $host ;

$ch = curl_init() ;
curl_setopt($ch, CURLOPT_URL, "http://meinserver.net/test.php?host=$host&check=$check") ;
curl_setopt($ch, CURLOPT_HEADER, 0) ;

$res = curl_exec($ch) ;

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch) ;

curl_close($ch) ;

$res = trim( str_replace (array("\n", "<br>", "<br />"  ),array('','',''), $res )) ;

$check_x = 0 ;

if ( $res == $check_x ) {
  echo "HTTP OK : alles OK   r= $res \n" ;
  exit (0) ;
}
elseif ( $res == 1 ) {
  echo "HTTP WARNING : nicht  alles OK  r=$res \n" ;
  exit (1) ;
}
?>

das skript gib es dann weiter auf den anderen server / skript unten, dieses checkt dann den server, was man an das erste übergeben hat. so kann man seinen eigenen oder einen oder mehrere andere server testen. auf funktion und erreichbarkeit.

Code:
<?php
if ($host==0)$host = $_GET['host'] ;
if ($check==0)$check = $_GET['check'];

$ch = curl_init($host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
if (curl_errno($ch) !=0){
  $err = "fehler";
}
else{
  $err = "super";
}
curl_close($ch);
$res = trim(str_replace(array("\n", "<br>", "<br />"), array('', '', ''), $res));

if ($res != $check) {
    //echo "HTTP CRITICAL: nicht alles OOOOOOOK  c=$check h=$host DREI=$err  r=$res  \n";
      echo "1";
    exit (1);
}
else {
  //echo "HTTP OK: alles ok\n";
  echo "0" ;
  exit (0) ;
}
?>

für testzwecke immer erstmal in der konsole checken, dann erst im nagios
 
Oben