Skip to content

Instantly share code, notes, and snippets.

@dynax60
Created September 13, 2011 10:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dynax60/1213559 to your computer and use it in GitHub Desktop.
Save dynax60/1213559 to your computer and use it in GitHub Desktop.
#!/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