Еще горстка материалов:

Оповещение о фактах добавления/удаления хостов в системе Nagios

Оповещение о фактах добавления/удаления хостов в системе Nagios

Имеем в Nagios контактную группу, например kds. Когда пользователь, допустим kds-nagios-agent, входящий в группу kds, авторизовывается, то он будет видеть только те хосты и сервисы, которые разрешены в его группе.

Задача: сделать так, чтобы когда появляется или удаляется хост в системе Nagios пользователю приходило уведомление, что теперь ему доступен (или удален из его группы) новый хост для мониторинга.

У Nagios есть cgi скрипт который выводит в формате csv детализацию по хостам. Значит необходимо только распарсить сей вывод. Итого имеем скрипт:

 #!/usr/bin/perl -w

use strict;
use LWP::UserAgent;
use IO::Socket::SSL;
my @hostname = '';
my @host;
my $filename_first = '/var/spool/nagios/nagios_file_1';
my $filename_second = '/var/spool/nagios/nagios_file_2';

$ENV{PERL_LWP_SSL_CA_FILE} = "/etc/ssl/certs/ca-hostcomm.pem";
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
my $browser = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0,
        SSL_verify_mode => SSL_VERIFY_NONE, 
        protocols_allowed => ['http', 'https'] },
 );

$browser->timeout(60);

$browser->credentials(
        'nagios.net.local:443',
        'NAGIOS',
      "kds-nagios-agent" => "password",
  );

my $url = 'https://nagios.net.local/nagios/cgi-bin/status.cgi?style=hostdetail&csvoutput';
my $response = $browser->get($url);

my @rows = split /\n/, $response->content;
shift @rows;
foreach my $string (@rows)
        {
        if ($string =~ /((')(.+?)('))/g) 
                {
                #print "$1\n";
                push @hostname,$1;
                }
        }

if ( scalar @hostname <= 1 ) {exit}
if(-e $filename_first) 
        {
        open(Fwrite, ">$filename_second");
        foreach (@hostname) {
         #print "$_\n"; 
        print Fwrite "$_\n";
                }
        close Fwrite;
        } else
                {
                open(Fwrite, ">$filename_first");
                
                foreach (@hostname) 
                        {
                        #print "$_\n"; 
                        print Fwrite "$_\n";
                        }
                close Fwrite;
                }


open(InFile2, "$filename_second") || die;
open(InFile1, "$filename_first") || die;
my @second=<InFile2>;my @first=<InFile1>;
foreach my $f2 (@second)
        {
        if (my $found = grep $f2 eq $_, @first) {
        #print "Ok\n";
        }
        else 
        {
                #print "$f1";
                print "Add host: $f2";
                push @host,"Add host: $f2";
                }
        }
foreach my $f1 (@first)
        {
        if (my $found = grep $f1 eq $_, @second) {
        #print "Ok\n";
        }
        else 
        {
                #print "$f1";
                print "Delete $f1";
                push @host,"Delete host: $f1";
                }
        }       
`mv $filename_second $filename_first`;


if ( scalar @host >= 1) {
my $sendmail  = "From: <root\@local.net>\r\n";
$sendmail .= "To: kds\@local.net\r\n";
$sendmail .= "Content-Type: multipart/mixed;\r\n boundary=\"------------070906020907000407080503\"\r\n";
$sendmail .= "Subject: Change in the hosts\r\n";

$sendmail .= "\r\nThis is a multi-part message in MIME format.
--------------070906020907000407080503
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit\r\n\r\n";
$sendmail .= "@host\r\n";
# Reporting possible errors


open SENDMAIL, "| sendmail -t";
print SENDMAIL $sendmail;

close SENDMAIL;
}

 

 

Обновлено 05.04.2016 15:36

unix-way