diff options
-rw-r--r-- | lib/utils_disk.c | 10 | ||||
-rw-r--r-- | lib/utils_disk.h | 2 | ||||
-rw-r--r-- | plugins/check_disk.c | 56 |
3 files changed, 66 insertions, 2 deletions
diff --git a/lib/utils_disk.c b/lib/utils_disk.c index 877b80d..cfd6a97 100644 --- a/lib/utils_disk.c +++ b/lib/utils_disk.c | |||
@@ -155,3 +155,13 @@ np_seen_name(struct name_list *list, const char *name) | |||
155 | return FALSE; | 155 | return FALSE; |
156 | } | 156 | } |
157 | 157 | ||
158 | int | ||
159 | np_regex_match_mount_entry (struct mount_entry* me, regex_t* re) | ||
160 | { | ||
161 | if (regexec(re, me->me_devname, (size_t) 0, NULL, 0) == 0 || | ||
162 | regexec(re, me->me_mountdir, (size_t) 0, NULL, 0) == 0 ) { | ||
163 | return true; | ||
164 | } else { | ||
165 | return false; | ||
166 | } | ||
167 | } | ||
diff --git a/lib/utils_disk.h b/lib/utils_disk.h index 331c16d..6263339 100644 --- a/lib/utils_disk.h +++ b/lib/utils_disk.h | |||
@@ -2,6 +2,7 @@ | |||
2 | 2 | ||
3 | #include "mountlist.h" | 3 | #include "mountlist.h" |
4 | #include "utils_base.h" | 4 | #include "utils_base.h" |
5 | #include "regex.h" | ||
5 | 6 | ||
6 | struct name_list | 7 | struct name_list |
7 | { | 8 | { |
@@ -32,3 +33,4 @@ struct parameter_list *np_add_parameter(struct parameter_list **list, const char | |||
32 | struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name); | 33 | struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name); |
33 | int search_parameter_list (struct parameter_list *list, const char *name); | 34 | int search_parameter_list (struct parameter_list *list, const char *name); |
34 | void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, int exact); | 35 | void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, int exact); |
36 | int np_regex_match_mount_entry (struct mount_entry* me, regex_t* re); | ||
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 1009564..2b12e56 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -56,6 +56,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
56 | #if HAVE_LIMITS_H | 56 | #if HAVE_LIMITS_H |
57 | # include <limits.h> | 57 | # include <limits.h> |
58 | #endif | 58 | #endif |
59 | #include "regex.h" | ||
59 | 60 | ||
60 | 61 | ||
61 | /* If nonzero, show inode information. */ | 62 | /* If nonzero, show inode information. */ |
@@ -437,11 +438,16 @@ double calculate_percent(uintmax_t value, uintmax_t total) { | |||
437 | int | 438 | int |
438 | process_arguments (int argc, char **argv) | 439 | process_arguments (int argc, char **argv) |
439 | { | 440 | { |
440 | int c; | 441 | int c, err; |
441 | struct parameter_list *se; | 442 | struct parameter_list *se; |
442 | struct parameter_list *temp_list; | 443 | struct parameter_list *temp_list; |
444 | struct mount_entry *me; | ||
443 | int result = OK; | 445 | int result = OK; |
444 | struct stat *stat_buf; | 446 | struct stat *stat_buf; |
447 | regex_t re; | ||
448 | int cflags = REG_NOSUB | REG_EXTENDED; | ||
449 | char errbuf[MAX_INPUT_BUFFER]; | ||
450 | bool fnd = false; | ||
445 | 451 | ||
446 | int option = 0; | 452 | int option = 0; |
447 | static struct option longopts[] = { | 453 | static struct option longopts[] = { |
@@ -460,6 +466,10 @@ process_arguments (int argc, char **argv) | |||
460 | {"exclude_device", required_argument, 0, 'x'}, | 466 | {"exclude_device", required_argument, 0, 'x'}, |
461 | {"exclude-type", required_argument, 0, 'X'}, | 467 | {"exclude-type", required_argument, 0, 'X'}, |
462 | {"group", required_argument, 0, 'g'}, | 468 | {"group", required_argument, 0, 'g'}, |
469 | {"eregi-path", required_argument, 0, 'R'}, | ||
470 | {"eregi-partition", required_argument, 0, 'R'}, | ||
471 | {"ereg-path", required_argument, 0, 'r'}, | ||
472 | {"ereg-partition", required_argument, 0, 'r'}, | ||
463 | {"mountpoint", no_argument, 0, 'M'}, | 473 | {"mountpoint", no_argument, 0, 'M'}, |
464 | {"errors-only", no_argument, 0, 'e'}, | 474 | {"errors-only", no_argument, 0, 'e'}, |
465 | {"exact-match", no_argument, 0, 'E'}, | 475 | {"exact-match", no_argument, 0, 'E'}, |
@@ -481,7 +491,7 @@ process_arguments (int argc, char **argv) | |||
481 | strcpy (argv[c], "-t"); | 491 | strcpy (argv[c], "-t"); |
482 | 492 | ||
483 | while (1) { | 493 | while (1) { |
484 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklg:ME", longopts, &option); | 494 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklg:R:r:ME", longopts, &option); |
485 | 495 | ||
486 | if (c == -1 || c == EOF) | 496 | if (c == -1 || c == EOF) |
487 | break; | 497 | break; |
@@ -626,6 +636,44 @@ process_arguments (int argc, char **argv) | |||
626 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before using -p\n")); | 636 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before using -p\n")); |
627 | group = optarg; | 637 | group = optarg; |
628 | break; | 638 | break; |
639 | case 'R': | ||
640 | cflags |= REG_ICASE; | ||
641 | case 'r': | ||
642 | if (! (warn_freespace_units || crit_freespace_units || warn_freespace_percent || | ||
643 | crit_freespace_percent || warn_usedspace_units || crit_usedspace_units || | ||
644 | warn_usedspace_percent || crit_usedspace_percent || warn_usedinodes_percent || | ||
645 | crit_usedinodes_percent || warn_freeinodes_percent || crit_freeinodes_percent )) { | ||
646 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set a threshold value before using -r/-R\n")); | ||
647 | } | ||
648 | |||
649 | err = regcomp(&re, optarg, cflags); | ||
650 | if (err != 0) { | ||
651 | regerror (err, &re, errbuf, MAX_INPUT_BUFFER); | ||
652 | die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf); | ||
653 | } | ||
654 | |||
655 | for (me = mount_list; me; me = me->me_next) { | ||
656 | if (np_regex_match_mount_entry(me, &re)) { | ||
657 | fnd = true; | ||
658 | if (verbose > 3) | ||
659 | printf("%s %s matching expression %s\n", me->me_devname, me->me_mountdir, optarg); | ||
660 | |||
661 | /* add parameter if not found. overwrite thresholds if path has already been added */ | ||
662 | if (! (se = np_find_parameter(path_select_list, me->me_mountdir))) { | ||
663 | se = np_add_parameter(&path_select_list, me->me_mountdir); | ||
664 | } | ||
665 | se->group = group; | ||
666 | set_all_thresholds(se); | ||
667 | } | ||
668 | } | ||
669 | |||
670 | if (!fnd) | ||
671 | die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), | ||
672 | _("Regular expression did not match any path or disk"), optarg); | ||
673 | |||
674 | fnd = false; | ||
675 | path_selected = true; | ||
676 | break; | ||
629 | case 'M': /* display mountpoint */ | 677 | case 'M': /* display mountpoint */ |
630 | display_mntp = TRUE; | 678 | display_mntp = TRUE; |
631 | break; | 679 | break; |
@@ -824,6 +872,10 @@ print_help (void) | |||
824 | printf (" %s\n", _("Only check local filesystems")); | 872 | printf (" %s\n", _("Only check local filesystems")); |
825 | printf (" %s\n", "-p, --path=PATH, --partition=PARTITION"); | 873 | printf (" %s\n", "-p, --path=PATH, --partition=PARTITION"); |
826 | printf (" %s\n", _("Path or partition (may be repeated)")); | 874 | printf (" %s\n", _("Path or partition (may be repeated)")); |
875 | printf (" %s\n", "-r, --ereg-path=PATH, --ereg-partition=PARTITION"); | ||
876 | printf (" %s\n", _("Regular expression for path or partition (may be repeated)")); | ||
877 | printf (" %s\n", "-R, --eregi-path=PATH, --eregi-partition=PARTITION"); | ||
878 | printf (" %s\n", _("Case insensitive regular expression for path/partition (may be repeated)")); | ||
827 | printf (" %s\n", "-g, --group=NAME"); | 879 | printf (" %s\n", "-g, --group=NAME"); |
828 | printf (" %s\n", _("Group pathes. Thresholds apply to (free-)space of all partitions together")); | 880 | printf (" %s\n", _("Group pathes. Thresholds apply to (free-)space of all partitions together")); |
829 | printf (" %s\n", "-x, --exclude_device=PATH <STRING>"); | 881 | printf (" %s\n", "-x, --exclude_device=PATH <STRING>"); |