LINUX.ORG.RU
ФорумAdmin

Непонятки [NAGIOS] и скрипт


0

0

Сделал несложный скриптик для мониторинга железок:

################################################################

#!/usr/bin/perl -w -T

use strict;
use warnings;

use SNMP;
use Net::SNMP qw(snmp_dispatcher ticks_to_time);

my ($ROUTER,$COMMUNITY);

my %ERRORS=('OK'=>0, 'WARNING'=>1, 'CRITICAL'=>2);

if (scalar @ARGV and $ARGV[1]) {
($ROUTER,$COMMUNITY)=@ARGV;
} else {
die "Usage $0 <router> <community>\n";
}

my ($row,$code)=(0,'',3);

my ($descr,$uptime,$sysname)=('',0,'');
my $s1 = new SNMP::Session (DestHost => $ROUTER,
Community => $COMMUNITY,
Timeout => 2000000,
Retries => 3,
Version => 1);

$descr = $s1->get("sysDescr.0");

if ( defined $descr ) {

$uptime = ticks_to_time( $s1->get("sysUpTimeInstance") );
$sysname = $s1->get("sysName.0");
$row = "$sysname ( $uptime ) \" $descr \"";
$code = $ERRORS{"OK"};

} else {

$row = "HOST Alive, but I can't get information by SNMP
protocol";
$code = $ERRORS{"CRITICAL"};

}

undef $s1;

print $row;
exit ($code);

################################################################

Все работает и все Ок!

>$ ./check_device_alive.pl X.X.X.X XXX
.....
.....
>$ echo $?
0
>$

Nagios - его понимает!

Решил его немного усложнить, чтоб не опрашивать трупы и при большой нагрузке на железа снизить процент ложных срабатываний!

################################################################

#!/usr/bin/perl -w -T

use strict;
use warnings;

use SNMP;
use Net::SNMP qw(snmp_dispatcher ticks_to_time);

my ($ROUTER,$COMMUNITY);

my %ERRORS=('OK'=>0, 'WARNING'=>1, 'CRITICAL'=>2, 'UNKNOWN'=>3);

if (scalar @ARGV and $ARGV[1]) {
($ROUTER,$COMMUNITY)=@ARGV;
} else {
die "Usage $0 <router> <community>\n";
}

my ($row,$code)=(0,'',3);

if ( PingScan( $ROUTER ) eq 1 ) {

my ($descr,$uptime,$sysname)=('',0,'');
my $s1 = new SNMP::Session (DestHost => $ROUTER,
Community => $COMMUNITY,
Timeout => 2000000,
Retries => 3,
Version => 1);

$descr = $s1->get("sysDescr.0");

if ( defined $descr ) {

$uptime = ticks_to_time( $s1->get("sysUpTimeInstance") );
$sysname = $s1->get("sysName.0");
$row = "$sysname ( $uptime ) \" $descr \"";
$code = $ERRORS{"OK"};

} else {

$row = "HOST Alive, but I can't get information by SNMP protocol";
$code = $ERRORS{"WARNING"};

}

undef $s1;

} else {

$row = "HOST IS DOWN!!! ICMP UNREACHABLE";
$code = $ERRORS{"CRITICAL"};

}

print $row;
exit ($code);

sub PingScan {

use Net::Ping;

my ($host) = @_;
my ($alive) = ('0');

my $sha=Net::Ping->new("icmp");

$alive = $sha->ping($host);

undef $sha;

return $alive;

}

################################################################

И тут начинается мистика!

>$ ./check_device_alive.pl X.X.X.X XXX
.....
.....
>$ echo $?
0
>$

А Nagios - орет: NAGIOS: (Return code of 255 is out of bounds)

Т.е., он перестает видеть возвращаемый ему "0"!!!




perl --version

This is perl, v5.10.0 built for i486-linux-gnu-thread-multi

Copyright 1987-2007, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Может кто-то сталкивался, т.к. я не шибко програмист, просто скриптик нужен, а тут какой-то непонятный подводный камень, что exit (0); - как-то странно отрабатывает :*(

★★★★★

Ответ на: Re: Непонятки [NAGIOS] и скрипт от hizel

Re: Непонятки [NAGIOS] и скрипт

Да, но не работает :)

sub PingScan {

use Net::Ping;

my ( $host ) = @_; my ( $alive ) = ( 0 ); # my $sha=Net::Ping->new("icmp"); my $sha=Net::Ping->new("udp"); $alive = $sha->ping($host);

undef $sha;

return $alive; }

$ sh test.sh Insecure dependency in connect while running with -T switch at /usr/share/perl/5.10/Net/Ping.pm line 921. 29

;(

Воще непонятно, что ему не нравится :(

ManJak ★★★★★ ()
Ответ на: Re: Непонятки [NAGIOS] и скрипт от ManJak

Re: Непонятки [NAGIOS] и скрипт

suid бит уберите 
и new->("icmp")

:]

у меня работает:

#!/usr/bin/perl -w

use strict;
use warnings;

use Net::Ping;

my $host = '';

if (scalar @ARGV and $ARGV[0]) { 
	($host)=@ARGV; 
} else { 
	die "Usage $0 <router>\n"; 
}

my $p = new Net::Ping->new('udp');
my $alive = $p->ping($host);

print "[$alive]\n";




и почему-то tcp неправильно отрабатывается :-\

hizel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.