From 2ce110bf57f5a412a48fd8baf4d5e498e0acc6c6 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Mon, 10 Mar 2025 22:49:38 +0100 Subject: refactor check_cluster --- plugins/Makefile.am | 3 +- plugins/check_cluster.c | 100 ++++++++++++++++++++------------------- plugins/check_cluster.d/config.h | 27 +++++++++++ 3 files changed, 81 insertions(+), 49 deletions(-) create mode 100644 plugins/check_cluster.d/config.h diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 41487131..be650089 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -57,7 +57,8 @@ EXTRA_DIST = t \ check_apt.d \ check_by_ssh.d \ check_smtp.d \ - check_dig.d + check_dig.d \ + check_cluster.d PLUGINHDRS = common.h diff --git a/plugins/check_cluster.c b/plugins/check_cluster.c index 72acde2e..9b695499 100644 --- a/plugins/check_cluster.c +++ b/plugins/check_cluster.c @@ -29,35 +29,18 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "utils.h" #include "utils_base.h" - -enum { - CHECK_SERVICES = 1, - CHECK_HOSTS = 2 -}; +#include "check_cluster.d/config.h" static void print_help(void); void print_usage(void); -static int total_services_ok = 0; -static int total_services_warning = 0; -static int total_services_unknown = 0; -static int total_services_critical = 0; - -static int total_hosts_up = 0; -static int total_hosts_down = 0; -static int total_hosts_unreachable = 0; - -static char *warn_threshold; -static char *crit_threshold; - -static int check_type = CHECK_SERVICES; - -static char *data_vals = NULL; -static char *label = NULL; - static int verbose = 0; -static int process_arguments(int /*argc*/, char ** /*argv*/); +typedef struct { + int errorcode; + check_cluster_config config; +} check_cluster_config_wrapper; +static check_cluster_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); int main(int argc, char **argv) { setlocale(LC_ALL, ""); @@ -67,24 +50,32 @@ 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_cluster_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage(_("Could not parse arguments")); } - thresholds *thresholds = NULL; + const check_cluster_config config = tmp_config.config; + /* Initialize the thresholds */ - set_thresholds(&thresholds, warn_threshold, crit_threshold); if (verbose) { - print_thresholds("check_cluster", thresholds); + print_thresholds("check_cluster", config.thresholds); } int data_val; + int total_services_ok = 0; + int total_services_warning = 0; + int total_services_unknown = 0; + int total_services_critical = 0; + int total_hosts_up = 0; + int total_hosts_down = 0; + int total_hosts_unreachable = 0; /* check the data values */ - for (char *ptr = strtok(data_vals, ","); ptr != NULL; ptr = strtok(NULL, ",")) { + for (char *ptr = strtok(config.data_vals, ","); ptr != NULL; ptr = strtok(NULL, ",")) { data_val = atoi(ptr); - if (check_type == CHECK_SERVICES) { + if (config.check_type == CHECK_SERVICES) { switch (data_val) { case 0: total_services_ok++; @@ -120,33 +111,41 @@ int main(int argc, char **argv) { int return_code = STATE_OK; /* return the status of the cluster */ - if (check_type == CHECK_SERVICES) { - return_code = get_status(total_services_warning + total_services_unknown + total_services_critical, thresholds); + if (config.check_type == CHECK_SERVICES) { + return_code = get_status(total_services_warning + total_services_unknown + total_services_critical, config.thresholds); printf("CLUSTER %s: %s: %d ok, %d warning, %d unknown, %d critical\n", state_text(return_code), - (label == NULL) ? "Service cluster" : label, total_services_ok, total_services_warning, total_services_unknown, + (config.label == NULL) ? "Service cluster" : config.label, total_services_ok, total_services_warning, total_services_unknown, total_services_critical); } else { - return_code = get_status(total_hosts_down + total_hosts_unreachable, thresholds); - printf("CLUSTER %s: %s: %d up, %d down, %d unreachable\n", state_text(return_code), (label == NULL) ? "Host cluster" : label, - total_hosts_up, total_hosts_down, total_hosts_unreachable); + return_code = get_status(total_hosts_down + total_hosts_unreachable, config.thresholds); + printf("CLUSTER %s: %s: %d up, %d down, %d unreachable\n", state_text(return_code), + (config.label == NULL) ? "Host cluster" : config.label, total_hosts_up, total_hosts_down, total_hosts_unreachable); } exit(return_code); } -int process_arguments(int argc, char **argv) { +check_cluster_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"data", required_argument, 0, 'd'}, {"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, {"label", required_argument, 0, 'l'}, {"host", no_argument, 0, 'h'}, {"service", no_argument, 0, 's'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'H'}, {0, 0, 0, 0}}; + check_cluster_config_wrapper result = { + .errorcode = OK, + .config = check_cluster_config_init(), + }; + /* no options were supplied */ if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } int option = 0; + char *warn_threshold = NULL; + char *crit_threshold = NULL; while (true) { int option_index = getopt_long(argc, argv, "hHsvVw:c:d:l:", longopts, &option); @@ -156,10 +155,10 @@ int process_arguments(int argc, char **argv) { switch (option_index) { case 'h': /* host cluster */ - check_type = CHECK_HOSTS; + result.config.check_type = CHECK_HOSTS; break; case 's': /* service cluster */ - check_type = CHECK_SERVICES; + result.config.check_type = CHECK_SERVICES; break; case 'w': /* warning threshold */ warn_threshold = strdup(optarg); @@ -168,22 +167,24 @@ int process_arguments(int argc, char **argv) { crit_threshold = strdup(optarg); break; case 'd': /* data values */ - data_vals = strdup(optarg); + result.config.data_vals = strdup(optarg); /* validate data */ - for (char *ptr = data_vals; ptr != NULL; ptr += 2) { + for (char *ptr = result.config.data_vals; ptr != NULL; ptr += 2) { if (ptr[0] < '0' || ptr[0] > '3') { - return ERROR; + result.errorcode = ERROR; + return result; } if (ptr[1] == '\0') { break; } if (ptr[1] != ',') { - return ERROR; + result.errorcode = ERROR; + return result; } } break; case 'l': /* text label */ - label = strdup(optarg); + result.config.label = strdup(optarg); break; case 'v': /* verbose */ verbose++; @@ -197,16 +198,19 @@ int process_arguments(int argc, char **argv) { exit(STATE_UNKNOWN); break; default: - return ERROR; + result.errorcode = ERROR; + return result; break; } } - if (data_vals == NULL) { - return ERROR; + if (result.config.data_vals == NULL) { + result.errorcode = ERROR; + return result; } - return OK; + set_thresholds(&result.config.thresholds, warn_threshold, crit_threshold); + return result; } void print_help(void) { diff --git a/plugins/check_cluster.d/config.h b/plugins/check_cluster.d/config.h new file mode 100644 index 00000000..fc386415 --- /dev/null +++ b/plugins/check_cluster.d/config.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../../config.h" +#include "../../lib/thresholds.h" +#include + +enum { + CHECK_SERVICES = 1, + CHECK_HOSTS = 2 +}; + +typedef struct { + char *data_vals; + thresholds *thresholds; + int check_type; + char *label; +} check_cluster_config; + +check_cluster_config check_cluster_config_init() { + check_cluster_config tmp = { + .data_vals = NULL, + .thresholds = NULL, + .check_type = CHECK_SERVICES, + .label = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1