[c-nsp] nagios monitor bgp peer pluggin?

Shaun mailinglists at unix-scripts.com
Thu Nov 3 19:43:12 EST 2005


Thats the one i found, except it wasnt working on the 3750, i didnt try my 
7200 yet.. i always ended up with the responce...

BGP to  is Unconfigured,

maybe i'm just being a gimp and throwing the wrong args at it...

./check_bgp -r myrouter.com -c public -n provider.peer.ip

it seams to work for one peer only if i do somthing like....

./check_bgp -r myrouter.com -c public -n provider1.peer.ip%provider2.peer.ip

but then only shows the status of provider2...


-- 

~Shaun
<andrew2 at one.net> wrote in message 
news:200511032231.jA3MV9Nm069989 at puck.nether.net...
> cisco-nsp-bounces at puck.nether.net wrote:
>> On Thu, 3 Nov 2005, Shaun wrote:
>>
>>> Anybody use or have a pluggin for nagios that checks the status of
>>> bgp peer/neighbors?  I found one by a university but just like almost
>>> every other pluggin i've found for cisco equipment it doesnt work.
>>> I'm monitoring a 7200 VXR and a 3750
>
> Not sure where I found this, but it works great for me on 7200 VXR's:
>
> #!/usr/bin/perl
>
> #=======================================================================
> ========
> #                               Configuration
> #=======================================================================
> ========
>
> my $lastScriptModification = '2002-11-24';
>
> #=======================================================================
> ========
> #                              Initialization
> #=======================================================================
> ========
>
> #-----------------------------------------------------------------------
> --------
> #    Libraries
> #-----------------------------------------------------------------------
> --------
>
> use Getopt::Std;
> use Net::SNMP qw(:snmp);
>
>
> #-----------------------------------------------------------------------
> --------
> #    Global var declarations
> #-----------------------------------------------------------------------
> --------
> my (
>   # Working vars
>   $usage,              # String containing usage help
>   $hostname,           # Hostname of machine being queried via SNMP
>   $community,          # SNMP community string to use for query
>   $base_oid,           # BGP Neighbor State OID
>   %bgp_neighbors,      # hash of BGP neighbors
>   %bgp_states,         # hash of SNMP BGP states
>   @neighbors,          # array to temporarily hold the list of
> neighbors
>   @up,                 # list of neighbors that are up
>   @down,               # list of neighbors that are down
>   @ne,                 # list of neighbors that are not configured
>   $message,            # the text message to return to netsaint
>   $state              # 2=critical, 1=warning, 0=ok, -1=error
> );
>
> #-----------------------------------------------------------------------
> --------
> #    Global var initializations
> #-----------------------------------------------------------------------
> --------
>
> $usage = <<"EOF";
> usage:  $0 [-h] -r <hostname> -c <community> -n <neighbors>
>
> [-h]            :       Print this message
> [-r] <router>   :       IP Address or Hostname of the router
> [-c] <community>:       SNMP Community String  (default = "public")
> [-n] <neighbors>:       % delimited list of neighbor ip addresses
>                        and descriptions.   Example:
> 10.10.10.1%ROUTER_A
>
> $lastScriptModification
>
> EOF
>
> %bgp_states = (
>        "1" => "Idle",
>        "2" => "Connect",
>        "3" => "Active",
>        "4" => "OpenSent",
>        "5" => "OpenConfirm",
>        "6" => "Established"
> );
>
> $state = 0;
>
> #=======================================================================
> ========
> #                              Input Phase
> #=======================================================================
> ========
>
> #-----------------------------------------------------------------------
> --------
> # Check the usage
> #-----------------------------------------------------------------------
> --------
> die $usage if (!getopts('hr:c:n:') || $opt_h);
> die $usage if (!$opt_r || !$opt_n || $opt_h);
>
> #-----------------------------------------------------------------------
> --------
> # Set the args for the snmp session
> #-----------------------------------------------------------------------
> --------
> $hostname = $opt_r;
> $community = $opt_c || "public";
> $base_oid = "1.3.6.1.2.1.15.3.1.2";
>
> #-----------------------------------------------------------------------
> --------
> # Build a hash of BGP neighbors: key=ip_address, value=description
> #-----------------------------------------------------------------------
> --------
> @neighbors = split(',', $opt_n);
> foreach my $neighbor (@neighbors) {
>        my @tmp = split('\%', $neighbor);
>        $bgp_neighbors{$tmp[0]} = $tmp[1];
> }
>
>
> #-----------------------------------------------------------------------
> --------
> # Open an SNMPv2 session with the router
> #-----------------------------------------------------------------------
> --------
> my ($session, $error) = Net::SNMP->session(
>        -version     => 'snmpv2c',
>        -nonblocking => 1,
>        -timeout     => 2,
>        -hostname    => $hostname,
>        -community   => $community
> );
>
> if (!defined($session)) {
>        printf("ERROR: %s.\n", $error);
>        exit (-1);
> }
>
>
> #-----------------------------------------------------------------------
> --------
> # Send a bulk request for the bgp neighbor table
> #-----------------------------------------------------------------------
> --------
> my $result = $session->get_bulk_request(
>        -callback       => [\&table_cb, {}],
>        -maxrepetitions => 10,
>        -varbindlist => [$base_oid]
> );
>
> if (!defined($result)) {
>        printf("ERROR: %s.\n", $session->error);
>        $session->close;
>        exit (-1);
> }
>
> #=======================================================================
> ========
> #                              Output Phase
> #=======================================================================
> ========
>
>
> #-----------------------------------------------------------------------
> --------
> # Wait for the responses.  These will be handled by &table_cb...
> #-----------------------------------------------------------------------
> --------
> snmp_dispatcher();
>
> #-----------------------------------------------------------------------
> --------
> # Clean-up and exit.
> #-----------------------------------------------------------------------
> --------
> $session->close;
>
> #---------------------------------------------------------------
> # If there are any neighbors left in the has, it means that
> # we were supposed to report on the status, but the neighbor
> # wasn't in the bgp neighbors table.  We'll assume this means
> # the neighbor is down.
> #---------------------------------------------------------------
> foreach my $neighbor (keys %bgp_neighbors) {
>        #print "BGP to $bgp_neighbors{$neighbor} is Unconfigured\n";
>        push(@ne, $bgp_neighbors{$neighbor});
>        $state = 2;
> }
>
>
> if ($state == 0) {
>        my $num_up = @up;
>        my $list = join(',', @up);
>        if ($num_up > 1) {
>                $message = "BGP to $list are Up";
>        } else {
>                $message = "BGP to $list is Up";
>        }
>
> } else {
>        my $num_ne = @ne;
>        my $num_down = @down;
>
>        if ($num_ne) {
>                my $list = join(',', @ne);
>                $message = "BGP to $list is Unconfigured, ";
>        }
>        if ($num_down) {
>                my $list = join(',', @down);
>                $message .= "BGP to $list is DOWN";
>        }
> }
>
> print "$message\n";
>
> exit($state);
>
>
> #=======================================================================
> ========
> #                              Subroutines
> #=======================================================================
> ========
>
> #-----------------------------------------------------------------------
> --------
> # Subroutine to handle the SNMP responses.
> #-----------------------------------------------------------------------
> --------
> sub table_cb
> {
>        my ($session, $table) = @_;
>
>        if (!defined($session->var_bind_list)) {
>                printf("ERROR: %s\n", $session->error);
>
>        } else {
>
>
> #---------------------------------------------------------------
>                # Loop through each of the OIDs in the response and
> assign
>                # the key/value pairs to the anonymous hash that is
> passed
>                # to the callback.  Make sure that we are still in the
> table
>                # before assigning the key/values.
>
> #---------------------------------------------------------------
>
>                my $next;
>                foreach my $oid
> (oid_lex_sort(keys(%{$session->var_bind_list}))) {
>                        if (!oid_base_match($base_oid, $oid)) {
>                                $next = undef;
>                                last;
>                        }
>                        $next = $oid;
>                        $table->{$oid} =
> $session->var_bind_list->{$oid};
>                }
>
>
> #---------------------------------------------------------------
>                # If $next is defined we need to send another request
>                # to get more of the table.
>
> #---------------------------------------------------------------
>
>                if (defined($next)) {
>                        $result = $session->get_bulk_request(
>                                -callback       => [\&table_cb, $table],
>                                -maxrepetitions => 10,
>                                -varbindlist    => [$next]
>                        );
>
>                        if (!defined($result)) {
>                                printf("ERROR: %s\n", $session->error);
>                        }
>                } else {
>
> #-------------------------------------------------------
>                        # We are no longer in the table, so print the
> results.
>
> #-------------------------------------------------------
>                        my @neighbors;
>                        foreach my $oid (oid_lex_sort(keys(%{$table})))
> {
>
>
> #-----------------------------------------------
>                                # Get neighbor address and ifIndex from
> oid
>
> #-----------------------------------------------
>                                if ($oid =~
> /^$base_oid.(\d+.\d+.\d+.\d+)$/) {
>                                        $neighbor = $1;
>                                }
>                                #print "$oid: $table->{$oid}\n";
>                                #print "neighbor: $neighbor\n";
>
>
> #-----------------------------------------------
>                                # If this snmp response is about a
> neighbor that
>                                # was listed in "-n", report on the
> status.
>
> #-----------------------------------------------
>                                if (defined($bgp_neighbors{$neighbor}))
> {
>                                        if ($table->{$oid} == 6) {
>                                                #print "BGP to
> $bgp_neighbors{$neighbor} is UP\n";
>                                                push(@up,
> $bgp_neighbors{$neighbor});
>                                        } else {
>                                                #print "BGP to
> $bgp_neighbors{$neighbor} is DOWN\n";
>                                                push(@down,
> $bgp_neighbors{$neighbor});
>                                                $state = 2;
>                                        }
>
> #---------------------------------------
>                                        # deleting the neighbor from the
> hash
>                                        # since we already reported on
> it
>
> #---------------------------------------
>
> delete($bgp_neighbors{$neighbor});
>                                }
>                        }
>                }
>        }
> }
>
> _______________________________________________
> cisco-nsp mailing list  cisco-nsp at puck.nether.net
> https://puck.nether.net/mailman/listinfo/cisco-nsp
> archive at http://puck.nether.net/pipermail/cisco-nsp/
> 





More information about the cisco-nsp mailing list