From 58f08344200e89fe9a3fbd3edbf4fa2c5b2ec194 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:03:36 +0100 Subject: check_dig: clang-format --- plugins/check_dig.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/plugins/check_dig.c b/plugins/check_dig.c index 2bbd1e05..abca6b24 100644 --- a/plugins/check_dig.c +++ b/plugins/check_dig.c @@ -80,14 +80,16 @@ int main(int argc, char **argv) { textdomain(PACKAGE); /* Set signal handling and alarm */ - if (signal(SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) + if (signal(SIGALRM, runcmd_timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); + } /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - if (process_arguments(argc, argv) == ERROR) + if (process_arguments(argc, argv) == ERROR) { usage_va(_("Could not parse arguments")); + } /* dig applies the timeout to each try, so we need to work around this */ timeout_interval_dig = timeout_interval / number_tries + number_tries; @@ -121,8 +123,9 @@ int main(int argc, char **argv) { /* loop through the whole 'ANSWER SECTION' */ for (; i < chld_out.lines; i++) { /* get the host address */ - if (verbose) + if (verbose) { printf("%s\n", chld_out.line[i]); + } if (strcasestr(chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { msg = chld_out.line[i]; @@ -130,8 +133,9 @@ int main(int argc, char **argv) { /* Translate output TAB -> SPACE */ t = msg; - while ((t = strchr(t, '\t')) != NULL) + while ((t = strchr(t, '\t')) != NULL) { *t = ' '; + } break; } } @@ -154,7 +158,7 @@ int main(int argc, char **argv) { /* If we get anything on STDERR, at least set warning */ if (chld_err.buflen > 0) { result = max_state(result, STATE_WARNING); - if (!msg) + if (!msg) { for (i = 0; i < chld_err.lines; i++) { msg = strchr(chld_err.line[0], ':'); if (msg) { @@ -162,16 +166,19 @@ int main(int argc, char **argv) { break; } } + } } microsec = deltime(tv); elapsed_time = (double)microsec / 1.0e6; - if (critical_interval > UNDEFINED && elapsed_time > critical_interval) + if (critical_interval > UNDEFINED && elapsed_time > critical_interval) { result = STATE_CRITICAL; + } - else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) + else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) { result = STATE_WARNING; + } printf("DNS %s - %.3f seconds response time (%s)|%s\n", state_text(result), elapsed_time, msg ? msg : _("Probably a non-existent host/domain"), @@ -201,14 +208,16 @@ int process_arguments(int argc, char **argv) { {"use-ipv6", no_argument, 0, '6'}, {0, 0, 0, 0}}; - if (argc < 2) + if (argc < 2) { return ERROR; + } while (1) { c = getopt_long(argc, argv, "hVvt:l:H:w:c:T:p:a:A:46", longopts, &option); - if (c == -1 || c == EOF) + if (c == -1 || c == EOF) { break; + } switch (c) { case 'h': /* help */ @@ -281,10 +290,11 @@ int process_arguments(int argc, char **argv) { host_or_die(argv[c]); dns_server = argv[c]; } else { - if (strcmp(query_transport, "-6") == 0) + if (strcmp(query_transport, "-6") == 0) { dns_server = strdup("::1"); - else + } else { dns_server = strdup("127.0.0.1"); + } } } @@ -292,8 +302,9 @@ int process_arguments(int argc, char **argv) { } int validate_arguments(void) { - if (query_address != NULL) + if (query_address != NULL) { return OK; + } return ERROR; } -- cgit v1.2.3-74-g34f1 From 920d2e0873fa05878df247e40a2b063ca959814a Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:34:51 +0100 Subject: Refactor check_dig --- plugins/Makefile.am | 3 +- plugins/check_dig.c | 162 +++++++++++++++++++++---------------------- plugins/check_dig.d/config.h | 40 +++++++++++ 3 files changed, 121 insertions(+), 84 deletions(-) create mode 100644 plugins/check_dig.d/config.h diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 3d5ad1a9..643a4992 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -55,7 +55,8 @@ EXTRA_DIST = t \ check_ssh.d \ check_dns.d \ check_apt.d \ - check_by_ssh.d + check_by_ssh.d \ + check_dig.d PLUGINHDRS = common.h diff --git a/plugins/check_dig.c b/plugins/check_dig.c index abca6b24..d0903be2 100644 --- a/plugins/check_dig.c +++ b/plugins/check_dig.c @@ -41,40 +41,22 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils.h" #include "runcmd.h" -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int validate_arguments(void); +#include "check_dig.d/config.h" +#include "states.h" + +typedef struct { + int errorcode; + check_dig_config config; +} check_dig_config_wrapper; +static check_dig_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_dig_config_wrapper validate_arguments(check_dig_config_wrapper /*config_wrapper*/); + static void print_help(void); void print_usage(void); -#define UNDEFINED 0 -#define DEFAULT_PORT 53 -#define DEFAULT_TRIES 2 - -static char *query_address = NULL; -static char *record_type = "A"; -static char *expected_address = NULL; -static char *dns_server = NULL; -static char *dig_args = ""; -static char *query_transport = ""; -static bool verbose = false; -static int server_port = DEFAULT_PORT; -static int number_tries = DEFAULT_TRIES; -static double warning_interval = UNDEFINED; -static double critical_interval = UNDEFINED; -static struct timeval tv; +static int verbose = 0; int main(int argc, char **argv) { - char *command_line; - output chld_out; - output chld_err; - char *msg = NULL; - size_t i; - char *t; - long microsec; - double elapsed_time; - int result = STATE_UNKNOWN; - int timeout_interval_dig; - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -87,36 +69,45 @@ int main(int argc, char **argv) { /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - if (process_arguments(argc, argv) == ERROR) { + check_dig_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage_va(_("Could not parse arguments")); } + const check_dig_config config = tmp_config.config; + /* dig applies the timeout to each try, so we need to work around this */ - timeout_interval_dig = timeout_interval / number_tries + number_tries; + int timeout_interval_dig = ((int)timeout_interval / config.number_tries) + config.number_tries; + char *command_line; /* get the command to run */ - xasprintf(&command_line, "%s %s %s -p %d @%s %s %s +retry=%d +time=%d", PATH_TO_DIG, dig_args, query_transport, server_port, dns_server, - query_address, record_type, number_tries, timeout_interval_dig); + xasprintf(&command_line, "%s %s %s -p %d @%s %s %s +retry=%d +time=%d", PATH_TO_DIG, config.dig_args, config.query_transport, + config.server_port, config.dns_server, config.query_address, config.record_type, config.number_tries, timeout_interval_dig); alarm(timeout_interval); - gettimeofday(&tv, NULL); + struct timeval start_time; + gettimeofday(&start_time, NULL); if (verbose) { printf("%s\n", command_line); - if (expected_address != NULL) { - printf(_("Looking for: '%s'\n"), expected_address); + if (config.expected_address != NULL) { + printf(_("Looking for: '%s'\n"), config.expected_address); } else { - printf(_("Looking for: '%s'\n"), query_address); + printf(_("Looking for: '%s'\n"), config.query_address); } } + output chld_out; + output chld_err; + char *msg = NULL; + mp_state_enum result = STATE_UNKNOWN; /* run the command */ if (np_runcmd(command_line, &chld_out, &chld_err, 0) != 0) { result = STATE_WARNING; msg = (char *)_("dig returned an error status"); } - for (i = 0; i < chld_out.lines; i++) { + for (size_t i = 0; i < chld_out.lines; i++) { /* the server is responding, we just got the host name... */ if (strstr(chld_out.line[i], ";; ANSWER SECTION:")) { @@ -127,14 +118,15 @@ int main(int argc, char **argv) { printf("%s\n", chld_out.line[i]); } - if (strcasestr(chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { + if (strcasestr(chld_out.line[i], (config.expected_address == NULL ? config.query_address : config.expected_address)) != + NULL) { msg = chld_out.line[i]; result = STATE_OK; /* Translate output TAB -> SPACE */ - t = msg; - while ((t = strchr(t, '\t')) != NULL) { - *t = ' '; + char *temp = msg; + while ((temp = strchr(temp, '\t')) != NULL) { + *temp = ' '; } break; } @@ -159,7 +151,7 @@ int main(int argc, char **argv) { if (chld_err.buflen > 0) { result = max_state(result, STATE_WARNING); if (!msg) { - for (i = 0; i < chld_err.lines; i++) { + for (size_t i = 0; i < chld_err.lines; i++) { msg = strchr(chld_err.line[0], ':'); if (msg) { msg++; @@ -169,29 +161,26 @@ int main(int argc, char **argv) { } } - microsec = deltime(tv); - elapsed_time = (double)microsec / 1.0e6; + long microsec = deltime(start_time); + double elapsed_time = (double)microsec / 1.0e6; - if (critical_interval > UNDEFINED && elapsed_time > critical_interval) { + if (config.critical_interval > UNDEFINED && elapsed_time > config.critical_interval) { result = STATE_CRITICAL; } - else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) { + else if (config.warning_interval > UNDEFINED && elapsed_time > config.warning_interval) { result = STATE_WARNING; } printf("DNS %s - %.3f seconds response time (%s)|%s\n", state_text(result), elapsed_time, msg ? msg : _("Probably a non-existent host/domain"), - fperfdata("time", elapsed_time, "s", (warning_interval > UNDEFINED ? true : false), warning_interval, - (critical_interval > UNDEFINED ? true : false), critical_interval, true, 0, false, 0)); - return result; + fperfdata("time", elapsed_time, "s", (config.warning_interval > UNDEFINED), config.warning_interval, + (config.critical_interval > UNDEFINED), config.critical_interval, true, 0, false, 0)); + exit(result); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; +check_dig_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"query_address", required_argument, 0, 'l'}, {"warning", required_argument, 0, 'w'}, @@ -208,18 +197,25 @@ int process_arguments(int argc, char **argv) { {"use-ipv6", no_argument, 0, '6'}, {0, 0, 0, 0}}; + check_dig_config_wrapper result = { + .errorcode = OK, + .config = check_dig_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } - while (1) { - c = getopt_long(argc, argv, "hVvt:l:H:w:c:T:p:a:A:46", longopts, &option); + int option = 0; + while (true) { + int option_index = getopt_long(argc, argv, "hVvt:l:H:w:c:T:p:a:A:46", longopts, &option); - if (c == -1 || c == EOF) { + if (option_index == -1 || option_index == EOF) { break; } - switch (c) { + switch (option_index) { case 'h': /* help */ print_help(); exit(STATE_UNKNOWN); @@ -228,28 +224,28 @@ int process_arguments(int argc, char **argv) { exit(STATE_UNKNOWN); case 'H': /* hostname */ host_or_die(optarg); - dns_server = optarg; + result.config.dns_server = optarg; break; case 'p': /* server port */ if (is_intpos(optarg)) { - server_port = atoi(optarg); + result.config.server_port = atoi(optarg); } else { usage_va(_("Port must be a positive integer - %s"), optarg); } break; case 'l': /* address to lookup */ - query_address = optarg; + result.config.query_address = optarg; break; case 'w': /* warning */ if (is_nonnegative(optarg)) { - warning_interval = strtod(optarg, NULL); + result.config.warning_interval = strtod(optarg, NULL); } else { usage_va(_("Warning interval must be a positive integer - %s"), optarg); } break; case 'c': /* critical */ if (is_nonnegative(optarg)) { - critical_interval = strtod(optarg, NULL); + result.config.critical_interval = strtod(optarg, NULL); } else { usage_va(_("Critical interval must be a positive integer - %s"), optarg); } @@ -262,50 +258,50 @@ int process_arguments(int argc, char **argv) { } break; case 'A': /* dig arguments */ - dig_args = strdup(optarg); + result.config.dig_args = strdup(optarg); break; case 'v': /* verbose */ - verbose = true; + verbose++; break; case 'T': - record_type = optarg; + result.config.record_type = optarg; break; case 'a': - expected_address = optarg; + result.config.expected_address = optarg; break; case '4': - query_transport = "-4"; + result.config.query_transport = "-4"; break; case '6': - query_transport = "-6"; + result.config.query_transport = "-6"; break; default: /* usage5 */ usage5(); } } - c = optind; - if (dns_server == NULL) { - if (c < argc) { - host_or_die(argv[c]); - dns_server = argv[c]; + int index = optind; + if (result.config.dns_server == NULL) { + if (index < argc) { + host_or_die(argv[index]); + result.config.dns_server = argv[index]; } else { - if (strcmp(query_transport, "-6") == 0) { - dns_server = strdup("::1"); + if (strcmp(result.config.query_transport, "-6") == 0) { + result.config.dns_server = strdup("::1"); } else { - dns_server = strdup("127.0.0.1"); + result.config.dns_server = strdup("127.0.0.1"); } } } - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments(void) { - if (query_address != NULL) { - return OK; +check_dig_config_wrapper validate_arguments(check_dig_config_wrapper config_wrapper) { + if (config_wrapper.config.query_address == NULL) { + config_wrapper.errorcode = ERROR; } - return ERROR; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_dig.d/config.h b/plugins/check_dig.d/config.h new file mode 100644 index 00000000..a570b633 --- /dev/null +++ b/plugins/check_dig.d/config.h @@ -0,0 +1,40 @@ +#pragma once + +#include "../../config.h" +#include + +#define UNDEFINED 0 +#define DEFAULT_PORT 53 +#define DEFAULT_TRIES 2 + +typedef struct { + char *query_address; + char *record_type; + char *expected_address; + char *dns_server; + char *query_transport; + int server_port; + char *dig_args; + int number_tries; + + double warning_interval; + double critical_interval; +} check_dig_config; + +check_dig_config check_dig_config_init() { + check_dig_config tmp = { + .query_address = NULL, + .record_type = "A", + .expected_address = NULL, + .dns_server = NULL, + .query_transport = "", + .server_port = DEFAULT_PORT, + .dig_args = "", + .number_tries = DEFAULT_TRIES, + + .warning_interval = UNDEFINED, + .critical_interval = UNDEFINED, + + }; + return tmp; +} -- cgit v1.2.3-74-g34f1