use strict; use vars qw(); use SNMP qw(); &SNMP::initMib(); &SNMP::loadModules( 'RFC2127-MIB', ); sub trap_call_setup; sub trap_dummy; # # should eventually get these out of the MIB... # my %dispatch_table = ( 'isdnMibCallInformation', \&trap_call_setup, '.', \&trap_dummy, ); sub trap_dispatcher { my $session = shift; my $ref = shift; my $trapType; my ($reqid, $addr, $community); # if this is a timeout, then there will be no args... if (defined($ref)) { $ref->[1]->[2] = SNMP::translateObj($ref->[1]->val); $trapType = $ref->[1]->val; my $args = shift; ($reqid, $addr, $community) = @{$args}; } else { $trapType = 'timeout'; } if (defined($dispatch_table{$trapType})) { &{$dispatch_table{$trapType}}($session, $ref); } elsif (defined($dispatch_table{'.'})) { &{$dispatch_table{'.'}}($session, $ref); } else { # don't do anything... silently discard. } } sub trap_dummy { my $session = shift; my $ref = shift; my $trapType = $ref->[1]->val; warn "unexpected trap " . $trapType; } sub trap_call_setup { my $session = shift; my $varlist = shift; my $args = shift; my $ifIndex = $varlist->[2]->val; my $isdnBearerOperStatus = $varlist->[3]->val; my $isdnBearerPeerAddress = $varlist->[4]->val; my $isdnBearerPeerSubAddress = $varlist->[5]->val; my $isdnBearerInfoType = $varlist->[6]->val; my $isdnBearerCallOrigin = $varlist->[5]->val; my ($reqid, $ipaddr, $community) = @{$args}; printf "Call from %s", $isdnBearerPeerAddress; printf "*%s", $isdnBearerPeerSubAddress if ($isdnBearerPeerSubAddress ne ''); printf "\n"; } my $session = new SNMP::Session( DestHost => 'udp:162', LocalPort => 1, Version => '2c', UseEnums => 0, ); if (!defined($session)) { die "can't create listener session"; } # otherwise assume that ErrorNum is zero... $session->SNMP::_catch([\&trap_dispatcher, $session]); &SNMP::MainLoop();