diff options
Diffstat (limited to 'plugins/check_disk.c')
-rw-r--r-- | plugins/check_disk.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index e73a0083..1c43e854 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -141,6 +141,7 @@ int erronly = FALSE; | |||
141 | int display_mntp = FALSE; | 141 | int display_mntp = FALSE; |
142 | int exact_match = FALSE; | 142 | int exact_match = FALSE; |
143 | int freespace_ignore_reserved = FALSE; | 143 | int freespace_ignore_reserved = FALSE; |
144 | int display_inodes_perfdata = FALSE; | ||
144 | char *warn_freespace_units = NULL; | 145 | char *warn_freespace_units = NULL; |
145 | char *crit_freespace_units = NULL; | 146 | char *crit_freespace_units = NULL; |
146 | char *warn_freespace_percent = NULL; | 147 | char *warn_freespace_percent = NULL; |
@@ -167,6 +168,7 @@ main (int argc, char **argv) | |||
167 | char *output; | 168 | char *output; |
168 | char *details; | 169 | char *details; |
169 | char *perf; | 170 | char *perf; |
171 | char *perf_ilabel; | ||
170 | char *preamble; | 172 | char *preamble; |
171 | char *flag_header; | 173 | char *flag_header; |
172 | double inode_space_pct; | 174 | double inode_space_pct; |
@@ -186,6 +188,7 @@ main (int argc, char **argv) | |||
186 | output = strdup (""); | 188 | output = strdup (""); |
187 | details = strdup (""); | 189 | details = strdup (""); |
188 | perf = strdup (""); | 190 | perf = strdup (""); |
191 | perf_ilabel = strdup (""); | ||
189 | stat_buf = malloc(sizeof *stat_buf); | 192 | stat_buf = malloc(sizeof *stat_buf); |
190 | 193 | ||
191 | setlocale (LC_ALL, ""); | 194 | setlocale (LC_ALL, ""); |
@@ -348,6 +351,29 @@ main (int argc, char **argv) | |||
348 | TRUE, 0, | 351 | TRUE, 0, |
349 | TRUE, path->dtotal_units)); | 352 | TRUE, path->dtotal_units)); |
350 | 353 | ||
354 | if (display_inodes_perfdata) { | ||
355 | /* *_high_tide must be reinitialized at each run */ | ||
356 | warning_high_tide = UINT_MAX; | ||
357 | critical_high_tide = UINT_MAX; | ||
358 | |||
359 | if (path->freeinodes_percent->warning != NULL) { | ||
360 | warning_high_tide = abs( min( (double) warning_high_tide, (double) (1.0 - path->freeinodes_percent->warning->end/100)*path->inodes_total )); | ||
361 | } | ||
362 | if (path->freeinodes_percent->critical != NULL) { | ||
363 | critical_high_tide = abs( min( (double) critical_high_tide, (double) (1.0 - path->freeinodes_percent->critical->end/100)*path->inodes_total )); | ||
364 | } | ||
365 | |||
366 | xasprintf (&perf_ilabel, "%s (inodes)", (!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir); | ||
367 | /* Nb: *_high_tide are unset when == UINT_MAX */ | ||
368 | xasprintf (&perf, "%s %s", perf, | ||
369 | perfdata (perf_ilabel, | ||
370 | path->inodes_used, "", | ||
371 | (warning_high_tide != UINT_MAX ? TRUE : FALSE), warning_high_tide, | ||
372 | (critical_high_tide != UINT_MAX ? TRUE : FALSE), critical_high_tide, | ||
373 | TRUE, 0, | ||
374 | TRUE, path->inodes_total)); | ||
375 | } | ||
376 | |||
351 | if (disk_result==STATE_OK && erronly && !verbose) | 377 | if (disk_result==STATE_OK && erronly && !verbose) |
352 | continue; | 378 | continue; |
353 | 379 | ||
@@ -455,6 +481,7 @@ process_arguments (int argc, char **argv) | |||
455 | {"ignore-eregi-partition", required_argument, 0, 'I'}, | 481 | {"ignore-eregi-partition", required_argument, 0, 'I'}, |
456 | {"local", no_argument, 0, 'l'}, | 482 | {"local", no_argument, 0, 'l'}, |
457 | {"stat-remote-fs", no_argument, 0, 'L'}, | 483 | {"stat-remote-fs", no_argument, 0, 'L'}, |
484 | {"iperfdata", no_argument, 0, 'P'}, | ||
458 | {"mountpoint", no_argument, 0, 'M'}, | 485 | {"mountpoint", no_argument, 0, 'M'}, |
459 | {"errors-only", no_argument, 0, 'e'}, | 486 | {"errors-only", no_argument, 0, 'e'}, |
460 | {"exact-match", no_argument, 0, 'E'}, | 487 | {"exact-match", no_argument, 0, 'E'}, |
@@ -477,7 +504,7 @@ process_arguments (int argc, char **argv) | |||
477 | strcpy (argv[c], "-t"); | 504 | strcpy (argv[c], "-t"); |
478 | 505 | ||
479 | while (1) { | 506 | while (1) { |
480 | c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option); | 507 | c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLPg:R:r:i:I:MEA", longopts, &option); |
481 | 508 | ||
482 | if (c == -1 || c == EOF) | 509 | if (c == -1 || c == EOF) |
483 | break; | 510 | break; |
@@ -582,9 +609,13 @@ process_arguments (int argc, char **argv) | |||
582 | break; | 609 | break; |
583 | case 'L': | 610 | case 'L': |
584 | stat_remote_fs = 1; | 611 | stat_remote_fs = 1; |
612 | /* fallthrough */ | ||
585 | case 'l': | 613 | case 'l': |
586 | show_local_fs = 1; | 614 | show_local_fs = 1; |
587 | break; | 615 | break; |
616 | case 'P': | ||
617 | display_inodes_perfdata = 1; | ||
618 | break; | ||
588 | case 'p': /* select path */ | 619 | case 'p': /* select path */ |
589 | if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent || | 620 | if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent || |
590 | crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || | 621 | crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || |
@@ -1012,6 +1043,8 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) { | |||
1012 | p->dtotal_units += p_list->dtotal_units; | 1043 | p->dtotal_units += p_list->dtotal_units; |
1013 | p->inodes_total += p_list->inodes_total; | 1044 | p->inodes_total += p_list->inodes_total; |
1014 | p->inodes_free += p_list->inodes_free; | 1045 | p->inodes_free += p_list->inodes_free; |
1046 | p->inodes_free_to_root += p_list->inodes_free_to_root; | ||
1047 | p->inodes_used += p_list->inodes_used; | ||
1015 | } | 1048 | } |
1016 | first = 0; | 1049 | first = 0; |
1017 | } | 1050 | } |
@@ -1050,7 +1083,18 @@ get_path_stats (struct parameter_list *p, struct fs_usage *fsp) { | |||
1050 | p->dused_units = p->used*fsp->fsu_blocksize/mult; | 1083 | p->dused_units = p->used*fsp->fsu_blocksize/mult; |
1051 | p->dfree_units = p->available*fsp->fsu_blocksize/mult; | 1084 | p->dfree_units = p->available*fsp->fsu_blocksize/mult; |
1052 | p->dtotal_units = p->total*fsp->fsu_blocksize/mult; | 1085 | p->dtotal_units = p->total*fsp->fsu_blocksize/mult; |
1053 | p->inodes_total = fsp->fsu_files; /* Total file nodes. */ | 1086 | /* Free file nodes. Not sure the workaround is required, but in case...*/ |
1054 | p->inodes_free = fsp->fsu_ffree; /* Free file nodes. */ | 1087 | p->inodes_free = fsp->fsu_favail > fsp->fsu_ffree ? 0 : fsp->fsu_favail; |
1088 | p->inodes_free_to_root = fsp->fsu_ffree; /* Free file nodes for root. */ | ||
1089 | p->inodes_used = fsp->fsu_files - fsp->fsu_ffree; | ||
1090 | if (freespace_ignore_reserved) { | ||
1091 | /* option activated : we substract the root-reserved inodes from the total */ | ||
1092 | /* not all OS report fsp->fsu_favail, only the ones with statvfs syscall */ | ||
1093 | /* for others, fsp->fsu_ffree == fsp->fsu_favail */ | ||
1094 | p->inodes_total = fsp->fsu_files - p->inodes_free_to_root + p->inodes_free; | ||
1095 | } else { | ||
1096 | /* default behaviour : take all the inodes into account */ | ||
1097 | p->inodes_total = fsp->fsu_files; | ||
1098 | } | ||
1055 | np_add_name(&seen, p->best_match->me_mountdir); | 1099 | np_add_name(&seen, p->best_match->me_mountdir); |
1056 | } | 1100 | } |