#!/usr/bin/perl

#############################################################################
# check_bgp - Cisco BGP checker for Netsaint
# (c) 1999 by FreeStone Systems, Matthias Cramer <cramer@freestone.net>
#############################################################################
# Version 1.0 - First Release
#
#

use strict;
use Net::Telnet ();

if ($#ARGV < 1) {
  print<<EOM;
Usage : check_bgp config-file ip-addr

Config file hase the following format (and resides in /usr/local/netsaint)

user=username
password=password
neighbor[ipaddr]=minprefixes
neighbor[ipaddr]=minprefixes
neighbor[ipaddr]=minprefixes

EOM

  exit(-1)
}

open (CONF, "/usr/local/netsaint/etc/$ARGV[0]");
my $line;
my $password;
my $user;
my %neighbor;

while ($line=<CONF>) {
  chomp $line;
  if ($line =~ /user[\s]*\=[\s]*(.+)/) {
    $user=$1;
  } elsif ($line =~ /password[\s]*\=[\s]*(.+)/) {
    $password=$1;
  } elsif ($line =~ /neighbor\[([\d]+\.[\d]+\.[\d]+\.[\d]+)\][\s]*\=[\s]*([\d]+)/) {
    $neighbor{$1}=$2;
  }
}

close (CONF);

## Telnet to the Router and fetsch the BGP summary
my $t = new Net::Telnet (Timeout => 10, Prompt => '/bgw[\d].zh.as8758.net>$/');

my $exitcode=0;
my @result;

  my $router=$ARGV[1];
  $t->open($router);
  $t->login($user,$password);
  my @lines = $t->cmd("term length 0");
  my @lines = $t->cmd("sh ip bgp summary");
  my $line;
  my $i;
  for ($i=5; $i<=$#lines; $i++) {
    if ($lines[$i] =~ /^[\d]+\.[\d]+\.[\d]+\.[\d]+/) {
       $lines[$i] =~ /^([\d]+\.[\d]+\.[\d]+\.[\d]+)[\s]+[\d]+[\s]+([\d]+)[\s]+[\d]+[\s]+[\d]+[\s]+([\d]+)[\s]+[\d]+[\s]+[\d]+[\s]+[\d\w\:]+[\s]+([\d]+|[\w]+)/;
       my $Peer=$1;
       my $ASNR=$2;
       my $TableVersion=$3;
       my $Routes=$4;
       if ($Routes =~ /Active|Idle/) {
         $Routes=0;
       }
       if (defined ($neighbor{$Peer})) {
          if ($neighbor{$Peer} < $Routes) {
             @result=(@result, "(+ AS$ASNR $Routes)");
          } else {
             @result=(@result, "(- AS$ASNR $Routes)");
             $exitcode=2;
          }
        } else {
	  @result=(@result, "(? AS$ASNR $Routes)");
        }
       
    }
  }

  $t->close;

  print join (" ", sort(@result)). "\n";
  exit($exitcode);

__END__

