Code

Strip leading spaces on dns return value (689563 - Simon L Nielsen)
[nagiosplug.git] / plugins / check_disk.c
index 9ce4a3248ee72329d78cc4ae5d181d41dc218f47..3c1cfef9519c51ffb692758749be38e69c0b818f 100644 (file)
 #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;
-       int temp_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);
@@ -94,77 +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) {
+               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) {
 
-                       /* cannot use max now that STATE_UNKNOWN is greater than STATE_CRITICAL
-                       result = max (result, check_disk (usp, free_disk)); */
-                       temp_result = check_disk (usp, free_disk) ;
+                       if (strcmp(exclude_device,file_system) == 0 ||
+                           strcmp(exclude_device,mntp) == 0) {
+                               if (verbose>0)
+                                       printf ("ignoring %s.", file_system);
+                               continue;
+                       }
 
-                                       
-                       if ( temp_result == STATE_CRITICAL ) {
-                               result = STATE_CRITICAL;
-                       }
-                       else if (temp_result == STATE_WARNING) {
-                               if ( !( result == STATE_CRITICAL) ) {
-                                       result = STATE_WARNING;
-                               }
-                       }
-                       else if (temp_result == STATE_OK) {
-                               if ( ! ( result == STATE_CRITICAL || result == STATE_WARNING) ){
-                                       result = STATE_OK;
-                               }
-                       }
-                       else if (temp_result == STATE_UNKNOWN) {
-                               if ( ! ( result == STATE_CRITICAL || result == STATE_WARNING || result == STATE_OK) ){
-                                       result = STATE_UNKNOWN;
-                               }
-                       }
-                       else {
-                               /* don't have a match with the return value from check_disk() */
-                               result = STATE_UNKNOWN;
-                       }
-                               
-
-                               
-                       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);
+                       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); */
-               if( !( result == STATE_CRITICAL) ) {
+       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( !( result == STATE_CRITICAL) ) {
+       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;
 }
@@ -175,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[] = {
@@ -222,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)) {
@@ -292,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 ();
@@ -308,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
@@ -358,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"
@@ -370,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"
@@ -391,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);
 }