Created
September 13, 2011 10:31
-
-
Save dynax60/1213559 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
# | |
# Tested hardware: | |
# DES-3526 | |
# DES-3200 | |
# DES-3550 | |
# | |
use strict; | |
use warnings; | |
use YAML qw/LoadFile/; | |
use Net::Netmask; | |
use Data::Dumper; | |
use FindBin; | |
use vars qw{ $trap }; | |
$0 =~ s{.*/}{}; | |
my $config_file = "$FindBin::Bin/$0.yml"; | |
my $conf = YAML::LoadFile($config_file) if -r $config_file; | |
my $trap_oid = '.1.3.6.1.6.3.1.1.4.1.0'; | |
my $events = { | |
'.1.3.6.1.6.3.1.1.5.3' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.2.1.2.2.1.1.}))[1] || ''; | |
my $admin = $trap->{".1.3.6.1.2.1.2.2.1.7.$port"} || ''; | |
my $oper = $trap->{".1.3.6.1.2.1.2.2.1.8.$port"} || ''; | |
my $msg = "Port $port link down"; | |
$msg .= ". Administratively blocked, operational port state: $oper" if $admin eq 'down'; | |
return $msg; | |
}, | |
'.1.3.6.1.6.3.1.1.5.4' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.2.1.2.2.1.1.}))[1] || ''; | |
my $admin = $trap->{".1.3.6.1.2.1.2.2.1.7.$port"} || ''; | |
my $oper = $trap->{".1.3.6.1.2.1.2.2.1.8.$port"} || ''; | |
my $msg = "Port $port link up"; | |
$msg .= ". Administratively blocked, operational port state: $oper" if $admin eq 'down'; | |
return $msg; | |
}, | |
# swL2macNotifyInfo | |
'.1.3.6.1.4.1.171.11.64.1.2.15.0.3' => sub { | |
my $act = { 1 => 'has appear on', 2 => 'has disappear from' }; | |
my $s = $trap->{'.1.3.6.1.4.1.171.11.64.1.2.15.1'}; | |
$s =~ s{"}{}g; | |
my $mac = lc(join ':', (split(/ /, $s))[1..6]); | |
my ($flag, $port) = map {hex} (split / /, $s)[0,10]; | |
return "MAC address $mac $act->{$flag} port $port"; | |
}, | |
'.1.3.6.1.6.3.1.1.5.1' => sub { return 'Cold start' }, | |
'.1.3.6.1.6.3.1.1.5.2' => sub { return 'Warm start' }, | |
# Loopback occured (DES-32XX) | |
'.1.3.6.1.4.1.171.11.64.1.2.15.4.0.2' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.64.1.2.12.2.1.1.1.}))[1] || ''; | |
return "Loopback occured on port $port"; | |
}, | |
# Loopback has gone (DES-32XX) | |
'.1.3.6.1.4.1.171.11.64.1.2.15.4.0.3' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.64.1.2.12.2.1.1.1.}))[1] || ''; | |
return "Loopback has gone from port $port"; | |
}, | |
# DES3200-10-L2MGMT-MIB::swL2PortLoopRestart | |
'.1.3.6.1.4.1.171.11.113.1.1.2.20.0.4' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.113.1.1.2.21.2.1.1.1.}))[1] || ''; | |
return "Loopback restart on port $port"; | |
}, | |
# DES3200-10-L2MGMT-MIB::swL2PortLoopOccurred | |
'.1.3.6.1.4.1.171.11.113.1.1.2.20.0.3' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.113.1.1.2.21.2.1.1.1.}))[1] || ''; | |
return "Loopback occured on port $port"; | |
}, | |
# DES3550-10-L2MGMT-MIB::swL2PortLoopOccurred | |
'.1.3.6.1.4.1.171.11.64.2.2.15.4.0.2' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.64.2.2.12.2.1.1.1.}))[1] || ''; | |
return "Loopback occured on port $port"; | |
}, | |
# DES3550-10-L2MGMT-MIB::swL2PortLoopRestart | |
'.1.3.6.1.4.1.171.11.64.2.2.15.4.0.3' => sub { | |
my $port = (find_oid(qq{.1.3.6.1.4.1.171.11.64.2.2.12.2.1.1.1.}))[1] || ''; | |
return "Loopback restart on port $port"; | |
}, | |
}; | |
sub find_oid { | |
(my $pattern = $_[0]) =~ s{\.}{\\\.}g; | |
(my $oid) = grep { $_ =~ /$pattern/ } keys %$trap; | |
return wantarray ? ( $oid, ($oid && exists $trap->{$oid} ? $trap->{$oid} : undef) ) : $oid; | |
} | |
sub logging { | |
my ($host, $message, $fname) = @_; | |
$fname ||= '/dev/stdout'; | |
open my $fh, '>>', $fname or die "Cannot write to $fname: $!\n"; | |
print $fh scalar(localtime(time)), " $host: $message\n"; | |
close($fh); | |
} | |
sub logfile { | |
my @found; | |
grep { Net::Netmask->new($_)->match($_[0]) && push @found, $conf->{logging}->{$_} } | |
keys %{ $conf->{logging} }; | |
push @found, '/dev/stdout' unless @found; | |
return @found; | |
} | |
my @traps = grep { chomp } <>; | |
my $host = shift @traps; | |
$trap = { map{ split / /,$_,2 } @traps[1..scalar(@traps-1)] }; | |
return if !$trap->{ $trap_oid }; # We dont have trap oid in tuple | |
my $message = | |
$events->{ $trap->{ $trap_oid } } ? | |
$events->{ $trap->{ $trap_oid } }->() : | |
join ', ', @traps; | |
logging($host, $message, $_) for (logfile($host)); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment