=================================================================== RCS file: /cvs/nagios/check_openbgpd/check_openbgpd,v retrieving revision 1.3 retrieving revision 1.6 diff -u -r1.3 -r1.6 --- nagios/check_openbgpd/check_openbgpd 2009/11/19 19:52:51 1.3 +++ nagios/check_openbgpd/check_openbgpd 2015/03/25 03:17:08 1.6 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver: check_openbgpd,v 1.2 2009/11/13 22:23:24 andrew Exp $ +# $RedRiver: check_openbgpd,v 1.4 2009/11/19 21:22:01 andrew Exp $ ######################################################################## # check_openbgpd *** A nagios check for OpenBSD bgpd # @@ -56,7 +56,7 @@ exit $ERRORS{'OK'}; } -my @STATUS = read_status(); +my @STATUS = read_status( $CHECKS{_SOCKET} ); my %STATES = check_status( \@STATUS, \%CHECKS ); my $have_results = 0; @@ -89,12 +89,17 @@ exit $ERRORS{$state}; sub read_status { - my ($status) = @_; + my ($socket) = @_; my @S; + my @cmd = ($BGPCTL); + if ($socket) { + push @cmd, '-s', $socket; + } + push @cmd, 'show', 'summary'; + #open my $fh, '<', 'output' # XXX - open my $fh, '-|', $BGPCTL, 'show', 'summary' - or die "Couldn't open bgpctl: $!\n"; + open my $fh, '-|', @cmd or die "Couldn't open bgpctl: $!\n"; while (<$fh>) { chomp; push @S, parse_line($_); @@ -157,14 +162,14 @@ my ( $S, $C ) = @_; my %states; - my %neighbors; + my %neighbors = map { $_ => $C->{$_} } qw( _SOCKET _UNKNOWN ); STATE: foreach my $s ( @{$S} ) { my $n = $s->{neighbor}; $neighbors{$n} = $s; my $result; - if ( my $c = $C->{$n} ) { + if ( my $c = $C->{$n} || $C->{_UNKNOWN} ) { CODE: foreach my $code ( 'CRITICAL', 'WARNING' ) { next CODE if ( ref $c->{$code} ne 'HASH' ); my $data = $s->{state}; @@ -215,7 +220,7 @@ return 'State (' . $d . ') is not numeric'; } - DIRECTION: foreach my $dir qw( low high ) { + DIRECTION: foreach my $dir (qw( low high )) { if ( !$c->{$dir} ) { next DIRECTION; } my $check = $c->{$dir}; @@ -260,17 +265,24 @@ my $opt = shift @argv; given ($opt) { when ( '-V' || '--version' ) { - print_revision( $PROGNAME, '$Revision: 1.3 $ ' ); + print_revision( $PROGNAME, '$Revision: 1.6 $ ' ); exit $ERRORS{'OK'} } - when (/^-?-h(?:elp)?/xms) { print_help(); exit $ERRORS{'OK'} } + when (/^-?-h(?:elp)?/xms) { print_help(); exit $ERRORS{'OK'} } + when (/^-?-s(?:ocket)?/xms) { $checks{_SOCKET} = shift @argv } when (/^-?-w(?:arning)?/xms) { $w = parse_check( shift @argv ) } when (/^-?-c(?:ritical)?/xms) { $c = parse_check( shift @argv ) } + when (/^-?-u(?:nknown)?/xms) { + $checks{_UNKNOWN} = { + WARNING => $w, + CRITICAL => $c, + } + } when (/^-?-n(?:eighbor)?/xms) { while ( @argv && $argv[0] !~ /^-/xms ) { $checks{ shift @argv } = { WARNING => $w, - CRITICAL => $c + CRITICAL => $c, } } } @@ -283,15 +295,22 @@ sub print_help { print <<"EOL"; $PROGNAME - checks status of OpenBGPd peers - $PROGNAME [ -w ENTRY ][ -c ENTRY ][ -n NEIGHBOR [ NEIGHBOR2 ] ] + $PROGNAME [ -s SOCKET ][ -w ENTRY ][ -c ENTRY ]( -u | -n NEIGHBOR ) Usage: + -s, --socket SOCKET + Path to bgpd socket to use. See -r in bgpd(8). -w, --warning RANGE or single ENTRY Exit with WARNING status if outside of RANGE or if != ENTRY + May be entered multiple times. -c, --critical RANGE or single ENTRY Exit with CRITICAL status if outside of RANGE or if != ENTRY + May be entered multiple times. -n, --neighbor NEIGHBOR - The name of the Neighbor + The name of the Neighbor, can be a space separated list of neighbors. + May be entered multiple times. + -u, --unknown + As if you specified -n for all unknown neighbors ENTRY is a comma separated list of items to match against. Each item can be a RANGE or it will just be matched against the status. @@ -312,18 +331,10 @@ the output causes a CRITICAL result. Any time a NEIGHBOR that is NOT specified on the command line shows up in the -output causes a CRITICAL result. +output causes a CRITICAL result. If -u is specified, it treats NEIGHBOR as if +it were specified at that position. -$PROGNAME -w 10:300 -c 10:500 -n P1 P2 -n P3 - -CRITICAL - If any of P1, P2, P3 are below 10, above 500 or any non-numeric value. - -WARNING - If any of P1, P2, P3 are above 300. - - $PROGNAME -c Idle -n P1 -c 1:1 -n P2 -w 200:300 -c Active,10: -n P3 CRITICAL @@ -335,20 +346,30 @@ If P3 is above 10 and below 200 or above 300. -$PROGNAME -n P1 -w 50%:70% -c 10%:90% -n P2 P3 +$PROGNAME -u -w 50%:70% -c 10%:90% -n P2 P3 -No checks on P1 +No checks of unknown neighbors. CRITICAL If P2 or P3 do not have max-prefix set or if they do but learned prefixes - are below 10% or above 90% of max-prefix. + are below 10% or above 90% of max-prefix or any non-numeric value. WARNING - If P2 or P3 have learned prefixes below 50% or above 90% of max-prefix. + If P2 or P3 have learned prefixes below 50% or above 70% of max-prefix. + +$PROGNAME -w 50%:70% -c 10%:90% -u + +CRITICAL + If any neighbor does not have max-prefix set or if they do but learned + prefixes are below 10% or above 90% of max-prefix or any non-numeric value. + +WARNING + If any neighbor have learned prefixes below 50% or above 70% of max-prefix. + EOL - print_revision( $PROGNAME, '$Revision: 1.3 $' ); + print_revision( $PROGNAME, '$Revision: 1.6 $' ); print $LICENSE;