diff --git a/debian/patches/32_check_disk_add_ignore_missing b/debian/patches/32_check_disk_add_ignore_missing new file mode 100644 index 0000000..caed27e --- /dev/null +++ b/debian/patches/32_check_disk_add_ignore_missing @@ -0,0 +1,839 @@ +From 8cf31437e99167ad9c260e6677b4d1ed31a34d56 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Mon, 24 Oct 2022 17:29:53 +0200 +Subject: [PATCH 1/9] check_disk: add ignore-missing option to return OK for + missing fs There a situations where UNKNOWN or CRITICAL services are not + wanted when a filesystem is missing, a regex does not match or the filesystem + is inaccessible on a system. This new option helps to have the service in + state OK. + +--- + plugins/check_disk.c | 29 ++++++++++++++++++++++++----- + 1 file changed, 24 insertions(+), 5 deletions(-) + +diff --git a/plugins/check_disk.c b/plugins/check_disk.c +index 7018c6fd5..8df9e7ec8 100644 +--- a/plugins/check_disk.c ++++ b/plugins/check_disk.c +@@ -112,7 +112,8 @@ enum + { + SYNC_OPTION = CHAR_MAX + 1, + NO_SYNC_OPTION, +- BLOCK_SIZE_OPTION ++ BLOCK_SIZE_OPTION, ++ IGNORE_MISSING + }; + + #ifdef _AIX +@@ -140,6 +141,7 @@ int verbose = 0; + int erronly = FALSE; + int display_mntp = FALSE; + int exact_match = FALSE; ++int ignore_missing = FALSE; + int freespace_ignore_reserved = FALSE; + int display_inodes_perfdata = FALSE; + char *warn_freespace_units = NULL; +@@ -219,7 +221,9 @@ main (int argc, char **argv) + temp_list = path_select_list; + + while (temp_list) { +- if (! temp_list->best_match) { ++ if (! temp_list->best_match && ignore_missing == 1) { ++ die (STATE_OK, _("DISK %s: %s not found (ignoring)\n"), _("OK"), temp_list->name); ++ } else if (! temp_list->best_match) { + die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), temp_list->name); + } + +@@ -481,6 +485,7 @@ process_arguments (int argc, char **argv) + {"ignore-ereg-partition", required_argument, 0, 'i'}, + {"ignore-eregi-path", required_argument, 0, 'I'}, + {"ignore-eregi-partition", required_argument, 0, 'I'}, ++ {"ignore-missing", no_argument, 0, IGNORE_MISSING}, + {"local", no_argument, 0, 'l'}, + {"stat-remote-fs", no_argument, 0, 'L'}, + {"iperfdata", no_argument, 0, 'P'}, +@@ -718,6 +723,9 @@ process_arguments (int argc, char **argv) + cflags = default_cflags; + break; + ++ case IGNORE_MISSING: ++ ignore_missing = 1; ++ break; + case 'A': + optarg = strdup(".*"); + // Intentional fallthrough +@@ -753,7 +761,10 @@ process_arguments (int argc, char **argv) + } + } + +- if (!fnd) ++ if (!fnd && ignore_missing == 1) ++ die (STATE_OK, "DISK %s: %s - %s\n",_("OK"), ++ _("Regular expression did not match any path or disk (ignoring)"), optarg); ++ else if (!fnd) + die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), + _("Regular expression did not match any path or disk"), optarg); + +@@ -923,6 +934,9 @@ print_help (void) + 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 (" %s\n", "--ignore-missing"); ++ printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible.")); ++ printf (" %s\n", _("(Provide this option before -r / --ereg-path if used)")); + printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); + printf (" %s\n", "-u, --units=STRING"); + printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)")); +@@ -965,8 +979,13 @@ stat_path (struct parameter_list *p) + if (stat (p->name, &stat_buf[0])) { + if (verbose >= 3) + printf("stat failed on %s\n", p->name); +- printf("DISK %s - ", _("CRITICAL")); +- die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno)); ++ if (ignore_missing == 1) { ++ printf("DISK %s - ", _("OK")); ++ die (STATE_OK, _("%s %s: %s\n"), p->name, _("is not accessible (ignoring)"), strerror(errno)); ++ } else { ++ printf("DISK %s - ", _("CRITICAL")); ++ die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno)); ++ } + } + } + + +From 0d562a356f45f645014c3908178fc13876006f6e Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Tue, 25 Oct 2022 20:49:51 +0200 +Subject: [PATCH 2/9] check_disk: add tests for new option --ignore-missing + +--- + plugins/t/check_disk.t | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t +index ec527e7f6..bea34a4c9 100644 +--- a/plugins/t/check_disk.t ++++ b/plugins/t/check_disk.t +@@ -351,3 +351,18 @@ unlike( $result->output, qr/$mountpoint2_valid/, "output data does not have $mou + $result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -i '^barbazJodsf\$'"); + like( $result->output, qr/$mountpoint_valid/, "ignore: output data does have $mountpoint_valid when regex doesn't match"); + like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mountpoint2_valid when regex doesn't match"); ++ ++# ignore-missing: exit okay, when fs is not accessible ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob"); ++cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob"); ++like( $result->output, '/^DISK OK - /bob is not accessible .*$/', 'Output OK'); ++ ++# ignore-missing: exit okay, when regex does not match ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob"); ++cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); ++like( $result->output, '/^DISK OK: Regular expression did not match any path or disk.*$/', 'Output OK'); ++ ++# ignore-missing: exit okay, when fs with exact match (-E) is not found ++$result = NPTest->testCmd( "./check_disk --ignore-missing -E -w 0% -c 0% -p /etc"); ++cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs"); ++like( $result->output, '/^DISK OK: /etc not found.*$/', 'Output OK'); + +From bacacd2cb38c7d7a695a6f75f699168d9df0132d Mon Sep 17 00:00:00 2001 +From: Sven Nierlein +Date: Wed, 26 Oct 2022 14:03:22 +0200 +Subject: [PATCH 3/9] check_disk: adjust test plan + +--- + plugins/t/check_disk.t | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t +index bea34a4c9..a534fd4a5 100644 +--- a/plugins/t/check_disk.t ++++ b/plugins/t/check_disk.t +@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth + if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { + plan skip_all => "Need 2 mountpoints to test"; + } else { +- plan tests => 78; ++ plan tests => 84; + } + + $result = NPTest->testCmd( + +From 9898a8ad7dabfabfe80785585a5bbc30b678bdb0 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Sun, 19 Feb 2023 13:44:04 +0100 +Subject: [PATCH 4/9] utils_disk: add name_prev pointer to struct + parameter_list + +Also added handling of name_prev in np_add_parameter and np_delete_parameter. +This make calling the np_delete_parameter function easier, because it requires +the previous element as second argument. +--- + lib/utils_disk.c | 19 +++++++++++++++++-- + lib/utils_disk.h | 1 + + 2 files changed, 18 insertions(+), 2 deletions(-) + +diff --git a/lib/utils_disk.c b/lib/utils_disk.c +index c7c9126e4..a1181d37b 100644 +--- a/lib/utils_disk.c ++++ b/lib/utils_disk.c +@@ -46,9 +46,10 @@ np_add_parameter(struct parameter_list **list, const char *name) + struct parameter_list *current = *list; + struct parameter_list *new_path; + new_path = (struct parameter_list *) malloc (sizeof *new_path); +- new_path->name = (char *) name; ++ new_path->name = (char *) malloc(strlen(name) + 1); + new_path->best_match = NULL; + new_path->name_next = NULL; ++ new_path->name_prev = NULL; + new_path->freespace_bytes = NULL; + new_path->freespace_units = NULL; + new_path->freespace_percent = NULL; +@@ -74,13 +75,17 @@ np_add_parameter(struct parameter_list **list, const char *name) + new_path->dused_inodes_percent = 0; + new_path->dfree_inodes_percent = 0; + ++ strcpy(new_path->name, name); ++ + if (current == NULL) { + *list = new_path; ++ new_path->name_prev = NULL; + } else { + while (current->name_next) { + current = current->name_next; + } + current->name_next = new_path; ++ new_path->name_prev = current; + } + return new_path; + } +@@ -89,6 +94,9 @@ np_add_parameter(struct parameter_list **list, const char *name) + struct parameter_list * + np_del_parameter(struct parameter_list *item, struct parameter_list *prev) + { ++ if (item == NULL) { ++ return NULL; ++ } + struct parameter_list *next; + + if (item->name_next) +@@ -96,10 +104,17 @@ np_del_parameter(struct parameter_list *item, struct parameter_list *prev) + else + next = NULL; + +- free(item); ++ if (next) ++ next->name_prev = prev; ++ + if (prev) + prev->name_next = next; + ++ if (item->name) { ++ free(item->name); ++ } ++ free(item); ++ + return next; + } + +diff --git a/lib/utils_disk.h b/lib/utils_disk.h +index bf52e4ce9..3b5a45f86 100644 +--- a/lib/utils_disk.h ++++ b/lib/utils_disk.h +@@ -24,6 +24,7 @@ struct parameter_list + char *group; + struct mount_entry *best_match; + struct parameter_list *name_next; ++ struct parameter_list *name_prev; + uintmax_t total, available, available_to_root, used, + inodes_free, inodes_free_to_root, inodes_used, inodes_total; + double dfree_pct, dused_pct; + +From ba78c32018658608a31c293beef89ec82b9ba9d3 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Sun, 19 Feb 2023 22:49:30 +0100 +Subject: [PATCH 5/9] check_disk: still allow check of available disks with + ignore-missing param used + +Also add reporting of ignored paths. When paths are provided by -p and/ or -r and +one path does not match a mounted disk, checking available disks is still +possible. Paths provided by -p are reported as ignored, when not available. Due +to code structure, this is not possible for -r unfortunately. +--- + plugins/check_disk.c | 103 ++++++++++++++++++++++++++++++++----------- + 1 file changed, 78 insertions(+), 25 deletions(-) + +diff --git a/plugins/check_disk.c b/plugins/check_disk.c +index 8df9e7ec8..c1cfb13c0 100644 +--- a/plugins/check_disk.c ++++ b/plugins/check_disk.c +@@ -117,7 +117,7 @@ enum + }; + + #ifdef _AIX +- #pragma alloca ++#pragma alloca + #endif + + int process_arguments (int, char **); +@@ -127,7 +127,7 @@ int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, ch + void print_help (void); + void print_usage (void); + double calculate_percent(uintmax_t, uintmax_t); +-void stat_path (struct parameter_list *p); ++bool stat_path (struct parameter_list *p); + void get_stats (struct parameter_list *p, struct fs_usage *fsp); + void get_path_stats (struct parameter_list *p, struct fs_usage *fsp); + +@@ -157,6 +157,7 @@ char *crit_usedinodes_percent = NULL; + char *warn_freeinodes_percent = NULL; + char *crit_freeinodes_percent = NULL; + int path_selected = FALSE; ++int path_ignored = FALSE; + char *group = NULL; + struct stat *stat_buf; + struct name_list *seen = NULL; +@@ -168,10 +169,12 @@ main (int argc, char **argv) + int result = STATE_UNKNOWN; + int disk_result = STATE_UNKNOWN; + char *output; ++ char *ignored; + char *details; + char *perf; + char *perf_ilabel; + char *preamble; ++ char *ignored_preamble; + char *flag_header; + int temp_result; + +@@ -183,8 +186,10 @@ main (int argc, char **argv) + char mountdir[32]; + #endif + +- preamble = strdup (" - free space:"); ++ preamble = strdup (" free space:"); ++ ignored_preamble = strdup (" ignored paths:"); + output = strdup (""); ++ ignored = strdup (""); + details = strdup (""); + perf = strdup (""); + perf_ilabel = strdup (""); +@@ -205,7 +210,7 @@ main (int argc, char **argv) + /* If a list of paths has not been selected, find entire + mount list and create list of paths + */ +- if (path_selected == FALSE) { ++ if (path_selected == FALSE && path_ignored == FALSE) { + for (me = mount_list; me; me = me->me_next) { + if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) { + path = np_add_parameter(&path_select_list, me->me_mountdir); +@@ -215,19 +220,40 @@ main (int argc, char **argv) + set_all_thresholds(path); + } + } +- np_set_best_match(path_select_list, mount_list, exact_match); ++ ++ if (path_ignored == FALSE) { ++ np_set_best_match(path_select_list, mount_list, exact_match); ++ } + + /* Error if no match found for specified paths */ + temp_list = path_select_list; + +- while (temp_list) { +- if (! temp_list->best_match && ignore_missing == 1) { +- die (STATE_OK, _("DISK %s: %s not found (ignoring)\n"), _("OK"), temp_list->name); +- } else if (! temp_list->best_match) { +- die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), temp_list->name); ++ while (path_select_list) { ++ if (! path_select_list->best_match && ignore_missing == 1) { ++ /* If the first element will be deleted, the temp_list must be updated with the new start address as well */ ++ if (path_select_list == temp_list) { ++ temp_list = path_select_list->name_next; ++ } ++ /* Add path argument to list of ignored paths to inform about missing paths being ignored and not alerted */ ++ xasprintf (&ignored, "%s %s;", ignored, path_select_list->name); ++ /* Delete the path from the list so that it is not stat-checked later in the code. */ ++ path_select_list = np_del_parameter(path_select_list, path_select_list->name_prev); ++ } else if (! path_select_list->best_match) { ++ /* Without --ignore-missing option, exit with Critical state. */ ++ die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), path_select_list->name); ++ } else { ++ /* Continue jumping through the list */ ++ path_select_list = path_select_list->name_next; + } ++ } ++ ++ path_select_list = temp_list; + +- temp_list = temp_list->name_next; ++ if (! path_select_list && ignore_missing == 1) { ++ result = STATE_OK; ++ if (verbose >= 2) { ++ printf ("None of the provided paths were found\n"); ++ } + } + + /* Process for every path in list */ +@@ -246,6 +272,10 @@ main (int argc, char **argv) + + me = path->best_match; + ++ if (!me) { ++ continue; ++ } ++ + #ifdef __CYGWIN__ + if (strncmp(path->name, "/cygdrive/", 10) != 0 || strlen(path->name) > 11) + continue; +@@ -264,8 +294,12 @@ main (int argc, char **argv) + if (path->group == NULL) { + /* Skip remote filesystems if we're not interested in them */ + if (me->me_remote && show_local_fs) { +- if (stat_remote_fs) +- stat_path(path); ++ if (stat_remote_fs) { ++ if (!stat_path(path) && ignore_missing == 1) { ++ result = STATE_OK; ++ xasprintf (&ignored, "%s %s;", ignored, path->name); ++ } ++ } + continue; + /* Skip pseudo fs's if we haven't asked for all fs's */ + } else if (me->me_dummy && !show_all_fs) { +@@ -284,7 +318,13 @@ main (int argc, char **argv) + } + } + +- stat_path(path); ++ if (!stat_path(path)) { ++ if (ignore_missing == 1) { ++ result = STATE_OK; ++ xasprintf (&ignored, "%s %s;", ignored, path->name); ++ } ++ continue; ++ } + get_fs_usage (me->me_mountdir, me->me_devname, &fsp); + + if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { +@@ -415,8 +455,12 @@ main (int argc, char **argv) + if (verbose >= 2) + xasprintf (&output, "%s%s", output, details); + ++ if (strcmp(output, "") == 0) { ++ preamble = ""; ++ xasprintf (&output, " No disks were found for provided parameters;"); ++ } + +- printf ("DISK %s%s%s|%s\n", state_text (result), (erronly && result==STATE_OK) ? "" : preamble, output, perf); ++ printf ("DISK %s -%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf); + return result; + } + +@@ -637,12 +681,19 @@ process_arguments (int argc, char **argv) + /* 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); ++ ++ if (stat(optarg, &stat_buf[0]) && ignore_missing == 1) { ++ path_ignored = TRUE; ++ break; ++ } + } + se->group = group; + set_all_thresholds(se); + + /* With autofs, it is required to stat() the path before re-populating the mount_list */ +- stat_path(se); ++ if (!stat_path(se)) { ++ break; ++ } + /* NB: We can't free the old mount_list "just like that": both list pointers and struct + * pointers are copied around. One of the reason it wasn't done yet is that other parts + * of check_disk need the same kind of cleanup so it'd better be done as a whole */ +@@ -761,10 +812,11 @@ process_arguments (int argc, char **argv) + } + } + +- if (!fnd && ignore_missing == 1) +- die (STATE_OK, "DISK %s: %s - %s\n",_("OK"), +- _("Regular expression did not match any path or disk (ignoring)"), optarg); +- else if (!fnd) ++ if (!fnd && ignore_missing == 1) { ++ path_ignored = TRUE; ++ /* path_selected = TRUE;*/ ++ break; ++ } else if (!fnd) + die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), + _("Regular expression did not match any path or disk"), optarg); + +@@ -936,7 +988,7 @@ print_help (void) + printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)")); + printf (" %s\n", "--ignore-missing"); + printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible.")); +- printf (" %s\n", _("(Provide this option before -r / --ereg-path if used)")); ++ printf (" %s\n", _("(Provide this option before -p / -r / --ereg-path if used)")); + printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); + printf (" %s\n", "-u, --units=STRING"); + printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)")); +@@ -970,7 +1022,7 @@ print_usage (void) + printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n"); + } + +-void ++bool + stat_path (struct parameter_list *p) + { + /* Stat entry to check that dir exists and is accessible */ +@@ -980,13 +1032,13 @@ stat_path (struct parameter_list *p) + if (verbose >= 3) + printf("stat failed on %s\n", p->name); + if (ignore_missing == 1) { +- printf("DISK %s - ", _("OK")); +- die (STATE_OK, _("%s %s: %s\n"), p->name, _("is not accessible (ignoring)"), strerror(errno)); ++ return false; + } else { + printf("DISK %s - ", _("CRITICAL")); + die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno)); + } + } ++ return true; + } + + +@@ -1006,7 +1058,8 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) { + continue; + #endif + if (p_list->group && ! (strcmp(p_list->group, p->group))) { +- stat_path(p_list); ++ if (! stat_path(p_list)) ++ continue; + get_fs_usage (p_list->best_match->me_mountdir, p_list->best_match->me_devname, &tmpfsp); + get_path_stats(p_list, &tmpfsp); + if (verbose >= 3) + +From ca3d59cd6918c9e2739e783b721d4c1122640fd3 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Sun, 19 Feb 2023 23:00:21 +0100 +Subject: [PATCH 6/9] check_disk: add new tests for new ignore-missing feature + +--- + plugins/t/check_disk.t | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t +index a534fd4a5..275db70d8 100644 +--- a/plugins/t/check_disk.t ++++ b/plugins/t/check_disk.t +@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth + if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { + plan skip_all => "Need 2 mountpoints to test"; + } else { +- plan tests => 84; ++ plan tests => 86; + } + + $result = NPTest->testCmd( +@@ -355,14 +355,24 @@ like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mo + # ignore-missing: exit okay, when fs is not accessible + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob"); +-like( $result->output, '/^DISK OK - /bob is not accessible .*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /bob;.*$/', 'Output OK'); + + # ignore-missing: exit okay, when regex does not match + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); +-like( $result->output, '/^DISK OK: Regular expression did not match any path or disk.*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - No disks were found for provided parameters;.*$/', 'Output OK'); + + # ignore-missing: exit okay, when fs with exact match (-E) is not found +-$result = NPTest->testCmd( "./check_disk --ignore-missing -E -w 0% -c 0% -p /etc"); ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs"); +-like( $result->output, '/^DISK OK: /etc not found.*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK'); ++ ++# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex) ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/$'"); ++cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); ++like( $result->output, '/^DISK OK - free space: / .*$/', 'Output OK'); ++ ++# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path) ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'"); ++cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); ++like( $result->output, '/^DISK OK - free space: / .*; ignored paths: /bob;.*$/', 'Output OK'); +\ No newline at end of file + +From a58293a0c288ee0e050c79715073da9fbdfc4c58 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Mon, 20 Feb 2023 01:27:23 +0100 +Subject: [PATCH 7/9] check_disk: fix tests by setting correct test number and + escaping line end regex + +--- + plugins/t/check_disk.t | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t +index 275db70d8..73f1e3748 100644 +--- a/plugins/t/check_disk.t ++++ b/plugins/t/check_disk.t +@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth + if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") { + plan skip_all => "Need 2 mountpoints to test"; + } else { +- plan tests => 86; ++ plan tests => 88; + } + + $result = NPTest->testCmd( +@@ -126,7 +126,7 @@ my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2; + + + $result = NPTest->testCmd( "./check_disk -e -w 1 -c 1 -p $more_free" ); +-is( $result->only_output, "DISK OK", "No print out of disks with -e for OKs"); ++is( $result->only_output, "DISK OK - No disks were found for provided parameters;", "No print out of disks with -e for OKs"); + + $result = NPTest->testCmd( "./check_disk 100 100 $more_free" ); + cmp_ok( $result->return_code, '==', 0, "Old syntax okay" ); +@@ -368,9 +368,9 @@ cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact m + like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK'); + + # ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex) +-$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/$'"); ++$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); +-like( $result->output, '/^DISK OK - free space: / .*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK'); + + # ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path) + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'"); + +From e102b8a49e857a474db516455d2e871e6834ae34 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Mon, 20 Feb 2023 02:03:01 +0100 +Subject: [PATCH 8/9] check_disk: fix ugly output with -e option and adapt + tests accordingly + +--- + plugins/check_disk.c | 10 +++++----- + plugins/t/check_disk.t | 8 ++++---- + 2 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/plugins/check_disk.c b/plugins/check_disk.c +index d32841d8e..c52d1df48 100644 +--- a/plugins/check_disk.c ++++ b/plugins/check_disk.c +@@ -186,8 +186,8 @@ main (int argc, char **argv) + char mountdir[32]; + #endif + +- preamble = strdup (" free space:"); +- ignored_preamble = strdup (" ignored paths:"); ++ preamble = strdup (" - free space:"); ++ ignored_preamble = strdup (" - ignored paths:"); + output = strdup (""); + ignored = strdup (""); + details = strdup (""); +@@ -455,12 +455,12 @@ main (int argc, char **argv) + if (verbose >= 2) + xasprintf (&output, "%s%s", output, details); + +- if (strcmp(output, "") == 0) { ++ if (strcmp(output, "") == 0 && ! erronly) { + preamble = ""; +- xasprintf (&output, " No disks were found for provided parameters;"); ++ xasprintf (&output, " - No disks were found for provided parameters;"); + } + +- printf ("DISK %s -%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf); ++ printf ("DISK %s%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf); + return result; + } + +diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t +index 73f1e3748..c8f08f515 100644 +--- a/plugins/t/check_disk.t ++++ b/plugins/t/check_disk.t +@@ -126,7 +126,7 @@ my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2; + + + $result = NPTest->testCmd( "./check_disk -e -w 1 -c 1 -p $more_free" ); +-is( $result->only_output, "DISK OK - No disks were found for provided parameters;", "No print out of disks with -e for OKs"); ++is( $result->only_output, "DISK OK", "No print out of disks with -e for OKs"); + + $result = NPTest->testCmd( "./check_disk 100 100 $more_free" ); + cmp_ok( $result->return_code, '==', 0, "Old syntax okay" ); +@@ -355,7 +355,7 @@ like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mo + # ignore-missing: exit okay, when fs is not accessible + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob"); +-like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /bob;.*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /bob;.*$/', 'Output OK'); + + # ignore-missing: exit okay, when regex does not match + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob"); +@@ -365,7 +365,7 @@ like( $result->output, '/^DISK OK - No disks were found for provided parameters; + # ignore-missing: exit okay, when fs with exact match (-E) is not found + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs"); +-like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK'); ++like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /etc;.*$/', 'Output OK'); + + # ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex) + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'"); +@@ -375,4 +375,4 @@ like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK'); + # ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path) + $result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'"); + cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching"); +-like( $result->output, '/^DISK OK - free space: / .*; ignored paths: /bob;.*$/', 'Output OK'); +\ No newline at end of file ++like( $result->output, '/^DISK OK - free space: / .*; - ignored paths: /bob;.*$/', 'Output OK'); +\ No newline at end of file + +From 3e7da5f970d73df91fad32f4dce259d30cdbbd65 Mon Sep 17 00:00:00 2001 +From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com> +Date: Mon, 6 Mar 2023 14:03:10 +0100 +Subject: [PATCH 9/9] check_disk: use cleaner code for ignore-missing option - + use datatype bool for new vars ignore_missing and path_ignored instead of int + - directly initialize preamble and ignored_preamble with their strings + +--- + plugins/check_disk.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +diff --git a/plugins/check_disk.c b/plugins/check_disk.c +index c52d1df48..bd84c8257 100644 +--- a/plugins/check_disk.c ++++ b/plugins/check_disk.c +@@ -141,7 +141,7 @@ int verbose = 0; + int erronly = FALSE; + int display_mntp = FALSE; + int exact_match = FALSE; +-int ignore_missing = FALSE; ++bool ignore_missing = false; + int freespace_ignore_reserved = FALSE; + int display_inodes_perfdata = FALSE; + char *warn_freespace_units = NULL; +@@ -157,7 +157,7 @@ char *crit_usedinodes_percent = NULL; + char *warn_freeinodes_percent = NULL; + char *crit_freeinodes_percent = NULL; + int path_selected = FALSE; +-int path_ignored = FALSE; ++bool path_ignored = false; + char *group = NULL; + struct stat *stat_buf; + struct name_list *seen = NULL; +@@ -173,8 +173,8 @@ main (int argc, char **argv) + char *details; + char *perf; + char *perf_ilabel; +- char *preamble; +- char *ignored_preamble; ++ char *preamble = " - free space:"; ++ char *ignored_preamble = " - ignored paths:"; + char *flag_header; + int temp_result; + +@@ -186,8 +186,6 @@ main (int argc, char **argv) + char mountdir[32]; + #endif + +- preamble = strdup (" - free space:"); +- ignored_preamble = strdup (" - ignored paths:"); + output = strdup (""); + ignored = strdup (""); + details = strdup (""); +@@ -210,7 +208,7 @@ main (int argc, char **argv) + /* If a list of paths has not been selected, find entire + mount list and create list of paths + */ +- if (path_selected == FALSE && path_ignored == FALSE) { ++ if (path_selected == FALSE && path_ignored == false) { + for (me = mount_list; me; me = me->me_next) { + if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) { + path = np_add_parameter(&path_select_list, me->me_mountdir); +@@ -221,7 +219,7 @@ main (int argc, char **argv) + } + } + +- if (path_ignored == FALSE) { ++ if (path_ignored == false) { + np_set_best_match(path_select_list, mount_list, exact_match); + } + +@@ -229,7 +227,7 @@ main (int argc, char **argv) + temp_list = path_select_list; + + while (path_select_list) { +- if (! path_select_list->best_match && ignore_missing == 1) { ++ if (! path_select_list->best_match && ignore_missing == true) { + /* If the first element will be deleted, the temp_list must be updated with the new start address as well */ + if (path_select_list == temp_list) { + temp_list = path_select_list->name_next; +@@ -249,7 +247,7 @@ main (int argc, char **argv) + + path_select_list = temp_list; + +- if (! path_select_list && ignore_missing == 1) { ++ if (! path_select_list && ignore_missing == true) { + result = STATE_OK; + if (verbose >= 2) { + printf ("None of the provided paths were found\n"); +@@ -295,7 +293,7 @@ main (int argc, char **argv) + /* Skip remote filesystems if we're not interested in them */ + if (me->me_remote && show_local_fs) { + if (stat_remote_fs) { +- if (!stat_path(path) && ignore_missing == 1) { ++ if (!stat_path(path) && ignore_missing == true) { + result = STATE_OK; + xasprintf (&ignored, "%s %s;", ignored, path->name); + } +@@ -319,7 +317,7 @@ main (int argc, char **argv) + } + + if (!stat_path(path)) { +- if (ignore_missing == 1) { ++ if (ignore_missing == true) { + result = STATE_OK; + xasprintf (&ignored, "%s %s;", ignored, path->name); + } +@@ -682,8 +680,8 @@ process_arguments (int argc, char **argv) + if (! (se = np_find_parameter(path_select_list, optarg))) { + se = np_add_parameter(&path_select_list, optarg); + +- if (stat(optarg, &stat_buf[0]) && ignore_missing == 1) { +- path_ignored = TRUE; ++ if (stat(optarg, &stat_buf[0]) && ignore_missing == true) { ++ path_ignored = true; + break; + } + } +@@ -775,7 +773,7 @@ process_arguments (int argc, char **argv) + break; + + case IGNORE_MISSING: +- ignore_missing = 1; ++ ignore_missing = true; + break; + case 'A': + optarg = strdup(".*"); +@@ -812,8 +810,8 @@ process_arguments (int argc, char **argv) + } + } + +- if (!fnd && ignore_missing == 1) { +- path_ignored = TRUE; ++ if (!fnd && ignore_missing == true) { ++ path_ignored = true; + /* path_selected = TRUE;*/ + break; + } else if (!fnd) +@@ -1031,7 +1029,7 @@ stat_path (struct parameter_list *p) + if (stat (p->name, &stat_buf[0])) { + if (verbose >= 3) + printf("stat failed on %s\n", p->name); +- if (ignore_missing == 1) { ++ if (ignore_missing == true) { + return false; + } else { + printf("DISK %s - ", _("CRITICAL")); diff --git a/debian/patches/series b/debian/patches/series index 6700b35..6ea014f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -9,3 +9,4 @@ # feature patches 30_check_radius_radcli_1.3.1_support 31_checl_mailq_separate_submission_queue +32_check_disk_add_ignore_missing