Оповещение о фактах добавления/удаления хостов в системе 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