Цитата:
rsyslogd
Цитата:
по CRONу периодически дергать snmp-get
Извращенец
Цитата:
но я бы использовал snmptrapd
+1, примерно вот эдак:
Код:
#!/usr/bin/perl -w
use Switch;
use threads;
use warnings;
use strict;
use Net::SNMPTrapd;
use constant THREADS_COUNT => 4;
use constant DEBUG => 0;
use constant GLOBAL_OID => '1.3.6.1.6.3.1.1.4.1.0';
use constant LINKDOWN_OID => '1.3.6.1.6.3.1.1.5.3';
my $log_filename = "/var/log/snmptraps.log";
open(STDIN, "+>/dev/null") or die "Can't open STDIN: $!\n";
open(STDOUT, "+>/dev/null") or die "Can't open STDOUT: $!\n";
open(STDERR, "+>>$log_filename") or die "Can't open STDERR: $!\n";
my $obj = Net::SNMPTrapd->new(Family=>'ipv4', LocalAddr=>'1.1.1.1', LocalPort=>162, timeout=>3) or die "Error: ", Net::SNMPTrapd->error;
for my $i (1..(THREADS_COUNT - 1)) { threads->create(\&request_loop, $obj); }
request_loop($obj);
sub request_loop {
my $snmptrapd = shift;
my $tid = threads->tid(); # thread ID
logX($tid, 'START');
my ($ip, $found, $p, $trap);
while (1) {
$trap = $snmptrapd->get_trap();
if (!defined($trap)) {
logX($tid, Net::SNMPTrapd->error);
next;
}
next if ($trap == 0);
if (!defined($trap->process_trap())) { logX($tid, Net::SNMPTrapd->error); }
else {
$ip = $trap->remoteaddr;
$found = 0;
$p = "";
for my $vals (@{$trap->varbinds}) {
for (keys(%{$vals})) {
$p .= sprintf "%s: %s; ", $_, $vals->{$_};
switch ($_) {
case GLOBAL_OID {
switch($vals->{$_}){
case LINKDOWN_OID { $found = 2; }
}
last;
} else {
if ($found == 2) {
logX($tid, "$ip down port $vals->{$_}");
$found = 1;
}
}
}
}
last if ($found == 1);
}
logX($tid, "[$ip] $p") if (DEBUG == 1);
}
}
}
sub logX
{
my ($tid, $msg) = @_;
my $now = POSIX::strftime("%d.%m.%Y %H:%M:%S", localtime);
open hFile, ">>", $log_filename;
print hFile "$now Thread ($tid): $msg\n";
close hFile;
}