Module: monitoring-plugins
Branch: Decstasy-check_dig_flags_feature
Commit: d91d02619d4c1330b871a5418e436b2f81db533a
Author: Lorenz Kästle <[email protected]>
Date: Thu Nov 27 23:42:56 2025 +0100
URL:
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=d91d0261
check_dig: Move flag parsing to parameter processing and out of main
The processing of the forbid-flags and the require-flags parameter
was done in the main function previous to this.
Since no further information is actually needed during runtime,
I moved the processing in the cli param processing stage to
reduce actual complexity later.
---
plugins/check_dig.c | 67 +++++++++++++++++---------------------------
plugins/check_dig.d/config.h | 14 +++++----
2 files changed, 34 insertions(+), 47 deletions(-)
diff --git a/plugins/check_dig.c b/plugins/check_dig.c
index 2db0f66b..9ea19e6a 100644
--- a/plugins/check_dig.c
+++ b/plugins/check_dig.c
@@ -58,10 +58,6 @@ void print_usage(void);
static int verbose = 0;
/* helpers for flag parsing */
-typedef struct {
- char **items;
- size_t count;
-} flag_list;
static flag_list parse_flags_line(const char *line);
static flag_list split_csv_trim(const char *csv);
static bool flag_list_contains(const flag_list *list, const char *needle);
@@ -208,49 +204,36 @@ int main(int argc, char **argv) {
}
/* Optional: evaluate dig flags only if -E/-X were provided */
- if ((config.require_flags && *config.require_flags) ||
- (config.forbid_flags && *config.forbid_flags)) {
-
+ if ((config.require_flags.count > 0) || (config.forbid_flags.count >
0)) {
if (dig_flags.count > 0) {
-
- if (config.require_flags && *config.require_flags) {
- flag_list req =
split_csv_trim(config.require_flags);
-
- for (size_t r = 0; r < req.count; r++) {
- if (!flag_list_contains(&dig_flags,
req.items[r])) {
- result = STATE_CRITICAL;
- if (!msg) {
- xasprintf(&msg,
_("Missing required DNS flag: %s"), req.items[r]);
- } else {
- char *newmsg = NULL;
- xasprintf(&newmsg,
_("%s; missing required DNS flag: %s"), msg,
-
req.items[r]);
- msg = newmsg;
- }
+ for (size_t r = 0; r < config.require_flags.count; r++)
{
+ if (!flag_list_contains(&dig_flags,
config.require_flags.items[r])) {
+ result = STATE_CRITICAL;
+ if (!msg) {
+ xasprintf(&msg, _("Missing
required DNS flag: %s"),
+
config.require_flags.items[r]);
+ } else {
+ char *newmsg = NULL;
+ xasprintf(&newmsg, _("%s;
missing required DNS flag: %s"), msg,
+
config.require_flags.items[r]);
+ msg = newmsg;
}
}
-
- free_flag_list(&req);
}
- if (config.forbid_flags && *config.forbid_flags) {
- flag_list bad =
split_csv_trim(config.forbid_flags);
-
- for (size_t r = 0; r < bad.count; r++) {
- if (flag_list_contains(&dig_flags,
bad.items[r])) {
- result = STATE_CRITICAL;
- if (!msg) {
- xasprintf(&msg,
_("Forbidden DNS flag present: %s"), bad.items[r]);
- } else {
- char *newmsg = NULL;
- xasprintf(&newmsg,
_("%s; forbidden DNS flag present: %s"), msg,
-
bad.items[r]);
- msg = newmsg;
- }
+ for (size_t r = 0; r < config.forbid_flags.count; r++) {
+ if (flag_list_contains(&dig_flags,
config.forbid_flags.items[r])) {
+ result = STATE_CRITICAL;
+ if (!msg) {
+ xasprintf(&msg, _("Forbidden
DNS flag present: %s"),
+
config.forbid_flags.items[r]);
+ } else {
+ char *newmsg = NULL;
+ xasprintf(&newmsg, _("%s;
forbidden DNS flag present: %s"), msg,
+
config.forbid_flags.items[r]);
+ msg = newmsg;
}
}
-
- free_flag_list(&bad);
}
}
}
@@ -351,10 +334,10 @@ check_dig_config_wrapper process_arguments(int argc, char
**argv) {
result.config.dig_args = strdup(optarg);
break;
case 'E': /* require flags */
- result.config.require_flags = strdup(optarg);
+ result.config.require_flags = split_csv_trim(optarg);
break;
case 'X': /* forbid flags */
- result.config.forbid_flags = strdup(optarg);
+ result.config.forbid_flags = split_csv_trim(optarg);
break;
case 'v': /* verbose */
verbose++;
diff --git a/plugins/check_dig.d/config.h b/plugins/check_dig.d/config.h
index 392848e5..dd1f58b5 100644
--- a/plugins/check_dig.d/config.h
+++ b/plugins/check_dig.d/config.h
@@ -7,6 +7,11 @@
#define DEFAULT_PORT 53
#define DEFAULT_TRIES 2
+typedef struct {
+ char **items;
+ size_t count;
+} flag_list;
+
typedef struct {
char *query_address;
char *record_type;
@@ -19,8 +24,8 @@ typedef struct {
double warning_interval;
double critical_interval;
- char *require_flags;
- char *forbid_flags;
+ flag_list require_flags;
+ flag_list forbid_flags;
} check_dig_config;
check_dig_config check_dig_config_init() {
@@ -36,9 +41,8 @@ check_dig_config check_dig_config_init() {
.warning_interval = UNDEFINED,
.critical_interval = UNDEFINED,
- .require_flags = NULL,
- .forbid_flags = NULL,
-
+ .require_flags = {.count = 0, .items = NULL},
+ .forbid_flags = {.count = 0, .items = NULL},
};
return tmp;
}