X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_disk.c;h=3c1cfef9519c51ffb692758749be38e69c0b818f;hb=671cc66eff84b3559019608e97cb4d7c8edc9de5;hp=742942496e80adaa059939a6b87c49d37e945805;hpb=9e971876cd15292c7e1c02deb829bd478789eed4;p=nagiosplug.git diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 7429424..3c1cfef 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c @@ -36,45 +36,48 @@ #include "utils.h" #include -#define PROGNAME "check_disk" +#define REVISION "$Revision$" +#define COPYRIGHT "2000-2002" int process_arguments (int, char **); -int call_getopt (int, char **); int validate_arguments (void); int check_disk (int usp, int free_disk); void print_help (void); void print_usage (void); +const char *progname = "check_disk"; + int w_df = -1; int c_df = -1; float w_dfp = -1.0; float c_dfp = -1.0; -char *path = NULL; -int verbose = FALSE; +char *path = ""; +char *exclude_device = ""; +int verbose = 0; int display_mntp = FALSE; + int main (int argc, char **argv) { - int len; int usp = -1; int total_disk = -1; int used_disk = -1; int free_disk = -1; int result = STATE_UNKNOWN; - char *command_line = NULL; - char input_buffer[MAX_INPUT_BUFFER] = ""; - char file_system[MAX_INPUT_BUFFER] = ""; - char mntp[MAX_INPUT_BUFFER] = ""; - char outbuf[MAX_INPUT_BUFFER] = ""; - char *output = NULL; + int disk_result = STATE_UNKNOWN; + char *command_line = ""; + char input_buffer[MAX_INPUT_BUFFER]; + char file_system[MAX_INPUT_BUFFER]; + char mntp[MAX_INPUT_BUFFER]; + char *output = ""; if (process_arguments (argc, argv) != OK) usage ("Could not parse arguments\n"); - command_line = ssprintf (command_line, "%s %s", DF_COMMAND, path); + asprintf (&command_line, "%s %s", DF_COMMAND, path); - if (verbose) + if (verbose>0) printf ("%s ==> ", command_line); child_process = spopen (command_line); @@ -93,43 +96,58 @@ main (int argc, char **argv) if (!index (input_buffer, '/')) continue; - if (sscanf - (input_buffer, "%s %d %d %d %d%% %s", file_system, &total_disk, - &used_disk, &free_disk, &usp, &mntp) == 6 - || sscanf (input_buffer, "%s %*s %d %d %d %d%% %s", file_system, - &total_disk, &used_disk, &free_disk, &usp, &mntp) == 6) { - - result = max (result, check_disk (usp, free_disk)); - len = - snprintf (outbuf, MAX_INPUT_BUFFER - 1, - " [%d kB (%d%%) free on %s]", free_disk, 100 - usp, - display_mntp ? mntp : file_system); - outbuf[len] = 0; - output = strscat (output, outbuf); + if (sscanf (input_buffer, "%s %d %d %d %d%% %s", file_system, + &total_disk, &used_disk, &free_disk, &usp, mntp) == 6 || + sscanf (input_buffer, "%s %*s %d %d %d %d%% %s", file_system, + &total_disk, &used_disk, &free_disk, &usp, mntp) == 6) { + + if (strcmp(exclude_device,file_system) == 0 || + strcmp(exclude_device,mntp) == 0) { + if (verbose>0) + printf ("ignoring %s.", file_system); + continue; + } + + disk_result = check_disk (usp, free_disk); + + if (strcmp (file_system, "none") == 0) + strncpy (file_system, mntp, MAX_INPUT_BUFFER-1); + + if (disk_result!=STATE_OK || verbose>=0) + asprintf (&output, "%s [%d kB (%d%%) free on %s]", output, + free_disk, 100 - usp, display_mntp ? mntp : file_system); + + result = max_state (result, disk_result); } + else { printf ("Unable to read output:\n%s\n%s\n", command_line, input_buffer); return result; } + } /* If we get anything on stderr, at least set warning */ - while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) - result = max (result, STATE_WARNING); + while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { + if (result != STATE_CRITICAL) { + result = STATE_WARNING; + } + } /* close stderr */ - (void) fclose (child_stderr); + if (child_stderr) + (void) fclose (child_stderr); /* close the pipe */ - if (spclose (child_process)) - result = max (result, STATE_WARNING); + if (spclose(child_process)!=0 && result!=STATE_CRITICAL) + result = STATE_WARNING; if (usp < 0) printf ("Disk \"%s\" not mounted or nonexistant\n", path); else if (result == STATE_UNKNOWN) printf ("Unable to read output\n%s\n%s\n", command_line, input_buffer); else - printf ("DISK %s -%s\n", state_text (result), output); + printf ("DISK %s%s\n", state_text (result), output); return result; } @@ -140,41 +158,6 @@ process_arguments (int argc, char **argv) { int c; - if (argc < 2) - return ERROR; - - for (c = 1; c < argc; c++) { - if (strcmp ("-to", argv[c]) == 0) { - strcpy (argv[c], "-t"); - } - } - - c = 0; - while ((c += (call_getopt (argc - c, &argv[c]))) < argc) { - - if (w_dfp == -1 && is_intnonneg (argv[c])) - w_dfp = (100.0 - atof (argv[c])); - else if (c_dfp == -1 && is_intnonneg (argv[c])) - c_dfp = (100.0 - atof (argv[c])); - else if (path == NULL || path[0] == 0) - path = strscpy (path, argv[c]); - } - - if (path == NULL) { - path = malloc (1); - if (path == NULL) - terminate (STATE_UNKNOWN, "Could not malloc empty path\n"); - path[0] = 0; - } - - return validate_arguments (); -} - -int -call_getopt (int argc, char **argv) -{ - int c, i = 0; - #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { @@ -187,31 +170,31 @@ call_getopt (int argc, char **argv) {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"mountpoint", no_argument, 0, 'm'}, + {"exclude_device", required_argument, 0, 'x'}, + {"quiet", no_argument, 0, 'q'}, + {0, 0, 0, 0} }; #endif + if (argc < 2) + return ERROR; + + for (c = 1; c < argc; c++) + if (strcmp ("-to", argv[c]) == 0) + strcpy (argv[c], "-t"); + while (1) { #ifdef HAVE_GETOPT_H c = - getopt_long (argc, argv, "+?Vhvt:c:w:p:m", long_options, &option_index); + getopt_long (argc, argv, "+?Vqhvt:c:w:p:x:m", long_options, &option_index); #else - c = getopt (argc, argv, "+?Vhvt:c:w:p:m"); + c = getopt (argc, argv, "+?Vqhvt:c:w:p:x:m"); #endif - i++; - - if (c == -1 || c == EOF || c == 1) + if (c == -1 || c == EOF) break; - switch (c) { - case 't': - case 'c': - case 'w': - case 'p': - i++; - } - switch (c) { case 'w': /* warning time threshold */ if (is_intnonneg (optarg)) { @@ -257,13 +240,19 @@ call_getopt (int argc, char **argv) path = optarg; break; case 'v': /* verbose */ - verbose = TRUE; + verbose++; + break; + case 'q': /* verbose */ + verbose--; break; case 'm': /* display mountpoint */ display_mntp = TRUE; break; + case 'x': /* exclude path or partition */ + exclude_device = optarg; + break; case 'V': /* version */ - print_revision (my_basename (argv[0]), "$Revision$"); + print_revision (progname, REVISION); exit (STATE_OK); case 'h': /* help */ print_help (); @@ -273,7 +262,18 @@ call_getopt (int argc, char **argv) break; } } - return i; + + c = optind; + if (w_dfp == -1 && argc > c && is_intnonneg (argv[c])) + w_dfp = (100.0 - atof (argv[c++])); + + if (c_dfp == -1 && argc > c && is_intnonneg (argv[c])) + c_dfp = (100.0 - atof (argv[c++])); + + if (argc > c && strlen (path) == 0) + path = argv[c++]; + + return validate_arguments (); } int @@ -323,7 +323,7 @@ check_disk (usp, free_disk) void print_help (void) { - print_revision (PROGNAME, "$Revision$"); + print_revision (progname, REVISION); printf ("Copyright (c) 2000 Ethan Galstad/Karl DeBisschop\n\n" "This plugin will check the percent of used disk space on a mounted\n" @@ -335,15 +335,19 @@ print_help (void) " -w, --warning=INTEGER\n" " Exit with WARNING status if less than INTEGER kilobytes of disk are free\n" " -w, --warning=PERCENT%%\n" - " Exit with WARNING status if more than PERCENT of disk space is free\n" + " Exit with WARNING status if less than PERCENT of disk space is free\n" " -c, --critical=INTEGER\n" " Exit with CRITICAL status if less than INTEGER kilobytes of disk are free\n" " -c, --critical=PERCENT%%\n" - " Exit with CRITCAL status if more than PERCENT of disk space is free\n" + " Exit with CRITCAL status if less than PERCENT of disk space is free\n" " -p, --path=PATH, --partition=PARTTION\n" " Path or partition (checks all mounted partitions if unspecified)\n" " -m, --mountpoint\n" " Display the mountpoint instead of the partition\n" + " -x, --exclude_device=PATH\n" + " Ignore device (only works if -p unspecified)\n" + " -e, --errors-only\n" + " Display only devices/mountpoints with errors\n" " -v, --verbose\n" " Show details for command-line debugging (do not use with nagios server)\n" " -h, --help\n" @@ -356,7 +360,7 @@ void print_usage (void) { printf - ("Usage: %s -w limit -c limit [-p path] [-t timeout] [-m] [--verbose]\n" + ("Usage: %s -w limit -c limit [-p path | -x device] [-t timeout] [-m] [-e] [--verbose]\n" " %s (-h|--help)\n" - " %s (-V|--version)\n", PROGNAME, PROGNAME, PROGNAME); + " %s (-V|--version)\n", progname, progname, progname); }