diff --git a/plugins/check_disk.c b/plugins/check_disk.c
index 742942496e80adaa059939a6b87c49d37e945805..3c1cfef9519c51ffb692758749be38e69c0b818f 100644 (file)
--- a/plugins/check_disk.c
+++ b/plugins/check_disk.c
#include "utils.h"
#include <stdarg.h>
-#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);
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;
}
{
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[] = {
{"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)) {
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 ();
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
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"
" -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"
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);
}