From: Jan Willamowius Date: Tue, 13 Sep 2005 14:11:00 +0000 (+0000) Subject: better error checking X-Git-Tag: spong-2_8_0-beta1~18 X-Git-Url: http://git.etc.gen.nz/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b65d25c9b97325378548c44c8b06197038a0a6b;p=spong.git better error checking --- diff --git a/src/lib/Spong/Client/plugins/check_disk b/src/lib/Spong/Client/plugins/check_disk index 94a2c34..61a4255 100755 --- a/src/lib/Spong/Client/plugins/check_disk +++ b/src/lib/Spong/Client/plugins/check_disk @@ -4,22 +4,94 @@ $CHECKFUNCS{'disk'} = \&check_disk; # This check check the amount of free diskspace for all of the mounted disk # partitions and the the amount of free swapspace. -# $Id: check_disk,v 1.5 2002/05/10 21:07:43 sljohnson Exp $ +# $Id: check_disk,v 1.6 2005/09/13 14:11:00 willamowius Exp $ + +# v1.2 02/26/04 Alan Premselaar +# +# added additional criteria to reporting red. +# if filesystem is (x)GB and even though it is 98% used +# if it has (X)GB free, it's not really critical. +# so the logic is, if the size of the filesystem is GB +# and the available space is GB then even 98% full is ok, although +# if the size is GB and the avail is MB then it's critical. + +# v1.3 02/26/04 Alan Premselaar +# +# add code to correctly determine if GIG free even if +# human readable output from DF is not returned. +# assumes 1-K block size reports from DF + +# v1.4 02/26/04 Alan Premselaar +# +# minor bug fixes with regex + +# v1.5 02/26/04 Alan Premselaar +# +# add 'human readable' output for swap space information use Spong::SafeExec qw(safe_exec); +use constant REALGIG => 1073741824; +use constant GIG => 1048576; # DF will normally return 1-K blocks +use constant KILO => 1024; + sub check_disk { + + # nested sub routine + + sub get_size { + my ($size) = @_; + + my ($gigs,$megs,$kilo); + my $retval = ""; + + return("0") if (!$size); + + $kilo = $size / KILO; + + $megs = ($size / GIG); + + $gigs = ($size / REALGIG); + + $retval = sprintf("%.0fK",$kilo) if ($kilo >= 1); + $retval = sprintf("%.0fM",$megs) if ($megs >= 1); + $retval = sprintf("%.1fG",$gigs) if ($gigs >= 1); + + return($retval); + } + + my $color = "green"; my( $summary, $message, $check, @problems, $large, $lpercent, $page ); + my ($size,$used,$avail); + my $old_regex = '(\S+)\s.*?\s(\d+)\%\s+[^/]*(/.*)'; + my $human_regex = '(\S+)\s.*?([0-9.]+[KMG]?)\s+([0-9.]+[KMG]?)\s+([0-9.]+[KMG]?)\s+(\d+)\%\s+[^/]*(/.*)'; + my $norm_regex = '(\S+)\s.*?(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%\s+[^/]*(/.*)'; + + my ($myregex,$humanform) = (); + + if ($DF =~ /\-h/) { + $myregex = $human_regex; + $humanform = 1; + } else { + $myregex = $norm_regex; + } + my @msg = safe_exec($DF); $message = shift(@msg); # Header DFPIPE: foreach ( @msg ) { - if( m!^(\S+)\s.*?\s(\d+)\%\s+[^/]*(/.*)$! ) { - my( $rawfs, $percent, $name ) = ( $1, $2, $3 ); +# if( m!^(\S+)\s.*?\s(\d+)\%\s+[^/]*(/.*)$! ) { + if ( m!^$myregex$! ) { +# if ($humanform) { +# my ($rawfs,$size,$used,$avail,$percent,$name) = ( $1, $2, $3, $4, $5, $6 ); +# } else { +# my( $rawfs, $percent, $name ) = ( $1, $2, $3 ); +# } + my ($rawfs,$size,$used,$avail,$percent,$name) = ( $1, $2, $3, $4, $5, $6 ); my $skip; my $panic = $DFCRIT{$name} || $DFCRIT{$rawfs} || $DFCRIT{"ALL"}; @@ -32,8 +104,11 @@ sub check_disk { if( $percent > $lpercent ) { $lpercent = $percent; $large = $name; } + my $gig_free = ( ($size =~ /(\d+)G/) && ($used =~ /(\d+)G/) ) if ($humanform); + my $gig_free = ( ($size / GIG > 1) && ($used / GIG > 1) ) if (!$humanform); + $message .= $_; - if( $percent >= $panic ) { + if( $percent >= $panic && !$gig_free ) { $color = "red"; push( @problems, "$name $percent" ); } elsif( $percent >= $warn ) { @@ -68,6 +143,19 @@ sub check_disk { my $warn = $DFWARN{"page"} || $DFWARN{"ALL"}; ($msg, $page) = &get_swap; + + if ($humanform) { + + $msg =~ /(\d+)\s+(\d+)\s+(\d+)/; + my ($total,$used,$avail) = ($1,$2,$3); + + my $total_gig = get_size($total); + my $used_gig = get_size($used); + my $avail_gig = get_size($avail); + + $msg = sprintf("Swap: %s %s %s",$total_gig,$used_gig,$avail_gig); + } + $message .= "\nSwap Space\n$msg"; $page =~ s/.*\s(\d+)%.*/$1/s;