From 958162b45fb77dcacb302e6c65cc5fb45df47692 Mon Sep 17 00:00:00 2001 From: Ton Voon Date: Wed, 20 Dec 2006 19:25:59 +0000 Subject: Fixed inode thresholds, regressed from previous release git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1554 f882894a-f735-0410-b71e-b25c423dba1c --- lib/utils_disk.c | 1 + lib/utils_disk.h | 1 + plugins/check_disk.c | 33 ++++++++++++++++++----- plugins/t/check_disk.t | 73 +++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 94 insertions(+), 14 deletions(-) diff --git a/lib/utils_disk.c b/lib/utils_disk.c index fdbeaf1e..74708c0e 100644 --- a/lib/utils_disk.c +++ b/lib/utils_disk.c @@ -60,6 +60,7 @@ np_add_parameter(struct parameter_list **list, const char *name) new_path->usedspace_units = NULL; new_path->usedspace_percent = NULL; new_path->usedinodes_percent = NULL; + new_path->freeinodes_percent = NULL; if (current == NULL) { *list = new_path; diff --git a/lib/utils_disk.h b/lib/utils_disk.h index 700f5d26..8bf4f113 100644 --- a/lib/utils_disk.h +++ b/lib/utils_disk.h @@ -19,6 +19,7 @@ struct parameter_list thresholds *usedspace_units; thresholds *usedspace_percent; thresholds *usedinodes_percent; + thresholds *freeinodes_percent; struct mount_entry *best_match; struct parameter_list *name_next; }; diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 51e8e850..ac86f4d2 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c @@ -146,6 +146,8 @@ char *warn_usedspace_percent = NULL; char *crit_usedspace_percent = NULL; char *warn_usedinodes_percent = NULL; char *crit_usedinodes_percent = NULL; +char *warn_freeinodes_percent = NULL; +char *crit_freeinodes_percent = NULL; int @@ -197,6 +199,7 @@ main (int argc, char **argv) set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units); set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); + set_thresholds(&path->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent); } } else { np_set_best_match(path_select_list, mount_list, exact_match); @@ -261,8 +264,8 @@ main (int argc, char **argv) dfree_inodes_percent = 100 - dused_inodes_percent; if (verbose >= 3) { - printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n", - me->me_mountdir, dused_pct, dfree_pct, dused_units, dfree_units, dtotal_units, dused_inodes_percent); + printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g free_inodes_pct=%g\n", + me->me_mountdir, dused_pct, dfree_pct, dused_units, dfree_units, dtotal_units, dused_inodes_percent, dfree_inodes_percent); } /* Threshold comparisons */ @@ -287,6 +290,10 @@ main (int argc, char **argv) if (verbose >=3) printf("Usedinodes_percent result=%d\n", temp_result); disk_result = max_state( disk_result, temp_result ); + temp_result = get_status(dfree_inodes_percent, path->freeinodes_percent); + if (verbose >=3) printf("Freeinodes_percent result=%d\n", temp_result); + disk_result = max_state( disk_result, temp_result ); + result = max_state(result, disk_result); /* What a mess of units. The output shows free space, the perf data shows used space. Yikes! @@ -309,8 +316,8 @@ main (int argc, char **argv) asprintf (&perf, "%s %s", perf, perfdata ((!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, dused_units, units, - TRUE, warning_high_tide, - TRUE, critical_high_tide, + (warning_high_tide != UINT_MAX ? TRUE : FALSE), warning_high_tide, + (critical_high_tide != UINT_MAX ? TRUE : FALSE), critical_high_tide, TRUE, 0, TRUE, dtotal_units)); @@ -477,10 +484,18 @@ process_arguments (int argc, char **argv) break; case 'W': /* warning inode threshold */ - warn_usedinodes_percent = optarg; + if (*optarg == '@') { + warn_freeinodes_percent = optarg; + } else { + asprintf(&warn_freeinodes_percent, "@%s", optarg); + } break; case 'K': /* critical inode threshold */ - crit_usedinodes_percent = optarg; + if (*optarg == '@') { + crit_freeinodes_percent = optarg; + } else { + asprintf(&crit_freeinodes_percent, "@%s", optarg); + } break; case 'u': if (units) @@ -525,7 +540,7 @@ process_arguments (int argc, char **argv) if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent || crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent || - crit_usedinodes_percent)) { + crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) { die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -p\n")); } se = np_add_parameter(&path_select_list, optarg); @@ -534,6 +549,7 @@ process_arguments (int argc, char **argv) set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units); set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); + set_thresholds(&se->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent); break; case 'x': /* exclude path or partition */ np_add_name(&dp_exclude_list, optarg); @@ -567,6 +583,8 @@ process_arguments (int argc, char **argv) crit_usedspace_percent = NULL; warn_usedinodes_percent = NULL; crit_usedinodes_percent = NULL; + warn_freeinodes_percent = NULL; + crit_freeinodes_percent = NULL; break; case 'V': /* version */ print_revision (progname, revision); @@ -594,6 +612,7 @@ process_arguments (int argc, char **argv) set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units); set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); + set_thresholds(&se->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent); } if (units == NULL) { diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t index e8e35b9f..dd4fcee4 100644 --- a/plugins/t/check_disk.t +++ b/plugins/t/check_disk.t @@ -24,13 +24,13 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { plan skip_all => "Need 2 mountpoints to test"; } else { - plan tests => 42; + plan tests => 56; } $result = NPTest->testCmd( "./check_disk -w 1% -c 1% -p $mountpoint_valid -w 1% -c 1% -p $mountpoint2_valid" ); -cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free)"); +cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free in space and inodes)"); my $c = 0; $_ = $result->output; $c++ while /\(/g; # counts number of "(" - should be two @@ -54,6 +54,26 @@ if ($free_on_mp1 > $free_on_mp2) { } +# Do same for inodes +$_ = $result->output; +my ($free_inode_on_mp1, $free_inode_on_mp2) = (m/inode=(\d+)%.*inode=(\d+)%/); +die "Cannot parse free inodes: $_" unless ($free_inode_on_mp1 && $free_inode_on_mp2); +my $avg_inode_free = ceil(($free_inode_on_mp1 + $free_inode_on_mp2)/2); +my ($more_inode_free, $less_inode_free); +if ($free_inode_on_mp1 > $free_inode_on_mp2) { + $more_inode_free = $mountpoint_valid; + $less_inode_free = $mountpoint2_valid; +} elsif ($free_on_mp1 < $free_on_mp2) { + $more_inode_free = $mountpoint2_valid; + $less_inode_free = $mountpoint_valid; +} else { + die "Two mountpoints with same inodes free - cannot do rest of test"; +} + + + +# Basic filesystem checks for sizes + $result = NPTest->testCmd( "./check_disk -w 1 -c 1 -p $more_free" ); cmp_ok( $result->return_code, '==', 0, "At least 1 MB available on $more_free"); like ( $result->output, $successOutput, "OK output" ); @@ -76,8 +96,6 @@ cmp_ok( $result->return_code, "==", 2, "Get critical on less_free mountpoint $le like( $result->output, $failureOutput, "Right output" ); - - $result = NPTest->testCmd( "./check_disk -w $avg_free% -c 0% -p $less_free" ); @@ -102,9 +120,6 @@ like( $result->output, qr/$less_free/, "Found problem $less_free"); unlike( $result->only_output, qr/$more_free/, "Has ignored $more_free as not a problem"); like( $result->perf_output, qr/$more_free/, "But $more_free is still in perf data"); - - - $result = NPTest->testCmd( "./check_disk -w $avg_free% -c 0% -p $more_free" ); @@ -126,6 +141,50 @@ cmp_ok( $result->return_code, '==', 2, "And reversing arguments should not make +# Basic inode checks for sizes + +$result = NPTest->testCmd( "./check_disk --icritical 1% --iwarning 1% -p $more_inode_free" ); +is( $result->return_code, 0, "At least 1% free on inodes for both mountpoints"); + +$result = NPTest->testCmd( "./check_disk -K 100% -W 100% -p $less_inode_free" ); +is( $result->return_code, 2, "Critical requesting 100% free inodes for both mountpoints"); + +$result = NPTest->testCmd( "./check_disk --iwarning 1% --icritical 1% -p $more_inode_free -K 100% -W 100% -p $less_inode_free" ); +is( $result->return_code, 2, "Get critical on less_inode_free mountpoint $less_inode_free"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $less_inode_free" ); +is( $result->return_code, 1, "Get warning on less_inode_free, when checking average"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K $avg_inode_free% -p $more_inode_free "); +is( $result->return_code, 0, "Get ok on more_inode_free when checking average"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $less_inode_free -W $avg_inode_free% -K $avg_inode_free% -p $more_inode_free" ); +is ($result->return_code, 1, "Combine above two tests, get warning"); +$all_disks = $result->output; + +$result = NPTest->testCmd( "./check_disk -e -W $avg_inode_free% -K 0% -p $less_inode_free -W $avg_inode_free% -K $avg_inode_free% -p $more_inode_free" ); +isnt( $result->output, $all_disks, "-e gives different output"); +like( $result->output, qr/$less_inode_free/, "Found problem $less_inode_free"); +unlike( $result->only_output, qr/$more_inode_free/, "Has ignored $more_inode_free as not a problem"); +like( $result->perf_output, qr/$more_inode_free/, "But $more_inode_free is still in perf data"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $more_inode_free" ); +is( $result->return_code, 0, "Get ok on more_inode_free mountpoint, checking average"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K $avg_inode_free% -p $less_inode_free" ); +is( $result->return_code, 2, "Get critical on less_inode_free, checking average"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $more_inode_free -W $avg_inode_free% -K $avg_inode_free% -p $less_inode_free" ); +is( $result->return_code, 2, "Combining above two tests, get critical"); + +$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K $avg_inode_free% -p $less_inode_free -W $avg_inode_free% -K 0% -p $more_inode_free" ); +cmp_ok( $result->return_code, '==', 2, "And reversing arguments should not make a difference"); + + + + + + TODO: { local $TODO = "Invalid percent figures"; $result = NPTest->testCmd( -- cgit v1.2.3-74-g34f1