summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/utils_disk.c1
-rw-r--r--lib/utils_disk.h1
-rw-r--r--plugins/check_disk.c33
-rw-r--r--plugins/t/check_disk.t73
4 files changed, 94 insertions, 14 deletions
diff --git a/lib/utils_disk.c b/lib/utils_disk.c
index fdbeaf1..74708c0 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)
60 new_path->usedspace_units = NULL; 60 new_path->usedspace_units = NULL;
61 new_path->usedspace_percent = NULL; 61 new_path->usedspace_percent = NULL;
62 new_path->usedinodes_percent = NULL; 62 new_path->usedinodes_percent = NULL;
63 new_path->freeinodes_percent = NULL;
63 64
64 if (current == NULL) { 65 if (current == NULL) {
65 *list = new_path; 66 *list = new_path;
diff --git a/lib/utils_disk.h b/lib/utils_disk.h
index 700f5d2..8bf4f11 100644
--- a/lib/utils_disk.h
+++ b/lib/utils_disk.h
@@ -19,6 +19,7 @@ struct parameter_list
19 thresholds *usedspace_units; 19 thresholds *usedspace_units;
20 thresholds *usedspace_percent; 20 thresholds *usedspace_percent;
21 thresholds *usedinodes_percent; 21 thresholds *usedinodes_percent;
22 thresholds *freeinodes_percent;
22 struct mount_entry *best_match; 23 struct mount_entry *best_match;
23 struct parameter_list *name_next; 24 struct parameter_list *name_next;
24}; 25};
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 51e8e85..ac86f4d 100644
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
@@ -146,6 +146,8 @@ char *warn_usedspace_percent = NULL;
146char *crit_usedspace_percent = NULL; 146char *crit_usedspace_percent = NULL;
147char *warn_usedinodes_percent = NULL; 147char *warn_usedinodes_percent = NULL;
148char *crit_usedinodes_percent = NULL; 148char *crit_usedinodes_percent = NULL;
149char *warn_freeinodes_percent = NULL;
150char *crit_freeinodes_percent = NULL;
149 151
150 152
151int 153int
@@ -197,6 +199,7 @@ main (int argc, char **argv)
197 set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units); 199 set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units);
198 set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); 200 set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
199 set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); 201 set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
202 set_thresholds(&path->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
200 } 203 }
201 } else { 204 } else {
202 np_set_best_match(path_select_list, mount_list, exact_match); 205 np_set_best_match(path_select_list, mount_list, exact_match);
@@ -261,8 +264,8 @@ main (int argc, char **argv)
261 dfree_inodes_percent = 100 - dused_inodes_percent; 264 dfree_inodes_percent = 100 - dused_inodes_percent;
262 265
263 if (verbose >= 3) { 266 if (verbose >= 3) {
264 printf ("For %s, used_pct=%g free_pct=%g used_units=%g free_units=%g total_units=%g used_inodes_pct=%g\n", 267 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",
265 me->me_mountdir, dused_pct, dfree_pct, dused_units, dfree_units, dtotal_units, dused_inodes_percent); 268 me->me_mountdir, dused_pct, dfree_pct, dused_units, dfree_units, dtotal_units, dused_inodes_percent, dfree_inodes_percent);
266 } 269 }
267 270
268 /* Threshold comparisons */ 271 /* Threshold comparisons */
@@ -287,6 +290,10 @@ main (int argc, char **argv)
287 if (verbose >=3) printf("Usedinodes_percent result=%d\n", temp_result); 290 if (verbose >=3) printf("Usedinodes_percent result=%d\n", temp_result);
288 disk_result = max_state( disk_result, temp_result ); 291 disk_result = max_state( disk_result, temp_result );
289 292
293 temp_result = get_status(dfree_inodes_percent, path->freeinodes_percent);
294 if (verbose >=3) printf("Freeinodes_percent result=%d\n", temp_result);
295 disk_result = max_state( disk_result, temp_result );
296
290 result = max_state(result, disk_result); 297 result = max_state(result, disk_result);
291 298
292 /* What a mess of units. The output shows free space, the perf data shows used space. Yikes! 299 /* 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)
309 asprintf (&perf, "%s %s", perf, 316 asprintf (&perf, "%s %s", perf,
310 perfdata ((!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir, 317 perfdata ((!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
311 dused_units, units, 318 dused_units, units,
312 TRUE, warning_high_tide, 319 (warning_high_tide != UINT_MAX ? TRUE : FALSE), warning_high_tide,
313 TRUE, critical_high_tide, 320 (critical_high_tide != UINT_MAX ? TRUE : FALSE), critical_high_tide,
314 TRUE, 0, 321 TRUE, 0,
315 TRUE, dtotal_units)); 322 TRUE, dtotal_units));
316 323
@@ -477,10 +484,18 @@ process_arguments (int argc, char **argv)
477 break; 484 break;
478 485
479 case 'W': /* warning inode threshold */ 486 case 'W': /* warning inode threshold */
480 warn_usedinodes_percent = optarg; 487 if (*optarg == '@') {
488 warn_freeinodes_percent = optarg;
489 } else {
490 asprintf(&warn_freeinodes_percent, "@%s", optarg);
491 }
481 break; 492 break;
482 case 'K': /* critical inode threshold */ 493 case 'K': /* critical inode threshold */
483 crit_usedinodes_percent = optarg; 494 if (*optarg == '@') {
495 crit_freeinodes_percent = optarg;
496 } else {
497 asprintf(&crit_freeinodes_percent, "@%s", optarg);
498 }
484 break; 499 break;
485 case 'u': 500 case 'u':
486 if (units) 501 if (units)
@@ -525,7 +540,7 @@ process_arguments (int argc, char **argv)
525 if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent || 540 if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent ||
526 crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || 541 crit_freespace_percent || warn_usedspace_units || crit_usedspace_units ||
527 warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent || 542 warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent ||
528 crit_usedinodes_percent)) { 543 crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) {
529 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -p\n")); 544 die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -p\n"));
530 } 545 }
531 se = np_add_parameter(&path_select_list, optarg); 546 se = np_add_parameter(&path_select_list, optarg);
@@ -534,6 +549,7 @@ process_arguments (int argc, char **argv)
534 set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units); 549 set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units);
535 set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); 550 set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
536 set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); 551 set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
552 set_thresholds(&se->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
537 break; 553 break;
538 case 'x': /* exclude path or partition */ 554 case 'x': /* exclude path or partition */
539 np_add_name(&dp_exclude_list, optarg); 555 np_add_name(&dp_exclude_list, optarg);
@@ -567,6 +583,8 @@ process_arguments (int argc, char **argv)
567 crit_usedspace_percent = NULL; 583 crit_usedspace_percent = NULL;
568 warn_usedinodes_percent = NULL; 584 warn_usedinodes_percent = NULL;
569 crit_usedinodes_percent = NULL; 585 crit_usedinodes_percent = NULL;
586 warn_freeinodes_percent = NULL;
587 crit_freeinodes_percent = NULL;
570 break; 588 break;
571 case 'V': /* version */ 589 case 'V': /* version */
572 print_revision (progname, revision); 590 print_revision (progname, revision);
@@ -594,6 +612,7 @@ process_arguments (int argc, char **argv)
594 set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units); 612 set_thresholds(&se->usedspace_units, warn_usedspace_units, crit_usedspace_units);
595 set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent); 613 set_thresholds(&se->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
596 set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent); 614 set_thresholds(&se->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
615 set_thresholds(&se->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
597 } 616 }
598 617
599 if (units == NULL) { 618 if (units == NULL) {
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
index e8e35b9..dd4fcee 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
24if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { 24if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
25 plan skip_all => "Need 2 mountpoints to test"; 25 plan skip_all => "Need 2 mountpoints to test";
26} else { 26} else {
27 plan tests => 42; 27 plan tests => 56;
28} 28}
29 29
30$result = NPTest->testCmd( 30$result = NPTest->testCmd(
31 "./check_disk -w 1% -c 1% -p $mountpoint_valid -w 1% -c 1% -p $mountpoint2_valid" 31 "./check_disk -w 1% -c 1% -p $mountpoint_valid -w 1% -c 1% -p $mountpoint2_valid"
32 ); 32 );
33cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free)"); 33cmp_ok( $result->return_code, "==", 0, "Checking two mountpoints (must have at least 1% free in space and inodes)");
34my $c = 0; 34my $c = 0;
35$_ = $result->output; 35$_ = $result->output;
36$c++ while /\(/g; # counts number of "(" - should be two 36$c++ while /\(/g; # counts number of "(" - should be two
@@ -54,6 +54,26 @@ if ($free_on_mp1 > $free_on_mp2) {
54} 54}
55 55
56 56
57# Do same for inodes
58$_ = $result->output;
59my ($free_inode_on_mp1, $free_inode_on_mp2) = (m/inode=(\d+)%.*inode=(\d+)%/);
60die "Cannot parse free inodes: $_" unless ($free_inode_on_mp1 && $free_inode_on_mp2);
61my $avg_inode_free = ceil(($free_inode_on_mp1 + $free_inode_on_mp2)/2);
62my ($more_inode_free, $less_inode_free);
63if ($free_inode_on_mp1 > $free_inode_on_mp2) {
64 $more_inode_free = $mountpoint_valid;
65 $less_inode_free = $mountpoint2_valid;
66} elsif ($free_on_mp1 < $free_on_mp2) {
67 $more_inode_free = $mountpoint2_valid;
68 $less_inode_free = $mountpoint_valid;
69} else {
70 die "Two mountpoints with same inodes free - cannot do rest of test";
71}
72
73
74
75# Basic filesystem checks for sizes
76
57$result = NPTest->testCmd( "./check_disk -w 1 -c 1 -p $more_free" ); 77$result = NPTest->testCmd( "./check_disk -w 1 -c 1 -p $more_free" );
58cmp_ok( $result->return_code, '==', 0, "At least 1 MB available on $more_free"); 78cmp_ok( $result->return_code, '==', 0, "At least 1 MB available on $more_free");
59like ( $result->output, $successOutput, "OK output" ); 79like ( $result->output, $successOutput, "OK output" );
@@ -76,8 +96,6 @@ cmp_ok( $result->return_code, "==", 2, "Get critical on less_free mountpoint $le
76like( $result->output, $failureOutput, "Right output" ); 96like( $result->output, $failureOutput, "Right output" );
77 97
78 98
79
80
81$result = NPTest->testCmd( 99$result = NPTest->testCmd(
82 "./check_disk -w $avg_free% -c 0% -p $less_free" 100 "./check_disk -w $avg_free% -c 0% -p $less_free"
83 ); 101 );
@@ -102,9 +120,6 @@ like( $result->output, qr/$less_free/, "Found problem $less_free");
102unlike( $result->only_output, qr/$more_free/, "Has ignored $more_free as not a problem"); 120unlike( $result->only_output, qr/$more_free/, "Has ignored $more_free as not a problem");
103like( $result->perf_output, qr/$more_free/, "But $more_free is still in perf data"); 121like( $result->perf_output, qr/$more_free/, "But $more_free is still in perf data");
104 122
105
106
107
108$result = NPTest->testCmd( 123$result = NPTest->testCmd(
109 "./check_disk -w $avg_free% -c 0% -p $more_free" 124 "./check_disk -w $avg_free% -c 0% -p $more_free"
110 ); 125 );
@@ -126,6 +141,50 @@ cmp_ok( $result->return_code, '==', 2, "And reversing arguments should not make
126 141
127 142
128 143
144# Basic inode checks for sizes
145
146$result = NPTest->testCmd( "./check_disk --icritical 1% --iwarning 1% -p $more_inode_free" );
147is( $result->return_code, 0, "At least 1% free on inodes for both mountpoints");
148
149$result = NPTest->testCmd( "./check_disk -K 100% -W 100% -p $less_inode_free" );
150is( $result->return_code, 2, "Critical requesting 100% free inodes for both mountpoints");
151
152$result = NPTest->testCmd( "./check_disk --iwarning 1% --icritical 1% -p $more_inode_free -K 100% -W 100% -p $less_inode_free" );
153is( $result->return_code, 2, "Get critical on less_inode_free mountpoint $less_inode_free");
154
155$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $less_inode_free" );
156is( $result->return_code, 1, "Get warning on less_inode_free, when checking average");
157
158$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K $avg_inode_free% -p $more_inode_free ");
159is( $result->return_code, 0, "Get ok on more_inode_free when checking average");
160
161$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" );
162is ($result->return_code, 1, "Combine above two tests, get warning");
163$all_disks = $result->output;
164
165$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" );
166isnt( $result->output, $all_disks, "-e gives different output");
167like( $result->output, qr/$less_inode_free/, "Found problem $less_inode_free");
168unlike( $result->only_output, qr/$more_inode_free/, "Has ignored $more_inode_free as not a problem");
169like( $result->perf_output, qr/$more_inode_free/, "But $more_inode_free is still in perf data");
170
171$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K 0% -p $more_inode_free" );
172is( $result->return_code, 0, "Get ok on more_inode_free mountpoint, checking average");
173
174$result = NPTest->testCmd( "./check_disk -W $avg_inode_free% -K $avg_inode_free% -p $less_inode_free" );
175is( $result->return_code, 2, "Get critical on less_inode_free, checking average");
176
177$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" );
178is( $result->return_code, 2, "Combining above two tests, get critical");
179
180$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" );
181cmp_ok( $result->return_code, '==', 2, "And reversing arguments should not make a difference");
182
183
184
185
186
187
129TODO: { 188TODO: {
130 local $TODO = "Invalid percent figures"; 189 local $TODO = "Invalid percent figures";
131 $result = NPTest->testCmd( 190 $result = NPTest->testCmd(