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); - как-то странно отрабатывает :*(

★★★★★

Ответ на: комментарий от hizel

С 1-го начал.

Буду пробовать дальше

$ sh test.sh Can't do setuid (cannot exec sperl)

2-е $ 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 ★★★★★
() автор топика
Ответ на: комментарий от hizel

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

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 ★★★★★
() автор топика
Ответ на: комментарий от ManJak

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 ★★★★★
()
Ответ на: комментарий от hizel

Спасибо, уже заменил.

Правда, еще и "-Т" пришлось убрать.

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