diff options
Diffstat (limited to 'plugins/check_disk.c')
-rw-r--r-- | plugins/check_disk.c | 81 |
1 files changed, 67 insertions, 14 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 90b22484..d2674097 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c @@ -447,15 +447,16 @@ int process_arguments (int argc, char **argv) { int c, err; - struct parameter_list *se, *se2; - struct parameter_list *temp_list; + struct parameter_list *se; + struct parameter_list *temp_list = NULL, *previous = NULL; struct parameter_list *temp_path_select_list = NULL; - struct mount_entry *me; + struct mount_entry *me, *temp_me; int result = OK; regex_t re; int cflags = REG_NOSUB | REG_EXTENDED; + int default_cflags = cflags; char errbuf[MAX_INPUT_BUFFER]; - bool fnd = false; + int fnd = 0; int option = 0; static struct option longopts[] = { @@ -478,9 +479,14 @@ process_arguments (int argc, char **argv) {"eregi-partition", required_argument, 0, 'R'}, {"ereg-path", required_argument, 0, 'r'}, {"ereg-partition", required_argument, 0, 'r'}, + {"ignore-ereg-path", required_argument, 0, 'i'}, + {"ignore-ereg-partition", required_argument, 0, 'i'}, + {"ignore-eregi-path", required_argument, 0, 'I'}, + {"ignore-eregi-partition", required_argument, 0, 'I'}, {"mountpoint", no_argument, 0, 'M'}, {"errors-only", no_argument, 0, 'e'}, {"exact-match", no_argument, 0, 'E'}, + {"all", no_argument, 0, 'A'}, {"verbose", no_argument, 0, 'v'}, {"quiet", no_argument, 0, 'q'}, {"clear", no_argument, 0, 'C'}, @@ -499,7 +505,7 @@ process_arguments (int argc, char **argv) strcpy (argv[c], "-t"); while (1) { - c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklg:R:r:ME", longopts, &option); + c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklg:R:r:i:I:MEA", longopts, &option); if (c == -1 || c == EOF) break; @@ -613,18 +619,13 @@ process_arguments (int argc, char **argv) die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -p\n")); } - /* get the real mountdir of the specified path. np_find_parameter won't find an entry if -p is not - * exactly the same string as the mountdir */ - se2 = np_add_parameter(&temp_path_select_list, optarg); - np_set_best_match(se2, mount_list, FALSE); - - /* add parameter if not found. overwrite thresholds if path has already been added */ if (! (se = np_find_parameter(path_select_list, optarg))) { se = np_add_parameter(&path_select_list, optarg); } se->group = group; set_all_thresholds(se); + np_set_best_match(se, mount_list, exact_match); path_selected = true; break; case 'x': /* exclude path or partition */ @@ -644,13 +645,56 @@ process_arguments (int argc, char **argv) erronly = TRUE; break; case 'E': + if (path_selected) + die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting pathes\n")); exact_match = TRUE; break; case 'g': if (path_selected) - die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before using -p\n")); + die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting pathes \n")); group = optarg; break; + case 'I': + cflags |= REG_ICASE; + case 'i': + if (!path_selected) + die (STATE_UNKNOWN, "DISK %s: %s\n", _("UNKNOWN"), _("Pathes need to be selected before using -i/-I. Use -A to select all pathes explicitly")); + err = regcomp(&re, optarg, cflags); + if (err != 0) { + regerror (err, &re, errbuf, MAX_INPUT_BUFFER); + die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf); + } + + temp_list = path_select_list; + + previous = NULL; + while (temp_list) { + if (temp_list->best_match) { + if (np_regex_match_mount_entry(temp_list->best_match, &re)) { + + if (verbose >=3) + printf("ignoring %s matching regex\n", temp_list->name); + + temp_list = np_del_parameter(temp_list, previous); + /* pointer to first element needs to be uĆ¼dated if first item gets deleted */ + if (previous == NULL) + path_select_list = temp_list; + } else { + previous = temp_list; + temp_list = temp_list->name_next; + } + } else { + previous = temp_list; + temp_list = temp_list->name_next; + } + } + + + cflags = default_cflags; + break; + + case 'A': + optarg = strdup(".*"); case 'R': cflags |= REG_ICASE; case 'r': @@ -669,9 +713,9 @@ process_arguments (int argc, char **argv) for (me = mount_list; me; me = me->me_next) { if (np_regex_match_mount_entry(me, &re)) { - fnd = true; + fnd = true; if (verbose > 3) - printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg); + printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg); /* add parameter if not found. overwrite thresholds if path has already been added */ if (! (se = np_find_parameter(path_select_list, me->me_mountdir))) { @@ -688,6 +732,9 @@ process_arguments (int argc, char **argv) fnd = false; path_selected = true; + np_set_best_match(path_select_list, mount_list, exact_match); + cflags = default_cflags; + break; case 'M': /* display mountpoint */ display_mntp = TRUE; @@ -871,10 +918,16 @@ print_help (void) printf (" %s\n", _("Display the mountpoint instead of the partition")); printf (" %s\n", "-m, --megabytes"); printf (" %s\n", _("Same as '--units MB'")); + printf (" %s\n", "-A, --all"); + printf (" %s\n", _("Explicitly select all pathes. This is equivalent to -R '.*'")); printf (" %s\n", "-R, --eregi-path=PATH, --eregi-partition=PARTITION"); printf (" %s\n", _("Case insensitive regular expression for path/partition (may be repeated)")); printf (" %s\n", "-r, --ereg-path=PATH, --ereg-partition=PARTITION"); printf (" %s\n", _("Regular expression for path or partition (may be repeated)")); + printf (" %s\n", "-I, --ignore-eregi-path=PATH, --ignore-eregi-partition=PARTITION"); + printf (" %s\n", _("Regular expression to ignore selected path/partition (case insensitive) (may be repeated)")); + printf (" %s\n", "-i, --ignore-ereg-path=PATH, --ignore-ereg-partition=PARTITION"); + printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)")); printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); printf (" %s\n", "-u, --units=STRING"); printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)")); |