pandorafms/pandora_server/util/plugin/bgp_plugin.pl

212 lines
6.9 KiB
Perl
Executable File

#!/usr/bin/perl -w
#
# Router bgp (Border Gateway Protocol v4 ) monitor
# look at each router and get the status of all is BGP neighbour
# Adapted version for a Pandora FMS server plugin
# Copyright 2002, Marc Hauswirth, Safe Host SA <marc@safehostnet.com>
# Copyright 2006, Val Glinskiy, <vglinskiy@gmail.com>
# Copyright 2010, Sancho Lerena <slerena@artica.es>
# Some inspiration was taken from Marc Hauswirth's script http://www.kernel.org/pub/software/admin/mon/contrib/monitors/bgp/bgp.monitor
# Modified to get bad status on a non-BGP device.
# License: GNU GPL v2, see http://www.gnu.org/copyleft/gpl.html
#
# This script needs the Net::SNMP module
my $version=1;
use Net::SNMP qw(:snmp);
use strict;
use Getopt::Long;
sub print_usage () {
print "Usage: $0 -r <router> -c <community> [-hV]\n";
print "\n";
exit;
}
my ($opt_v, $opt_h, $opt_r, $verbose, $router, $community);
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3);
GetOptions
("h" => \$opt_h, "help" => \$opt_h,
"r=s" => \$opt_r, "router=s" => \$opt_r,
"c=s" => \$community, "community=s" => \$community,
"v" => \$opt_v, "verbose" => \$opt_v);
if ($opt_v) {
print "\n";
print "check_bgp_snmp Pandora FMS server plugin version $version\n";
print "\n";
print_usage();
}
if ($opt_h) {
print_usage();
}
if ( !defined($opt_r) || !defined($community) ){
print_usage();
}
# OID's to the SNMP elements that I want to show...
# From Cisco's MIB and RFC's
# http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&step=2&mibName=BGP4-MIB
my %oids = (
"SysUptime" => "1.3.6.1.2.1.1.3.0",
"bgpVersion" => "1.3.6.1.2.1.15.1.0",
"bgpLocalAs" => "1.3.6.1.2.1.15.2.0",
# "bgpPeerTable" => "1.3.6.1.2.1.15.3",
"bgpPeerEntry" => "1.3.6.1.2.1.15.3.1",
"bgpPeerIdentifier" => "1.3.6.1.2.1.15.3.1.1",
"bgpPeerState" => "1.3.6.1.2.1.15.3.1.2",
"bgpPeerAdminStatus" => "1.3.6.1.2.1.15.3.1.3",
"bgpPeerNegotiatedVersion" => "1.3.6.1.2.1.15.3.1.4",
"bgpPeerLocalAddr" => "1.3.6.1.2.1.15.3.1.5",
"bgpPeerLocalPort" => "1.3.6.1.2.1.15.3.1.6",
"bgpPeerRemoteAddr" => "1.3.6.1.2.1.15.3.1.7",
"bgpPeerRemotePort" => "1.3.6.1.2.1.15.3.1.8",
"bgpPeerRemoteAs" => "1.3.6.1.2.1.15.3.1.9",
"bgpPeerInUpdates" => "1.3.6.1.2.1.15.3.1.10",
"bgpPeerOutUpdates" => "1.3.6.1.2.1.15.3.1.11",
"bgpPeerInTotalMessages" => "1.3.6.1.2.1.15.3.1.12",
"bgpPeerOutTotalMessages" => "1.3.6.1.2.1.15.3.1.13",
"bgpPeerLastError" => "1.3.6.1.2.1.15.3.1.14",
"bgpPeerFsmEstablishedTransitions" => "1.3.6.1.2.1.15.3.1.15",
"bgpPeerFsmEstablishedTime" => "1.3.6.1.2.1.15.3.1.16",
"bgpPeerConnectRetryInterval" => "1.3.6.1.2.1.15.3.1.17",
"bgpPeerHoldTime" => "1.3.6.1.2.1.15.3.1.18",
"bgpPeerKeepAlive" => "1.3.6.1.2.1.15.3.1.19",
"bgpPeerHoldTimeConfigured" => "1.3.6.1.2.1.15.3.1.20",
"bgpPeerKeepAliveConfigured" => "1.3.6.1.2.1.15.3.1.21",
"bgpPeerMinASOriginationInterval" => "1.3.6.1.2.1.15.3.1.22",
"bgpPeerMinRouteAdvertisementInterval" => "1.3.6.1.2.1.15.3.1.23",
"bgpPeerInUpdateElapsedTime" => "1.3.6.1.2.1.15.3.1.24",
"bgpIdentifier" => "1.3.6.1.2.1.15.4",
"bgpRcvdPathAttrTable" => "1.3.6.1.2.1.15.5",
"bgp4PathAttrTable" => "1.3.6.1.2.1.15.6",
"bgpPathAttrEntry" => "1.3.6.1.2.1.15.5.1",
"bgpPathAttrPeer" => "1.3.6.1.2.1.15.5.1.1",
"bgpPathAttrDestNetwork" => "1.3.6.1.2.1.15.5.1.2",
"bgpPathAttrOrigin" => "1.3.6.1.2.1.15.5.1.3",
"bgpPathAttrASPath" => "1.3.6.1.2.1.15.5.1.4",
"bgpPathAttrNextHop" => "1.3.6.1.2.1.15.5.1.5",
"bgpPathAttrInterASMetric" => "1.3.6.1.2.1.15.5.1.6",
"bgp4PathAttrEntry" => "1.3.6.1.2.1.15.6.1",
"bgp4PathAttrPeer" => "1.3.6.1.2.1.15.6.1.1",
"bgp4PathAttrIpAddrPrefixLen" => "1.3.6.1.2.1.15.6.1.2",
"bgp4PathAttrIpAddrPrefix" => "1.3.6.1.2.1.15.6.1.3",
"bgp4PathAttrOrigin" => "1.3.6.1.2.1.15.6.1.4",
"bgp4PathAttrASPathSegment" => "1.3.6.1.2.1.15.6.1.5",
"bgp4PathAttrNextHop" => "1.3.6.1.2.1.15.6.1.6",
"bgp4PathAttrMultiExitDisc" => "1.3.6.1.2.1.15.6.1.7",
"bgp4PathAttrLocalPref" => "1.3.6.1.2.1.15.6.1.8",
"bgp4PathAttrAtomicAggregate" => "1.3.6.1.2.1.15.6.1.9",
"bgp4PathAttrAggregatorAS" => "1.3.6.1.2.1.15.6.1.10",
"bgp4PathAttrAggregatorAddr" => "1.3.6.1.2.1.15.6.1.11",
"bgp4PathAttrCalcLocalPref" => "1.3.6.1.2.1.15.6.1.12",
"bgp4PathAttrBest" => "1.3.6.1.2.1.15.6.1.13",
"bgp4PathAttrUnknown" => "1.3.6.1.2.1.15.6.1.14",
);
my %BgpPeerState = (
1 => "idle",
2 => "connect",
3 => "active",
4 => "opensnet",
5 => "openconfirm",
6 => "established"
);
my %BgpPeerAdminState = (
1 => "stop",
2 => "start"
);
if ($opt_r) {
$router= $opt_r;
# Get some infos about this router
my ($sess, $error) = Net::SNMP->session ( -hostname => $router, -community => $community, -version => 2 );
if(!defined($sess)) {
#print("SESSION ERROR: $error\n");
print ("0\n");
exit;
}
# if you get "Message size exceeded buffer maxMsgSize" error, try reducing -maxrepetitions
my $results = $sess->get_bulk_request(-varbindlist => [$oids{bgpPeerRemoteAddr}], -maxrepetitions =>20 );
if (!defined($results)){
# print "ERROR: $oids{bgpPeerRemoteAddr} No results $sess->error \n";
print ("0\n");
exit;
}
my $key;
my %vals=%{$results};
my $valid_keys = 0;
foreach $key (keys %vals) {
if(oid_base_match($oids{bgpPeerRemoteAddr}, $key)) {
$valid_keys++;
my $PeerState;
my $oidPeerStatus=$oids{bgpPeerState}.".".$vals{$key};
$PeerState = $sess->get_request(-varbindlist => [$oidPeerStatus]);
my $oidInPrefixes=$oids{bgpPeerInUpdates}.".".$vals{$key};
my $InPrefixStatus;
$InPrefixStatus = $sess->get_request(-varbindlist => [$oidInPrefixes]);
if (!defined($PeerState)){
# print "ERROR: $oidPeerStatus No results $sess->error\n";
print ("0\n");
exit;
}
if (!defined($InPrefixStatus)) {
# print "ERROR: $InPrefixStatus No results $sess->error\n";
print ("0\n");
exit;
}
# Let's check neighbor's state. If it's not "established" and not administratively down , send alarm
if ( $BgpPeerState{$PeerState->{$oidPeerStatus}} ne "established" ) {
my $oidNeighborAdminStatus= $oids{bgpPeerAdminStatus}.".".$vals{$key};
my $NeighborAdminStatus = $sess->get_request(-varbindlist => [$oidNeighborAdminStatus]);
if ( $NeighborAdminStatus -> {$oidNeighborAdminStatus} == 2 ) {
# print ("ERROR: Neighbor $vals{$key} is $BgpPeerState{$PeerState->{$oidPeerStatus}}\n");
print ("0\n");
exit;
}
}
else {
if(($InPrefixStatus ->{$oidInPrefixes}) == 0) {
# print "Neighbor $vals{$key} sends 0 prefixes\n";
print ("0\n");
exit;
}
}
}
}
# If doesnt have any BGP information, exit. BGP not good (modified from original nagios plugin)
if ($valid_keys == 0){
print "0\n";
exit;
}
$sess->close;
# print(" All BGP Neighbors are sending updates\n");
print ("1\n");
exit;
}