#!/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 # Copyright 2006, Val Glinskiy, # Copyright 2010, Sancho Lerena # 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 -c [-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; }