diff options
Diffstat (limited to 'plugins/check_disk.c')
-rw-r--r-- | plugins/check_disk.c | 226 |
1 files changed, 119 insertions, 107 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index b0b0d2a..7feb5a5 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -35,80 +35,6 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
35 | # include <limits.h> | 35 | # include <limits.h> |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | void | ||
39 | print_usage (void) | ||
40 | { | ||
41 | printf (_("\ | ||
42 | Usage: %s -w limit -c limit [-p path | -x device] [-t timeout] [-m] [-e]\n\ | ||
43 | [-v] [-q]\n\ | ||
44 | %s (-h|--help)\n\ | ||
45 | %s (-V|--version)\n"), | ||
46 | progname, progname, progname); | ||
47 | } | ||
48 | |||
49 | void | ||
50 | print_help (void) | ||
51 | { | ||
52 | print_revision (progname, revision); | ||
53 | |||
54 | printf (_(COPYRIGHT), copyright, email); | ||
55 | |||
56 | printf (_("\ | ||
57 | This plugin checks the amount of used disk space on a mounted file system\n\ | ||
58 | and generates an alert if free space is less than one of the threshold values.")); | ||
59 | |||
60 | print_usage (); | ||
61 | |||
62 | printf (_(UT_HELP_VRSN)); | ||
63 | |||
64 | printf (_("\ | ||
65 | -w, --warning=INTEGER\n\ | ||
66 | Exit with WARNING status if less than INTEGER kilobytes of disk are free\n\ | ||
67 | -w, --warning=PERCENT%%\n\ | ||
68 | Exit with WARNING status if less than PERCENT of disk space is free\n\ | ||
69 | -c, --critical=INTEGER\n\ | ||
70 | Exit with CRITICAL status if less than INTEGER kilobytes of disk are free\n\ | ||
71 | -c, --critical=PERCENT%%\n\ | ||
72 | Exit with CRITCAL status if less than PERCENT of disk space is free\n\ | ||
73 | -C, --clear\n\ | ||
74 | Clear thresholds\n")); | ||
75 | |||
76 | printf (_("\ | ||
77 | -u, --units=STRING\n\ | ||
78 | Choose bytes, kB, MB, GB, TB (default: MB)\n\ | ||
79 | -k, --kilobytes\n\ | ||
80 | Same as '--units kB'\n\ | ||
81 | -m, --megabytes\n\ | ||
82 | Same as '--units MB'\n")); | ||
83 | |||
84 | printf (_("\ | ||
85 | -l, --local\n\ | ||
86 | Only check local filesystems\n\ | ||
87 | -p, --path=PATH, --partition=PARTITION\n\ | ||
88 | Path or partition (may be repeated)\n\ | ||
89 | -x, --exclude_device=PATH <STRING>\n\ | ||
90 | Ignore device (only works if -p unspecified)\n\ | ||
91 | -X, --exclude-type=TYPE <STRING>\n\ | ||
92 | Ignore all filesystems of indicated type (may be repeated)\n\ | ||
93 | -M, --mountpoint\n\ | ||
94 | Display the mountpoint instead of the partition\n\ | ||
95 | -e, --errors-only\n\ | ||
96 | Display only devices/mountpoints with errors\n")); | ||
97 | |||
98 | printf (_(UT_WARN_CRIT)); | ||
99 | |||
100 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
101 | |||
102 | printf (_(UT_VERBOSE)); | ||
103 | |||
104 | printf ("%s", _("Examples:\n\ | ||
105 | check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /\n\ | ||
106 | Checks /tmp and /var at 10%,5% and / at 100MB, 50MB\n")); | ||
107 | |||
108 | support (); | ||
109 | } | ||
110 | |||
111 | |||
112 | /* If nonzero, show inode information. */ | 38 | /* If nonzero, show inode information. */ |
113 | /* static int inode_format; */ | 39 | /* static int inode_format; */ |
114 | 40 | ||
@@ -135,8 +61,8 @@ struct name_list | |||
135 | { | 61 | { |
136 | char *name; | 62 | char *name; |
137 | int found; | 63 | int found; |
138 | int w_df; | 64 | uintmax_t w_df; |
139 | int c_df; | 65 | uintmax_t c_df; |
140 | double w_dfp; | 66 | double w_dfp; |
141 | double c_dfp; | 67 | double c_dfp; |
142 | struct name_list *name_next; | 68 | struct name_list *name_next; |
@@ -183,18 +109,21 @@ enum | |||
183 | #endif | 109 | #endif |
184 | 110 | ||
185 | int process_arguments (int, char **); | 111 | int process_arguments (int, char **); |
186 | int validate_arguments (int, int, double, double, char *); | 112 | void print_path (char *mypath); |
187 | int check_disk (int usp, int free_disk); | 113 | int validate_arguments (uintmax_t, uintmax_t, double, double, char *); |
114 | int check_disk (int usp, uintmax_t free_disk); | ||
188 | int walk_name_list (struct name_list *list, const char *name); | 115 | int walk_name_list (struct name_list *list, const char *name); |
116 | void print_help (void); | ||
117 | void print_usage (void); | ||
189 | 118 | ||
190 | int w_df = -1; | 119 | uintmax_t w_df = 0; |
191 | int c_df = -1; | 120 | uintmax_t c_df = 0; |
192 | double w_dfp = -1.0; | 121 | double w_dfp = -1.0; |
193 | double c_dfp = -1.0; | 122 | double c_dfp = -1.0; |
194 | char *path = ""; | 123 | char *path = ""; |
195 | char *exclude_device = ""; | 124 | char *exclude_device = ""; |
196 | char *units = "MB"; | 125 | char *units = NULL; |
197 | unsigned long mult = 1024 * 1024; | 126 | uintmax_t mult = 1024 * 1024; |
198 | int verbose = 0; | 127 | int verbose = 0; |
199 | int erronly = FALSE; | 128 | int erronly = FALSE; |
200 | int display_mntp = FALSE; | 129 | int display_mntp = FALSE; |
@@ -202,10 +131,12 @@ int display_mntp = FALSE; | |||
202 | /* Linked list of mounted filesystems. */ | 131 | /* Linked list of mounted filesystems. */ |
203 | static struct mount_entry *mount_list; | 132 | static struct mount_entry *mount_list; |
204 | 133 | ||
134 | |||
135 | |||
205 | int | 136 | int |
206 | main (int argc, char **argv) | 137 | main (int argc, char **argv) |
207 | { | 138 | { |
208 | int usp = -1; | 139 | double usp = -1.0; |
209 | int result = STATE_UNKNOWN; | 140 | int result = STATE_UNKNOWN; |
210 | int disk_result = STATE_UNKNOWN; | 141 | int disk_result = STATE_UNKNOWN; |
211 | char file_system[MAX_INPUT_BUFFER]; | 142 | char file_system[MAX_INPUT_BUFFER]; |
@@ -244,7 +175,7 @@ main (int argc, char **argv) | |||
244 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 175 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); |
245 | 176 | ||
246 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 177 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
247 | usp = (fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; | 178 | usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; |
248 | disk_result = check_disk (usp, fsp.fsu_bavail); | 179 | disk_result = check_disk (usp, fsp.fsu_bavail); |
249 | result = max_state (disk_result, result); | 180 | result = max_state (disk_result, result); |
250 | if (disk_result==STATE_OK && erronly && !verbose) | 181 | if (disk_result==STATE_OK && erronly && !verbose) |
@@ -364,7 +295,7 @@ process_arguments (int argc, char **argv) | |||
364 | } | 295 | } |
365 | else if (strpbrk (optarg, ",:") && | 296 | else if (strpbrk (optarg, ",:") && |
366 | strstr (optarg, "%") && | 297 | strstr (optarg, "%") && |
367 | sscanf (optarg, "%d%*[:,]%lf%%", &w_df, &w_dfp) == 2) { | 298 | sscanf (optarg, "%ul%*[:,]%lf%%", &w_df, &w_dfp) == 2) { |
368 | break; | 299 | break; |
369 | } | 300 | } |
370 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &w_dfp) == 1) { | 301 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &w_dfp) == 1) { |
@@ -380,7 +311,7 @@ process_arguments (int argc, char **argv) | |||
380 | } | 311 | } |
381 | else if (strpbrk (optarg, ",:") && | 312 | else if (strpbrk (optarg, ",:") && |
382 | strstr (optarg, "%") && | 313 | strstr (optarg, "%") && |
383 | sscanf (optarg, "%d%*[,:]%lf%%", &c_df, &c_dfp) == 2) { | 314 | sscanf (optarg, "%ul%*[,:]%lf%%", &c_df, &c_dfp) == 2) { |
384 | break; | 315 | break; |
385 | } | 316 | } |
386 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_dfp) == 1) { | 317 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_dfp) == 1) { |
@@ -391,19 +322,19 @@ process_arguments (int argc, char **argv) | |||
391 | } | 322 | } |
392 | case 'u': | 323 | case 'u': |
393 | if (! strcmp (optarg, "bytes")) { | 324 | if (! strcmp (optarg, "bytes")) { |
394 | mult = 1; | 325 | mult = (uintmax_t)1; |
395 | units = "B"; | 326 | units = "B"; |
396 | } else if (! strcmp (optarg, "kB")) { | 327 | } else if (! strcmp (optarg, "kB")) { |
397 | mult = 1024; | 328 | mult = (uintmax_t)1024; |
398 | units = "kB"; | 329 | units = "kB"; |
399 | } else if (! strcmp (optarg, "MB")) { | 330 | } else if (! strcmp (optarg, "MB")) { |
400 | mult = 1024 * 1024; | 331 | mult = (uintmax_t)1024 * 1024; |
401 | units = "MB"; | 332 | units = "MB"; |
402 | } else if (! strcmp (optarg, "GB")) { | 333 | } else if (! strcmp (optarg, "GB")) { |
403 | mult = 1024 * 1024 * 1024; | 334 | mult = (uintmax_t)1024 * 1024 * 1024; |
404 | units = "GB"; | 335 | units = "GB"; |
405 | } else if (! strcmp (optarg, "TB")) { | 336 | } else if (! strcmp (optarg, "TB")) { |
406 | mult = (unsigned long)1024 * 1024 * 1024 * 1024; | 337 | mult = (uintmax_t)1024 * 1024 * 1024 * 1024; |
407 | units = "TB"; | 338 | units = "TB"; |
408 | } else { | 339 | } else { |
409 | die (STATE_UNKNOWN, _("unit type %s not known\n"), optarg); | 340 | die (STATE_UNKNOWN, _("unit type %s not known\n"), optarg); |
@@ -458,8 +389,8 @@ process_arguments (int argc, char **argv) | |||
458 | display_mntp = TRUE; | 389 | display_mntp = TRUE; |
459 | break; | 390 | break; |
460 | case 'C': | 391 | case 'C': |
461 | w_df = -1; | 392 | w_df = 0; |
462 | c_df = -1; | 393 | c_df = 0; |
463 | w_dfp = -1.0; | 394 | w_dfp = -1.0; |
464 | c_dfp = -1.0; | 395 | c_dfp = -1.0; |
465 | break; | 396 | break; |
@@ -477,10 +408,10 @@ process_arguments (int argc, char **argv) | |||
477 | 408 | ||
478 | /* Support for "check_disk warn crit [fs]" with thresholds at used level */ | 409 | /* Support for "check_disk warn crit [fs]" with thresholds at used level */ |
479 | c = optind; | 410 | c = optind; |
480 | if (w_dfp == -1 && argc > c && is_intnonneg (argv[c])) | 411 | if (w_dfp < 0 && argc > c && is_intnonneg (argv[c])) |
481 | w_dfp = (100.0 - atof (argv[c++])); | 412 | w_dfp = (100.0 - atof (argv[c++])); |
482 | 413 | ||
483 | if (c_dfp == -1 && argc > c && is_intnonneg (argv[c])) | 414 | if (c_dfp < 0 && argc > c && is_intnonneg (argv[c])) |
484 | c_dfp = (100.0 - atof (argv[c++])); | 415 | c_dfp = (100.0 - atof (argv[c++])); |
485 | 416 | ||
486 | if (argc > c && strlen (path) == 0) { | 417 | if (argc > c && strlen (path) == 0) { |
@@ -520,9 +451,9 @@ void print_path (char *mypath) | |||
520 | } | 451 | } |
521 | 452 | ||
522 | int | 453 | int |
523 | validate_arguments (int w, int c, double wp, double cp, char *mypath) | 454 | validate_arguments (uintmax_t w, uintmax_t c, double wp, double cp, char *mypath) |
524 | { | 455 | { |
525 | if (w < 0 && c < 0 && wp < 0.0 && cp < 0.0) { | 456 | if (w == 0 && c == 0 && wp < 0.0 && cp < 0.0) { |
526 | printf (_("INPUT ERROR: No thresholds specified")); | 457 | printf (_("INPUT ERROR: No thresholds specified")); |
527 | print_path (mypath); | 458 | print_path (mypath); |
528 | return ERROR; | 459 | return ERROR; |
@@ -535,10 +466,10 @@ INPUT ERROR: C_DFP (%f) should be less than W_DFP (%.1f) and both should be betw | |||
535 | print_path (path); | 466 | print_path (path); |
536 | return ERROR; | 467 | return ERROR; |
537 | } | 468 | } |
538 | else if ((w > 0 || c > 0) && (w < 0 || c < 0 || c > w)) { | 469 | else if ((w > 0 || c > 0) && (w == 0 || c == 0 || c > w)) { |
539 | printf (_("\ | 470 | printf (_("\ |
540 | INPUT ERROR: C_DF (%d) should be less than W_DF (%d) and both should be greater than zero"), | 471 | INPUT ERROR: C_DF (%lu) should be less than W_DF (%lu) and both should be greater than zero"), |
541 | c, w); | 472 | (unsigned long)c, (unsigned long)w); |
542 | print_path (path); | 473 | print_path (path); |
543 | return ERROR; | 474 | return ERROR; |
544 | } | 475 | } |
@@ -551,17 +482,17 @@ INPUT ERROR: C_DF (%d) should be less than W_DF (%d) and both should be greater | |||
551 | 482 | ||
552 | 483 | ||
553 | int | 484 | int |
554 | check_disk (int usp, int free_disk) | 485 | check_disk (int usp, uintmax_t free_disk) |
555 | { | 486 | { |
556 | int result = STATE_UNKNOWN; | 487 | int result = STATE_UNKNOWN; |
557 | /* check the percent used space against thresholds */ | 488 | /* check the percent used space against thresholds */ |
558 | if (usp >= 0 && usp >= (100.0 - c_dfp)) | 489 | if (usp >= 0.0 && usp >= (100.0 - c_dfp)) |
559 | result = STATE_CRITICAL; | 490 | result = STATE_CRITICAL; |
560 | else if (c_df >= 0 && free_disk <= c_df) | 491 | else if (c_df > 0 && free_disk <= c_df) |
561 | result = STATE_CRITICAL; | 492 | result = STATE_CRITICAL; |
562 | else if (usp >= 0 && usp >= (100.0 - w_dfp)) | 493 | else if (usp >= 0.0 && usp >= (100.0 - w_dfp)) |
563 | result = STATE_WARNING; | 494 | result = STATE_WARNING; |
564 | else if (w_df >= 0 && free_disk <= w_df) | 495 | else if (w_df > 0 && free_disk <= w_df) |
565 | result = STATE_WARNING; | 496 | result = STATE_WARNING; |
566 | else if (usp >= 0.0) | 497 | else if (usp >= 0.0) |
567 | result = STATE_OK; | 498 | result = STATE_OK; |
@@ -579,11 +510,92 @@ walk_name_list (struct name_list *list, const char *name) | |||
579 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ | 510 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ |
580 | if (list->w_df) w_df = list->w_df; | 511 | if (list->w_df) w_df = list->w_df; |
581 | if (list->c_df) c_df = list->c_df; | 512 | if (list->c_df) c_df = list->c_df; |
582 | if (list->w_dfp) w_dfp = list->w_dfp; | 513 | if (list->w_dfp>=0.0) w_dfp = list->w_dfp; |
583 | if (list->c_dfp) c_dfp = list->c_dfp; | 514 | if (list->c_dfp>=0.0) c_dfp = list->c_dfp; |
584 | return TRUE; | 515 | return TRUE; |
585 | } | 516 | } |
586 | list = list->name_next; | 517 | list = list->name_next; |
587 | } | 518 | } |
588 | return FALSE; | 519 | return FALSE; |
589 | } | 520 | } |
521 | |||
522 | |||
523 | |||
524 | |||
525 | |||
526 | |||
527 | void | ||
528 | print_help (void) | ||
529 | { | ||
530 | print_revision (progname, revision); | ||
531 | |||
532 | printf (_(COPYRIGHT), copyright, email); | ||
533 | |||
534 | printf (_("\ | ||
535 | This plugin checks the amount of used disk space on a mounted file system\n\ | ||
536 | and generates an alert if free space is less than one of the threshold values.")); | ||
537 | |||
538 | print_usage (); | ||
539 | |||
540 | printf (_(UT_HELP_VRSN)); | ||
541 | |||
542 | printf (_("\ | ||
543 | -w, --warning=INTEGER\n\ | ||
544 | Exit with WARNING status if less than INTEGER kilobytes of disk are free\n\ | ||
545 | -w, --warning=PERCENT%%\n\ | ||
546 | Exit with WARNING status if less than PERCENT of disk space is free\n\ | ||
547 | -c, --critical=INTEGER\n\ | ||
548 | Exit with CRITICAL status if less than INTEGER kilobytes of disk are free\n\ | ||
549 | -c, --critical=PERCENT%%\n\ | ||
550 | Exit with CRITCAL status if less than PERCENT of disk space is free\n\ | ||
551 | -C, --clear\n\ | ||
552 | Clear thresholds\n")); | ||
553 | |||
554 | printf (_("\ | ||
555 | -u, --units=STRING\n\ | ||
556 | Choose bytes, kB, MB, GB, TB (default: MB)\n\ | ||
557 | -k, --kilobytes\n\ | ||
558 | Same as '--units kB'\n\ | ||
559 | -m, --megabytes\n\ | ||
560 | Same as '--units MB'\n")); | ||
561 | |||
562 | printf (_("\ | ||
563 | -l, --local\n\ | ||
564 | Only check local filesystems\n\ | ||
565 | -p, --path=PATH, --partition=PARTITION\n\ | ||
566 | Path or partition (may be repeated)\n\ | ||
567 | -x, --exclude_device=PATH <STRING>\n\ | ||
568 | Ignore device (only works if -p unspecified)\n\ | ||
569 | -X, --exclude-type=TYPE <STRING>\n\ | ||
570 | Ignore all filesystems of indicated type (may be repeated)\n\ | ||
571 | -M, --mountpoint\n\ | ||
572 | Display the mountpoint instead of the partition\n\ | ||
573 | -e, --errors-only\n\ | ||
574 | Display only devices/mountpoints with errors\n")); | ||
575 | |||
576 | printf (_(UT_WARN_CRIT)); | ||
577 | |||
578 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
579 | |||
580 | printf (_(UT_VERBOSE)); | ||
581 | |||
582 | printf ("%s", _("Examples:\n\ | ||
583 | check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /\n\ | ||
584 | Checks /tmp and /var at 10%,5% and / at 100MB, 50MB\n")); | ||
585 | |||
586 | support (); | ||
587 | } | ||
588 | |||
589 | |||
590 | |||
591 | |||
592 | void | ||
593 | print_usage (void) | ||
594 | { | ||
595 | printf (_("\ | ||
596 | Usage: %s -w limit -c limit [-p path | -x device] [-t timeout] [-m] [-e]\n\ | ||
597 | [-v] [-q]\n\ | ||
598 | %s (-h|--help)\n\ | ||
599 | %s (-V|--version)\n"), | ||
600 | progname, progname, progname); | ||
601 | } | ||