=================================================================== RCS file: /cvs/nagios/check_openbgpd/check_openbgpd,v retrieving revision 1.1 retrieving revision 1.3 diff -u -r1.1 -r1.3 --- nagios/check_openbgpd/check_openbgpd 2009/11/13 02:05:20 1.1 +++ nagios/check_openbgpd/check_openbgpd 2009/11/19 19:52:51 1.3 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver$ +# $RedRiver: check_openbgpd,v 1.2 2009/11/13 22:23:24 andrew Exp $ ######################################################################## # check_openbgpd *** A nagios check for OpenBSD bgpd # @@ -12,7 +12,7 @@ local %ENV = (); -my $NAGIOS_OUTPUT = 0; +my $NAGIOS_OUTPUT = 1; my $LICENSE = <<'EOL'; Copyright (c) 2009 Andrew Fresh @@ -60,7 +60,7 @@ my %STATES = check_status( \@STATUS, \%CHECKS ); my $have_results = 0; -my $state = 'OK'; +my $state = 'OK'; foreach my $error ( reverse sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS ) { @@ -93,7 +93,7 @@ my @S; #open my $fh, '<', 'output' # XXX - open my $fh , '-|', $BGPCTL, 'show', 'summary' + open my $fh, '-|', $BGPCTL, 'show', 'summary' or die "Couldn't open bgpctl: $!\n"; while (<$fh>) { chomp; @@ -143,7 +143,7 @@ foreach my $d ( 'low', 'high' ) { if ( defined $c{$d} ) { - $c{$d} =~ s/[^-\d\.]//gxms; + $c{$d} =~ s/[^-\d\.\%]//gxms; if ( !length $c{$d} ) { delete $c{$d}; } @@ -208,19 +208,42 @@ if ( $c->{low} || $c->{high} ) { $result = undef; - my $num = $d; + my ( $num, $max ) = split m{/}xms, $d; $num =~ s/[^-\d\.]//gxms; if ( !length $num ) { return 'State (' . $d . ') is not numeric'; } - if ( $c->{low} && $num < $c->{low} ) { - return 'is below threshold (' . $d . ' < ' . $c->{low} . ')'; - } + DIRECTION: foreach my $dir qw( low high ) { + if ( !$c->{$dir} ) { next DIRECTION; } - if ( $c->{high} && $num > $c->{high} ) { - return 'is above threshold (' . $d . ' > ' . $c->{high} . ')'; + my $check = $c->{$dir}; + my $cnum = $num; + + if ( $check =~ s/\%$//xms ) { + if ( !defined $max ) { + return 'max-prefix not specified and % check requested'; + } + + # convert to percent + $cnum = 100 * $cnum / $max; + } + + my @nums = ( $cnum, $check ); + my $abovebelow = 'below'; + my $symbol = '<'; + if ( $dir eq 'high' ) { + @nums = ( $check, $cnum ); + $abovebelow = 'above'; + $symbol = '>'; + } + + if ( $nums[0] < $nums[1] ) { + return join q{ }, 'is', $abovebelow, + 'threshold (' . $d, + $symbol, $c->{$dir} . ')'; + } } } @@ -237,13 +260,13 @@ my $opt = shift @argv; given ($opt) { when ( '-V' || '--version' ) { - print_revision( $PROGNAME, '$Revision: 1.1 $ ' ); + print_revision( $PROGNAME, '$Revision: 1.3 $ ' ); exit $ERRORS{'OK'} } - when ( /^-?-h(?:elp)?/xms ) { print_help(); exit $ERRORS{'OK'} } - when ( /^-?-w(?:arning)?/xms ) { $w = parse_check( shift @argv ) } - when ( /^-?-c(?:ritical)?/xms ) { $c = parse_check( shift @argv ) } - when ( /^-?-n(?:eighbor)?/xms ) { + when (/^-?-h(?:elp)?/xms) { print_help(); exit $ERRORS{'OK'} } + when (/^-?-w(?:arning)?/xms) { $w = parse_check( shift @argv ) } + when (/^-?-c(?:ritical)?/xms) { $c = parse_check( shift @argv ) } + when (/^-?-n(?:eighbor)?/xms) { while ( @argv && $argv[0] !~ /^-/xms ) { $checks{ shift @argv } = { WARNING => $w, @@ -259,7 +282,7 @@ sub print_help { print <<"EOL"; -$PROGNAME - monitors sysctl hw.bgpstatus on OpenBSD +$PROGNAME - checks status of OpenBGPd peers $PROGNAME [ -w ENTRY ][ -c ENTRY ][ -n NEIGHBOR [ NEIGHBOR2 ] ] Usage: @@ -275,27 +298,57 @@ RANGE is specified as two optional numbers separated with a colon (:). The check is that the value is between the two numbers. If either number is left -off, that check is ignored +off, that check is ignored. +If either number in a RANGE is specified as a percent, check is that +max-prefix is specified and that the number is within the specified percent. + NEIGHBOR is the name that shows when running "bgpctl show summary" Examples: +(where many of the numbers would probably have to be multiplied by 1000) -$PROGNAME -w 10000:300000 -c 1000:500000 -n eBGP1 eBGP2 -n eBGP3 +Any time a NEIGHBOR is specified on the command line but does NOT show up in +the output causes a CRITICAL result. -Checks that peers eBGP1, eBGP2 and eBGP2 are within the ranges specified +Any time a NEIGHBOR that is NOT specified on the command line shows up in the +output causes a CRITICAL result. -$PROGNAME -c 1:1 -n eBGP1 -w 200000:300000 -c 100: -n iBGP1 -Checks that 1 and only 1 prefix is received from from eBGP1, warns if less -than 200000 or more than 300000 prefixes are recieved from peer iBGP1 and is -critical if less than 100 prefixes are recieved from peer iBGP1 +$PROGNAME -w 10:300 -c 10:500 -n P1 P2 -n P3 -$PROGNAME -c Idle -n iBGP1 -w +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 + If P1 is any value but Idle. + If P2 is any value but 1. + If P3 is below 10 or any non-numeric value other than "Active". + +WARNING + If P3 is above 10 and below 200 or above 300. + + +$PROGNAME -n P1 -w 50%:70% -c 10%:90% -n P2 P3 + +No checks on P1 + +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. + +WARNING + If P2 or P3 have learned prefixes below 50% or above 90% of max-prefix. + EOL - print_revision( $PROGNAME, '$Revision: 1.1 $' ); + print_revision( $PROGNAME, '$Revision: 1.3 $' ); print $LICENSE;