czwartek, 25 października 2012

Powiadomienia w Nagios dla managera

Poniżej skrypt w PHP, pozwalający wysyłać powiadomienia dla menagerów z usług i hostów monitorowanych w Nagios, które nie zostały naprawione w zadanym czasie przez techników odpowiedzialnych za dane urządzenia.
3 pliczki  PHP, 4 wpisy do cron'a. Ciach bach i gotowe :)

Greetz dla Łukasza K. za pomysł ;)

Skrypty check_nagios_host.php i check_nagios_services.php mają za zadanie parsować  plik Nagiosa /usr/local/nagios/var/status.dat pod  kątem czasu ostatniego poprawnego działania hosta lub usługi.
last_time_up - dla hosta
last_time_ok - dla usługi

Jeśli host nie działa dłużej niż 40000 (timestamp) to skrypt, kieruję sprawę do zbiorczego maila i wysyła do managera.

Skrypt został zatwierdzony i dodany do katalogu Nagios Exchange
http://exchange.nagios.org/directory/Plugins/Notifications/notifications-for-manager/details

Link do źródeł http://sourceforge.net/projects/nagiosnotifi/

Poniżej źródła skryptów.



Plik check_nagios_host.php:

<?php
include("daty.php");
$plik = file_get_contents('/usr/local/nagios/var/status.dat');
 $klamra = explode("hoststatus {",$plik);
$ile = count($klamra);
$messages ="";
for($i=0;$i<=$ile;$i++)
{
$regex_hostname = '/host_name=(.*)/';
@preg_match($regex_hostname, $klamra[$i], $matches_hostname);

$regex_time = '/last_time_up=(.*)/';
@preg_match($regex_time, $klamra[$i], $matches_time);

$data1=time();
@$data2=date("Y-m-d H:i:s",$matches_time[1]);

if(strlen(@$matches_hostname[1])>2)
{

$roznica_czas =  $diff = dateDiff("now", $data2) . "\n"; // NORMANY CZAS
@$roznica_timestamp =  strtotime(" +".$diff, $data2) . "\n"; // CZAS W TIMESTAMP
if($roznica_timestamp >40000)
{
echo 'ALARM ALARM ALARM';
echo "\n".$matches_hostname[1];
echo "\n".'NIE DZIALA OD: '.$roznica_czas;

$message .= "- Host $matches_hostname[1] nie dziala od $roznica_czas. \n";
}
}

}

$to     = 'mail@mail.com';
$subject = 'Powiadomienie menadzerskie - SYSTEM MONITORINGU NAGIOS';
$message .= "\nProsze o reakcje!!! ";
$headers = 'From: nagios@mail.com' . "\r\n" .
   'Reply-To: nagios@mail.com' . "\r\n" .
   'X-Mailer: PHP/' . phpversion();

if(mail($to, $subject, $message, $headers))
  {
     echo "\n Wiadomosc zostala wyslana \n";
  }

?>


Plik check_nagios_service.php

<?php
include("daty.php");
$plik = file_get_contents('/usr/local/nagios/var/status.dat');
 $klamra = explode("servicestatus {",$plik);
$ile = count($klamra);

$messages = "";

for($i=0;$i<=$ile;$i++)
{
$regex_hostname = '/host_name=(.*)/';
@preg_match($regex_hostname, $klamra[$i], $matches_hostname);

$regex_time = '/last_time_ok=(.*)/';
@preg_match($regex_time, $klamra[$i], $matches_time);

$data1=time();
@$data2=date("Y-m-d H:i:s",$matches_time[1]);

if(strlen(@$matches_hostname[1])>2)
{

$roznica_czas =  $diff = dateDiff("now", $data2) . "\n"; // NORMANY CZAS
@$roznica_timestamp =  strtotime(" +".$diff, $data2) . "\n"; // CZAS W TIMESTAMP
if($roznica_timestamp >40000)
{
echo 'ALARM ALARM ALARM';
echo "\n".$matches_hostname[1];
echo "\n".'NIE DZIALA OD: '.$roznica_czas;
$message .= "- Usluga $matches_hostname[1] nie dziala od $roznica_czas. \n ";

}  

}

}


$to     = 'mail@mail.com';
$subject = 'Powiadomienie menadzerskie - SYSTEM MONITORINGU NAGIOS';
$message .= "\nProsze o reakcje!!! ";
$headers = 'From: nagios@mail.com' . "\r\n" .
   'Reply-To: nagios@mail.com' . "\r\n" .
   'X-Mailer: PHP/' . phpversion();

if(mail($to, $subject, $message, $headers))
  {
     echo "\n Wiadomosc zostala wyslana \n";
  }



?>
Plik daty.php


<?php
 // SRC FROM http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/ - THX


  // Set timezone
  date_default_timezone_set("UTC");

  // Time format is UNIX timestamp or
  // PHP strtotime compatible strings
  function dateDiff($time1, $time2, $precision = 1) {
    // If not numeric then convert texts to unix timestamps
    if (!is_int($time1)) {
      $time1 = strtotime($time1);
    }
    if (!is_int($time2)) {
      $time2 = strtotime($time2);
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2
    if ($time1 > $time2) {
      $ttime = $time1;
      $time1 = $time2;
      $time2 = $ttime;
    }

    // Set up intervals and diffs arrays
    $intervals = array('year','month','day','hour','minute','second');
    $diffs = array();

    // Loop thru all intervals
    foreach ($intervals as $interval) {
      // Set default diff to 0
      $diffs[$interval] = 0;
      // Create temp time from time1 and interval
      $ttime = strtotime("+1 " . $interval, $time1);
      // Loop until temp time is smaller than time2
      while ($time2 >= $ttime) {
$time1 = $ttime;
$diffs[$interval]++;
// Create new temp time from time1 and interval
$ttime = strtotime("+1 " . $interval, $time1);
      }
    }

    $count = 0;
    $times = array();
    // Loop thru all diffs
    foreach ($diffs as $interval => $value) {
      // Break if we have needed precission
      if ($count >= $precision) {
break;
      }
      // Add value and interval
      // if value is bigger than 0
      if ($value > 0) {
// Add s if value is not 1
if ($value != 1) {
 $interval .= "s";
}
// Add value and interval to times array
$times[] = $value . " " . $interval;
$count++;
      }
    }

    // Return string with times
    return implode(", ", $times);
  }

//$data1=date("Y-m-d H:i:s","1351087201");
//$data2=date("Y-m-d H:i:s","1351086201");

//echo dateDiff($data1, $data2) . "\n";


?>


crontab -l


0 6 * * * /usr/bin/php /root/nagios_powiadomienia/check_nagios_host.php
0 18 * * * /usr/bin/php /root/nagios_powiadomienia/check_nagios_host.php

0 6 * * * /usr/bin/php /root/nagios_powiadomienia/check_nagios_service.php
0 18 * * * /usr/bin/php /root/nagios_powiadomienia/check_nagios_service.php