=================================================================== RCS file: /cvs/nagios/check_openbgpd/check_openbgpd,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- nagios/check_openbgpd/check_openbgpd 2009/11/13 22:23:24 1.2 +++ nagios/check_openbgpd/check_openbgpd 2009/11/19 19:52:51 1.3 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver: check_openbgpd,v 1.1 2009/11/13 02:05:20 andrew Exp $ +# $RedRiver: check_openbgpd,v 1.2 2009/11/13 22:23:24 andrew Exp $ ######################################################################## # check_openbgpd *** A nagios check for OpenBSD bgpd # @@ -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,10 +260,10 @@ my $opt = shift @argv; given ($opt) { when ( '-V' || '--version' ) { - print_revision( $PROGNAME, '$Revision: 1.2 $ ' ); + print_revision( $PROGNAME, '$Revision: 1.3 $ ' ); exit $ERRORS{'OK'} } - when (/^-?-h(?:elp)?/xms) { print_help(); 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) { @@ -275,8 +298,11 @@ 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: @@ -308,9 +334,21 @@ 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.2 $' ); + print_revision( $PROGNAME, '$Revision: 1.3 $' ); print $LICENSE;