From cf48162487d6f042af084ee436acdd7a2db0cbfd Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:43:51 +0100 Subject: Refactor check_fping --- plugins/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 41487131..25a286c1 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_fping.d PLUGINHDRS = common.h -- cgit v1.2.3-74-g34f1 From a2ce9e962d52ebaffc275379c82ce29229a1fba8 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 11:07:26 +0100 Subject: Refactor check_hpjd --- plugins/Makefile.am | 1 + plugins/check_hpjd.c | 141 +++++++++++++++++++----------------------- plugins/check_hpjd.d/config.h | 25 ++++++++ 3 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 plugins/check_hpjd.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index be650089..1b40b91c 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -50,6 +50,7 @@ EXTRA_DIST = t \ tests \ $(np_test_scripts) \ check_swap.d \ + check_hpjd.d \ check_game.d \ check_dbi.d \ check_ssh.d \ diff --git a/plugins/check_hpjd.c b/plugins/check_hpjd.c index 78f55b7f..62417fd6 100644 --- a/plugins/check_hpjd.c +++ b/plugins/check_hpjd.c @@ -37,9 +37,10 @@ const char *email = "devel@monitoring-plugins.org"; #include "popen.h" #include "utils.h" #include "netutils.h" +#include "states.h" +#include "check_hpjd.d/config.h" #define DEFAULT_COMMUNITY "public" -#define DEFAULT_PORT "161" #define HPJD_LINE_STATUS ".1.3.6.1.4.1.11.2.3.9.1.1.2.1" #define HPJD_PAPER_STATUS ".1.3.6.1.4.1.11.2.3.9.1.1.2.2" @@ -57,39 +58,15 @@ const char *email = "devel@monitoring-plugins.org"; #define ONLINE 0 #define OFFLINE 1 -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int validate_arguments(void); +typedef struct { + int errorcode; + check_hpjd_config config; +} check_hpjd_config_wrapper; +static check_hpjd_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); -static char *community = NULL; -static char *address = NULL; -static unsigned int port = 0; -static int check_paper_out = 1; - int main(int argc, char **argv) { - char command_line[1024]; - int result = STATE_UNKNOWN; - int line; - char input_buffer[MAX_INPUT_BUFFER]; - char query_string[512]; - char *errmsg; - char *temp_buffer; - int line_status = ONLINE; - int paper_status = 0; - int intervention_required = 0; - int peripheral_error = 0; - int paper_jam = 0; - int paper_out = 0; - int toner_low = 0; - int page_punt = 0; - int memory_out = 0; - int door_open = 0; - int paper_output = 0; - char display_message[MAX_INPUT_BUFFER]; - - errmsg = malloc(MAX_INPUT_BUFFER); - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -97,10 +74,15 @@ 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_hpjd_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_hpjd_config config = tmp_config.config; + + char query_string[512]; /* removed ' 2>1' at end of command 10/27/1999 - EG */ /* create the query string */ sprintf(query_string, "%s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0 %s.0", HPJD_LINE_STATUS, HPJD_PAPER_STATUS, @@ -108,7 +90,8 @@ int main(int argc, char **argv) { HPJD_GD_PAGE_PUNT, HPJD_GD_MEMORY_OUT, HPJD_GD_DOOR_OPEN, HPJD_GD_PAPER_OUTPUT, HPJD_GD_STATUS_DISPLAY); /* get the command to run */ - sprintf(command_line, "%s -OQa -m : -v 1 -c %s %s:%u %s", PATH_TO_SNMPGET, community, address, port, query_string); + char command_line[1024]; + sprintf(command_line, "%s -OQa -m : -v 1 -c %s %s:%u %s", PATH_TO_SNMPGET, config.community, config.address, config.port, query_string); /* run the command */ child_process = spopen(command_line); @@ -122,11 +105,26 @@ int main(int argc, char **argv) { printf(_("Could not open stderr for %s\n"), command_line); } - result = STATE_OK; + mp_state_enum result = STATE_OK; - line = 0; - while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { + int line_status = ONLINE; + int paper_status = 0; + int intervention_required = 0; + int peripheral_error = 0; + int paper_jam = 0; + int paper_out = 0; + int toner_low = 0; + int page_punt = 0; + int memory_out = 0; + int door_open = 0; + int paper_output = 0; + char display_message[MAX_INPUT_BUFFER]; + + char input_buffer[MAX_INPUT_BUFFER]; + char *errmsg = malloc(MAX_INPUT_BUFFER); + int line = 0; + while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { /* strip the newline character from the end of the input */ if (input_buffer[strlen(input_buffer) - 1] == '\n') { input_buffer[strlen(input_buffer) - 1] = 0; @@ -134,18 +132,14 @@ int main(int argc, char **argv) { line++; - temp_buffer = strtok(input_buffer, "="); + char *temp_buffer = strtok(input_buffer, "="); temp_buffer = strtok(NULL, "="); if (temp_buffer == NULL && line < 13) { - result = STATE_UNKNOWN; strcpy(errmsg, input_buffer); - } else { - switch (line) { - case 1: /* 1st line should contain the line status */ line_status = atoi(temp_buffer); break; @@ -213,10 +207,9 @@ int main(int argc, char **argv) { /* if there wasn't any output, display an error */ if (line == 0) { - /* might not be the problem, but most likely is. */ result = STATE_UNKNOWN; - xasprintf(&errmsg, "%s : Timeout from host %s\n", errmsg, address); + xasprintf(&errmsg, "%s : Timeout from host %s\n", errmsg, config.address); } /* if we had no read errors, check the printer status results... */ @@ -226,7 +219,7 @@ int main(int argc, char **argv) { result = STATE_WARNING; strcpy(errmsg, _("Paper Jam")); } else if (paper_out) { - if (check_paper_out) { + if (config.check_paper_out) { result = STATE_WARNING; } strcpy(errmsg, _("Out of Paper")); @@ -264,30 +257,21 @@ int main(int argc, char **argv) { if (result == STATE_OK) { printf(_("Printer ok - (%s)\n"), display_message); - } - - else if (result == STATE_UNKNOWN) { - + } else if (result == STATE_UNKNOWN) { printf("%s\n", errmsg); - /* if printer could not be reached, escalate to critical */ if (strstr(errmsg, "Timeout")) { result = STATE_CRITICAL; } - } - - else if (result == STATE_WARNING) { + } else if (result == STATE_WARNING) { printf("%s (%s)\n", errmsg, display_message); } - return result; + exit(result); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; +check_hpjd_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"community", required_argument, 0, 'C'}, /* {"critical", required_argument,0,'c'}, */ @@ -297,37 +281,44 @@ int process_arguments(int argc, char **argv) { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_hpjd_config_wrapper result = { + .errorcode = OK, + .config = check_hpjd_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } - while (1) { - c = getopt_long(argc, argv, "+hVH:C:p:D", longopts, &option); + int option = 0; + while (true) { + int option_index = getopt_long(argc, argv, "+hVH:C:p:D", longopts, &option); - if (c == -1 || c == EOF || c == 1) { + if (option_index == -1 || option_index == EOF || option_index == 1) { break; } - switch (c) { + switch (option_index) { case 'H': /* hostname */ if (is_host(optarg)) { - address = strscpy(address, optarg); + result.config.address = strscpy(result.config.address, optarg); } else { usage2(_("Invalid hostname/address"), optarg); } break; case 'C': /* community */ - community = strscpy(community, optarg); + result.config.community = strscpy(result.config.community, optarg); break; case 'p': if (!is_intpos(optarg)) { usage2(_("Port must be a positive short integer"), optarg); } else { - port = atoi(optarg); + result.config.port = atoi(optarg); } break; case 'D': /* disable paper out check*/ - check_paper_out = 0; + result.config.check_paper_out = false; break; case 'V': /* version */ print_revision(progname, NP_VERSION); @@ -340,32 +331,26 @@ int process_arguments(int argc, char **argv) { } } - c = optind; - if (address == NULL) { + int c = optind; + if (result.config.address == NULL) { if (is_host(argv[c])) { - address = argv[c++]; + result.config.address = argv[c++]; } else { usage2(_("Invalid hostname/address"), argv[c]); } } - if (community == NULL) { + if (result.config.community == NULL) { if (argv[c] != NULL) { - community = argv[c]; + result.config.community = argv[c]; } else { - community = strdup(DEFAULT_COMMUNITY); + result.config.community = strdup(DEFAULT_COMMUNITY); } } - if (port == 0) { - port = atoi(DEFAULT_PORT); - } - - return validate_arguments(); + return result; } -int validate_arguments(void) { return OK; } - void print_help(void) { print_revision(progname, NP_VERSION); diff --git a/plugins/check_hpjd.d/config.h b/plugins/check_hpjd.d/config.h new file mode 100644 index 00000000..e36b7972 --- /dev/null +++ b/plugins/check_hpjd.d/config.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../../config.h" +#include +#include + +#define DEFAULT_PORT "161" + +typedef struct { + char *address; + char *community; + unsigned int port; + bool check_paper_out; + +} check_hpjd_config; + +check_hpjd_config check_hpjd_config_init() { + check_hpjd_config tmp = { + .address = NULL, + .community = NULL, + .port = (unsigned int)atoi(DEFAULT_PORT), + .check_paper_out = true, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 7a518f99a57a6ee169cedd062e4e2e1e7c3fc2d2 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:12:32 +0100 Subject: Refactor check_ldap --- plugins/Makefile.am | 1 + plugins/check_ldap.c | 262 ++++++++++++++++++++---------------------- plugins/check_ldap.d/config.h | 61 ++++++++++ 3 files changed, 184 insertions(+), 140 deletions(-) create mode 100644 plugins/check_ldap.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index be650089..9f7266ad 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -50,6 +50,7 @@ EXTRA_DIST = t \ tests \ $(np_test_scripts) \ check_swap.d \ + check_ldap.d \ check_game.d \ check_dbi.d \ check_ssh.d \ diff --git a/plugins/check_ldap.c b/plugins/check_ldap.c index fc8eccec..597644bd 100644 --- a/plugins/check_ldap.c +++ b/plugins/check_ldap.c @@ -34,70 +34,33 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" +#include "check_ldap.d/config.h" +#include "states.h" #include #define LDAP_DEPRECATED 1 #include enum { - UNDEFINED = 0, -#ifdef HAVE_LDAP_SET_OPTION - DEFAULT_PROTOCOL = 2, -#endif DEFAULT_PORT = 389 }; -static int process_arguments(int, char **); -static int validate_arguments(void); +typedef struct { + int errorcode; + check_ldap_config config; +} check_ldap_config_wrapper; +static check_ldap_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_ldap_config_wrapper validate_arguments(check_ldap_config_wrapper /*config_wrapper*/); + static void print_help(void); void print_usage(void); -static char ld_defattr[] = "(objectclass=*)"; -static char *ld_attr = ld_defattr; -static char *ld_host = NULL; -static char *ld_base = NULL; -static char *ld_passwd = NULL; -static char *ld_binddn = NULL; -static int ld_port = -1; -#ifdef HAVE_LDAP_SET_OPTION -static int ld_protocol = DEFAULT_PROTOCOL; -#endif #ifndef LDAP_OPT_SUCCESS # define LDAP_OPT_SUCCESS LDAP_SUCCESS #endif -static double warn_time = UNDEFINED; -static double crit_time = UNDEFINED; -static thresholds *entries_thresholds = NULL; -static struct timeval tv; -static char *warn_entries = NULL; -static char *crit_entries = NULL; -static bool starttls = false; -static bool ssl_on_connect = false; -static bool verbose = false; - -/* for ldap tls */ - -static char *SERVICE = "LDAP"; +static int verbose = 0; int main(int argc, char *argv[]) { - - LDAP *ld; - LDAPMessage *result; - - /* should be int result = STATE_UNKNOWN; */ - - int status = STATE_UNKNOWN; - long microsec; - double elapsed_time; - - /* for ldap tls */ - - int tls; - int version = 3; - - int status_entries = STATE_OK; - int num_entries = 0; - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -109,13 +72,12 @@ 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_ldap_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } - if (strstr(argv[0], "check_ldaps") && !starttls && !ssl_on_connect) { - starttls = true; - } + const check_ldap_config config = tmp_config.config; /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -124,65 +86,67 @@ int main(int argc, char *argv[]) { alarm(socket_timeout); /* get the start time */ - gettimeofday(&tv, NULL); + struct timeval start_time; + gettimeofday(&start_time, NULL); + LDAP *ldap_connection; /* initialize ldap */ #ifdef HAVE_LDAP_INIT - if (!(ld = ldap_init(ld_host, ld_port))) { - printf("Could not connect to the server at port %i\n", ld_port); + if (!(ldap_connection = ldap_init(config.ld_host, config.ld_port))) { + printf("Could not connect to the server at port %i\n", config.ld_port); return STATE_CRITICAL; } #else - if (!(ld = ldap_open(ld_host, ld_port))) { + if (!(ld = ldap_open(config.ld_host, config.ld_port))) { if (verbose) { - ldap_perror(ld, "ldap_open"); + ldap_perror(ldap_connection, "ldap_open"); } - printf(_("Could not connect to the server at port %i\n"), ld_port); + printf(_("Could not connect to the server at port %i\n"), config.ld_port); return STATE_CRITICAL; } #endif /* HAVE_LDAP_INIT */ #ifdef HAVE_LDAP_SET_OPTION /* set ldap options */ - if (ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &ld_protocol) != LDAP_OPT_SUCCESS) { - printf(_("Could not set protocol version %d\n"), ld_protocol); + if (ldap_set_option(ldap_connection, LDAP_OPT_PROTOCOL_VERSION, &config.ld_protocol) != LDAP_OPT_SUCCESS) { + printf(_("Could not set protocol version %d\n"), config.ld_protocol); return STATE_CRITICAL; } #endif - if (ld_port == LDAPS_PORT || ssl_on_connect) { - xasprintf(&SERVICE, "LDAPS"); + int version = 3; + int tls; + if (config.ld_port == LDAPS_PORT || config.ssl_on_connect) { #if defined(HAVE_LDAP_SET_OPTION) && defined(LDAP_OPT_X_TLS) /* ldaps: set option tls */ tls = LDAP_OPT_X_TLS_HARD; - if (ldap_set_option(ld, LDAP_OPT_X_TLS, &tls) != LDAP_SUCCESS) { + if (ldap_set_option(ldap_connection, LDAP_OPT_X_TLS, &tls) != LDAP_SUCCESS) { if (verbose) { - ldap_perror(ld, "ldaps_option"); + ldap_perror(ldap_connection, "ldaps_option"); } - printf(_("Could not init TLS at port %i!\n"), ld_port); + printf(_("Could not init TLS at port %i!\n"), config.ld_port); return STATE_CRITICAL; } #else printf(_("TLS not supported by the libraries!\n")); return STATE_CRITICAL; #endif /* LDAP_OPT_X_TLS */ - } else if (starttls) { - xasprintf(&SERVICE, "LDAP-TLS"); + } else if (config.starttls) { #if defined(HAVE_LDAP_SET_OPTION) && defined(HAVE_LDAP_START_TLS_S) /* ldap with startTLS: set option version */ - if (ldap_get_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version) == LDAP_OPT_SUCCESS) { + if (ldap_get_option(ldap_connection, LDAP_OPT_PROTOCOL_VERSION, &version) == LDAP_OPT_SUCCESS) { if (version < LDAP_VERSION3) { version = LDAP_VERSION3; - ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version); + ldap_set_option(ldap_connection, LDAP_OPT_PROTOCOL_VERSION, &version); } } /* call start_tls */ - if (ldap_start_tls_s(ld, NULL, NULL) != LDAP_SUCCESS) { + if (ldap_start_tls_s(ldap_connection, NULL, NULL) != LDAP_SUCCESS) { if (verbose) { - ldap_perror(ld, "ldap_start_tls"); + ldap_perror(ldap_connection, "ldap_start_tls"); } - printf(_("Could not init startTLS at port %i!\n"), ld_port); + printf(_("Could not init startTLS at port %i!\n"), config.ld_port); return STATE_CRITICAL; } #else @@ -192,51 +156,56 @@ int main(int argc, char *argv[]) { } /* bind to the ldap server */ - if (ldap_bind_s(ld, ld_binddn, ld_passwd, LDAP_AUTH_SIMPLE) != LDAP_SUCCESS) { + if (ldap_bind_s(ldap_connection, config.ld_binddn, config.ld_passwd, LDAP_AUTH_SIMPLE) != LDAP_SUCCESS) { if (verbose) { - ldap_perror(ld, "ldap_bind"); + ldap_perror(ldap_connection, "ldap_bind"); } printf(_("Could not bind to the LDAP server\n")); return STATE_CRITICAL; } + LDAPMessage *result; + int num_entries = 0; /* do a search of all objectclasses in the base dn */ - if (ldap_search_s(ld, ld_base, (crit_entries != NULL || warn_entries != NULL) ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE, ld_attr, NULL, 0, - &result) != LDAP_SUCCESS) { + if (ldap_search_s(ldap_connection, config.ld_base, + (config.crit_entries != NULL || config.warn_entries != NULL) ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_BASE, config.ld_attr, + NULL, 0, &result) != LDAP_SUCCESS) { if (verbose) { - ldap_perror(ld, "ldap_search"); + ldap_perror(ldap_connection, "ldap_search"); } - printf(_("Could not search/find objectclasses in %s\n"), ld_base); + printf(_("Could not search/find objectclasses in %s\n"), config.ld_base); return STATE_CRITICAL; - } else if (crit_entries != NULL || warn_entries != NULL) { - num_entries = ldap_count_entries(ld, result); + } + + if (config.crit_entries != NULL || config.warn_entries != NULL) { + num_entries = ldap_count_entries(ldap_connection, result); } /* unbind from the ldap server */ - ldap_unbind(ld); + ldap_unbind(ldap_connection); /* reset the alarm handler */ alarm(0); /* calculate the elapsed time and compare to thresholds */ - microsec = deltime(tv); - elapsed_time = (double)microsec / 1.0e6; - - if (crit_time != UNDEFINED && elapsed_time > crit_time) { + long microsec = deltime(start_time); + double elapsed_time = (double)microsec / 1.0e6; + mp_state_enum status = STATE_UNKNOWN; + if (config.crit_time_set && elapsed_time > config.crit_time) { status = STATE_CRITICAL; - } else if (warn_time != UNDEFINED && elapsed_time > warn_time) { + } else if (config.warn_time_set && elapsed_time > config.warn_time) { status = STATE_WARNING; } else { status = STATE_OK; } - if (entries_thresholds != NULL) { + if (config.entries_thresholds != NULL) { if (verbose) { printf("entries found: %d\n", num_entries); - print_thresholds("entry thresholds", entries_thresholds); + print_thresholds("entry thresholds", config.entries_thresholds); } - status_entries = get_status(num_entries, entries_thresholds); + mp_state_enum status_entries = get_status(num_entries, config.entries_thresholds); if (status_entries == STATE_CRITICAL) { status = STATE_CRITICAL; } else if (status != STATE_CRITICAL) { @@ -245,23 +214,22 @@ int main(int argc, char *argv[]) { } /* print out the result */ - if (crit_entries != NULL || warn_entries != NULL) { + if (config.crit_entries != NULL || config.warn_entries != NULL) { printf(_("LDAP %s - found %d entries in %.3f seconds|%s %s\n"), state_text(status), num_entries, elapsed_time, - fperfdata("time", elapsed_time, "s", (int)warn_time, warn_time, (int)crit_time, crit_time, true, 0, false, 0), - sperfdata("entries", (double)num_entries, "", warn_entries, crit_entries, true, 0.0, false, 0.0)); + fperfdata("time", elapsed_time, "s", config.warn_time_set, config.warn_time, config.crit_time_set, config.crit_time, true, 0, + false, 0), + sperfdata("entries", (double)num_entries, "", config.warn_entries, config.crit_entries, true, 0.0, false, 0.0)); } else { printf(_("LDAP %s - %.3f seconds response time|%s\n"), state_text(status), elapsed_time, - fperfdata("time", elapsed_time, "s", (int)warn_time, warn_time, (int)crit_time, crit_time, true, 0, false, 0)); + fperfdata("time", elapsed_time, "s", config.warn_time_set, config.warn_time, config.crit_time_set, config.crit_time, true, 0, + false, 0)); } - return status; + exit(status); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; +check_ldap_config_wrapper process_arguments(int argc, char **argv) { /* initialize the long option struct */ static struct option longopts[] = {{"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, @@ -287,24 +255,31 @@ int process_arguments(int argc, char **argv) { {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0}}; + check_ldap_config_wrapper result = { + .errorcode = OK, + .config = check_ldap_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } - for (c = 1; c < argc; c++) { - if (strcmp("-to", argv[c]) == 0) { - strcpy(argv[c], "-t"); + for (int index = 1; index < argc; index++) { + if (strcmp("-to", argv[index]) == 0) { + strcpy(argv[index], "-t"); } } + int option = 0; while (true) { - c = getopt_long(argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", longopts, &option); + int option_index = getopt_long(argc, argv, "hvV234TS6t:c:w:H:b:p:a:D:P:C:W:", 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); @@ -319,61 +294,63 @@ int process_arguments(int argc, char **argv) { } break; case 'H': - ld_host = optarg; + result.config.ld_host = optarg; break; case 'b': - ld_base = optarg; + result.config.ld_base = optarg; break; case 'p': - ld_port = atoi(optarg); + result.config.ld_port = atoi(optarg); break; case 'a': - ld_attr = optarg; + result.config.ld_attr = optarg; break; case 'D': - ld_binddn = optarg; + result.config.ld_binddn = optarg; break; case 'P': - ld_passwd = optarg; + result.config.ld_passwd = optarg; break; case 'w': - warn_time = strtod(optarg, NULL); + result.config.warn_time_set = true; + result.config.warn_time = strtod(optarg, NULL); break; case 'c': - crit_time = strtod(optarg, NULL); + result.config.crit_time_set = true; + result.config.crit_time = strtod(optarg, NULL); break; case 'W': - warn_entries = optarg; + result.config.warn_entries = optarg; break; case 'C': - crit_entries = optarg; + result.config.crit_entries = optarg; break; #ifdef HAVE_LDAP_SET_OPTION case '2': - ld_protocol = 2; + result.config.ld_protocol = 2; break; case '3': - ld_protocol = 3; + result.config.ld_protocol = 3; break; -#endif +#endif // HAVE_LDAP_SET_OPTION case '4': address_family = AF_INET; break; case 'v': - verbose = true; + verbose++; break; case 'T': - if (!ssl_on_connect) { - starttls = true; + if (!result.config.ssl_on_connect) { + result.config.starttls = true; } else { usage_va(_("%s cannot be combined with %s"), "-T/--starttls", "-S/--ssl"); } break; case 'S': - if (!starttls) { - ssl_on_connect = true; - if (ld_port == -1) { - ld_port = LDAPS_PORT; + if (!result.config.starttls) { + result.config.ssl_on_connect = true; + if (result.config.ld_port == -1) { + result.config.ld_port = LDAPS_PORT; } } else { usage_va(_("%s cannot be combined with %s"), "-S/--ssl", "-T/--starttls"); @@ -391,39 +368,44 @@ int process_arguments(int argc, char **argv) { } } - c = optind; - if (ld_host == NULL && is_host(argv[c])) { - ld_host = strdup(argv[c++]); + int index = optind; + if ((result.config.ld_host == NULL) && is_host(argv[index])) { + result.config.ld_host = strdup(argv[index++]); + } + + if ((result.config.ld_base == NULL) && argv[index]) { + result.config.ld_base = strdup(argv[index++]); } - if (ld_base == NULL && argv[c]) { - ld_base = strdup(argv[c++]); + if (result.config.ld_port == -1) { + result.config.ld_port = DEFAULT_PORT; } - if (ld_port == -1) { - ld_port = DEFAULT_PORT; + if (strstr(argv[0], "check_ldaps") && !result.config.starttls && !result.config.ssl_on_connect) { + result.config.starttls = true; } - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments() { - if (ld_host == NULL || strlen(ld_host) == 0) { +check_ldap_config_wrapper validate_arguments(check_ldap_config_wrapper config_wrapper) { + if (config_wrapper.config.ld_host == NULL || strlen(config_wrapper.config.ld_host) == 0) { usage4(_("Please specify the host name\n")); } - if (ld_base == NULL) { + if (config_wrapper.config.ld_base == NULL) { usage4(_("Please specify the LDAP base\n")); } - if (crit_entries != NULL || warn_entries != NULL) { - set_thresholds(&entries_thresholds, warn_entries, crit_entries); + if (config_wrapper.config.crit_entries != NULL || config_wrapper.config.warn_entries != NULL) { + set_thresholds(&config_wrapper.config.entries_thresholds, config_wrapper.config.warn_entries, config_wrapper.config.crit_entries); } - if (ld_passwd == NULL) { - ld_passwd = getenv("LDAP_PASSWORD"); + + if (config_wrapper.config.ld_passwd == NULL) { + config_wrapper.config.ld_passwd = getenv("LDAP_PASSWORD"); } - return OK; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_ldap.d/config.h b/plugins/check_ldap.d/config.h new file mode 100644 index 00000000..97a9cfa7 --- /dev/null +++ b/plugins/check_ldap.d/config.h @@ -0,0 +1,61 @@ +#pragma once + +#include "../../config.h" +#include "thresholds.h" +#include +#include + +static char ld_defattr[] = "(objectclass=*)"; + +enum { +#ifdef HAVE_LDAP_SET_OPTION + DEFAULT_PROTOCOL = 2, +#endif +}; + +typedef struct { + char *ld_host; + char *ld_base; + char *ld_passwd; + char *ld_binddn; + char *ld_attr; + int ld_port; + bool starttls; + bool ssl_on_connect; +#ifdef HAVE_LDAP_SET_OPTION + int ld_protocol; +#endif + + char *warn_entries; + char *crit_entries; + thresholds *entries_thresholds; + bool warn_time_set; + double warn_time; + bool crit_time_set; + double crit_time; +} check_ldap_config; + +check_ldap_config check_ldap_config_init() { + check_ldap_config tmp = { + .ld_host = NULL, + .ld_base = NULL, + .ld_passwd = NULL, + .ld_binddn = NULL, + .ld_attr = ld_defattr, + .ld_port = -1, + .starttls = false, + .ssl_on_connect = false, +#ifdef HAVE_LDAP_SET_OPTION + .ld_protocol = DEFAULT_PROTOCOL, +#endif + + .warn_entries = NULL, + .crit_entries = NULL, + .entries_thresholds = NULL, + .warn_time_set = false, + .warn_time = 0, + .crit_time_set = false, + .crit_time = 0, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 23da18f10ce32c899f266ae703f0b9c2b3991d70 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:39:14 +0100 Subject: Refactor check_mrtg --- plugins/Makefile.am | 1 + plugins/check_mrtg.c | 141 ++++++++++++++++++++++-------------------- plugins/check_mrtg.d/config.h | 36 +++++++++++ 3 files changed, 110 insertions(+), 68 deletions(-) create mode 100644 plugins/check_mrtg.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9d310a15..5e636f9b 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -55,6 +55,7 @@ EXTRA_DIST = t \ check_dbi.d \ check_ssh.d \ check_dns.d \ + check_mrtg.d \ check_apt.d \ check_by_ssh.d \ check_smtp.d \ diff --git a/plugins/check_mrtg.c b/plugins/check_mrtg.c index e355fa11..5bd276dc 100644 --- a/plugins/check_mrtg.c +++ b/plugins/check_mrtg.c @@ -35,21 +35,18 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "utils.h" +#include "check_mrtg.d/config.h" + +typedef struct { + int errorcode; + check_mrtg_config config; +} check_mrtg_config_wrapper; +static check_mrtg_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_mrtg_config_wrapper validate_arguments(check_mrtg_config_wrapper /*config_wrapper*/); -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int validate_arguments(void); static void print_help(void); void print_usage(void); -static char *log_file = NULL; -static int expire_minutes = 0; -static bool use_average = true; -static int variable_number = -1; -static unsigned long value_warning_threshold = 0L; -static unsigned long value_critical_threshold = 0L; -static char *label; -static char *units; - int main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); @@ -58,24 +55,26 @@ 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_mrtg_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments\n")); } + const check_mrtg_config config = tmp_config.config; + /* open the MRTG log file for reading */ - FILE *mtrg_log_file = fopen(log_file, "r"); + FILE *mtrg_log_file = fopen(config.log_file, "r"); if (mtrg_log_file == NULL) { printf(_("Unable to open MRTG log file\n")); return STATE_UNKNOWN; } - time_t timestamp = 0L; - unsigned long average_value_rate = 0L; - unsigned long maximum_value_rate = 0L; + time_t timestamp = 0; + unsigned long average_value_rate = 0; + unsigned long maximum_value_rate = 0; char input_buffer[MAX_INPUT_BUFFER]; int line = 0; while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, mtrg_log_file)) { - line++; /* skip the first line of the log file */ @@ -94,25 +93,25 @@ int main(int argc, char **argv) { /* grab the average value 1 rate */ temp_buffer = strtok(NULL, " "); - if (variable_number == 1) { + if (config.variable_number == 1) { average_value_rate = strtoul(temp_buffer, NULL, 10); } /* grab the average value 2 rate */ temp_buffer = strtok(NULL, " "); - if (variable_number == 2) { + if (config.variable_number == 2) { average_value_rate = strtoul(temp_buffer, NULL, 10); } /* grab the maximum value 1 rate */ temp_buffer = strtok(NULL, " "); - if (variable_number == 1) { + if (config.variable_number == 1) { maximum_value_rate = strtoul(temp_buffer, NULL, 10); } /* grab the maximum value 2 rate */ temp_buffer = strtok(NULL, " "); - if (variable_number == 2) { + if (config.variable_number == 2) { maximum_value_rate = strtoul(temp_buffer, NULL, 10); } } @@ -129,43 +128,49 @@ int main(int argc, char **argv) { /* make sure the MRTG data isn't too old */ time_t current_time; time(¤t_time); - if (expire_minutes > 0 && (current_time - timestamp) > (expire_minutes * 60)) { + if (config.expire_minutes > 0 && (current_time - timestamp) > (config.expire_minutes * 60)) { printf(_("MRTG data has expired (%d minutes old)\n"), (int)((current_time - timestamp) / 60)); return STATE_WARNING; } unsigned long rate = 0L; /* else check the incoming/outgoing rates */ - if (use_average) { + if (config.use_average) { rate = average_value_rate; } else { rate = maximum_value_rate; } int result = STATE_OK; - if (rate > value_critical_threshold) { + if (config.value_critical_threshold_set && rate > config.value_critical_threshold) { result = STATE_CRITICAL; - } else if (rate > value_warning_threshold) { + } else if (config.value_warning_threshold_set && rate > config.value_warning_threshold) { result = STATE_WARNING; } - printf("%s. %s = %lu %s|%s\n", (use_average) ? _("Avg") : _("Max"), label, rate, units, - perfdata(label, (long)rate, units, (int)value_warning_threshold, (long)value_warning_threshold, (int)value_critical_threshold, - (long)value_critical_threshold, 0, 0, 0, 0)); + printf("%s. %s = %lu %s|%s\n", (config.use_average) ? _("Avg") : _("Max"), config.label, rate, config.units, + perfdata(config.label, (long)rate, config.units, config.value_warning_threshold_set, (long)config.value_warning_threshold, + config.value_critical_threshold_set, (long)config.value_critical_threshold, 0, 0, 0, 0)); return result; } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_mrtg_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = { {"logfile", required_argument, 0, 'F'}, {"expires", required_argument, 0, 'e'}, {"aggregation", required_argument, 0, 'a'}, {"variable", required_argument, 0, 'v'}, {"critical", required_argument, 0, 'c'}, {"warning", required_argument, 0, 'w'}, {"label", required_argument, 0, 'l'}, {"units", required_argument, 0, 'u'}, {"variable", required_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_mrtg_config_wrapper result = { + .errorcode = OK, + .config = check_mrtg_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } for (int i = 1; i < argc; i++) { @@ -189,35 +194,33 @@ int process_arguments(int argc, char **argv) { switch (option_char) { case 'F': /* input file */ - log_file = optarg; + result.config.log_file = optarg; break; case 'e': /* ups name */ - expire_minutes = atoi(optarg); + result.config.expire_minutes = atoi(optarg); break; case 'a': /* port */ - if (!strcmp(optarg, "MAX")) { - use_average = false; - } else { - use_average = true; - } + result.config.use_average = (bool)(strcmp(optarg, "MAX")); break; case 'v': - variable_number = atoi(optarg); - if (variable_number < 1 || variable_number > 2) { + result.config.variable_number = atoi(optarg); + if (result.config.variable_number < 1 || result.config.variable_number > 2) { usage4(_("Invalid variable number")); } break; case 'w': /* critical time threshold */ - value_warning_threshold = strtoul(optarg, NULL, 10); + result.config.value_warning_threshold_set = true; + result.config.value_warning_threshold = strtoul(optarg, NULL, 10); break; case 'c': /* warning time threshold */ - value_critical_threshold = strtoul(optarg, NULL, 10); + result.config.value_critical_threshold_set = true; + result.config.value_critical_threshold = strtoul(optarg, NULL, 10); break; case 'l': /* label */ - label = optarg; + result.config.label = optarg; break; case 'u': /* timeout */ - units = optarg; + result.config.units = optarg; break; case 'V': /* version */ print_revision(progname, NP_VERSION); @@ -231,67 +234,69 @@ int process_arguments(int argc, char **argv) { } option_char = optind; - if (log_file == NULL && argc > option_char) { - log_file = argv[option_char++]; + if (result.config.log_file == NULL && argc > option_char) { + result.config.log_file = argv[option_char++]; } - if (expire_minutes <= 0 && argc > option_char) { + if (result.config.expire_minutes <= 0 && argc > option_char) { if (is_intpos(argv[option_char])) { - expire_minutes = atoi(argv[option_char++]); + result.config.expire_minutes = atoi(argv[option_char++]); } else { die(STATE_UNKNOWN, _("%s is not a valid expiration time\nUse '%s -h' for additional help\n"), argv[option_char], progname); } } if (argc > option_char && strcmp(argv[option_char], "MAX") == 0) { - use_average = false; + result.config.use_average = false; option_char++; } else if (argc > option_char && strcmp(argv[option_char], "AVG") == 0) { - use_average = true; + result.config.use_average = true; option_char++; } - if (argc > option_char && variable_number == -1) { - variable_number = atoi(argv[option_char++]); - if (variable_number < 1 || variable_number > 2) { + if (argc > option_char && result.config.variable_number == -1) { + result.config.variable_number = atoi(argv[option_char++]); + if (result.config.variable_number < 1 || result.config.variable_number > 2) { printf("%s :", argv[option_char]); usage(_("Invalid variable number\n")); } } - if (argc > option_char && value_warning_threshold == 0) { - value_warning_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && !result.config.value_warning_threshold_set) { + result.config.value_warning_threshold_set = true; + result.config.value_warning_threshold = strtoul(argv[option_char++], NULL, 10); } - if (argc > option_char && value_critical_threshold == 0) { - value_critical_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && !result.config.value_critical_threshold_set) { + result.config.value_critical_threshold_set = true; + result.config.value_critical_threshold = strtoul(argv[option_char++], NULL, 10); } - if (argc > option_char && strlen(label) == 0) { - label = argv[option_char++]; + if (argc > option_char && strlen(result.config.label) == 0) { + result.config.label = argv[option_char++]; } - if (argc > option_char && strlen(units) == 0) { - units = argv[option_char++]; + if (argc > option_char && strlen(result.config.units) == 0) { + result.config.units = argv[option_char++]; } - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments(void) { - if (variable_number == -1) { +check_mrtg_config_wrapper validate_arguments(check_mrtg_config_wrapper config_wrapper) { + if (config_wrapper.config.variable_number == -1) { usage4(_("You must supply the variable number")); } - if (label == NULL) { - label = strdup("value"); + if (config_wrapper.config.label == NULL) { + config_wrapper.config.label = strdup("value"); } - if (units == NULL) { - units = strdup(""); + if (config_wrapper.config.units == NULL) { + config_wrapper.config.units = strdup(""); } - return OK; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_mrtg.d/config.h b/plugins/check_mrtg.d/config.h new file mode 100644 index 00000000..96b849a2 --- /dev/null +++ b/plugins/check_mrtg.d/config.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../../config.h" +#include +#include + +typedef struct { + bool use_average; + int variable_number; + int expire_minutes; + char *label; + char *units; + char *log_file; + + bool value_warning_threshold_set; + unsigned long value_warning_threshold; + bool value_critical_threshold_set; + unsigned long value_critical_threshold; +} check_mrtg_config; + +check_mrtg_config check_mrtg_config_init() { + check_mrtg_config tmp = { + .use_average = true, + .variable_number = -1, + .expire_minutes = 0, + .label = NULL, + .units = NULL, + .log_file = NULL, + + .value_warning_threshold_set = false, + .value_warning_threshold = 0, + .value_critical_threshold_set = false, + .value_critical_threshold = 0, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 94f81f6fc78003d4f6f7d75789e3c4b364747d8b Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:53:48 +0100 Subject: Refactor check_mrtgraf --- plugins/Makefile.am | 1 + plugins/check_mrtgraf.d/config.h | 30 +++++++++++ plugins/check_mrtgtraf.c | 108 ++++++++++++++++++++------------------- 3 files changed, 87 insertions(+), 52 deletions(-) create mode 100644 plugins/check_mrtgraf.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9d310a15..38e2ed28 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -55,6 +55,7 @@ EXTRA_DIST = t \ check_dbi.d \ check_ssh.d \ check_dns.d \ + check_mrtgraf.d \ check_apt.d \ check_by_ssh.d \ check_smtp.d \ diff --git a/plugins/check_mrtgraf.d/config.h b/plugins/check_mrtgraf.d/config.h new file mode 100644 index 00000000..6d949b50 --- /dev/null +++ b/plugins/check_mrtgraf.d/config.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../../config.h" +#include +#include + +typedef struct { + char *log_file; + int expire_minutes; + bool use_average; + unsigned long incoming_warning_threshold; + unsigned long incoming_critical_threshold; + unsigned long outgoing_warning_threshold; + unsigned long outgoing_critical_threshold; + +} check_mrtgraf_config; + +check_mrtgraf_config check_mrtgraf_config_init() { + check_mrtgraf_config tmp = { + .log_file = NULL, + .expire_minutes = -1, + .use_average = true, + + .incoming_warning_threshold = 0, + .incoming_critical_threshold = 0, + .outgoing_warning_threshold = 0, + .outgoing_critical_threshold = 0, + }; + return tmp; +} diff --git a/plugins/check_mrtgtraf.c b/plugins/check_mrtgtraf.c index 78dcda0d..c9e26099 100644 --- a/plugins/check_mrtgtraf.c +++ b/plugins/check_mrtgtraf.c @@ -29,25 +29,23 @@ * *****************************************************************************/ -#include "common.h" -#include "utils.h" - const char *progname = "check_mrtgtraf"; const char *copyright = "1999-2024"; const char *email = "devel@monitoring-plugins.org"; -static int process_arguments(int /*argc*/, char ** /*argv*/); +#include "check_mrtgraf.d/config.h" +#include "common.h" +#include "utils.h" + +typedef struct { + int errorcode; + check_mrtgraf_config config; +} check_mrtgraf_config_wrapper; + +static check_mrtgraf_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); -static char *log_file = NULL; -static int expire_minutes = -1; -static bool use_average = true; -static unsigned long incoming_warning_threshold = 0L; -static unsigned long incoming_critical_threshold = 0L; -static unsigned long outgoing_warning_threshold = 0L; -static unsigned long outgoing_critical_threshold = 0L; - int main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); @@ -56,12 +54,15 @@ 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_mrtgraf_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_mrtgraf_config config = tmp_config.config; + /* open the MRTG log file for reading */ - FILE *mrtg_log_file_ptr = fopen(log_file, "r"); + FILE *mrtg_log_file_ptr = fopen(config.log_file, "r"); if (mrtg_log_file_ptr == NULL) { usage4(_("Unable to open MRTG log file")); } @@ -120,14 +121,14 @@ int main(int argc, char **argv) { /* make sure the MRTG data isn't too old */ time_t current_time; time(¤t_time); - if ((expire_minutes > 0) && (current_time - timestamp) > (expire_minutes * 60)) { + if ((config.expire_minutes > 0) && (current_time - timestamp) > (config.expire_minutes * 60)) { die(STATE_WARNING, _("MRTG data has expired (%d minutes old)\n"), (int)((current_time - timestamp) / 60)); } unsigned long incoming_rate = 0L; unsigned long outgoing_rate = 0L; /* else check the incoming/outgoing rates */ - if (use_average) { + if (config.use_average) { incoming_rate = average_incoming_rate; outgoing_rate = average_outgoing_rate; } else { @@ -172,24 +173,26 @@ int main(int argc, char **argv) { /* report outgoing traffic in MBytes/sec */ else { strcpy(outgoing_speed_rating, "MB"); - adjusted_outgoing_rate = (double)(outgoing_rate / 1024.0 / 1024.0); + adjusted_outgoing_rate = (outgoing_rate / 1024.0 / 1024.0); } int result = STATE_OK; - if (incoming_rate > incoming_critical_threshold || outgoing_rate > outgoing_critical_threshold) { + if (incoming_rate > config.incoming_critical_threshold || outgoing_rate > config.outgoing_critical_threshold) { result = STATE_CRITICAL; - } else if (incoming_rate > incoming_warning_threshold || outgoing_rate > outgoing_warning_threshold) { + } else if (incoming_rate > config.incoming_warning_threshold || outgoing_rate > config.outgoing_warning_threshold) { result = STATE_WARNING; } char *error_message; - xasprintf(&error_message, _("%s. In = %0.1f %s/s, %s. Out = %0.1f %s/s|%s %s\n"), (use_average) ? _("Avg") : _("Max"), - adjusted_incoming_rate, incoming_speed_rating, (use_average) ? _("Avg") : _("Max"), adjusted_outgoing_rate, + xasprintf(&error_message, _("%s. In = %0.1f %s/s, %s. Out = %0.1f %s/s|%s %s\n"), (config.use_average) ? _("Avg") : _("Max"), + adjusted_incoming_rate, incoming_speed_rating, (config.use_average) ? _("Avg") : _("Max"), adjusted_outgoing_rate, outgoing_speed_rating, - fperfdata("in", adjusted_incoming_rate, incoming_speed_rating, (int)incoming_warning_threshold, incoming_warning_threshold, - (int)incoming_critical_threshold, incoming_critical_threshold, true, 0, false, 0), - fperfdata("out", adjusted_outgoing_rate, outgoing_speed_rating, (int)outgoing_warning_threshold, outgoing_warning_threshold, - (int)outgoing_critical_threshold, outgoing_critical_threshold, true, 0, false, 0)); + fperfdata("in", adjusted_incoming_rate, incoming_speed_rating, (int)config.incoming_warning_threshold, + config.incoming_warning_threshold, (int)config.incoming_critical_threshold, config.incoming_critical_threshold, + true, 0, false, 0), + fperfdata("out", adjusted_outgoing_rate, outgoing_speed_rating, (int)config.outgoing_warning_threshold, + config.outgoing_warning_threshold, (int)config.outgoing_critical_threshold, config.outgoing_critical_threshold, + true, 0, false, 0)); printf(_("Traffic %s - %s\n"), state_text(result), error_message); @@ -197,7 +200,7 @@ int main(int argc, char **argv) { } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_mrtgraf_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"filename", required_argument, 0, 'F'}, {"expires", required_argument, 0, 'e'}, {"aggregation", required_argument, 0, 'a'}, @@ -207,8 +210,13 @@ int process_arguments(int argc, char **argv) { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_mrtgraf_config_wrapper result = { + .errorcode = OK, + .config = check_mrtgraf_config_init(), + }; if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } for (int i = 1; i < argc; i++) { @@ -223,7 +231,7 @@ int process_arguments(int argc, char **argv) { int option_char; int option = 0; - while (1) { + while (true) { option_char = getopt_long(argc, argv, "hVF:e:a:c:w:", longopts, &option); if (option_char == -1 || option_char == EOF) { @@ -232,23 +240,19 @@ int process_arguments(int argc, char **argv) { switch (option_char) { case 'F': /* input file */ - log_file = optarg; + result.config.log_file = optarg; break; case 'e': /* expiration time */ - expire_minutes = atoi(optarg); + result.config.expire_minutes = atoi(optarg); break; case 'a': /* aggregation (AVE or MAX) */ - if (!strcmp(optarg, "MAX")) { - use_average = false; - } else { - use_average = true; - } + result.config.use_average = (bool)(strcmp(optarg, "MAX")); break; case 'c': /* warning threshold */ - sscanf(optarg, "%lu,%lu", &incoming_critical_threshold, &outgoing_critical_threshold); + sscanf(optarg, "%lu,%lu", &result.config.incoming_critical_threshold, &result.config.outgoing_critical_threshold); break; case 'w': /* critical threshold */ - sscanf(optarg, "%lu,%lu", &incoming_warning_threshold, &outgoing_warning_threshold); + sscanf(optarg, "%lu,%lu", &result.config.incoming_warning_threshold, &result.config.outgoing_warning_threshold); break; case 'V': /* version */ print_revision(progname, NP_VERSION); @@ -262,39 +266,39 @@ int process_arguments(int argc, char **argv) { } option_char = optind; - if (argc > option_char && log_file == NULL) { - log_file = argv[option_char++]; + if (argc > option_char && result.config.log_file == NULL) { + result.config.log_file = argv[option_char++]; } - if (argc > option_char && expire_minutes == -1) { - expire_minutes = atoi(argv[option_char++]); + if (argc > option_char && result.config.expire_minutes == -1) { + result.config.expire_minutes = atoi(argv[option_char++]); } if (argc > option_char && strcmp(argv[option_char], "MAX") == 0) { - use_average = false; + result.config.use_average = false; option_char++; } else if (argc > option_char && strcmp(argv[option_char], "AVG") == 0) { - use_average = true; + result.config.use_average = true; option_char++; } - if (argc > option_char && incoming_warning_threshold == 0) { - incoming_warning_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && result.config.incoming_warning_threshold == 0) { + result.config.incoming_warning_threshold = strtoul(argv[option_char++], NULL, 10); } - if (argc > option_char && incoming_critical_threshold == 0) { - incoming_critical_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && result.config.incoming_critical_threshold == 0) { + result.config.incoming_critical_threshold = strtoul(argv[option_char++], NULL, 10); } - if (argc > option_char && outgoing_warning_threshold == 0) { - outgoing_warning_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && result.config.outgoing_warning_threshold == 0) { + result.config.outgoing_warning_threshold = strtoul(argv[option_char++], NULL, 10); } - if (argc > option_char && outgoing_critical_threshold == 0) { - outgoing_critical_threshold = strtoul(argv[option_char++], NULL, 10); + if (argc > option_char && result.config.outgoing_critical_threshold == 0) { + result.config.outgoing_critical_threshold = strtoul(argv[option_char++], NULL, 10); } - return OK; + return result; } void print_help(void) { -- cgit v1.2.3-74-g34f1 From 3143b5217cf1c71a085e6c4c7d22a5b699c4ff07 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:22:13 +0100 Subject: Refactor check_mysql --- plugins/Makefile.am | 1 + plugins/check_mysql.c | 217 +++++++++++++++++++---------------------- plugins/check_mysql.d/config.h | 58 +++++++++++ 3 files changed, 160 insertions(+), 116 deletions(-) create mode 100644 plugins/check_mysql.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 06958849..9449f051 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -60,6 +60,7 @@ EXTRA_DIST = t \ check_apt.d \ check_by_ssh.d \ check_smtp.d \ + check_mysql.d \ check_dig.d \ check_cluster.d \ check_fping.d diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c index 2b6cfeaf..ca3422b5 100644 --- a/plugins/check_mysql.c +++ b/plugins/check_mysql.c @@ -40,32 +40,14 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils.h" #include "utils_base.h" #include "netutils.h" +#include "check_mysql.d/config.h" #include #include #include -static char *db_user = NULL; -static char *db_host = NULL; -static char *db_socket = NULL; -static char *db_pass = NULL; -static char *db = NULL; -static char *ca_cert = NULL; -static char *ca_dir = NULL; -static char *cert = NULL; -static char *key = NULL; -static char *ciphers = NULL; -static bool ssl = false; -static char *opt_file = NULL; -static char *opt_group = NULL; -static unsigned int db_port = MYSQL_PORT; -static bool check_replica = false; -static bool ignore_auth = false; static int verbose = 0; -static double warning_time = 0; -static double critical_time = 0; - #define LENGTH_METRIC_UNIT 6 static const char *metric_unit[LENGTH_METRIC_UNIT] = { "Open_files", "Open_tables", "Qcache_free_memory", "Qcache_queries_in_cache", "Threads_connected", "Threads_running"}; @@ -78,28 +60,16 @@ static const char *metric_counter[LENGTH_METRIC_COUNTER] = { #define MYSQLDUMP_THREADS_QUERY \ "SELECT COUNT(1) mysqldumpThreads FROM information_schema.processlist WHERE info LIKE 'SELECT /*!40001 SQL_NO_CACHE */%'" -static thresholds *my_threshold = NULL; - -static int process_arguments(int, char **); -static int validate_arguments(void); +typedef struct { + int errorcode; + check_mysql_config config; +} check_mysql_config_wrapper; +static check_mysql_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_mysql_config_wrapper validate_arguments(check_mysql_config_wrapper /*config_wrapper*/); static void print_help(void); void print_usage(void); int main(int argc, char **argv) { - - MYSQL mysql; - MYSQL_RES *res; - MYSQL_ROW row; - - /* should be status */ - - char *result = NULL; - char *error = NULL; - char replica_result[REPLICA_RESULTSIZE] = {0}; - char *perf; - - perf = strdup(""); - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -107,36 +77,43 @@ 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_mysql_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_mysql_config config = tmp_config.config; + + MYSQL mysql; /* initialize mysql */ mysql_init(&mysql); - if (opt_file != NULL) { - mysql_options(&mysql, MYSQL_READ_DEFAULT_FILE, opt_file); + if (config.opt_file != NULL) { + mysql_options(&mysql, MYSQL_READ_DEFAULT_FILE, config.opt_file); } - if (opt_group != NULL) { - mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, opt_group); + if (config.opt_group != NULL) { + mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, config.opt_group); } else { mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "client"); } - if (ssl) { - mysql_ssl_set(&mysql, key, cert, ca_cert, ca_dir, ciphers); + if (config.ssl) { + mysql_ssl_set(&mysql, config.key, config.cert, config.ca_cert, config.ca_dir, config.ciphers); } /* establish a connection to the server and error checking */ - if (!mysql_real_connect(&mysql, db_host, db_user, db_pass, db, db_port, db_socket, 0)) { + if (!mysql_real_connect(&mysql, config.db_host, config.db_user, config.db_pass, config.db, config.db_port, config.db_socket, 0)) { /* Depending on internally-selected auth plugin MySQL might return */ /* ER_ACCESS_DENIED_NO_PASSWORD_ERROR or ER_ACCESS_DENIED_ERROR. */ /* Semantically these errors are the same. */ - if (ignore_auth && (mysql_errno(&mysql) == ER_ACCESS_DENIED_ERROR || mysql_errno(&mysql) == ER_ACCESS_DENIED_NO_PASSWORD_ERROR)) { + if (config.ignore_auth && + (mysql_errno(&mysql) == ER_ACCESS_DENIED_ERROR || mysql_errno(&mysql) == ER_ACCESS_DENIED_NO_PASSWORD_ERROR)) { printf("MySQL OK - Version: %s (protocol %d)\n", mysql_get_server_info(&mysql), mysql_get_proto_info(&mysql)); mysql_close(&mysql); return STATE_OK; - } else if (mysql_errno(&mysql) == CR_UNKNOWN_HOST) { + } + + if (mysql_errno(&mysql) == CR_UNKNOWN_HOST) { die(STATE_WARNING, "%s\n", mysql_error(&mysql)); } else if (mysql_errno(&mysql) == CR_VERSION_ERROR) { die(STATE_WARNING, "%s\n", mysql_error(&mysql)); @@ -152,7 +129,7 @@ int main(int argc, char **argv) { } /* get the server stats */ - result = strdup(mysql_stat(&mysql)); + char *result = strdup(mysql_stat(&mysql)); /* error checking once more */ if (mysql_error(&mysql)) { @@ -165,6 +142,10 @@ int main(int argc, char **argv) { } } + char *perf = strdup(""); + char *error = NULL; + MYSQL_RES *res; + MYSQL_ROW row; /* try to fetch some perf data */ if (mysql_query(&mysql, "show global status") == 0) { if ((res = mysql_store_result(&mysql)) == NULL) { @@ -174,15 +155,13 @@ int main(int argc, char **argv) { } while ((row = mysql_fetch_row(res)) != NULL) { - int i; - - for (i = 0; i < LENGTH_METRIC_UNIT; i++) { + for (int i = 0; i < LENGTH_METRIC_UNIT; i++) { if (strcmp(row[0], metric_unit[i]) == 0) { xasprintf(&perf, "%s%s ", perf, perfdata(metric_unit[i], atol(row[1]), "", false, 0, false, 0, false, 0, false, 0)); continue; } } - for (i = 0; i < LENGTH_METRIC_COUNTER; i++) { + for (int i = 0; i < LENGTH_METRIC_COUNTER; i++) { if (strcmp(row[0], metric_counter[i]) == 0) { xasprintf(&perf, "%s%s ", perf, perfdata(metric_counter[i], atol(row[1]), "c", false, 0, false, 0, false, 0, false, 0)); continue; @@ -195,8 +174,8 @@ int main(int argc, char **argv) { } } - if (check_replica) { - + char replica_result[REPLICA_RESULTSIZE] = {0}; + if (config.check_replica) { // Detect which version we are, on older version // "show slave status" should work, on newer ones // "show replica status" @@ -283,12 +262,14 @@ int main(int argc, char **argv) { } else { /* mysql 4.x.x and mysql 5.x.x */ - int replica_io_field = -1, replica_sql_field = -1, seconds_behind_field = -1, i, num_fields; + int replica_io_field = -1; + int replica_sql_field = -1; + int seconds_behind_field = -1; + int num_fields; MYSQL_FIELD *fields; - num_fields = mysql_num_fields(res); fields = mysql_fetch_fields(res); - for (i = 0; i < num_fields; i++) { + for (int i = 0; i < num_fields; i++) { if (strcmp(fields[i].name, "Slave_IO_Running") == 0) { replica_io_field = i; continue; @@ -353,11 +334,11 @@ int main(int argc, char **argv) { double value = atof(row[seconds_behind_field]); int status; - status = get_status(value, my_threshold); + status = get_status(value, config.my_threshold); xasprintf(&perf, "%s %s", perf, - fperfdata("seconds behind master", value, "s", true, (double)warning_time, true, (double)critical_time, false, 0, - false, 0)); + fperfdata("seconds behind master", value, "s", true, (double)config.warning_time, true, + (double)config.critical_time, false, 0, false, 0)); if (status == STATE_WARNING) { printf("SLOW_REPLICA %s: %s|%s\n", _("WARNING"), replica_result, perf); @@ -377,7 +358,7 @@ int main(int argc, char **argv) { mysql_close(&mysql); /* print out the result of stats */ - if (check_replica) { + if (config.check_replica) { printf("%s %s|%s\n", result, replica_result, perf); } else { printf("%s|%s\n", result, perf); @@ -389,12 +370,7 @@ int main(int argc, char **argv) { #define CHECK_REPLICA_OPT CHAR_MAX + 1 /* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - char *warning = NULL; - char *critical = NULL; - - int option = 0; +check_mysql_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"socket", required_argument, 0, 's'}, {"database", required_argument, 0, 'd'}, @@ -419,56 +395,66 @@ int process_arguments(int argc, char **argv) { {"ciphers", required_argument, 0, 'L'}, {0, 0, 0, 0}}; + check_mysql_config_wrapper result = { + .errorcode = OK, + .config = check_mysql_config_init(), + }; + if (argc < 1) { - return ERROR; + result.errorcode = ERROR; + return result; } - while (1) { - c = getopt_long(argc, argv, "hlvVnSP:p:u:d:H:s:c:w:a:k:C:D:L:f:g:", longopts, &option); + char *warning = NULL; + char *critical = NULL; + + int option = 0; + while (true) { + int option_index = getopt_long(argc, argv, "hlvVnSP:p:u:d:H:s:c:w:a:k:C:D:L:f:g:", longopts, &option); - if (c == -1 || c == EOF) { + if (option_index == -1 || option_index == EOF) { break; } - switch (c) { + switch (option_index) { case 'H': /* hostname */ if (is_host(optarg)) { - db_host = optarg; + result.config.db_host = optarg; } else if (*optarg == '/') { - db_socket = optarg; + result.config.db_socket = optarg; } else { usage2(_("Invalid hostname/address"), optarg); } break; case 's': /* socket */ - db_socket = optarg; + result.config.db_socket = optarg; break; case 'd': /* database */ - db = optarg; + result.config.db = optarg; break; case 'l': - ssl = true; + result.config.ssl = true; break; case 'C': - ca_cert = optarg; + result.config.ca_cert = optarg; break; case 'a': - cert = optarg; + result.config.cert = optarg; break; case 'k': - key = optarg; + result.config.key = optarg; break; case 'D': - ca_dir = optarg; + result.config.ca_dir = optarg; break; case 'L': - ciphers = optarg; + result.config.ciphers = optarg; break; case 'u': /* username */ - db_user = optarg; + result.config.db_user = optarg; break; case 'p': /* authentication information: password */ - db_pass = strdup(optarg); + result.config.db_pass = strdup(optarg); /* Delete the password from process list */ while (*optarg != '\0') { @@ -477,28 +463,28 @@ int process_arguments(int argc, char **argv) { } break; case 'f': /* client options file */ - opt_file = optarg; + result.config.opt_file = optarg; break; case 'g': /* client options group */ - opt_group = optarg; + result.config.opt_group = optarg; break; case 'P': /* critical time threshold */ - db_port = atoi(optarg); + result.config.db_port = atoi(optarg); break; case 'S': case CHECK_REPLICA_OPT: - check_replica = true; /* check-slave */ + result.config.check_replica = true; /* check-slave */ break; case 'n': - ignore_auth = true; /* ignore-auth */ + result.config.ignore_auth = true; /* ignore-auth */ break; case 'w': warning = optarg; - warning_time = strtod(warning, NULL); + result.config.warning_time = strtod(warning, NULL); break; case 'c': critical = optarg; - critical_time = strtod(critical, NULL); + result.config.critical_time = strtod(critical, NULL); break; case 'V': /* version */ print_revision(progname, NP_VERSION); @@ -514,48 +500,47 @@ int process_arguments(int argc, char **argv) { } } - c = optind; - - set_thresholds(&my_threshold, warning, critical); + int index = optind; - while (argc > c) { + set_thresholds(&result.config.my_threshold, warning, critical); - if (db_host == NULL) { - if (is_host(argv[c])) { - db_host = argv[c++]; + while (argc > index) { + if (result.config.db_host == NULL) { + if (is_host(argv[index])) { + result.config.db_host = argv[index++]; } else { - usage2(_("Invalid hostname/address"), argv[c]); + usage2(_("Invalid hostname/address"), argv[index]); } - } else if (db_user == NULL) { - db_user = argv[c++]; - } else if (db_pass == NULL) { - db_pass = argv[c++]; - } else if (db == NULL) { - db = argv[c++]; - } else if (is_intnonneg(argv[c])) { - db_port = atoi(argv[c++]); + } else if (result.config.db_user == NULL) { + result.config.db_user = argv[index++]; + } else if (result.config.db_pass == NULL) { + result.config.db_pass = argv[index++]; + } else if (result.config.db == NULL) { + result.config.db = argv[index++]; + } else if (is_intnonneg(argv[index])) { + result.config.db_port = atoi(argv[index++]); } else { break; } } - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments(void) { - if (db_user == NULL) { - db_user = strdup(""); +check_mysql_config_wrapper validate_arguments(check_mysql_config_wrapper config_wrapper) { + if (config_wrapper.config.db_user == NULL) { + config_wrapper.config.db_user = strdup(""); } - if (db_host == NULL) { - db_host = strdup(""); + if (config_wrapper.config.db_host == NULL) { + config_wrapper.config.db_host = strdup(""); } - if (db == NULL) { - db = strdup(""); + if (config_wrapper.config.db == NULL) { + config_wrapper.config.db = strdup(""); } - return OK; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_mysql.d/config.h b/plugins/check_mysql.d/config.h new file mode 100644 index 00000000..71ddbe8d --- /dev/null +++ b/plugins/check_mysql.d/config.h @@ -0,0 +1,58 @@ +#pragma once + +#include "../../config.h" +#include "thresholds.h" +#include +#include + +typedef struct { + char *db_host; + unsigned int db_port; + char *db_user; + char *db_socket; + char *db_pass; + char *db; + char *ca_cert; + char *ca_dir; + char *cert; + char *key; + char *ciphers; + bool ssl; + char *opt_file; + char *opt_group; + + bool check_replica; + bool ignore_auth; + + double warning_time; + double critical_time; + thresholds *my_threshold; + +} check_mysql_config; + +check_mysql_config check_mysql_config_init() { + check_mysql_config tmp = { + .db_host = NULL, + .db_port = MYSQL_PORT, + .db = NULL, + .db_pass = NULL, + .db_socket = NULL, + .db_user = NULL, + .ca_cert = NULL, + .ca_dir = NULL, + .cert = NULL, + .key = NULL, + .ciphers = NULL, + .ssl = false, + .opt_file = NULL, + .opt_group = NULL, + + .check_replica = false, + .ignore_auth = false, + + .warning_time = 0, + .critical_time = 0, + .my_threshold = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 013b4d64899c22532f9578b4d64fa3b646e4a0c4 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:44:55 +0100 Subject: Refactor check_mysql_query --- plugins/Makefile.am | 1 + plugins/check_mysql_query.c | 96 ++++++++++++++++++------------------ plugins/check_mysql_query.d/config.h | 36 ++++++++++++++ 3 files changed, 86 insertions(+), 47 deletions(-) create mode 100644 plugins/check_mysql_query.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 19b3d172..1e4789ff 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -57,6 +57,7 @@ EXTRA_DIST = t \ check_ssh.d \ check_dns.d \ check_mrtgraf.d \ + check_mysql_query.d \ check_mrtg.d \ check_apt.d \ check_by_ssh.d \ diff --git a/plugins/check_mysql_query.c b/plugins/check_mysql_query.c index 480453b1..5e04a94b 100644 --- a/plugins/check_mysql_query.c +++ b/plugins/check_mysql_query.c @@ -37,27 +37,21 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils.h" #include "utils_base.h" #include "netutils.h" +#include "check_mysql_query.d/config.h" #include #include -static char *db_user = NULL; -static char *db_host = NULL; -static char *db_socket = NULL; -static char *db_pass = NULL; -static char *db = NULL; -static char *opt_file = NULL; -static char *opt_group = NULL; -static unsigned int db_port = MYSQL_PORT; - -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int validate_arguments(void); +typedef struct { + int errorcode; + check_mysql_query_config config; +} check_mysql_query_config_wrapper; +static check_mysql_query_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_mysql_query_config_wrapper validate_arguments(check_mysql_query_config_wrapper /*config_wrapper*/); static void print_help(void); void print_usage(void); -static char *sql_query = NULL; static int verbose = 0; -static thresholds *my_thresholds = NULL; int main(int argc, char **argv) { setlocale(LC_ALL, ""); @@ -67,26 +61,29 @@ 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_mysql_query_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_mysql_query_config config = tmp_config.config; + MYSQL mysql; /* initialize mysql */ mysql_init(&mysql); - if (opt_file != NULL) { - mysql_options(&mysql, MYSQL_READ_DEFAULT_FILE, opt_file); + if (config.opt_file != NULL) { + mysql_options(&mysql, MYSQL_READ_DEFAULT_FILE, config.opt_file); } - if (opt_group != NULL) { - mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, opt_group); + if (config.opt_group != NULL) { + mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, config.opt_group); } else { mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "client"); } /* establish a connection to the server and error checking */ - if (!mysql_real_connect(&mysql, db_host, db_user, db_pass, db, db_port, db_socket, 0)) { + if (!mysql_real_connect(&mysql, config.db_host, config.db_user, config.db_pass, config.db, config.db_port, config.db_socket, 0)) { if (mysql_errno(&mysql) == CR_UNKNOWN_HOST) { die(STATE_WARNING, "QUERY %s: %s\n", _("WARNING"), mysql_error(&mysql)); } else if (mysql_errno(&mysql) == CR_VERSION_ERROR) { @@ -103,7 +100,7 @@ int main(int argc, char **argv) { } char *error = NULL; - if (mysql_query(&mysql, sql_query) != 0) { + if (mysql_query(&mysql, config.sql_query) != 0) { error = strdup(mysql_error(&mysql)); mysql_close(&mysql); die(STATE_CRITICAL, "QUERY %s: %s - %s\n", _("CRITICAL"), _("Error with query"), error); @@ -148,7 +145,7 @@ int main(int argc, char **argv) { printf("mysql result: %f\n", value); } - int status = get_status(value, my_thresholds); + int status = get_status(value, config.my_thresholds); if (status == STATE_OK) { printf("QUERY %s: ", _("OK")); @@ -157,17 +154,16 @@ int main(int argc, char **argv) { } else if (status == STATE_CRITICAL) { printf("QUERY %s: ", _("CRITICAL")); } - printf(_("'%s' returned %f | %s"), sql_query, value, - fperfdata("result", value, "", my_thresholds->warning ? true : false, my_thresholds->warning ? my_thresholds->warning->end : 0, - my_thresholds->critical ? true : false, my_thresholds->critical ? my_thresholds->critical->end : 0, false, 0, false, - 0)); + printf(_("'%s' returned %f | %s"), config.sql_query, value, + fperfdata("result", value, "", config.my_thresholds->warning, config.my_thresholds->warning ? config.my_thresholds->warning->end : 0, + config.my_thresholds->critical, config.my_thresholds->critical ? config.my_thresholds->critical->end : 0, false, 0, false, 0)); printf("\n"); return status; } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_mysql_query_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = { {"hostname", required_argument, 0, 'H'}, {"socket", required_argument, 0, 's'}, {"database", required_argument, 0, 'd'}, {"username", required_argument, 0, 'u'}, {"password", required_argument, 0, 'p'}, {"file", required_argument, 0, 'f'}, @@ -175,8 +171,14 @@ int process_arguments(int argc, char **argv) { {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"query", required_argument, 0, 'q'}, {"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, {0, 0, 0, 0}}; + check_mysql_query_config_wrapper result = { + .errorcode = OK, + .config = check_mysql_query_config_init(), + }; + if (argc < 1) { - return ERROR; + result.errorcode = ERROR; + return result; } char *warning = NULL; @@ -193,22 +195,22 @@ int process_arguments(int argc, char **argv) { switch (option_char) { case 'H': /* hostname */ if (is_host(optarg)) { - db_host = optarg; + result.config.db_host = optarg; } else { usage2(_("Invalid hostname/address"), optarg); } break; case 's': /* socket */ - db_socket = optarg; + result.config.db_socket = optarg; break; case 'd': /* database */ - db = optarg; + result.config.db = optarg; break; case 'u': /* username */ - db_user = optarg; + result.config.db_user = optarg; break; case 'p': /* authentication information: password */ - db_pass = strdup(optarg); + result.config.db_pass = strdup(optarg); /* Delete the password from process list */ while (*optarg != '\0') { @@ -217,13 +219,13 @@ int process_arguments(int argc, char **argv) { } break; case 'f': /* client options file */ - opt_file = optarg; + result.config.opt_file = optarg; break; case 'g': /* client options group */ - opt_group = optarg; + result.config.opt_group = optarg; break; case 'P': /* critical time threshold */ - db_port = atoi(optarg); + result.config.db_port = atoi(optarg); break; case 'v': verbose++; @@ -235,7 +237,7 @@ int process_arguments(int argc, char **argv) { print_help(); exit(STATE_UNKNOWN); case 'q': - xasprintf(&sql_query, "%s", optarg); + xasprintf(&result.config.sql_query, "%s", optarg); break; case 'w': warning = optarg; @@ -248,29 +250,29 @@ int process_arguments(int argc, char **argv) { } } - set_thresholds(&my_thresholds, warning, critical); + set_thresholds(&result.config.my_thresholds, warning, critical); - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments(void) { - if (sql_query == NULL) { +check_mysql_query_config_wrapper validate_arguments(check_mysql_query_config_wrapper config_wrapper) { + if (config_wrapper.config.sql_query == NULL) { usage("Must specify a SQL query to run"); } - if (db_user == NULL) { - db_user = strdup(""); + if (config_wrapper.config.db_user == NULL) { + config_wrapper.config.db_user = strdup(""); } - if (db_host == NULL) { - db_host = strdup(""); + if (config_wrapper.config.db_host == NULL) { + config_wrapper.config.db_host = strdup(""); } - if (db == NULL) { - db = strdup(""); + if (config_wrapper.config.db == NULL) { + config_wrapper.config.db = strdup(""); } - return OK; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_mysql_query.d/config.h b/plugins/check_mysql_query.d/config.h new file mode 100644 index 00000000..be019160 --- /dev/null +++ b/plugins/check_mysql_query.d/config.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../../config.h" +#include "thresholds.h" +#include + +typedef struct { + char *db_host; + char *db_socket; + char *db; + char *db_user; + char *db_pass; + char *opt_file; + char *opt_group; + unsigned int db_port; + + char *sql_query; + thresholds *my_thresholds; +} check_mysql_query_config; + +check_mysql_query_config check_mysql_query_config_init() { + check_mysql_query_config tmp = { + .db_host = NULL, + .db_socket = NULL, + .db = NULL, + .db_user = NULL, + .db_pass = NULL, + .opt_file = NULL, + .opt_group = NULL, + .db_port = MYSQL_PORT, + + .sql_query = NULL, + .my_thresholds = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 69c61625e4f8977cb06a2514a26fc5805f29c531 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:02:24 +0100 Subject: typo: mrtgraf -> mrtgtraf --- plugins/Makefile.am | 2 +- plugins/check_mrtgraf.d/config.h | 30 ------------------------------ plugins/check_mrtgtraf.c | 18 +++++++++--------- plugins/check_mrtgtraf.d/config.h | 30 ++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 40 deletions(-) delete mode 100644 plugins/check_mrtgraf.d/config.h create mode 100644 plugins/check_mrtgtraf.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 1e4789ff..305924bf 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -56,7 +56,7 @@ EXTRA_DIST = t \ check_dbi.d \ check_ssh.d \ check_dns.d \ - check_mrtgraf.d \ + check_mrtgtraf.d \ check_mysql_query.d \ check_mrtg.d \ check_apt.d \ diff --git a/plugins/check_mrtgraf.d/config.h b/plugins/check_mrtgraf.d/config.h deleted file mode 100644 index 6d949b50..00000000 --- a/plugins/check_mrtgraf.d/config.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "../../config.h" -#include -#include - -typedef struct { - char *log_file; - int expire_minutes; - bool use_average; - unsigned long incoming_warning_threshold; - unsigned long incoming_critical_threshold; - unsigned long outgoing_warning_threshold; - unsigned long outgoing_critical_threshold; - -} check_mrtgraf_config; - -check_mrtgraf_config check_mrtgraf_config_init() { - check_mrtgraf_config tmp = { - .log_file = NULL, - .expire_minutes = -1, - .use_average = true, - - .incoming_warning_threshold = 0, - .incoming_critical_threshold = 0, - .outgoing_warning_threshold = 0, - .outgoing_critical_threshold = 0, - }; - return tmp; -} diff --git a/plugins/check_mrtgtraf.c b/plugins/check_mrtgtraf.c index c9e26099..8c7cf8aa 100644 --- a/plugins/check_mrtgtraf.c +++ b/plugins/check_mrtgtraf.c @@ -33,16 +33,16 @@ const char *progname = "check_mrtgtraf"; const char *copyright = "1999-2024"; const char *email = "devel@monitoring-plugins.org"; -#include "check_mrtgraf.d/config.h" +#include "check_mrtgtraf.d/config.h" #include "common.h" #include "utils.h" typedef struct { int errorcode; - check_mrtgraf_config config; -} check_mrtgraf_config_wrapper; + check_mrtgtraf_config config; +} check_mrtgtraf_config_wrapper; -static check_mrtgraf_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_mrtgtraf_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); @@ -54,12 +54,12 @@ int main(int argc, char **argv) { /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - check_mrtgraf_config_wrapper tmp_config = process_arguments(argc, argv); + check_mrtgtraf_config_wrapper tmp_config = process_arguments(argc, argv); if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } - const check_mrtgraf_config config = tmp_config.config; + const check_mrtgtraf_config config = tmp_config.config; /* open the MRTG log file for reading */ FILE *mrtg_log_file_ptr = fopen(config.log_file, "r"); @@ -200,7 +200,7 @@ int main(int argc, char **argv) { } /* process command-line arguments */ -check_mrtgraf_config_wrapper process_arguments(int argc, char **argv) { +check_mrtgtraf_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"filename", required_argument, 0, 'F'}, {"expires", required_argument, 0, 'e'}, {"aggregation", required_argument, 0, 'a'}, @@ -210,9 +210,9 @@ check_mrtgraf_config_wrapper process_arguments(int argc, char **argv) { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; - check_mrtgraf_config_wrapper result = { + check_mrtgtraf_config_wrapper result = { .errorcode = OK, - .config = check_mrtgraf_config_init(), + .config = check_mrtgtraf_config_init(), }; if (argc < 2) { result.errorcode = ERROR; diff --git a/plugins/check_mrtgtraf.d/config.h b/plugins/check_mrtgtraf.d/config.h new file mode 100644 index 00000000..94929ff7 --- /dev/null +++ b/plugins/check_mrtgtraf.d/config.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../../config.h" +#include +#include + +typedef struct { + char *log_file; + int expire_minutes; + bool use_average; + unsigned long incoming_warning_threshold; + unsigned long incoming_critical_threshold; + unsigned long outgoing_warning_threshold; + unsigned long outgoing_critical_threshold; + +} check_mrtgtraf_config; + +check_mrtgtraf_config check_mrtgtraf_config_init() { + check_mrtgtraf_config tmp = { + .log_file = NULL, + .expire_minutes = -1, + .use_average = true, + + .incoming_warning_threshold = 0, + .incoming_critical_threshold = 0, + .outgoing_warning_threshold = 0, + .outgoing_critical_threshold = 0, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From b16360eede8d370698ba8836808a3b1dbd805edf Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:18:03 +0100 Subject: Refactor check_nagios --- plugins/Makefile.am | 1 + plugins/check_nagios.c | 134 +++++++++++++++++++++------------------- plugins/check_nagios.d/config.h | 19 ++++++ 3 files changed, 89 insertions(+), 65 deletions(-) create mode 100644 plugins/check_nagios.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 1e4789ff..d27c9efd 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -53,6 +53,7 @@ EXTRA_DIST = t \ check_ldap.d \ check_hpjd.d \ check_game.d \ + check_nagios.d \ check_dbi.d \ check_ssh.d \ check_dns.d \ diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c index 72613f97..a46dc1ed 100644 --- a/plugins/check_nagios.c +++ b/plugins/check_nagios.c @@ -39,47 +39,20 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "runcmd.h" #include "utils.h" - -static int process_arguments(int /*argc*/, char ** /*argv*/); +#include "states.h" +#include "check_nagios.d/config.h" + +typedef struct { + int errorcode; + check_nagios_config config; +} check_nagios_config_wrapper; +static check_nagios_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); -static char *status_log = NULL; -static char *process_string = NULL; -static int expire_minutes = 0; - static int verbose = 0; int main(int argc, char **argv) { - int result = STATE_UNKNOWN; - char input_buffer[MAX_INPUT_BUFFER]; - unsigned long latest_entry_time = 0L; - unsigned long temp_entry_time = 0L; - int proc_entries = 0; - time_t current_time; - char *temp_ptr; - FILE *fp; - int procuid = 0; - int procpid = 0; - int procppid = 0; - int procvsz = 0; - int procrss = 0; - float procpcpu = 0; - char procstat[8]; -#ifdef PS_USES_PROCETIME - char procetime[MAX_INPUT_BUFFER]; -#endif /* PS_USES_PROCETIME */ - char procprog[MAX_INPUT_BUFFER]; - char *procargs; - int pos; - int cols; - int expected_cols = PS_COLS - 1; - const char *zombie = "Z"; - char *temp_string; - output chld_out; - output chld_err; - size_t i; - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -87,10 +60,14 @@ 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_nagios_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { usage_va(_("Could not parse arguments")); } + const check_nagios_config config = tmp_config.config; + /* Set signal handling and alarm timeout */ if (signal(SIGALRM, timeout_alarm_handler) == SIG_ERR) { usage_va(_("Cannot catch SIGALRM")); @@ -100,13 +77,17 @@ int main(int argc, char **argv) { alarm(timeout_interval); /* open the status log */ - fp = fopen(status_log, "r"); - if (fp == NULL) { + FILE *log_file = fopen(config.status_log, "r"); + if (log_file == NULL) { die(STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot open status log for reading!")); } + unsigned long latest_entry_time = 0L; + unsigned long temp_entry_time = 0L; + char input_buffer[MAX_INPUT_BUFFER]; + char *temp_ptr; /* get the date/time of the last item updated in the log */ - while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, fp)) { + while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, log_file)) { if ((temp_ptr = strstr(input_buffer, "created=")) != NULL) { temp_entry_time = strtoul(temp_ptr + 8, NULL, 10); latest_entry_time = temp_entry_time; @@ -119,20 +100,39 @@ int main(int argc, char **argv) { } } } - fclose(fp); + fclose(log_file); if (verbose >= 2) { printf("command: %s\n", PS_COMMAND); } /* run the command to check for the Nagios process.. */ + mp_state_enum result = STATE_UNKNOWN; + output chld_out; + output chld_err; if ((result = np_runcmd(PS_COMMAND, &chld_out, &chld_err, 0)) != 0) { result = STATE_WARNING; } + int procuid = 0; + int procpid = 0; + int procppid = 0; + int procvsz = 0; + int procrss = 0; + int proc_entries = 0; + float procpcpu = 0; + char procstat[8]; + char procprog[MAX_INPUT_BUFFER]; + char *procargs; +#ifdef PS_USES_PROCETIME + char procetime[MAX_INPUT_BUFFER]; +#endif /* PS_USES_PROCETIME */ + int pos; + int expected_cols = PS_COLS - 1; + const char *zombie = "Z"; /* count the number of matching Nagios processes... */ - for (i = 0; i < chld_out.lines; i++) { - cols = sscanf(chld_out.line[i], PS_FORMAT, PS_VARLIST); + for (size_t i = 0; i < chld_out.lines; i++) { + int cols = sscanf(chld_out.line[i], PS_FORMAT, PS_VARLIST); /* Zombie processes do not give a procprog command */ if (cols == (expected_cols - 1) && strstr(procstat, zombie)) { cols = expected_cols; @@ -146,14 +146,14 @@ int main(int argc, char **argv) { strip(procargs); /* Some ps return full pathname for command. This removes path */ - temp_string = strtok((char *)procprog, "/"); + char *temp_string = strtok((char *)procprog, "/"); while (temp_string) { strcpy(procprog, temp_string); temp_string = strtok(NULL, "/"); } /* May get empty procargs */ - if (!strstr(procargs, argv[0]) && strstr(procargs, process_string) && strcmp(procargs, "")) { + if (!strstr(procargs, argv[0]) && strstr(procargs, config.process_string) && strcmp(procargs, "")) { proc_entries++; if (verbose >= 2) { printf(_("Found process: %s %s\n"), procprog, procargs); @@ -178,8 +178,9 @@ int main(int argc, char **argv) { die(STATE_CRITICAL, "NAGIOS %s: %s\n", _("CRITICAL"), _("Cannot parse Nagios log file for valid time")); } + time_t current_time; time(¤t_time); - if ((int)(current_time - latest_entry_time) > (expire_minutes * 60)) { + if ((int)(current_time - latest_entry_time) > (config.expire_minutes * 60)) { result = STATE_WARNING; } else { result = STATE_OK; @@ -192,42 +193,45 @@ int main(int argc, char **argv) { (int)(current_time - latest_entry_time)); printf("\n"); - return result; + exit(result); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; +check_nagios_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"filename", required_argument, 0, 'F'}, {"expires", required_argument, 0, 'e'}, {"command", required_argument, 0, 'C'}, {"timeout", optional_argument, 0, 't'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0}}; + check_nagios_config_wrapper result = { + .errorcode = OK, + .config = check_nagios_config_init(), + }; if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } if (!is_option(argv[1])) { - status_log = argv[1]; + result.config.status_log = argv[1]; if (is_intnonneg(argv[2])) { - expire_minutes = atoi(argv[2]); + result.config.expire_minutes = atoi(argv[2]); } else { die(STATE_UNKNOWN, _("Expiration time must be an integer (seconds)\n")); } - process_string = argv[3]; - return OK; + result.config.process_string = argv[3]; + return result; } - while (1) { - c = getopt_long(argc, argv, "+hVvF:C:e:t:", longopts, &option); + int option = 0; + while (true) { + int option_index = getopt_long(argc, argv, "+hVvF:C:e:t:", longopts, &option); - if (c == -1 || c == EOF || c == 1) { + if (option_index == -1 || option_index == EOF || option_index == 1) { break; } - switch (c) { + switch (option_index) { case 'h': /* help */ print_help(); exit(STATE_UNKNOWN); @@ -235,14 +239,14 @@ int process_arguments(int argc, char **argv) { print_revision(progname, NP_VERSION); exit(STATE_UNKNOWN); case 'F': /* status log */ - status_log = optarg; + result.config.status_log = optarg; break; case 'C': /* command */ - process_string = optarg; + result.config.process_string = optarg; break; case 'e': /* expiry time */ if (is_intnonneg(optarg)) { - expire_minutes = atoi(optarg); + result.config.expire_minutes = atoi(optarg); } else { die(STATE_UNKNOWN, _("Expiration time must be an integer (seconds)\n")); } @@ -262,15 +266,15 @@ int process_arguments(int argc, char **argv) { } } - if (status_log == NULL) { + if (result.config.status_log == NULL) { die(STATE_UNKNOWN, _("You must provide the status_log\n")); } - if (process_string == NULL) { + if (result.config.process_string == NULL) { die(STATE_UNKNOWN, _("You must provide a process string\n")); } - return OK; + return result; } void print_help(void) { diff --git a/plugins/check_nagios.d/config.h b/plugins/check_nagios.d/config.h new file mode 100644 index 00000000..efe139f9 --- /dev/null +++ b/plugins/check_nagios.d/config.h @@ -0,0 +1,19 @@ +#pragma once + +#include "../../config.h" +#include + +typedef struct { + char *status_log; + char *process_string; + int expire_minutes; +} check_nagios_config; + +check_nagios_config check_nagios_config_init() { + check_nagios_config tmp = { + .status_log = NULL, + .process_string = NULL, + .expire_minutes = 0, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 47b484eb454b0a487f7d32406ee93f85c94f5895 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 00:36:53 +0100 Subject: Refactor check_nt --- plugins/Makefile.am | 1 + plugins/check_nt.c | 254 +++++++++++++++++++++----------------------- plugins/check_nt.d/config.h | 53 +++++++++ 3 files changed, 178 insertions(+), 130 deletions(-) create mode 100644 plugins/check_nt.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5d4449bf..097763fc 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -56,6 +56,7 @@ EXTRA_DIST = t \ check_nagios.d \ check_dbi.d \ check_ssh.d \ + check_nt.d \ check_dns.d \ check_mrtgtraf.d \ check_mysql_query.d \ diff --git a/plugins/check_nt.c b/plugins/check_nt.c index 7897558b..7dd23e5c 100644 --- a/plugins/check_nt.c +++ b/plugins/check_nt.c @@ -39,42 +39,22 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" - -enum checkvars { - CHECK_NONE, - CHECK_CLIENTVERSION, - CHECK_CPULOAD, - CHECK_UPTIME, - CHECK_USEDDISKSPACE, - CHECK_SERVICESTATE, - CHECK_PROCSTATE, - CHECK_MEMUSE, - CHECK_COUNTER, - CHECK_FILEAGE, - CHECK_INSTANCES -}; +#include "check_nt.d/config.h" enum { MAX_VALUE_LIST = 30, - PORT = 1248 }; -static char *server_address = NULL; -static int server_port = PORT; -static char *value_list = NULL; -static char *req_password = NULL; -static unsigned long lvalue_list[MAX_VALUE_LIST]; -static unsigned long warning_value = 0L; -static unsigned long critical_value = 0L; -static bool check_warning_value = false; -static bool check_critical_value = false; -static enum checkvars vars_to_check = CHECK_NONE; -static bool show_all = false; - static char recv_buffer[MAX_INPUT_BUFFER]; static void fetch_data(const char *address, int port, const char *sendb); -static int process_arguments(int /*argc*/, char ** /*argv*/); + +typedef struct { + int errorcode; + check_nt_config config; +} check_nt_config_wrapper; +static check_nt_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); + static void preparelist(char *string); static bool strtoularray(unsigned long *array, char *string, const char *delim); static void print_help(void); @@ -88,10 +68,13 @@ 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_nt_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_nt_config config = tmp_config.config; + /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -107,12 +90,13 @@ int main(int argc, char **argv) { char *description = NULL; char *counter_unit = NULL; char *errcvt = NULL; - switch (vars_to_check) { + unsigned long lvalue_list[MAX_VALUE_LIST]; + switch (config.vars_to_check) { case CHECK_CLIENTVERSION: - xasprintf(&send_buffer, "%s&1", req_password); - fetch_data(server_address, server_port, send_buffer); - if (value_list != NULL && strcmp(recv_buffer, value_list) != 0) { - xasprintf(&output_message, _("Wrong client version - running: %s, required: %s"), recv_buffer, value_list); + xasprintf(&send_buffer, "%s&1", config.req_password); + fetch_data(config.server_address, config.server_port, send_buffer); + if (config.value_list != NULL && strcmp(recv_buffer, config.value_list) != 0) { + xasprintf(&output_message, _("Wrong client version - running: %s, required: %s"), recv_buffer, config.value_list); return_code = STATE_WARNING; } else { xasprintf(&output_message, "%s", recv_buffer); @@ -120,9 +104,9 @@ int main(int argc, char **argv) { } break; case CHECK_CPULOAD: - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("missing -l parameters")); - } else if (!strtoularray(lvalue_list, value_list, ",")) { + } else if (!strtoularray(lvalue_list, config.value_list, ",")) { output_message = strdup(_("wrong -l parameter.")); } else { /* -l parameters is present with only integers */ @@ -137,8 +121,8 @@ int main(int argc, char **argv) { lvalue_list[2 + offset] > (unsigned long)0 && lvalue_list[2 + offset] <= (unsigned long)100) { /* Send request and retrieve data */ - xasprintf(&send_buffer, "%s&2&%lu", req_password, lvalue_list[0 + offset]); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&2&%lu", config.req_password, lvalue_list[0 + offset]); + fetch_data(config.server_address, config.server_port, send_buffer); unsigned long utilization = strtoul(recv_buffer, NULL, 10); @@ -165,27 +149,28 @@ int main(int argc, char **argv) { } } break; - case CHECK_UPTIME: - if (value_list == NULL) { - value_list = "minutes"; + case CHECK_UPTIME: { + char *tmp_value_list = config.value_list; + if (config.value_list == NULL) { + tmp_value_list = "minutes"; } - if (strncmp(value_list, "seconds", strlen("seconds") + 1) && strncmp(value_list, "minutes", strlen("minutes") + 1) && - strncmp(value_list, "hours", strlen("hours") + 1) && strncmp(value_list, "days", strlen("days") + 1)) { + if (strncmp(tmp_value_list, "seconds", strlen("seconds") + 1) && strncmp(tmp_value_list, "minutes", strlen("minutes") + 1) && + strncmp(config.value_list, "hours", strlen("hours") + 1) && strncmp(tmp_value_list, "days", strlen("days") + 1)) { output_message = strdup(_("wrong -l argument")); } else { - xasprintf(&send_buffer, "%s&3", req_password); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&3", config.req_password); + fetch_data(config.server_address, config.server_port, send_buffer); unsigned long uptime = strtoul(recv_buffer, NULL, 10); int updays = uptime / 86400; int uphours = (uptime % 86400) / 3600; int upminutes = ((uptime % 86400) % 3600) / 60; - if (!strncmp(value_list, "minutes", strlen("minutes"))) { + if (!strncmp(tmp_value_list, "minutes", strlen("minutes"))) { uptime = uptime / 60; - } else if (!strncmp(value_list, "hours", strlen("hours"))) { + } else if (!strncmp(tmp_value_list, "hours", strlen("hours"))) { uptime = uptime / 3600; - } else if (!strncmp(value_list, "days", strlen("days"))) { + } else if (!strncmp(tmp_value_list, "days", strlen("days"))) { uptime = uptime / 86400; } /* else uptime in seconds, nothing to do */ @@ -193,23 +178,23 @@ int main(int argc, char **argv) { xasprintf(&output_message, _("System Uptime - %u day(s) %u hour(s) %u minute(s) |uptime=%lu"), updays, uphours, upminutes, uptime); - if (check_critical_value && uptime <= critical_value) { + if (config.check_critical_value && uptime <= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && uptime <= warning_value) { + } else if (config.check_warning_value && uptime <= config.warning_value) { return_code = STATE_WARNING; } else { return_code = STATE_OK; } } - break; + } break; case CHECK_USEDDISKSPACE: - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("missing -l parameters")); - } else if (strlen(value_list) != 1) { + } else if (strlen(config.value_list) != 1) { output_message = strdup(_("wrong -l argument")); } else { - xasprintf(&send_buffer, "%s&4&%s", req_password, value_list); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&4&%s", config.req_password, config.value_list); + fetch_data(config.server_address, config.server_port, send_buffer); char *fds = strtok(recv_buffer, "&"); char *tds = strtok(NULL, "&"); double total_disk_space = 0; @@ -223,19 +208,19 @@ int main(int argc, char **argv) { if (total_disk_space > 0 && free_disk_space >= 0) { double percent_used_space = ((total_disk_space - free_disk_space) / total_disk_space) * 100; - double warning_used_space = ((float)warning_value / 100) * total_disk_space; - double critical_used_space = ((float)critical_value / 100) * total_disk_space; + double warning_used_space = ((float)config.warning_value / 100) * total_disk_space; + double critical_used_space = ((float)config.critical_value / 100) * total_disk_space; - xasprintf(&temp_string, _("%s:\\ - total: %.2f Gb - used: %.2f Gb (%.0f%%) - free %.2f Gb (%.0f%%)"), value_list, + xasprintf(&temp_string, _("%s:\\ - total: %.2f Gb - used: %.2f Gb (%.0f%%) - free %.2f Gb (%.0f%%)"), config.value_list, total_disk_space / 1073741824, (total_disk_space - free_disk_space) / 1073741824, percent_used_space, free_disk_space / 1073741824, (free_disk_space / total_disk_space) * 100); - xasprintf(&temp_string_perf, _("'%s:\\ Used Space'=%.2fGb;%.2f;%.2f;0.00;%.2f"), value_list, + xasprintf(&temp_string_perf, _("'%s:\\ Used Space'=%.2fGb;%.2f;%.2f;0.00;%.2f"), config.value_list, (total_disk_space - free_disk_space) / 1073741824, warning_used_space / 1073741824, critical_used_space / 1073741824, total_disk_space / 1073741824); - if (check_critical_value && percent_used_space >= critical_value) { + if (config.check_critical_value && percent_used_space >= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && percent_used_space >= warning_value) { + } else if (config.check_warning_value && percent_used_space >= config.warning_value) { return_code = STATE_WARNING; } else { return_code = STATE_OK; @@ -251,13 +236,13 @@ int main(int argc, char **argv) { break; case CHECK_SERVICESTATE: case CHECK_PROCSTATE: - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("No service/process specified")); } else { - preparelist(value_list); /* replace , between services with & to send the request */ - xasprintf(&send_buffer, "%s&%u&%s&%s", req_password, (vars_to_check == CHECK_SERVICESTATE) ? 5 : 6, - (show_all) ? "ShowAll" : "ShowFail", value_list); - fetch_data(server_address, server_port, send_buffer); + preparelist(config.value_list); /* replace , between services with & to send the request */ + xasprintf(&send_buffer, "%s&%u&%s&%s", config.req_password, (config.vars_to_check == CHECK_SERVICESTATE) ? 5 : 6, + (config.show_all) ? "ShowAll" : "ShowFail", config.value_list); + fetch_data(config.server_address, config.server_port, send_buffer); char *numstr = strtok(recv_buffer, "&"); if (numstr == NULL) { die(STATE_UNKNOWN, _("could not fetch information from server\n")); @@ -268,8 +253,8 @@ int main(int argc, char **argv) { } break; case CHECK_MEMUSE: - xasprintf(&send_buffer, "%s&7", req_password); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&7", config.req_password); + fetch_data(config.server_address, config.server_port, send_buffer); char *numstr = strtok(recv_buffer, "&"); if (numstr == NULL) { die(STATE_UNKNOWN, _("could not fetch information from server\n")); @@ -281,8 +266,8 @@ int main(int argc, char **argv) { } double mem_commitByte = atof(numstr); double percent_used_space = (mem_commitByte / mem_commitLimit) * 100; - double warning_used_space = ((float)warning_value / 100) * mem_commitLimit; - double critical_used_space = ((float)critical_value / 100) * mem_commitLimit; + double warning_used_space = ((float)config.warning_value / 100) * mem_commitLimit; + double critical_used_space = ((float)config.critical_value / 100) * mem_commitLimit; /* Divisor should be 1048567, not 3044515, as we are measuring "Commit Charge" here, which equals RAM + Pagefiles. */ @@ -293,14 +278,14 @@ int main(int argc, char **argv) { critical_used_space / 1048567, mem_commitLimit / 1048567); return_code = STATE_OK; - if (check_critical_value && percent_used_space >= critical_value) { + if (config.check_critical_value && percent_used_space >= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && percent_used_space >= warning_value) { + } else if (config.check_warning_value && percent_used_space >= config.warning_value) { return_code = STATE_WARNING; } break; - case CHECK_COUNTER: + case CHECK_COUNTER: { /* CHECK_COUNTER has been modified to provide extensive perfdata information. In order to do this, some modifications have been done to the code @@ -323,17 +308,17 @@ int main(int argc, char **argv) { */ double counter_value = 0.0; - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("No counter specified")); } else { - preparelist(value_list); /* replace , between services with & to send the request */ - bool isPercent = (strchr(value_list, '%') != NULL); + preparelist(config.value_list); /* replace , between services with & to send the request */ + bool isPercent = (strchr(config.value_list, '%') != NULL); - strtok(value_list, "&"); /* burn the first parameters */ + strtok(config.value_list, "&"); /* burn the first parameters */ description = strtok(NULL, "&"); counter_unit = strtok(NULL, "&"); - xasprintf(&send_buffer, "%s&8&%s", req_password, value_list); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&8&%s", config.req_password, config.value_list); + fetch_data(config.server_address, config.server_port, send_buffer); counter_value = atof(recv_buffer); bool allRight = false; @@ -380,52 +365,51 @@ int main(int argc, char **argv) { } xasprintf(&output_message, "%s |", output_message); xasprintf(&output_message, "%s %s", output_message, - fperfdata(description, counter_value, counter_unit, 1, warning_value, 1, critical_value, + fperfdata(description, counter_value, counter_unit, 1, config.warning_value, 1, config.critical_value, (!(isPercent) && (minval != NULL)), fminval, (!(isPercent) && (minval != NULL)), fmaxval)); } } - if (critical_value > warning_value) { /* Normal thresholds */ - if (check_critical_value && counter_value >= critical_value) { + if (config.critical_value > config.warning_value) { /* Normal thresholds */ + if (config.check_critical_value && counter_value >= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && counter_value >= warning_value) { + } else if (config.check_warning_value && counter_value >= config.warning_value) { return_code = STATE_WARNING; } else { return_code = STATE_OK; } } else { /* inverse thresholds */ return_code = STATE_OK; - if (check_critical_value && counter_value <= critical_value) { + if (config.check_critical_value && counter_value <= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && counter_value <= warning_value) { + } else if (config.check_warning_value && counter_value <= config.warning_value) { return_code = STATE_WARNING; } } - break; - + } break; case CHECK_FILEAGE: - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("No counter specified")); } else { - preparelist(value_list); /* replace , between services with & to send the request */ - xasprintf(&send_buffer, "%s&9&%s", req_password, value_list); - fetch_data(server_address, server_port, send_buffer); + preparelist(config.value_list); /* replace , between services with & to send the request */ + xasprintf(&send_buffer, "%s&9&%s", config.req_password, config.value_list); + fetch_data(config.server_address, config.server_port, send_buffer); unsigned long age_in_minutes = atoi(strtok(recv_buffer, "&")); description = strtok(NULL, "&"); output_message = strdup(description); - if (critical_value > warning_value) { /* Normal thresholds */ - if (check_critical_value && age_in_minutes >= critical_value) { + if (config.critical_value > config.warning_value) { /* Normal thresholds */ + if (config.check_critical_value && age_in_minutes >= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && age_in_minutes >= warning_value) { + } else if (config.check_warning_value && age_in_minutes >= config.warning_value) { return_code = STATE_WARNING; } else { return_code = STATE_OK; } } else { /* inverse thresholds */ - if (check_critical_value && age_in_minutes <= critical_value) { + if (config.check_critical_value && age_in_minutes <= config.critical_value) { return_code = STATE_CRITICAL; - } else if (check_warning_value && age_in_minutes <= warning_value) { + } else if (config.check_warning_value && age_in_minutes <= config.warning_value) { return_code = STATE_WARNING; } else { return_code = STATE_OK; @@ -435,11 +419,11 @@ int main(int argc, char **argv) { break; case CHECK_INSTANCES: - if (value_list == NULL) { + if (config.value_list == NULL) { output_message = strdup(_("No counter specified")); } else { - xasprintf(&send_buffer, "%s&10&%s", req_password, value_list); - fetch_data(server_address, server_port, send_buffer); + xasprintf(&send_buffer, "%s&10&%s", config.req_password, config.value_list); + fetch_data(config.server_address, config.server_port, send_buffer); if (!strncmp(recv_buffer, "ERROR", 5)) { printf("NSClient - %s\n", recv_buffer); exit(STATE_UNKNOWN); @@ -467,7 +451,7 @@ int main(int argc, char **argv) { } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_nt_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"port", required_argument, 0, 'p'}, {"timeout", required_argument, 0, 't'}, {"critical", required_argument, 0, 'c'}, @@ -482,14 +466,20 @@ int process_arguments(int argc, char **argv) { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_nt_config_wrapper result = { + .errorcode = OK, + .config = check_nt_config_init(), + }; + /* no options were supplied */ if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } /* backwards compatibility */ if (!is_option(argv[1])) { - server_address = strdup(argv[1]); + result.config.server_address = strdup(argv[1]); argv[1] = argv[0]; argv = &argv[1]; argc--; @@ -523,60 +513,62 @@ int process_arguments(int argc, char **argv) { print_revision(progname, NP_VERSION); exit(STATE_UNKNOWN); case 'H': /* hostname */ - server_address = optarg; + result.config.server_address = optarg; break; case 's': /* password */ - req_password = optarg; + result.config.req_password = optarg; break; case 'p': /* port */ if (is_intnonneg(optarg)) { - server_port = atoi(optarg); + result.config.server_port = atoi(optarg); } else { die(STATE_UNKNOWN, _("Server port must be an integer\n")); } break; case 'v': if (strlen(optarg) < 4) { - return ERROR; + result.errorcode = ERROR; + return result; } if (!strcmp(optarg, "CLIENTVERSION")) { - vars_to_check = CHECK_CLIENTVERSION; + result.config.vars_to_check = CHECK_CLIENTVERSION; } else if (!strcmp(optarg, "CPULOAD")) { - vars_to_check = CHECK_CPULOAD; + result.config.vars_to_check = CHECK_CPULOAD; } else if (!strcmp(optarg, "UPTIME")) { - vars_to_check = CHECK_UPTIME; + result.config.vars_to_check = CHECK_UPTIME; } else if (!strcmp(optarg, "USEDDISKSPACE")) { - vars_to_check = CHECK_USEDDISKSPACE; + result.config.vars_to_check = CHECK_USEDDISKSPACE; } else if (!strcmp(optarg, "SERVICESTATE")) { - vars_to_check = CHECK_SERVICESTATE; + result.config.vars_to_check = CHECK_SERVICESTATE; } else if (!strcmp(optarg, "PROCSTATE")) { - vars_to_check = CHECK_PROCSTATE; + result.config.vars_to_check = CHECK_PROCSTATE; } else if (!strcmp(optarg, "MEMUSE")) { - vars_to_check = CHECK_MEMUSE; + result.config.vars_to_check = CHECK_MEMUSE; } else if (!strcmp(optarg, "COUNTER")) { - vars_to_check = CHECK_COUNTER; + result.config.vars_to_check = CHECK_COUNTER; } else if (!strcmp(optarg, "FILEAGE")) { - vars_to_check = CHECK_FILEAGE; + result.config.vars_to_check = CHECK_FILEAGE; } else if (!strcmp(optarg, "INSTANCES")) { - vars_to_check = CHECK_INSTANCES; + result.config.vars_to_check = CHECK_INSTANCES; } else { - return ERROR; + result.errorcode = ERROR; + return result; } break; case 'l': /* value list */ - value_list = optarg; + result.config.value_list = optarg; break; case 'w': /* warning threshold */ - warning_value = strtoul(optarg, NULL, 10); - check_warning_value = true; + result.config.warning_value = strtoul(optarg, NULL, 10); + result.config.check_warning_value = true; break; case 'c': /* critical threshold */ - critical_value = strtoul(optarg, NULL, 10); - check_critical_value = true; + result.config.critical_value = strtoul(optarg, NULL, 10); + result.config.check_critical_value = true; break; case 'd': /* Display select for services */ if (!strcmp(optarg, "SHOWALL")) { - show_all = true; + result.config.show_all = true; } break; case 'u': @@ -585,23 +577,25 @@ int process_arguments(int argc, char **argv) { case 't': /* timeout */ socket_timeout = atoi(optarg); if (socket_timeout <= 0) { - return ERROR; + result.errorcode = ERROR; + return result; } } } - if (server_address == NULL) { + if (result.config.server_address == NULL) { usage4(_("You must provide a server address or host name")); } - if (vars_to_check == CHECK_NONE) { - return ERROR; + if (result.config.vars_to_check == CHECK_NONE) { + result.errorcode = ERROR; + return result; } - if (req_password == NULL) { - req_password = strdup(_("None")); + if (result.config.req_password == NULL) { + result.config.req_password = strdup(_("None")); } - return OK; + return result; } void fetch_data(const char *address, int port, const char *sendb) { diff --git a/plugins/check_nt.d/config.h b/plugins/check_nt.d/config.h new file mode 100644 index 00000000..431889cb --- /dev/null +++ b/plugins/check_nt.d/config.h @@ -0,0 +1,53 @@ +#pragma once + +#include "../../config.h" +#include + +enum { + PORT = 1248, +}; + +enum checkvars { + CHECK_NONE, + CHECK_CLIENTVERSION, + CHECK_CPULOAD, + CHECK_UPTIME, + CHECK_USEDDISKSPACE, + CHECK_SERVICESTATE, + CHECK_PROCSTATE, + CHECK_MEMUSE, + CHECK_COUNTER, + CHECK_FILEAGE, + CHECK_INSTANCES +}; + +typedef struct { + char *server_address; + int server_port; + char *req_password; + enum checkvars vars_to_check; + bool show_all; + char *value_list; + bool check_warning_value; + unsigned long warning_value; + bool check_critical_value; + unsigned long critical_value; +} check_nt_config; + +check_nt_config check_nt_config_init() { + check_nt_config tmp = { + .server_address = NULL, + .server_port = PORT, + .req_password = NULL, + + .vars_to_check = CHECK_NONE, + .show_all = false, + .value_list = NULL, + + .check_warning_value = false, + .warning_value = 0, + .check_critical_value = false, + .critical_value = 0, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 8b2222e8b704fc451093996e906c07a6a8e3538a Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 01:00:48 +0100 Subject: Refactor check_ntp_peer --- plugins/Makefile.am | 1 + plugins/check_ntp_peer.c | 139 ++++++++++++++++++++------------------ plugins/check_ntp_peer.d/config.h | 54 +++++++++++++++ 3 files changed, 127 insertions(+), 67 deletions(-) create mode 100644 plugins/check_ntp_peer.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5d4449bf..a294cfef 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -60,6 +60,7 @@ EXTRA_DIST = t \ check_mrtgtraf.d \ check_mysql_query.d \ check_mrtg.d \ + check_ntp_peer.d \ check_apt.d \ check_by_ssh.d \ check_smtp.d \ diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c index 35abdf10..6979d275 100644 --- a/plugins/check_ntp_peer.c +++ b/plugins/check_ntp_peer.c @@ -35,6 +35,7 @@ * *****************************************************************************/ +#include "states.h" const char *progname = "check_ntp_peer"; const char *copyright = "2006-2024"; const char *email = "devel@monitoring-plugins.org"; @@ -42,26 +43,17 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" +#include "check_ntp_peer.d/config.h" -static char *server_address = NULL; -static int port = 123; static int verbose = 0; -static bool quiet = false; -static char *owarn = "60"; -static char *ocrit = "120"; -static bool do_stratum = false; -static char *swarn = "-1:16"; -static char *scrit = "-1:16"; -static bool do_jitter = false; -static char *jwarn = "-1:5000"; -static char *jcrit = "-1:10000"; -static bool do_truechimers = false; -static char *twarn = "0:"; -static char *tcrit = "0:"; static bool syncsource_found = false; static bool li_alarm = false; -static int process_arguments(int /*argc*/, char ** /*argv*/); +typedef struct { + int errorcode; + check_ntp_peer_config config; +} check_ntp_peer_config_wrapper; +static check_ntp_peer_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static thresholds *offset_thresholds = NULL; static thresholds *jitter_thresholds = NULL; static thresholds *stratum_thresholds = NULL; @@ -211,7 +203,8 @@ void setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq) * status is pretty much useless as syncsource_found is a global variable * used later in main to check is the server was synchronized. It works * so I left it alone */ -int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers) { +mp_state_enum ntp_request(double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers, + const check_ntp_peer_config config) { *offset_result = STATE_UNKNOWN; *jitter = *stratum = -1; *num_truechimers = 0; @@ -240,7 +233,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum int peers_size = 0; int npeers = 0; int conn = -1; - my_udp_connect(server_address, port, &conn); + my_udp_connect(config.server_address, config.port, &conn); /* keep sending requests until the server stops setting the * REM_MORE bit, though usually this is only 1 packet. */ @@ -412,7 +405,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum } } - if (do_jitter) { + if (config.do_jitter) { /* get the jitter */ if (verbose) { printf("parsing %s from peer %.2x: ", strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter", @@ -435,7 +428,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum } } - if (do_stratum) { + if (config.do_stratum) { /* get the stratum */ if (verbose) { printf("parsing stratum from peer %.2x: ", ntohs(peers[i].assoc)); @@ -468,7 +461,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum return status; } -int process_arguments(int argc, char **argv) { +check_ntp_peer_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = { {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, {"use-ipv4", no_argument, 0, '4'}, {"use-ipv6", no_argument, 0, '6'}, {"quiet", no_argument, 0, 'q'}, @@ -481,6 +474,11 @@ int process_arguments(int argc, char **argv) { usage("\n"); } + check_ntp_peer_config_wrapper result = { + .errorcode = OK, + .config = check_ntp_peer_config_init(), + }; + while (true) { int option = 0; int option_char = getopt_long(argc, argv, "Vhv46qw:c:W:C:j:k:m:n:t:H:p:", longopts, &option); @@ -501,46 +499,46 @@ int process_arguments(int argc, char **argv) { verbose++; break; case 'q': - quiet = true; + result.config.quiet = true; break; case 'w': - owarn = optarg; + result.config.owarn = optarg; break; case 'c': - ocrit = optarg; + result.config.ocrit = optarg; break; case 'W': - do_stratum = true; - swarn = optarg; + result.config.do_stratum = true; + result.config.swarn = optarg; break; case 'C': - do_stratum = true; - scrit = optarg; + result.config.do_stratum = true; + result.config.scrit = optarg; break; case 'j': - do_jitter = true; - jwarn = optarg; + result.config.do_jitter = true; + result.config.jwarn = optarg; break; case 'k': - do_jitter = true; - jcrit = optarg; + result.config.do_jitter = true; + result.config.jcrit = optarg; break; case 'm': - do_truechimers = true; - twarn = optarg; + result.config.do_truechimers = true; + result.config.twarn = optarg; break; case 'n': - do_truechimers = true; - tcrit = optarg; + result.config.do_truechimers = true; + result.config.tcrit = optarg; break; case 'H': if (!is_host(optarg)) { usage2(_("Invalid hostname/address"), optarg); } - server_address = strdup(optarg); + result.config.server_address = strdup(optarg); break; case 'p': - port = atoi(optarg); + result.config.port = atoi(optarg); break; case 't': socket_timeout = atoi(optarg); @@ -562,11 +560,11 @@ int process_arguments(int argc, char **argv) { } } - if (server_address == NULL) { + if (result.config.server_address == NULL) { usage4(_("Hostname was not supplied")); } - return 0; + return result; } char *perfd_offset(double offset) { @@ -574,17 +572,17 @@ char *perfd_offset(double offset) { 0); } -char *perfd_jitter(double jitter) { +char *perfd_jitter(double jitter, bool do_jitter) { return fperfdata("jitter", jitter, "", do_jitter, jitter_thresholds->warning->end, do_jitter, jitter_thresholds->critical->end, true, 0, false, 0); } -char *perfd_stratum(int stratum) { +char *perfd_stratum(int stratum, bool do_stratum) { return perfdata("stratum", stratum, "", do_stratum, (int)stratum_thresholds->warning->end, do_stratum, (int)stratum_thresholds->critical->end, true, 0, true, 16); } -char *perfd_truechimers(int num_truechimers) { +char *perfd_truechimers(int num_truechimers, const bool do_truechimers) { return perfdata("truechimers", num_truechimers, "", do_truechimers, (int)truechimer_thresholds->warning->end, do_truechimers, (int)truechimer_thresholds->critical->end, true, 0, false, 0); } @@ -597,14 +595,18 @@ 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_ntp_peer_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } - set_thresholds(&offset_thresholds, owarn, ocrit); - set_thresholds(&jitter_thresholds, jwarn, jcrit); - set_thresholds(&stratum_thresholds, swarn, scrit); - set_thresholds(&truechimer_thresholds, twarn, tcrit); + const check_ntp_peer_config config = tmp_config.config; + + set_thresholds(&offset_thresholds, config.owarn, config.ocrit); + set_thresholds(&jitter_thresholds, config.jwarn, config.jcrit); + set_thresholds(&stratum_thresholds, config.swarn, config.scrit); + set_thresholds(&truechimer_thresholds, config.twarn, config.tcrit); /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -618,38 +620,37 @@ int main(int argc, char *argv[]) { double offset = 0; double jitter = 0; /* This returns either OK or WARNING (See comment preceding ntp_request) */ - int result = ntp_request(&offset, &offset_result, &jitter, &stratum, &num_truechimers); + mp_state_enum result = ntp_request(&offset, &offset_result, &jitter, &stratum, &num_truechimers, config); if (offset_result == STATE_UNKNOWN) { /* if there's no sync peer (this overrides ntp_request output): */ - result = (quiet ? STATE_UNKNOWN : STATE_CRITICAL); + result = (config.quiet ? STATE_UNKNOWN : STATE_CRITICAL); } else { /* Be quiet if there's no candidates either */ - if (quiet && result == STATE_WARNING) { + if (config.quiet && result == STATE_WARNING) { result = STATE_UNKNOWN; } result = max_state_alt(result, get_status(fabs(offset), offset_thresholds)); } - int oresult = result; - - int tresult = STATE_UNKNOWN; + mp_state_enum oresult = result; + mp_state_enum tresult = STATE_UNKNOWN; - if (do_truechimers) { + if (config.do_truechimers) { tresult = get_status(num_truechimers, truechimer_thresholds); result = max_state_alt(result, tresult); } - int sresult = STATE_UNKNOWN; + mp_state_enum sresult = STATE_UNKNOWN; - if (do_stratum) { + if (config.do_stratum) { sresult = get_status(stratum, stratum_thresholds); result = max_state_alt(result, sresult); } - int jresult = STATE_UNKNOWN; + mp_state_enum jresult = STATE_UNKNOWN; - if (do_jitter) { + if (config.do_jitter) { jresult = get_status(jitter, jitter_thresholds); result = max_state_alt(result, jresult); } @@ -669,6 +670,7 @@ int main(int argc, char *argv[]) { xasprintf(&result_line, _("NTP UNKNOWN:")); break; } + if (!syncsource_found) { xasprintf(&result_line, "%s %s,", result_line, _("Server not synchronized")); } else if (li_alarm) { @@ -688,7 +690,7 @@ int main(int argc, char *argv[]) { } xasprintf(&perfdata_line, "%s", perfd_offset(offset)); - if (do_jitter) { + if (config.do_jitter) { if (jresult == STATE_WARNING) { xasprintf(&result_line, "%s, jitter=%f (WARNING)", result_line, jitter); } else if (jresult == STATE_CRITICAL) { @@ -696,9 +698,10 @@ int main(int argc, char *argv[]) { } else { xasprintf(&result_line, "%s, jitter=%f", result_line, jitter); } - xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_jitter(jitter)); + xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_jitter(jitter, config.do_jitter)); } - if (do_stratum) { + + if (config.do_stratum) { if (sresult == STATE_WARNING) { xasprintf(&result_line, "%s, stratum=%i (WARNING)", result_line, stratum); } else if (sresult == STATE_CRITICAL) { @@ -706,9 +709,10 @@ int main(int argc, char *argv[]) { } else { xasprintf(&result_line, "%s, stratum=%i", result_line, stratum); } - xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_stratum(stratum)); + xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_stratum(stratum, config.do_stratum)); } - if (do_truechimers) { + + if (config.do_truechimers) { if (tresult == STATE_WARNING) { xasprintf(&result_line, "%s, truechimers=%i (WARNING)", result_line, num_truechimers); } else if (tresult == STATE_CRITICAL) { @@ -716,14 +720,15 @@ int main(int argc, char *argv[]) { } else { xasprintf(&result_line, "%s, truechimers=%i", result_line, num_truechimers); } - xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_truechimers(num_truechimers)); + xasprintf(&perfdata_line, "%s %s", perfdata_line, perfd_truechimers(num_truechimers, config.do_truechimers)); } printf("%s|%s\n", result_line, perfdata_line); - if (server_address != NULL) { - free(server_address); + if (config.server_address != NULL) { + free(config.server_address); } - return result; + + exit(result); } void print_help(void) { diff --git a/plugins/check_ntp_peer.d/config.h b/plugins/check_ntp_peer.d/config.h new file mode 100644 index 00000000..1907af7c --- /dev/null +++ b/plugins/check_ntp_peer.d/config.h @@ -0,0 +1,54 @@ +#pragma once + +#include "../../config.h" +#include + +enum { + DEFAULT_NTP_PORT = 123, +}; + +typedef struct { + char *server_address; + int port; + + bool quiet; + + // truechimer stuff + bool do_truechimers; + char *twarn; + char *tcrit; + + char *owarn; + char *ocrit; + + // stratum stuff + bool do_stratum; + char *swarn; + char *scrit; + + // jitter stuff + bool do_jitter; + char *jwarn; + char *jcrit; +} check_ntp_peer_config; + +check_ntp_peer_config check_ntp_peer_config_init() { + check_ntp_peer_config tmp = { + .server_address = NULL, + .port = DEFAULT_NTP_PORT, + + .quiet = false, + .do_truechimers = false, + .twarn = "0:", + .tcrit = "0:", + .owarn = "60", + .ocrit = "120", + .do_stratum = false, + .swarn = "-1:16", + .scrit = "-1:16", + .do_jitter = false, + .jwarn = "-1:5000", + .jcrit = "-1:10000", + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 9ea0bf23df484cdb223595e02211aa9145dffb34 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 01:41:48 +0100 Subject: Refactor check_ntp_time --- plugins/Makefile.am | 1 + plugins/check_ntp_time.c | 68 +++++++++++++++++++++++---------------- plugins/check_ntp_time.d/config.h | 28 ++++++++++++++++ 3 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 plugins/check_ntp_time.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5d4449bf..bb117881 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -64,6 +64,7 @@ EXTRA_DIST = t \ check_by_ssh.d \ check_smtp.d \ check_mysql.d \ + check_ntp_time.d \ check_dig.d \ check_cluster.d \ check_fping.d diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c index c757bc08..31162883 100644 --- a/plugins/check_ntp_time.c +++ b/plugins/check_ntp_time.c @@ -42,17 +42,17 @@ const char *email = "devel@monitoring-plugins.org"; #include "netutils.h" #include "utils.h" #include "states.h" +#include "thresholds.h" +#include "check_ntp_time.d/config.h" -static char *server_address = NULL; -static char *port = "123"; static int verbose = 0; -static bool quiet = false; -static char *owarn = "60"; -static char *ocrit = "120"; -static int time_offset = 0; -static int process_arguments(int /*argc*/, char ** /*argv*/); -static thresholds *offset_thresholds = NULL; +typedef struct { + int errorcode; + check_ntp_time_config config; +} check_ntp_time_config_wrapper; +static check_ntp_time_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); + static void print_help(void); void print_usage(void); @@ -321,7 +321,7 @@ int best_offset_server(const ntp_server_results *slist, int nservers) { * we don't waste time sitting around waiting for single packets. * - we also "manually" handle resolving host names and connecting, because * we have to do it in a way that our lazy macros don't handle currently :( */ -double offset_request(const char *host, mp_state_enum *status) { +double offset_request(const char *host, const char *port, mp_state_enum *status, int time_offset) { /* setup hints to only return results from getaddrinfo that we'd like */ struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); @@ -392,7 +392,7 @@ double offset_request(const char *host, mp_state_enum *status) { time_t start_ts = 0; time_t now_time = 0; now_time = start_ts = time(NULL); - int servers_completed = 0; + size_t servers_completed = 0; bool one_read = false; while (servers_completed < num_hosts && now_time - start_ts <= socket_timeout / 2) { /* loop through each server and find each one which hasn't @@ -401,13 +401,13 @@ double offset_request(const char *host, mp_state_enum *status) { * and update the "waiting" timestamp with the current time. */ now_time = time(NULL); - for (int i = 0; i < num_hosts; i++) { + for (size_t i = 0; i < num_hosts; i++) { if (servers[i].waiting < now_time && servers[i].num_responses < AVG_NUM) { if (verbose && servers[i].waiting != 0) { printf("re-"); } if (verbose) { - printf("sending request to peer %d\n", i); + printf("sending request to peer %zu\n", i); } setup_request(&req[i]); write(socklist[i], &req[i], sizeof(ntp_message)); @@ -488,7 +488,7 @@ double offset_request(const char *host, mp_state_enum *status) { return avg_offset; } -int process_arguments(int argc, char **argv) { +check_ntp_time_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, @@ -507,6 +507,14 @@ int process_arguments(int argc, char **argv) { usage("\n"); } + check_ntp_time_config_wrapper result = { + .errorcode = OK, + .config = check_ntp_time_config_init(), + }; + + char *owarn = "60"; + char *ocrit = "120"; + while (true) { int option = 0; int option_char = getopt_long(argc, argv, "Vhv46qw:c:t:H:p:o:", longopts, &option); @@ -527,7 +535,7 @@ int process_arguments(int argc, char **argv) { verbose++; break; case 'q': - quiet = true; + result.config.quiet = true; break; case 'w': owarn = optarg; @@ -539,16 +547,16 @@ int process_arguments(int argc, char **argv) { if (!is_host(optarg)) { usage2(_("Invalid hostname/address"), optarg); } - server_address = strdup(optarg); + result.config.server_address = strdup(optarg); break; case 'p': - port = strdup(optarg); + result.config.port = strdup(optarg); break; case 't': socket_timeout = atoi(optarg); break; case 'o': - time_offset = atoi(optarg); + result.config.time_offset = atoi(optarg); break; case '4': address_family = AF_INET; @@ -567,14 +575,16 @@ int process_arguments(int argc, char **argv) { } } - if (server_address == NULL) { + if (result.config.server_address == NULL) { usage4(_("Hostname was not supplied")); } - return 0; + set_thresholds(&result.config.offset_thresholds, owarn, ocrit); + + return result; } -char *perfd_offset(double offset) { +char *perfd_offset(double offset, thresholds *offset_thresholds) { return fperfdata("offset", offset, "s", true, offset_thresholds->warning->end, true, offset_thresholds->critical->end, false, 0, false, 0); } @@ -587,11 +597,13 @@ 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_ntp_time_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } - set_thresholds(&offset_thresholds, owarn, ocrit); + const check_ntp_time_config config = tmp_config.config; /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -601,11 +613,11 @@ int main(int argc, char *argv[]) { mp_state_enum offset_result = STATE_OK; mp_state_enum result = STATE_OK; - double offset = offset_request(server_address, &offset_result); + double offset = offset_request(config.server_address, config.port, &offset_result, config.time_offset); if (offset_result == STATE_UNKNOWN) { - result = ((!quiet) ? STATE_UNKNOWN : STATE_CRITICAL); + result = ((!config.quiet) ? STATE_UNKNOWN : STATE_CRITICAL); } else { - result = get_status(fabs(offset), offset_thresholds); + result = get_status(fabs(offset), config.offset_thresholds); } char *result_line; @@ -630,12 +642,12 @@ int main(int argc, char *argv[]) { xasprintf(&perfdata_line, ""); } else { xasprintf(&result_line, "%s %s %.10g secs", result_line, _("Offset"), offset); - xasprintf(&perfdata_line, "%s", perfd_offset(offset)); + xasprintf(&perfdata_line, "%s", perfd_offset(offset, config.offset_thresholds)); } printf("%s|%s\n", result_line, perfdata_line); - if (server_address != NULL) { - free(server_address); + if (config.server_address != NULL) { + free(config.server_address); } exit(result); } diff --git a/plugins/check_ntp_time.d/config.h b/plugins/check_ntp_time.d/config.h new file mode 100644 index 00000000..99dabbbd --- /dev/null +++ b/plugins/check_ntp_time.d/config.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../../config.h" +#include "thresholds.h" +#include + +typedef struct { + char *server_address; + char *port; + + bool quiet; + int time_offset; + + thresholds *offset_thresholds; +} check_ntp_time_config; + +check_ntp_time_config check_ntp_time_config_init() { + check_ntp_time_config tmp = { + .server_address = NULL, + .port = "123", + + .quiet = false, + .time_offset = 0, + + .offset_thresholds = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From de392a81ede00fef1c25e220ee253d487453f6cd Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 02:16:41 +0100 Subject: Refactor check_pgsql --- plugins/Makefile.am | 1 + plugins/check_pgsql.c | 143 +++++++++++++++++++---------------------- plugins/check_pgsql.d/config.h | 61 ++++++++++++++++++ 3 files changed, 128 insertions(+), 77 deletions(-) create mode 100644 plugins/check_pgsql.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5d4449bf..6ee121ba 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -61,6 +61,7 @@ EXTRA_DIST = t \ check_mysql_query.d \ check_mrtg.d \ check_apt.d \ + check_pgsql.d \ check_by_ssh.d \ check_smtp.d \ check_mysql.d \ diff --git a/plugins/check_pgsql.c b/plugins/check_pgsql.c index 0c0ef415..84305adb 100644 --- a/plugins/check_pgsql.c +++ b/plugins/check_pgsql.c @@ -28,6 +28,7 @@ * *****************************************************************************/ +#include "states.h" const char *progname = "check_pgsql"; const char *copyright = "1999-2024"; const char *email = "devel@monitoring-plugins.org"; @@ -35,12 +36,13 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "utils.h" #include "utils_cmd.h" +#include "check_pgsql.d/config.h" +#include "thresholds.h" #include "netutils.h" #include #include -#define DEFAULT_DB "template1" #define DEFAULT_HOST "127.0.0.1" /* return the PSQL server version as a 3-tuple */ @@ -53,33 +55,18 @@ const char *email = "devel@monitoring-plugins.org"; #define PSQL_SOCKET3(host, port) \ ((NULL == (host)) || ('\0' == *(host))) ? DEFAULT_PGSOCKET_DIR : host, PSQL_IS_UNIX_DOMAIN_SOCKET(host) ? "/.s.PGSQL." : ":", port -enum { - DEFAULT_PORT = 5432, - DEFAULT_WARN = 2, - DEFAULT_CRIT = 8 -}; +typedef struct { + int errorcode; + check_pgsql_config config; +} check_pgsql_config_wrapper; +static check_pgsql_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); -static int process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); static bool is_pg_logname(char * /*username*/); -static int do_query(PGconn * /*conn*/, char * /*query*/); +static mp_state_enum do_query(PGconn * /*conn*/, char * /*query*/, const char /*pgqueryname*/[], thresholds * /*qthresholds*/, + char * /*query_warning*/, char * /*query_critical*/); void print_usage(void); -static char *pghost = NULL; /* host name of the backend server */ -static char *pgport = NULL; /* port of the backend server */ -static char *pgoptions = NULL; -static char *pgtty = NULL; -static char dbName[NAMEDATALEN] = DEFAULT_DB; -static char *pguser = NULL; -static char *pgpasswd = NULL; -static char *pgparams = NULL; -static double twarn = (double)DEFAULT_WARN; -static double tcrit = (double)DEFAULT_CRIT; -static char *pgquery = NULL; -static char *pgqueryname = NULL; -static char *query_warning = NULL; -static char *query_critical = NULL; -static thresholds *qthresholds = NULL; static int verbose = 0; #define OPTID_QUERYNAME -1000 @@ -139,20 +126,16 @@ int main(int argc, char **argv) { bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - /* begin, by setting the parameters for a backend connection if the - * parameters are null, then the system will try to use reasonable - * defaults by looking up environment variables or, failing that, - * using hardwired constants */ - - pgoptions = NULL; /* special options to start up the backend server */ - pgtty = NULL; /* debugging tty for the backend server */ - /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - if (process_arguments(argc, argv) == ERROR) { + check_pgsql_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + + const check_pgsql_config config = tmp_config.config; + if (verbose > 2) { printf("Arguments initialized\n"); } @@ -164,31 +147,31 @@ int main(int argc, char **argv) { alarm(timeout_interval); char *conninfo = NULL; - if (pgparams) { - asprintf(&conninfo, "%s ", pgparams); + if (config.pgparams) { + asprintf(&conninfo, "%s ", config.pgparams); } - asprintf(&conninfo, "%sdbname = '%s'", conninfo ? conninfo : "", dbName); - if (pghost) { - asprintf(&conninfo, "%s host = '%s'", conninfo, pghost); + asprintf(&conninfo, "%sdbname = '%s'", conninfo ? conninfo : "", config.dbName); + if (config.pghost) { + asprintf(&conninfo, "%s host = '%s'", conninfo, config.pghost); } - if (pgport) { - asprintf(&conninfo, "%s port = '%s'", conninfo, pgport); + if (config.pgport) { + asprintf(&conninfo, "%s port = '%s'", conninfo, config.pgport); } - if (pgoptions) { - asprintf(&conninfo, "%s options = '%s'", conninfo, pgoptions); + if (config.pgoptions) { + asprintf(&conninfo, "%s options = '%s'", conninfo, config.pgoptions); } /* if (pgtty) -- ignored by PQconnectdb */ - if (pguser) { - asprintf(&conninfo, "%s user = '%s'", conninfo, pguser); + if (config.pguser) { + asprintf(&conninfo, "%s user = '%s'", conninfo, config.pguser); } if (verbose) { /* do not include password (see right below) in output */ - printf("Connecting to PostgreSQL using conninfo: %s%s\n", conninfo, pgpasswd ? " password = " : ""); + printf("Connecting to PostgreSQL using conninfo: %s%s\n", conninfo, config.pgpasswd ? " password = " : ""); } - if (pgpasswd) { - asprintf(&conninfo, "%s password = '%s'", conninfo, pgpasswd); + if (config.pgpasswd) { + asprintf(&conninfo, "%s password = '%s'", conninfo, config.pgpasswd); } /* make a connection to the database */ @@ -203,7 +186,7 @@ int main(int argc, char **argv) { end_timeval.tv_usec += 1000000; } double elapsed_time = - (double)(end_timeval.tv_sec - start_timeval.tv_sec) + (double)(end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0; + (double)(end_timeval.tv_sec - start_timeval.tv_sec) + ((double)(end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0); if (verbose) { printf("Time elapsed: %f\n", elapsed_time); @@ -214,15 +197,15 @@ int main(int argc, char **argv) { printf("Verifying connection\n"); } if (PQstatus(conn) == CONNECTION_BAD) { - printf(_("CRITICAL - no connection to '%s' (%s).\n"), dbName, PQerrorMessage(conn)); + printf(_("CRITICAL - no connection to '%s' (%s).\n"), config.dbName, PQerrorMessage(conn)); PQfinish(conn); return STATE_CRITICAL; } - int status = STATE_UNKNOWN; - if (elapsed_time > tcrit) { + mp_state_enum status = STATE_UNKNOWN; + if (elapsed_time > config.tcrit) { status = STATE_CRITICAL; - } else if (elapsed_time > twarn) { + } else if (elapsed_time > config.twarn) { status = STATE_WARNING; } else { status = STATE_OK; @@ -239,23 +222,23 @@ int main(int argc, char **argv) { PQprotocolVersion(conn), PQbackendPID(conn)); } - printf(_(" %s - database %s (%f sec.)|%s\n"), state_text(status), dbName, elapsed_time, - fperfdata("time", elapsed_time, "s", !!(twarn > 0.0), twarn, !!(tcrit > 0.0), tcrit, true, 0, false, 0)); + printf(_(" %s - database %s (%f sec.)|%s\n"), state_text(status), config.dbName, elapsed_time, + fperfdata("time", elapsed_time, "s", (config.twarn > 0.0), config.twarn, (config.tcrit > 0.0), config.tcrit, true, 0, false, 0)); - int query_status = STATE_UNKNOWN; - if (pgquery) { - query_status = do_query(conn, pgquery); + mp_state_enum query_status = STATE_UNKNOWN; + if (config.pgquery) { + query_status = do_query(conn, config.pgquery, config.pgqueryname, config.qthresholds, config.query_warning, config.query_critical); } if (verbose) { printf("Closing connection\n"); } PQfinish(conn); - return (pgquery && query_status > status) ? query_status : status; + return (config.pgquery && query_status > status) ? query_status : status; } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_pgsql_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"timeout", required_argument, 0, 't'}, @@ -275,6 +258,11 @@ int process_arguments(int argc, char **argv) { {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0}}; + check_pgsql_config_wrapper result = { + .errorcode = OK, + .config = check_pgsql_config_init(), + }; + while (true) { int option = 0; int option_char = getopt_long(argc, argv, "hVt:c:w:H:P:d:l:p:a:o:q:C:W:v", longopts, &option); @@ -303,65 +291,65 @@ int process_arguments(int argc, char **argv) { if (!is_nonnegative(optarg)) { usage2(_("Critical threshold must be a positive integer"), optarg); } else { - tcrit = strtod(optarg, NULL); + result.config.tcrit = strtod(optarg, NULL); } break; case 'w': /* warning time threshold */ if (!is_nonnegative(optarg)) { usage2(_("Warning threshold must be a positive integer"), optarg); } else { - twarn = strtod(optarg, NULL); + result.config.twarn = strtod(optarg, NULL); } break; case 'C': /* critical query threshold */ - query_critical = optarg; + result.config.query_critical = optarg; break; case 'W': /* warning query threshold */ - query_warning = optarg; + result.config.query_warning = optarg; break; case 'H': /* host */ if ((*optarg != '/') && (!is_host(optarg))) { usage2(_("Invalid hostname/address"), optarg); } else { - pghost = optarg; + result.config.pghost = optarg; } break; case 'P': /* port */ if (!is_integer(optarg)) { usage2(_("Port must be a positive integer"), optarg); } else { - pgport = optarg; + result.config.pgport = optarg; } break; case 'd': /* database name */ if (strlen(optarg) >= NAMEDATALEN) { usage2(_("Database name exceeds the maximum length"), optarg); } - snprintf(dbName, NAMEDATALEN, "%s", optarg); + snprintf(result.config.dbName, NAMEDATALEN, "%s", optarg); break; case 'l': /* login name */ if (!is_pg_logname(optarg)) { usage2(_("User name is not valid"), optarg); } else { - pguser = optarg; + result.config.pguser = optarg; } break; case 'p': /* authentication password */ case 'a': - pgpasswd = optarg; + result.config.pgpasswd = optarg; break; case 'o': - if (pgparams) { - asprintf(&pgparams, "%s %s", pgparams, optarg); + if (result.config.pgparams) { + asprintf(&result.config.pgparams, "%s %s", result.config.pgparams, optarg); } else { - asprintf(&pgparams, "%s", optarg); + asprintf(&result.config.pgparams, "%s", optarg); } break; case 'q': - pgquery = optarg; + result.config.pgquery = optarg; break; case OPTID_QUERYNAME: - pgqueryname = optarg; + result.config.pgqueryname = optarg; break; case 'v': verbose++; @@ -369,9 +357,9 @@ int process_arguments(int argc, char **argv) { } } - set_thresholds(&qthresholds, query_warning, query_critical); + set_thresholds(&result.config.qthresholds, result.config.query_warning, result.config.query_critical); - return OK; + return result; } /** @@ -416,7 +404,7 @@ bool is_pg_logname(char *username) { void print_help(void) { char *myport; - xasprintf(&myport, "%d", DEFAULT_PORT); + xasprintf(&myport, "%d", 5432); print_revision(progname, NP_VERSION); @@ -504,7 +492,8 @@ void print_usage(void) { "[-q ] [-C ] [-W ]\n"); } -int do_query(PGconn *conn, char *query) { +mp_state_enum do_query(PGconn *conn, char *query, const char pgqueryname[], thresholds *qthresholds, char *query_warning, + char *query_critical) { if (verbose) { printf("Executing SQL query \"%s\".\n", query); } @@ -548,7 +537,7 @@ int do_query(PGconn *conn, char *query) { } } - int my_status = get_status(value, qthresholds); + mp_state_enum my_status = get_status(value, qthresholds); printf("QUERY %s - ", (my_status == STATE_OK) ? _("OK") : (my_status == STATE_WARNING) ? _("WARNING") : (my_status == STATE_CRITICAL) ? _("CRITICAL") diff --git a/plugins/check_pgsql.d/config.h b/plugins/check_pgsql.d/config.h new file mode 100644 index 00000000..2d4b8b89 --- /dev/null +++ b/plugins/check_pgsql.d/config.h @@ -0,0 +1,61 @@ +#pragma once + +#include "../../config.h" +#include "thresholds.h" +#include +#include + +#define DEFAULT_DB "template1" + +enum { + DEFAULT_WARN = 2, + DEFAULT_CRIT = 8, +}; + +typedef struct { + char *pghost; /* host name of the backend server */ + char *pgport; /* port of the backend server */ + char *pgoptions; /* special options to start up the backend server */ + char *pgtty; /* debugging tty for the backend server */ + char dbName[NAMEDATALEN]; + char *pguser; + char *pgpasswd; + char *pgparams; + char *pgquery; + char *pgqueryname; + + double twarn; + double tcrit; + thresholds *qthresholds; + char *query_warning; + char *query_critical; +} check_pgsql_config; + +/* begin, by setting the parameters for a backend connection if the + * parameters are null, then the system will try to use reasonable + * defaults by looking up environment variables or, failing that, + * using hardwired constants + * this targets .pgoptions and .pgtty + */ + +check_pgsql_config check_pgsql_config_init() { + check_pgsql_config tmp = { + .pghost = NULL, + .pgport = NULL, + .pgoptions = NULL, + .pgtty = NULL, + .dbName = DEFAULT_DB, + .pguser = NULL, + .pgpasswd = NULL, + .pgparams = NULL, + .pgquery = NULL, + .pgqueryname = NULL, + + .twarn = (double)DEFAULT_WARN, + .tcrit = (double)DEFAULT_CRIT, + .qthresholds = NULL, + .query_warning = NULL, + .query_critical = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 56ad762bd3bd59e5dac1ecb0e87c0b69f4ebaffc Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:16:04 +0100 Subject: Remove check_overcr This commit removes the plugin check_overcr and all related files and parts of files. OverCR seems to be dead and I have never seen a mention of an active usage anywhere. The website still does exist, but the activity seems to be limited. Carrying check_overcr forward seems to be a burden without a purpose and more of an opportunity to remove some code. --- .github/monitoring-plugins.spec | 14 -- .gitignore | 1 - plugins/Makefile.am | 3 +- plugins/check_overcr.c | 417 ---------------------------------------- 4 files changed, 1 insertion(+), 434 deletions(-) delete mode 100644 plugins/check_overcr.c (limited to 'plugins/Makefile.am') diff --git a/.github/monitoring-plugins.spec b/.github/monitoring-plugins.spec index 5cae3e59..64ee34f2 100644 --- a/.github/monitoring-plugins.spec +++ b/.github/monitoring-plugins.spec @@ -193,7 +193,6 @@ Requires: %{name}-ntp_peer Requires: %{name}-ntp_time Requires: %{name}-nwstat Requires: %{name}-oracle -Requires: %{name}-overcr Requires: %{name}-pgsql Requires: %{name}-ping Requires: %{name}-procs @@ -729,19 +728,6 @@ Provides check_oracle of the Monitoring Plugins. -# check_overcr -%package overcr -Summary: Monitoring Plugins - check_overcr -Requires: %{name} = %{version}-%{release} - -%description overcr -Provides check_overcr of the Monitoring Plugins. - -%files overcr -%{plugindir}/check_overcr - - - # check_pgsql %package pgsql Summary: Monitoring Plugins - check_pgsql diff --git a/.gitignore b/.gitignore index 0efc2b66..f9cb37e4 100644 --- a/.gitignore +++ b/.gitignore @@ -178,7 +178,6 @@ NP-VERSION-FILE /plugins/check_ntp_peer /plugins/check_ntp_time /plugins/check_nwstat -/plugins/check_overcr /plugins/check_pgsql /plugins/check_ping /plugins/check_pop diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9ea6e85e..6c582a15 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -27,7 +27,7 @@ MATHLIBS = @MATHLIBS@ #AM_CFLAGS = -Wall libexec_PROGRAMS = check_apt check_cluster check_disk check_dummy check_http check_load \ - check_mrtg check_mrtgtraf check_ntp check_ntp_peer check_nwstat check_overcr check_ping \ + check_mrtg check_mrtgtraf check_ntp check_ntp_peer check_nwstat check_ping \ check_real check_smtp check_ssh check_tcp check_time check_ntp_time \ check_ups check_users negate \ urlize @EXTRAS@ @@ -132,7 +132,6 @@ check_nt_LDADD = $(NETLIBS) check_ntp_LDADD = $(NETLIBS) $(MATHLIBS) check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS) check_nwstat_LDADD = $(NETLIBS) -check_overcr_LDADD = $(NETLIBS) check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) check_ping_LDADD = $(NETLIBS) check_procs_LDADD = $(BASEOBJS) diff --git a/plugins/check_overcr.c b/plugins/check_overcr.c deleted file mode 100644 index 599540b7..00000000 --- a/plugins/check_overcr.c +++ /dev/null @@ -1,417 +0,0 @@ -/***************************************************************************** - * - * Monitoring check_overcr plugin - * - * License: GPL - * Copyright (c) 2000-2024 Monitoring Plugins Development Team - * - * Description: - * - * This file contains the check_overcr plugin - * - * This plugin attempts to contact the Over-CR collector daemon running on the - * remote UNIX server in order to gather the requested system information. - * - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - *****************************************************************************/ - -const char *progname = "check_overcr"; -const char *copyright = "2000-2024"; -const char *email = "devel@monitoring-plugins.org"; - -#include "common.h" -#include "netutils.h" -#include "utils.h" - -enum checkvar { - NONE, - LOAD1, - LOAD5, - LOAD15, - DPU, - PROCS, - NETSTAT, - UPTIME -}; - -enum { - PORT = 2000 -}; - -static char *server_address = NULL; -static int server_port = PORT; -static double warning_value = 0L; -static double critical_value = 0L; -static bool check_warning_value = false; -static bool check_critical_value = false; -static enum checkvar vars_to_check = NONE; - -static int netstat_port = 0; -static char *disk_name = NULL; -static char *process_name = NULL; -static char send_buffer[MAX_INPUT_BUFFER]; - -static int process_arguments(int, char **); -void print_usage(void); -static void print_help(void); - -int main(int argc, char **argv) { - int result = STATE_UNKNOWN; - char recv_buffer[MAX_INPUT_BUFFER]; - char temp_buffer[MAX_INPUT_BUFFER]; - char *temp_ptr = NULL; - bool found_disk = false; - unsigned long percent_used_disk_space = 100; - double load; - double load_1min; - double load_5min; - double load_15min; - int port_connections = 0; - int processes = 0; - double uptime_raw_hours; - int uptime_raw_minutes = 0; - int uptime_days = 0; - int uptime_hours = 0; - int uptime_minutes = 0; - - setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - /* Parse extra opts if any */ - argv = np_extra_opts(&argc, argv, progname); - - if (process_arguments(argc, argv) == ERROR) - usage4(_("Could not parse arguments")); - - /* initialize alarm signal handling */ - signal(SIGALRM, socket_timeout_alarm_handler); - - /* set socket timeout */ - alarm(socket_timeout); - - result = process_tcp_request2(server_address, server_port, send_buffer, recv_buffer, sizeof(recv_buffer)); - - switch (vars_to_check) { - - case LOAD1: - case LOAD5: - case LOAD15: - - if (result != STATE_OK) - die(result, _("Unknown error fetching load data\n")); - - temp_ptr = (char *)strtok(recv_buffer, "\r\n"); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server - no load information\n")); - else - load_1min = strtod(temp_ptr, NULL); - - temp_ptr = (char *)strtok(NULL, "\r\n"); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server after load 1\n")); - else - load_5min = strtod(temp_ptr, NULL); - - temp_ptr = (char *)strtok(NULL, "\r\n"); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server after load 5\n")); - else - load_15min = strtod(temp_ptr, NULL); - - switch (vars_to_check) { - case LOAD1: - strcpy(temp_buffer, "1"); - load = load_1min; - break; - case LOAD5: - strcpy(temp_buffer, "5"); - load = load_5min; - break; - default: - strcpy(temp_buffer, "15"); - load = load_15min; - break; - } - - if (check_critical_value && (load >= critical_value)) - result = STATE_CRITICAL; - else if (check_warning_value && (load >= warning_value)) - result = STATE_WARNING; - - die(result, _("Load %s - %s-min load average = %0.2f"), state_text(result), temp_buffer, load); - - break; - - case DPU: - - if (result != STATE_OK) - die(result, _("Unknown error fetching disk data\n")); - - for (temp_ptr = (char *)strtok(recv_buffer, " "); temp_ptr != NULL; temp_ptr = (char *)strtok(NULL, " ")) { - - if (!strcmp(temp_ptr, disk_name)) { - found_disk = true; - temp_ptr = (char *)strtok(NULL, "%"); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server\n")); - else - percent_used_disk_space = strtoul(temp_ptr, NULL, 10); - break; - } - - temp_ptr = (char *)strtok(NULL, "\r\n"); - } - - /* error if we couldn't find the info for the disk */ - if (!found_disk) - die(STATE_CRITICAL, "CRITICAL - Disk '%s' non-existent or not mounted", disk_name); - - if (check_critical_value && (percent_used_disk_space >= critical_value)) - result = STATE_CRITICAL; - else if (check_warning_value && (percent_used_disk_space >= warning_value)) - result = STATE_WARNING; - - die(result, "Disk %s - %lu%% used on %s", state_text(result), percent_used_disk_space, disk_name); - - break; - - case NETSTAT: - - if (result != STATE_OK) - die(result, _("Unknown error fetching network status\n")); - else - port_connections = strtod(recv_buffer, NULL); - - if (check_critical_value && (port_connections >= critical_value)) - result = STATE_CRITICAL; - else if (check_warning_value && (port_connections >= warning_value)) - result = STATE_WARNING; - - die(result, _("Net %s - %d connection%s on port %d"), state_text(result), port_connections, (port_connections == 1) ? "" : "s", - netstat_port); - - break; - - case PROCS: - - if (result != STATE_OK) - die(result, _("Unknown error fetching process status\n")); - - temp_ptr = (char *)strtok(recv_buffer, "("); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server\n")); - - temp_ptr = (char *)strtok(NULL, ")"); - if (temp_ptr == NULL) - die(STATE_CRITICAL, _("Invalid response from server\n")); - else - processes = strtod(temp_ptr, NULL); - - if (check_critical_value && (processes >= critical_value)) - result = STATE_CRITICAL; - else if (check_warning_value && (processes >= warning_value)) - result = STATE_WARNING; - - die(result, _("Process %s - %d instance%s of %s running"), state_text(result), processes, (processes == 1) ? "" : "s", - process_name); - break; - - case UPTIME: - - if (result != STATE_OK) - return result; - - uptime_raw_hours = strtod(recv_buffer, NULL); - uptime_raw_minutes = (unsigned long)(uptime_raw_hours * 60.0); - - if (check_critical_value && (uptime_raw_minutes <= critical_value)) - result = STATE_CRITICAL; - else if (check_warning_value && (uptime_raw_minutes <= warning_value)) - result = STATE_WARNING; - - uptime_days = uptime_raw_minutes / 1440; - uptime_raw_minutes %= 1440; - uptime_hours = uptime_raw_minutes / 60; - uptime_raw_minutes %= 60; - uptime_minutes = uptime_raw_minutes; - - die(result, _("Uptime %s - Up %d days %d hours %d minutes"), state_text(result), uptime_days, uptime_hours, uptime_minutes); - break; - - default: - die(STATE_UNKNOWN, _("Nothing to check!\n")); - break; - } -} - -/* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; - static struct option longopts[] = { - {"port", required_argument, 0, 'p'}, {"timeout", required_argument, 0, 't'}, {"critical", required_argument, 0, 'c'}, - {"warning", required_argument, 0, 'w'}, {"variable", required_argument, 0, 'v'}, {"hostname", required_argument, 0, 'H'}, - {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; - - /* no options were supplied */ - if (argc < 2) - return ERROR; - - /* backwards compatibility */ - if (!is_option(argv[1])) { - server_address = argv[1]; - argv[1] = argv[0]; - argv = &argv[1]; - argc--; - } - - for (c = 1; c < argc; c++) { - if (strcmp("-to", argv[c]) == 0) - strcpy(argv[c], "-t"); - else if (strcmp("-wv", argv[c]) == 0) - strcpy(argv[c], "-w"); - else if (strcmp("-cv", argv[c]) == 0) - strcpy(argv[c], "-c"); - } - - while (1) { - c = getopt_long(argc, argv, "+hVH:t:c:w:p:v:", longopts, &option); - - if (c == -1 || c == EOF || c == 1) - break; - - switch (c) { - case '?': /* print short usage statement if args not parsable */ - usage5(); - case 'h': /* help */ - print_help(); - exit(STATE_UNKNOWN); - case 'V': /* version */ - print_revision(progname, NP_VERSION); - exit(STATE_UNKNOWN); - case 'H': /* hostname */ - server_address = optarg; - break; - case 'p': /* port */ - if (is_intnonneg(optarg)) - server_port = atoi(optarg); - else - die(STATE_UNKNOWN, _("Server port an integer\n")); - break; - case 'v': /* variable */ - if (strcmp(optarg, "LOAD") == 0) { - strcpy(send_buffer, "LOAD\r\nQUIT\r\n"); - if (strcmp(optarg, "LOAD1") == 0) - vars_to_check = LOAD1; - else if (strcmp(optarg, "LOAD5") == 0) - vars_to_check = LOAD5; - else if (strcmp(optarg, "LOAD15") == 0) - vars_to_check = LOAD15; - } else if (strcmp(optarg, "UPTIME") == 0) { - vars_to_check = UPTIME; - strcpy(send_buffer, "UPTIME\r\n"); - } else if (strstr(optarg, "PROC") == optarg) { - vars_to_check = PROCS; - process_name = strscpy(process_name, optarg + 4); - sprintf(send_buffer, "PROCESS %s\r\n", process_name); - } else if (strstr(optarg, "NET") == optarg) { - vars_to_check = NETSTAT; - netstat_port = atoi(optarg + 3); - sprintf(send_buffer, "NETSTAT %d\r\n", netstat_port); - } else if (strstr(optarg, "DPU") == optarg) { - vars_to_check = DPU; - strcpy(send_buffer, "DISKSPACE\r\n"); - disk_name = strscpy(disk_name, optarg + 3); - } else - return ERROR; - break; - case 'w': /* warning threshold */ - warning_value = strtoul(optarg, NULL, 10); - check_warning_value = true; - break; - case 'c': /* critical threshold */ - critical_value = strtoul(optarg, NULL, 10); - check_critical_value = true; - break; - case 't': /* timeout */ - socket_timeout = atoi(optarg); - if (socket_timeout <= 0) - return ERROR; - } - } - return OK; -} - -void print_help(void) { - char *myport; - xasprintf(&myport, "%d", PORT); - - print_revision(progname, NP_VERSION); - - printf("Copyright (c) 1999 Ethan Galstad \n"); - printf(COPYRIGHT, copyright, email); - - printf("%s\n", _("This plugin attempts to contact the Over-CR collector daemon running on the")); - printf("%s\n", _("remote UNIX server in order to gather the requested system information.")); - - printf("\n\n"); - - print_usage(); - - printf(UT_HELP_VRSN); - printf(UT_EXTRA_OPTS); - - printf(UT_HOST_PORT, 'p', myport); - - printf(" %s\n", "-w, --warning=INTEGER"); - printf(" %s\n", _("Threshold which will result in a warning status")); - printf(" %s\n", "-c, --critical=INTEGER"); - printf(" %s\n", _("Threshold which will result in a critical status")); - printf(" %s\n", "-v, --variable=STRING"); - printf(" %s\n", _("Variable to check. Valid variables include:")); - printf(" %s\n", _("LOAD1 = 1 minute average CPU load")); - printf(" %s\n", _("LOAD5 = 5 minute average CPU load")); - printf(" %s\n", _("LOAD15 = 15 minute average CPU load")); - printf(" %s\n", _("DPU = percent used disk space on filesystem ")); - printf(" %s\n", _("PROC = number of running processes with name ")); - printf(" %s\n", _("NET = number of active connections on TCP port ")); - printf(" %s\n", _("UPTIME = system uptime in seconds")); - - printf(UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); - - printf(UT_VERBOSE); - - printf("\n"); - printf("%s\n", _("This plugin requires that Eric Molitors' Over-CR collector daemon be")); - printf("%s\n", _("running on the remote server.")); - printf("%s\n", _("Over-CR can be downloaded from http://www.molitor.org/overcr")); - printf("%s\n", _("This plugin was tested with version 0.99.53 of the Over-CR collector")); - - printf("\n"); - printf("%s\n", _("Notes:")); - printf(" %s\n", _("For the available options, the critical threshold value should always be")); - printf(" %s\n", _("higher than the warning threshold value, EXCEPT with the uptime variable")); - - printf(UT_SUPPORT); -} - -void print_usage(void) { - printf("%s\n", _("Usage:")); - printf("%s -H host [-p port] [-v variable] [-w warning] [-c critical] [-t timeout]\n", progname); -} -- cgit v1.2.3-74-g34f1 From ae60d6d8d818191afba08819c5a62673b98ef29a Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 13:03:17 +0100 Subject: Refactor check_ping --- plugins/Makefile.am | 1 + plugins/check_ping.c | 319 ++++++++++++++++++++++-------------------- plugins/check_ping.d/config.h | 46 ++++++ 3 files changed, 218 insertions(+), 148 deletions(-) create mode 100644 plugins/check_ping.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9ea6e85e..10a12168 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -63,6 +63,7 @@ EXTRA_DIST = t \ check_mrtg.d \ check_apt.d \ check_pgsql.d \ + check_ping.d \ check_by_ssh.d \ check_smtp.d \ check_mysql.d \ diff --git a/plugins/check_ping.c b/plugins/check_ping.c index d79a4a61..fcf68f81 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c @@ -36,39 +36,35 @@ const char *email = "devel@monitoring-plugins.org"; #include "netutils.h" #include "popen.h" #include "utils.h" +#include "check_ping.d/config.h" +#include "../lib/states.h" #include -#define WARN_DUPLICATES "DUPLICATES FOUND! " -#define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ +#define WARN_DUPLICATES "DUPLICATES FOUND! " -enum { - UNKNOWN_PACKET_LOSS = 200, /* 200% */ - DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ -}; +typedef struct { + int errorcode; + check_ping_config config; +} check_ping_config_wrapper; +static check_ping_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_ping_config_wrapper validate_arguments(check_ping_config_wrapper /*config_wrapper*/); -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int get_threshold(char * /*arg*/, float * /*trta*/, int * /*tpl*/); -static int validate_arguments(void); -static int run_ping(const char *cmd, const char *addr); -static int error_scan(char buf[MAX_INPUT_BUFFER], const char *addr); +static int get_threshold(char * /*arg*/, double * /*trta*/, int * /*tpl*/); + +typedef struct { + mp_state_enum state; + double round_trip_average; + int packet_loss; +} ping_result; +static ping_result run_ping(const char *cmd, const char *addr, double /*crta*/); + +static mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr); static void print_help(void); void print_usage(void); -static bool display_html = false; -static int wpl = UNKNOWN_PACKET_LOSS; -static int cpl = UNKNOWN_PACKET_LOSS; -static float wrta = UNKNOWN_TRIP_TIME; -static float crta = UNKNOWN_TRIP_TIME; -static char **addresses = NULL; -static int n_addresses = 0; -static int max_addr = 1; -static int max_packets = -1; static int verbose = 0; -static float round_trip_average = UNKNOWN_TRIP_TIME; -static int packet_loss = UNKNOWN_PACKET_LOSS; - static char *warn_text; int main(int argc, char **argv) { @@ -77,16 +73,16 @@ int main(int argc, char **argv) { bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - addresses = malloc(sizeof(char *) * max_addr); - addresses[0] = NULL; - /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - if (process_arguments(argc, argv) == ERROR) { + check_ping_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_ping_config config = tmp_config.config; + /* Set signal handling and alarm */ if (signal(SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { usage4(_("Cannot catch SIGALRM")); @@ -102,9 +98,9 @@ int main(int argc, char **argv) { int result = STATE_UNKNOWN; char *rawcmd = NULL; - for (int i = 0; i < n_addresses; i++) { + for (size_t i = 0; i < config.n_addresses; i++) { #ifdef PING6_COMMAND - if (address_family != AF_INET && is_inet6_addr(addresses[i])) { + if (address_family != AF_INET && is_inet6_addr(config.addresses[i])) { rawcmd = strdup(PING6_COMMAND); } else { rawcmd = strdup(PING_COMMAND); @@ -118,12 +114,12 @@ int main(int argc, char **argv) { /* does the host address of number of packets argument come first? */ #ifdef PING_PACKETS_FIRST # ifdef PING_HAS_TIMEOUT - xasprintf(&cmd, rawcmd, timeout_interval, max_packets, addresses[i]); + xasprintf(&cmd, rawcmd, timeout_interval, config.max_packets, config.addresses[i]); # else - xasprintf(&cmd, rawcmd, max_packets, addresses[i]); + xasprintf(&cmd, rawcmd, config.max_packets, addresses[i]); # endif #else - xasprintf(&cmd, rawcmd, addresses[i], max_packets); + xasprintf(&cmd, rawcmd, addresses[i], config.max_packets); #endif if (verbose >= 2) { @@ -131,53 +127,55 @@ int main(int argc, char **argv) { } /* run the command */ - int this_result = run_ping(cmd, addresses[i]); - if (packet_loss == UNKNOWN_PACKET_LOSS || round_trip_average < 0.0) { + ping_result pinged = run_ping(cmd, config.addresses[i], config.crta); + + if (pinged.packet_loss == UNKNOWN_PACKET_LOSS || pinged.round_trip_average < 0.0) { printf("%s\n", cmd); die(STATE_UNKNOWN, _("CRITICAL - Could not interpret output from ping command\n")); } - if (packet_loss >= cpl || round_trip_average >= crta || round_trip_average < 0) { - this_result = STATE_CRITICAL; - } else if (packet_loss >= wpl || round_trip_average >= wrta) { - this_result = STATE_WARNING; - } else if (packet_loss >= 0 && round_trip_average >= 0) { - this_result = max_state(STATE_OK, this_result); + if (pinged.packet_loss >= config.cpl || pinged.round_trip_average >= config.crta || pinged.round_trip_average < 0) { + pinged.state = STATE_CRITICAL; + } else if (pinged.packet_loss >= config.wpl || pinged.round_trip_average >= config.wrta) { + pinged.state = STATE_WARNING; + } else if (pinged.packet_loss >= 0 && pinged.round_trip_average >= 0) { + pinged.state = max_state(STATE_OK, pinged.state); } - if (n_addresses > 1 && this_result != STATE_UNKNOWN) { - die(STATE_OK, "%s is alive\n", addresses[i]); + if (config.n_addresses > 1 && pinged.state != STATE_UNKNOWN) { + die(STATE_OK, "%s is alive\n", config.addresses[i]); } - if (display_html) { - printf("", CGIURL, addresses[i]); + if (config.display_html) { + printf("", CGIURL, config.addresses[i]); } - if (packet_loss == 100) { - printf(_("PING %s - %sPacket loss = %d%%"), state_text(this_result), warn_text, packet_loss); + if (pinged.packet_loss == 100) { + printf(_("PING %s - %sPacket loss = %d%%"), state_text(pinged.state), warn_text, pinged.packet_loss); } else { - printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(this_result), warn_text, packet_loss, - round_trip_average); + printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(pinged.state), warn_text, pinged.packet_loss, + pinged.round_trip_average); } - if (display_html) { + if (config.display_html) { printf(""); } /* Print performance data */ - if (packet_loss != 100) { - printf("|%s", - fperfdata("rta", (double)round_trip_average, "ms", (bool)(wrta > 0), wrta, (bool)(crta > 0), crta, true, 0, false, 0)); + if (pinged.packet_loss != 100) { + printf("|%s", fperfdata("rta", pinged.round_trip_average, "ms", (bool)(config.wrta > 0), config.wrta, + (bool)(config.crta > 0), config.crta, true, 0, false, 0)); } else { - printf("| rta=U;%f;%f;;", wrta, crta); + printf("| rta=U;%f;%f;;", config.wrta, config.crta); } - printf(" %s\n", perfdata("pl", (long)packet_loss, "%", (bool)(wpl > 0), wpl, (bool)(cpl > 0), cpl, true, 0, false, 0)); + printf(" %s\n", perfdata("pl", (long)pinged.packet_loss, "%", (bool)(config.wpl > 0), config.wpl, (bool)(config.cpl > 0), + config.cpl, true, 0, false, 0)); if (verbose >= 2) { - printf("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl); + printf("%f:%d%% %f:%d%%\n", config.wrta, config.wpl, config.crta, config.cpl); } - result = max_state(result, this_result); + result = max_state(result, pinged.state); free(rawcmd); free(cmd); } @@ -186,7 +184,7 @@ int main(int argc, char **argv) { } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_ping_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {STD_LONG_OPTS, {"packets", required_argument, 0, 'p'}, {"nohtml", no_argument, 0, 'n'}, @@ -195,8 +193,14 @@ int process_arguments(int argc, char **argv) { {"use-ipv6", no_argument, 0, '6'}, {0, 0, 0, 0}}; + check_ping_config_wrapper result = { + .errorcode = OK, + .config = check_ping_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } for (int index = 1; index < argc; index++) { @@ -209,6 +213,7 @@ int process_arguments(int argc, char **argv) { } int option = 0; + size_t max_addr = MAX_ADDR_START; while (true) { int option_index = getopt_long(argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option); @@ -246,15 +251,15 @@ int process_arguments(int argc, char **argv) { case 'H': /* hostname */ { char *ptr = optarg; while (true) { - n_addresses++; - if (n_addresses > max_addr) { + result.config.n_addresses++; + if (result.config.n_addresses > max_addr) { max_addr *= 2; - addresses = realloc(addresses, sizeof(char *) * max_addr); - if (addresses == NULL) { + result.config.addresses = realloc(result.config.addresses, sizeof(char *) * max_addr); + if (result.config.addresses == NULL) { die(STATE_UNKNOWN, _("Could not realloc() addresses\n")); } } - addresses[n_addresses - 1] = ptr; + result.config.addresses[result.config.n_addresses - 1] = ptr; if ((ptr = index(ptr, ','))) { strcpy(ptr, ""); ptr += sizeof(char); @@ -265,105 +270,110 @@ int process_arguments(int argc, char **argv) { } break; case 'p': /* number of packets to send */ if (is_intnonneg(optarg)) { - max_packets = atoi(optarg); + result.config.max_packets = atoi(optarg); } else { usage2(_(" (%s) must be a non-negative number\n"), optarg); } break; case 'n': /* no HTML */ - display_html = false; + result.config.display_html = false; break; case 'L': /* show HTML */ - display_html = true; + result.config.display_html = true; break; case 'c': - get_threshold(optarg, &crta, &cpl); + get_threshold(optarg, &result.config.crta, &result.config.cpl); break; case 'w': - get_threshold(optarg, &wrta, &wpl); + get_threshold(optarg, &result.config.wrta, &result.config.wpl); break; } } int arg_counter = optind; if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } - if (addresses[0] == NULL) { + if (result.config.addresses[0] == NULL) { if (!is_host(argv[arg_counter])) { usage2(_("Invalid hostname/address"), argv[arg_counter]); } else { - addresses[0] = argv[arg_counter++]; - n_addresses++; + result.config.addresses[0] = argv[arg_counter++]; + result.config.n_addresses++; if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } } } - if (wpl == UNKNOWN_PACKET_LOSS) { + if (result.config.wpl == UNKNOWN_PACKET_LOSS) { if (!is_intpercent(argv[arg_counter])) { printf(_(" (%s) must be an integer percentage\n"), argv[arg_counter]); - return ERROR; + result.errorcode = ERROR; + return result; } - wpl = atoi(argv[arg_counter++]); + result.config.wpl = atoi(argv[arg_counter++]); if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } } - if (cpl == UNKNOWN_PACKET_LOSS) { + if (result.config.cpl == UNKNOWN_PACKET_LOSS) { if (!is_intpercent(argv[arg_counter])) { printf(_(" (%s) must be an integer percentage\n"), argv[arg_counter]); - return ERROR; + result.errorcode = ERROR; + return result; } - cpl = atoi(argv[arg_counter++]); + result.config.cpl = atoi(argv[arg_counter++]); if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } } - if (wrta < 0.0) { + if (result.config.wrta < 0.0) { if (is_negative(argv[arg_counter])) { printf(_(" (%s) must be a non-negative number\n"), argv[arg_counter]); - return ERROR; + result.errorcode = ERROR; + return result; } - wrta = atof(argv[arg_counter++]); + result.config.wrta = atof(argv[arg_counter++]); if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } } - if (crta < 0.0) { + if (result.config.crta < 0.0) { if (is_negative(argv[arg_counter])) { printf(_(" (%s) must be a non-negative number\n"), argv[arg_counter]); - return ERROR; + result.errorcode = ERROR; + return result; } - crta = atof(argv[arg_counter++]); + result.config.crta = atof(argv[arg_counter++]); if (arg_counter == argc) { - return validate_arguments(); + return validate_arguments(result); } } - if (max_packets == -1) { + if (result.config.max_packets == -1) { if (is_intnonneg(argv[arg_counter])) { - max_packets = atoi(argv[arg_counter++]); + result.config.max_packets = atoi(argv[arg_counter++]); } else { printf(_(" (%s) must be a non-negative number\n"), argv[arg_counter]); - return ERROR; + result.errorcode = ERROR; + return result; } } - return validate_arguments(); + return validate_arguments(result); } -int get_threshold(char *arg, float *trta, int *tpl) { - if (is_intnonneg(arg) && sscanf(arg, "%f", trta) == 1) { +int get_threshold(char *arg, double *trta, int *tpl) { + if (is_intnonneg(arg) && sscanf(arg, "%lf", trta) == 1) { return OK; } - if (strpbrk(arg, ",:") && strstr(arg, "%") && sscanf(arg, "%f%*[:,]%d%%", trta, tpl) == 2) { + if (strpbrk(arg, ",:") && strstr(arg, "%") && sscanf(arg, "%lf%*[:,]%d%%", trta, tpl) == 2) { return OK; } @@ -375,60 +385,66 @@ int get_threshold(char *arg, float *trta, int *tpl) { return STATE_UNKNOWN; } -int validate_arguments() { - if (wrta < 0.0) { +check_ping_config_wrapper validate_arguments(check_ping_config_wrapper config_wrapper) { + if (config_wrapper.config.wrta < 0.0) { printf(_(" was not set\n")); - return ERROR; + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (crta < 0.0) { + if (config_wrapper.config.crta < 0.0) { printf(_(" was not set\n")); - return ERROR; + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (wpl == UNKNOWN_PACKET_LOSS) { + if (config_wrapper.config.wpl == UNKNOWN_PACKET_LOSS) { printf(_(" was not set\n")); - return ERROR; + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (cpl == UNKNOWN_PACKET_LOSS) { + if (config_wrapper.config.cpl == UNKNOWN_PACKET_LOSS) { printf(_(" was not set\n")); - return ERROR; + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (wrta > crta) { - printf(_(" (%f) cannot be larger than (%f)\n"), wrta, crta); - return ERROR; + if (config_wrapper.config.wrta > config_wrapper.config.crta) { + printf(_(" (%f) cannot be larger than (%f)\n"), config_wrapper.config.wrta, config_wrapper.config.crta); + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (wpl > cpl) { - printf(_(" (%d) cannot be larger than (%d)\n"), wpl, cpl); - return ERROR; + if (config_wrapper.config.wpl > config_wrapper.config.cpl) { + printf(_(" (%d) cannot be larger than (%d)\n"), config_wrapper.config.wpl, config_wrapper.config.cpl); + config_wrapper.errorcode = ERROR; + return config_wrapper; } - if (max_packets == -1) { - max_packets = DEFAULT_MAX_PACKETS; + if (config_wrapper.config.max_packets == -1) { + config_wrapper.config.max_packets = DEFAULT_MAX_PACKETS; } - float max_seconds = (crta / 1000.0 * max_packets) + max_packets; + double max_seconds = (config_wrapper.config.crta / 1000.0 * config_wrapper.config.max_packets) + config_wrapper.config.max_packets; if (max_seconds > timeout_interval) { timeout_interval = (unsigned int)max_seconds; } - for (int i = 0; i < n_addresses; i++) { - if (!is_host(addresses[i])) { - usage2(_("Invalid hostname/address"), addresses[i]); + for (size_t i = 0; i < config_wrapper.config.n_addresses; i++) { + if (!is_host(config_wrapper.config.addresses[i])) { + usage2(_("Invalid hostname/address"), config_wrapper.config.addresses[i]); } } - if (n_addresses == 0) { + if (config_wrapper.config.n_addresses == 0) { usage(_("You must specify a server address or host name")); } - return OK; + return config_wrapper; } -int run_ping(const char *cmd, const char *addr) { +ping_result run_ping(const char *cmd, const char *addr, double crta) { if ((child_process = spopen(cmd)) == NULL) { die(STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd); } @@ -439,48 +455,55 @@ int run_ping(const char *cmd, const char *addr) { } char buf[MAX_INPUT_BUFFER]; - int result = STATE_UNKNOWN; + ping_result result = { + .state = STATE_UNKNOWN, + .packet_loss = UNKNOWN_PACKET_LOSS, + .round_trip_average = UNKNOWN_TRIP_TIME, + }; + while (fgets(buf, MAX_INPUT_BUFFER - 1, child_process)) { if (verbose >= 3) { printf("Output: %s", buf); } - result = max_state(result, error_scan(buf, addr)); + result.state = max_state(result.state, error_scan(buf, addr)); /* get the percent loss statistics */ int match = 0; - if ((sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", &packet_loss, &match) && + if ((sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) && + match) || + (sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, + &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n", &packet_loss, &match) && + (sscanf(buf, "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", &packet_loss, &match) && match) || - (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &packet_loss, &match) && match)) { + (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) && match) || + (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &result.packet_loss, &match) && match)) { continue; } /* get the round trip average */ - if ((sscanf(buf, "round-trip min/avg/max = %*f/%f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%f/%*f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%f/%*f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%f/%*f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f%n", &round_trip_average, &match) && match) || - (sscanf(buf, "rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms%n", &round_trip_average, &match) && match) || - (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %fms%n", &round_trip_average, &match) && match)) { + if ((sscanf(buf, "round-trip min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "rtt min/avg/max/mdev = %*f/%lf/%*f/%*f ms%n", &result.round_trip_average, &match) && match) || + (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %lfms%n", &result.round_trip_average, &match) && match)) { continue; } } /* this is needed because there is no rta if all packets are lost */ - if (packet_loss == 100) { - round_trip_average = crta; + if (result.packet_loss == 100) { + result.round_trip_average = crta; } /* check stderr, setting at least WARNING if there is output here */ @@ -492,8 +515,8 @@ int run_ping(const char *cmd, const char *addr) { if (verbose >= 3) { printf("Got stderr: %s", buf); } - if ((result = error_scan(buf, addr)) == STATE_OK) { - result = STATE_WARNING; + if ((result.state = error_scan(buf, addr)) == STATE_OK) { + result.state = STATE_WARNING; if (warn_text == NULL) { warn_text = strdup(_("System call sent warnings to stderr ")); } else { @@ -514,7 +537,7 @@ int run_ping(const char *cmd, const char *addr) { return result; } -int error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { +mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { if (strstr(buf, "Network is unreachable") || strstr(buf, "Destination Net Unreachable") || strstr(buf, "No route")) { die(STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr); } else if (strstr(buf, "Destination Host Unreachable") || strstr(buf, "Address unreachable")) { @@ -543,10 +566,10 @@ int error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { } else if (!strstr(warn_text, _(WARN_DUPLICATES)) && xasprintf(&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) { die(STATE_UNKNOWN, _("Unable to realloc warn_text\n")); } - return (STATE_WARNING); + return STATE_WARNING; } - return (STATE_OK); + return STATE_OK; } void print_help(void) { diff --git a/plugins/check_ping.d/config.h b/plugins/check_ping.d/config.h new file mode 100644 index 00000000..eb2735a7 --- /dev/null +++ b/plugins/check_ping.d/config.h @@ -0,0 +1,46 @@ +#pragma once + +#include "../../config.h" +#include +#include + +enum { + UNKNOWN_PACKET_LOSS = 200, /* 200% */ + DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ +}; + +#define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ + +#define MAX_ADDR_START 1 + +typedef struct { + bool display_html; + int max_packets; + + char **addresses; + size_t n_addresses; + + int wpl; + int cpl; + double wrta; + double crta; +} check_ping_config; + +check_ping_config check_ping_config_init() { + check_ping_config tmp = { + .display_html = false, + .max_packets = -1, + + .addresses = NULL, + .n_addresses = 0, + + .wpl = UNKNOWN_PACKET_LOSS, + .cpl = UNKNOWN_PACKET_LOSS, + .wrta = UNKNOWN_TRIP_TIME, + .crta = UNKNOWN_TRIP_TIME, + }; + + tmp.addresses = calloc(MAX_ADDR_START, sizeof(char *)); + tmp.addresses[0] = NULL; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 37c543e2b20657a8f4c120ba6b52e8e605a417bb Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 13:50:39 +0100 Subject: Remove check_nwstat check_nwstat is a plugin which was used to determine the health of things on Novel machines. Since Novel is quite dead (even more so the product, this can be removed and this commit does just that to reduce ressource usage. --- .github/monitoring-plugins.spec | 14 - .gitignore | 1 - REQUIREMENTS | 4 - plugins/Makefile.am | 3 +- plugins/check_nwstat.c | 1527 --------------------------------------- 5 files changed, 1 insertion(+), 1548 deletions(-) delete mode 100644 plugins/check_nwstat.c (limited to 'plugins/Makefile.am') diff --git a/.github/monitoring-plugins.spec b/.github/monitoring-plugins.spec index 64ee34f2..10799128 100644 --- a/.github/monitoring-plugins.spec +++ b/.github/monitoring-plugins.spec @@ -191,7 +191,6 @@ Requires: %{name}-nt Requires: %{name}-ntp Requires: %{name}-ntp_peer Requires: %{name}-ntp_time -Requires: %{name}-nwstat Requires: %{name}-oracle Requires: %{name}-pgsql Requires: %{name}-ping @@ -702,19 +701,6 @@ Provides check_ntp_time of the Monitoring Plugins. -# check_nwstat -%package nwstat -Summary: Monitoring Plugins - check_nwstat -Requires: %{name} = %{version}-%{release} - -%description nwstat -Provides check_nwstat of the Monitoring Plugins. - -%files nwstat -%{plugindir}/check_nwstat - - - # check_oracle %package oracle Summary: Monitoring Plugins - check_oracle diff --git a/.gitignore b/.gitignore index f9cb37e4..7f79265f 100644 --- a/.gitignore +++ b/.gitignore @@ -177,7 +177,6 @@ NP-VERSION-FILE /plugins/check_ntp /plugins/check_ntp_peer /plugins/check_ntp_time -/plugins/check_nwstat /plugins/check_pgsql /plugins/check_ping /plugins/check_pop diff --git a/REQUIREMENTS b/REQUIREMENTS index f3b1c01d..551fdb1a 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -87,10 +87,6 @@ check_ifstatus/check_ifoperstatus - Requires Net::SNMP perl module http://www.perl.com/CPAN/modules/by-authors/id/D/DT/DTOWN/ -check_nwstat: - - Requires MRTGEXT NLM for Novell Servers - http://forge.novell.com/modules/xfmod/project/?mrtgext - check_nt: - Requires NSClient to run on the NT server to monitor http://nsclient.ready2run.nl/ diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6c582a15..7c404a3b 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -27,7 +27,7 @@ MATHLIBS = @MATHLIBS@ #AM_CFLAGS = -Wall libexec_PROGRAMS = check_apt check_cluster check_disk check_dummy check_http check_load \ - check_mrtg check_mrtgtraf check_ntp check_ntp_peer check_nwstat check_ping \ + check_mrtg check_mrtgtraf check_ntp check_ntp_peer check_ping \ check_real check_smtp check_ssh check_tcp check_time check_ntp_time \ check_ups check_users negate \ urlize @EXTRAS@ @@ -131,7 +131,6 @@ check_nagios_LDADD = $(BASEOBJS) check_nt_LDADD = $(NETLIBS) check_ntp_LDADD = $(NETLIBS) $(MATHLIBS) check_ntp_peer_LDADD = $(NETLIBS) $(MATHLIBS) -check_nwstat_LDADD = $(NETLIBS) check_pgsql_LDADD = $(NETLIBS) $(PGLIBS) check_ping_LDADD = $(NETLIBS) check_procs_LDADD = $(BASEOBJS) diff --git a/plugins/check_nwstat.c b/plugins/check_nwstat.c deleted file mode 100644 index 176dfbc8..00000000 --- a/plugins/check_nwstat.c +++ /dev/null @@ -1,1527 +0,0 @@ -/***************************************************************************** - * - * Monitoring check_nwstat plugin - * - * License: GPL - * Copyright (c) 2000-2024 Monitoring Plugins Development Team - * - * Description: - * - * This file contains the check_nwstat plugin - * - * This plugin attempts to contact the MRTGEXT NLM running on a - * Novell server to gather the requested system information. - * - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - *****************************************************************************/ - -const char *progname = "check_nwstat"; -const char *copyright = "2000-2024"; -const char *email = "devel@monitoring-plugins.org"; - -#include "common.h" -#include "netutils.h" -#include "utils.h" - -enum checkvar { - NONE, - LOAD1, /* check 1 minute CPU load */ - LOAD5, /* check 5 minute CPU load */ - LOAD15, /* check 15 minute CPU load */ - CONNS, /* check number of connections */ - VPF, /* check % free space on volume */ - VMF, /* check MB free space on volume */ - VMU, /* check MB used space on volume */ - VPU, /* check % used space on volume */ - VMP, /* check MB purgeable space on volume */ - VKF, /* check KB free space on volume */ - LTCH, /* check long-term cache hit percentage */ - CBUFF, /* check total cache buffers */ - CDBUFF, /* check dirty cache buffers */ - LRUM, /* check LRU sitting time in minutes */ - DSDB, /* check to see if DS Database is open */ - LOGINS, /* check to see if logins are enabled */ - NRMH, /* check to see NRM Health Status */ - PUPRB, /* check % of used packet receive buffers */ - UPRB, /* check used packet receive buffers */ - SAPENTRIES, /* check SAP entries */ - OFILES, /* check number of open files */ - VKP, /* check KB purgeable space on volume */ - VPP, /* check % purgeable space on volume */ - VKNP, /* check KB not yet purgeable space on volume */ - VPNP, /* check % not yet purgeable space on volume */ - ABENDS, /* check abended thread count */ - CSPROCS, /* check number of current service processes */ - TSYNC, /* check timesync status 0=no 1=yes in sync to the network */ - LRUS, /* check LRU sitting time in seconds */ - DCB, /* check dirty cache buffers as a percentage of the total */ - TCB, /* check total cache buffers as a percentage of the original */ - DSVER, /* check NDS version */ - UPTIME, /* check server uptime */ - NLM, /* check NLM loaded */ - NRMP, /* check NRM Process Values */ - NRMM, /* check NRM Memory Values */ - NRMS, /* check NRM Values */ - NSS1, /* check Statistics from _Admin:Manage_NSS\GeneralStats.xml */ - NSS2, /* check Statistics from _Admin:Manage_NSS\BufferCache.xml */ - NSS3, /* check statistics from _Admin:Manage_NSS\NameCache.xml */ - NSS4, /* check statistics from _Admin:Manage_NSS\FileStats.xml */ - NSS5, /* check statistics from _Admin:Manage_NSS\ObjectCache.xml */ - NSS6, /* check statistics from _Admin:Manage_NSS\Thread.xml */ - NSS7 /* check statistics from _Admin:Manage_NSS\AuthorizationCache.xml */ -}; - -enum { - PORT = 9999 -}; - -static char *server_address = NULL; -static char *volume_name = NULL; -static char *nlm_name = NULL; -static char *nrmp_name = NULL; -static char *nrmm_name = NULL; -static char *nrms_name = NULL; -static char *nss1_name = NULL; -static char *nss2_name = NULL; -static char *nss3_name = NULL; -static char *nss4_name = NULL; -static char *nss5_name = NULL; -static char *nss6_name = NULL; -static char *nss7_name = NULL; -static int server_port = PORT; -static unsigned long warning_value = 0L; -static unsigned long critical_value = 0L; -static bool check_warning_value = false; -static bool check_critical_value = false; -static bool check_netware_version = false; -static enum checkvar vars_to_check = NONE; -static int sap_number = -1; - -static int process_arguments(int /*argc*/, char ** /*argv*/); -static void print_help(void); -void print_usage(void); - -int main(int argc, char **argv) { - int result = STATE_UNKNOWN; - int sd; - char *send_buffer = NULL; - char recv_buffer[MAX_INPUT_BUFFER]; - char *output_message = NULL; - char *temp_buffer = NULL; - char *netware_version = NULL; - - int time_sync_status = 0; - int nrm_health_status = 0; - unsigned long total_cache_buffers = 0; - unsigned long dirty_cache_buffers = 0; - unsigned long open_files = 0; - unsigned long abended_threads = 0; - unsigned long max_service_processes = 0; - unsigned long current_service_processes = 0; - unsigned long free_disk_space = 0L; - unsigned long nrmp_value = 0L; - unsigned long nrmm_value = 0L; - unsigned long nrms_value = 0L; - unsigned long nss1_value = 0L; - unsigned long nss2_value = 0L; - unsigned long nss3_value = 0L; - unsigned long nss4_value = 0L; - unsigned long nss5_value = 0L; - unsigned long nss6_value = 0L; - unsigned long nss7_value = 0L; - unsigned long total_disk_space = 0L; - unsigned long used_disk_space = 0L; - unsigned long percent_used_disk_space = 0L; - unsigned long purgeable_disk_space = 0L; - unsigned long non_purgeable_disk_space = 0L; - unsigned long percent_free_space = 0; - unsigned long percent_purgeable_space = 0; - unsigned long percent_non_purgeable_space = 0; - unsigned long current_connections = 0L; - unsigned long utilization = 0L; - unsigned long cache_hits = 0; - unsigned long cache_buffers = 0L; - unsigned long lru_time = 0L; - unsigned long max_packet_receive_buffers = 0; - unsigned long used_packet_receive_buffers = 0; - unsigned long percent_used_packet_receive_buffers = 0L; - unsigned long sap_entries = 0; - char uptime[MAX_INPUT_BUFFER]; - - setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - /* Parse extra opts if any */ - argv = np_extra_opts(&argc, argv, progname); - - if (process_arguments(argc, argv) == ERROR) - usage4(_("Could not parse arguments")); - - /* initialize alarm signal handling */ - signal(SIGALRM, socket_timeout_alarm_handler); - - /* set socket timeout */ - alarm(socket_timeout); - - /* open connection */ - my_tcp_connect(server_address, server_port, &sd); - - /* get OS version string */ - if (check_netware_version) { - send_buffer = strdup("S19\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - if (!strcmp(recv_buffer, "-1\n")) - netware_version = strdup(""); - else { - recv_buffer[strlen(recv_buffer) - 1] = 0; - xasprintf(&netware_version, _("NetWare %s: "), recv_buffer); - } - } else - netware_version = strdup(""); - - /* check CPU load */ - if (vars_to_check == LOAD1 || vars_to_check == LOAD5 || vars_to_check == LOAD15) { - - switch (vars_to_check) { - case LOAD1: - temp_buffer = strdup("1"); - break; - case LOAD5: - temp_buffer = strdup("5"); - break; - default: - temp_buffer = strdup("15"); - break; - } - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "UTIL%s\r\n", temp_buffer); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - utilization = strtoul(recv_buffer, NULL, 10); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("UPTIME\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - recv_buffer[strlen(recv_buffer) - 1] = 0; - sprintf(uptime, _("Up %s,"), recv_buffer); - - if (check_critical_value && utilization >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && utilization >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("Load %s - %s %s-min load average = %lu%%|load%s=%lu;%lu;%lu;0;100"), state_text(result), uptime, - temp_buffer, utilization, temp_buffer, utilization, warning_value, critical_value); - - /* check number of user connections */ - } else if (vars_to_check == CONNS) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("CONNECT\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - current_connections = strtoul(recv_buffer, NULL, 10); - - if (check_critical_value && current_connections >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && current_connections >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("Conns %s - %lu current connections|Conns=%lu;%lu;%lu;;"), state_text(result), current_connections, - current_connections, warning_value, critical_value); - - /* check % long term cache hits */ - } else if (vars_to_check == LTCH) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S1\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - cache_hits = atoi(recv_buffer); - - if (check_critical_value && cache_hits <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && cache_hits <= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%s: Long term cache hits = %lu%%"), state_text(result), cache_hits); - - /* check cache buffers */ - } else if (vars_to_check == CBUFF) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S2\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - cache_buffers = strtoul(recv_buffer, NULL, 10); - - if (check_critical_value && cache_buffers <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && cache_buffers <= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%s: Total cache buffers = %lu|Cachebuffers=%lu;%lu;%lu;;"), state_text(result), cache_buffers, - cache_buffers, warning_value, critical_value); - - /* check dirty cache buffers */ - } else if (vars_to_check == CDBUFF) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S3\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - cache_buffers = strtoul(recv_buffer, NULL, 10); - - if (check_critical_value && cache_buffers >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && cache_buffers >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%s: Dirty cache buffers = %lu|Dirty-Cache-Buffers=%lu;%lu;%lu;;"), state_text(result), cache_buffers, - cache_buffers, warning_value, critical_value); - - /* check LRU sitting time in minutes */ - } else if (vars_to_check == LRUM) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S5\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - lru_time = strtoul(recv_buffer, NULL, 10); - - if (check_critical_value && lru_time <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && lru_time <= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%s: LRU sitting time = %lu minutes"), state_text(result), lru_time); - - /* check KB free space on volume */ - } else if (vars_to_check == VKF) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKF%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - free_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && free_disk_space <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && free_disk_space <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu KB free on volume %s|KBFree%s=%lu;%lu;%lu;;"), (result == STATE_OK) ? "" : _("Only "), - free_disk_space, volume_name, volume_name, free_disk_space, warning_value, critical_value); - } - - /* check MB free space on volume */ - } else if (vars_to_check == VMF) { - - xasprintf(&send_buffer, "VMF%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - free_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && free_disk_space <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && free_disk_space <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu MB free on volume %s|MBFree%s=%lu;%lu;%lu;;"), (result == STATE_OK) ? "" : _("Only "), - free_disk_space, volume_name, volume_name, free_disk_space, warning_value, critical_value); - } - /* check MB used space on volume */ - } else if (vars_to_check == VMU) { - - xasprintf(&send_buffer, "VMU%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - free_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && free_disk_space <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && free_disk_space <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu MB used on volume %s|MBUsed%s=%lu;%lu;%lu;;"), (result == STATE_OK) ? "" : _("Only "), - free_disk_space, volume_name, volume_name, free_disk_space, warning_value, critical_value); - } - /* check % used space on volume */ - } else if (vars_to_check == VPU) { - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - asprintf(&send_buffer, "VMU%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - asprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - - } else { - used_disk_space = strtoul(recv_buffer, NULL, 10); - close(sd); - my_tcp_connect(server_address, server_port, &sd); - /* get total volume in MB */ - asprintf(&send_buffer, "VMS%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - total_disk_space = strtoul(recv_buffer, NULL, 10); - /* calculate percent used on volume */ - percent_used_disk_space = (unsigned long)(((double)used_disk_space / (double)total_disk_space) * 100.0); - - if (check_critical_value && percent_used_disk_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && percent_used_disk_space >= warning_value) - result = STATE_WARNING; - - asprintf(&output_message, _("%lu MB (%lu%%) used on volume %s - total %lu MB|Used space in percent on %s=%lu;%lu;%lu;0;100"), - used_disk_space, percent_used_disk_space, volume_name, total_disk_space, volume_name, percent_used_disk_space, - warning_value, critical_value); - } - - /* check % free space on volume */ - } else if (vars_to_check == VPF) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKF%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - - } else { - - free_disk_space = strtoul(recv_buffer, NULL, 10); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKS%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - total_disk_space = strtoul(recv_buffer, NULL, 10); - - percent_free_space = (unsigned long)(((double)free_disk_space / (double)total_disk_space) * 100.0); - - if (check_critical_value && percent_free_space <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && percent_free_space <= warning_value) - result = STATE_WARNING; - free_disk_space /= 1024; - total_disk_space /= 1024; - xasprintf(&output_message, _("%lu MB (%lu%%) free on volume %s - total %lu MB|FreeMB%s=%lu;%lu;%lu;0;100"), free_disk_space, - percent_free_space, volume_name, total_disk_space, volume_name, percent_free_space, warning_value, critical_value); - } - - /* check to see if DS Database is open or closed */ - } else if (vars_to_check == DSDB) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S11\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - if (atoi(recv_buffer) == 1) - result = STATE_OK; - else - result = STATE_WARNING; - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S13\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - temp_buffer = strtok(recv_buffer, "\r\n"); - - xasprintf(&output_message, _("Directory Services Database is %s (DS version %s)"), (result == STATE_OK) ? "open" : "closed", - temp_buffer); - - /* check to see if logins are enabled */ - } else if (vars_to_check == LOGINS) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S12\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - if (atoi(recv_buffer) == 1) - result = STATE_OK; - else - result = STATE_WARNING; - - xasprintf(&output_message, _("Logins are %s"), (result == STATE_OK) ? _("enabled") : _("disabled")); - - /* check NRM Health Status Summary*/ - } else if (vars_to_check == NRMH) { - - xasprintf(&send_buffer, "NRMH\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - nrm_health_status = atoi(recv_buffer); - - if (nrm_health_status == 2) { - result = STATE_OK; - xasprintf(&output_message, _("CRITICAL - NRM Status is bad!")); - } else { - if (nrm_health_status == 1) { - result = STATE_WARNING; - xasprintf(&output_message, _("Warning - NRM Status is suspect!")); - } - - xasprintf(&output_message, _("OK - NRM Status is good!")); - } - - /* check packet receive buffers */ - } else if (vars_to_check == UPRB || vars_to_check == PUPRB) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S15\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - used_packet_receive_buffers = atoi(recv_buffer); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S16\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - max_packet_receive_buffers = atoi(recv_buffer); - - percent_used_packet_receive_buffers = - (unsigned long)(((double)used_packet_receive_buffers / (double)max_packet_receive_buffers) * 100.0); - - if (vars_to_check == UPRB) { - if (check_critical_value && used_packet_receive_buffers >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && used_packet_receive_buffers >= warning_value) - result = STATE_WARNING; - } else { - if (check_critical_value && percent_used_packet_receive_buffers >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && percent_used_packet_receive_buffers >= warning_value) - result = STATE_WARNING; - } - - xasprintf(&output_message, _("%lu of %lu (%lu%%) packet receive buffers used"), used_packet_receive_buffers, - max_packet_receive_buffers, percent_used_packet_receive_buffers); - - /* check SAP table entries */ - } else if (vars_to_check == SAPENTRIES) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - if (sap_number == -1) - xasprintf(&send_buffer, "S9\r\n"); - else - xasprintf(&send_buffer, "S9.%d\r\n", sap_number); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - sap_entries = atoi(recv_buffer); - - if (check_critical_value && sap_entries >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && sap_entries >= warning_value) - result = STATE_WARNING; - - if (sap_number == -1) - xasprintf(&output_message, _("%lu entries in SAP table"), sap_entries); - else - xasprintf(&output_message, _("%lu entries in SAP table for SAP type %d"), sap_entries, sap_number); - - /* check KB purgeable space on volume */ - } else if (vars_to_check == VKP) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKP%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - purgeable_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && purgeable_disk_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && purgeable_disk_space >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu KB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"), (result == STATE_OK) ? "" : _("Only "), - purgeable_disk_space, volume_name, volume_name, purgeable_disk_space, warning_value, critical_value); - } - /* check MB purgeable space on volume */ - } else if (vars_to_check == VMP) { - - xasprintf(&send_buffer, "VMP%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - purgeable_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && purgeable_disk_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && purgeable_disk_space >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu MB purgeable on volume %s|Purge%s=%lu;%lu;%lu;;"), (result == STATE_OK) ? "" : _("Only "), - purgeable_disk_space, volume_name, volume_name, purgeable_disk_space, warning_value, critical_value); - } - - /* check % purgeable space on volume */ - } else if (vars_to_check == VPP) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKP%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - - } else { - - purgeable_disk_space = strtoul(recv_buffer, NULL, 10); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKS%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - total_disk_space = strtoul(recv_buffer, NULL, 10); - - percent_purgeable_space = (unsigned long)(((double)purgeable_disk_space / (double)total_disk_space) * 100.0); - - if (check_critical_value && percent_purgeable_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && percent_purgeable_space >= warning_value) - result = STATE_WARNING; - purgeable_disk_space /= 1024; - xasprintf(&output_message, _("%lu MB (%lu%%) purgeable on volume %s|Purgeable%s=%lu;%lu;%lu;0;100"), purgeable_disk_space, - percent_purgeable_space, volume_name, volume_name, percent_purgeable_space, warning_value, critical_value); - } - - /* check KB not yet purgeable space on volume */ - } else if (vars_to_check == VKNP) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKNP%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - } else { - non_purgeable_disk_space = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && non_purgeable_disk_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && non_purgeable_disk_space >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s%lu KB not yet purgeable on volume %s"), (result == STATE_OK) ? "" : _("Only "), - non_purgeable_disk_space, volume_name); - } - - /* check % not yet purgeable space on volume */ - } else if (vars_to_check == VPNP) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKNP%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - - xasprintf(&output_message, _("CRITICAL - Volume '%s' does not exist!"), volume_name); - result = STATE_CRITICAL; - - } else { - - non_purgeable_disk_space = strtoul(recv_buffer, NULL, 10); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "VKS%s\r\n", volume_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - total_disk_space = strtoul(recv_buffer, NULL, 10); - - percent_non_purgeable_space = (unsigned long)(((double)non_purgeable_disk_space / (double)total_disk_space) * 100.0); - - if (check_critical_value && percent_non_purgeable_space >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && percent_non_purgeable_space >= warning_value) - result = STATE_WARNING; - purgeable_disk_space /= 1024; - xasprintf(&output_message, _("%lu MB (%lu%%) not yet purgeable on volume %s"), non_purgeable_disk_space, - percent_non_purgeable_space, volume_name); - } - - /* check # of open files */ - } else if (vars_to_check == OFILES) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S18\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - open_files = atoi(recv_buffer); - - if (check_critical_value && open_files >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && open_files >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%lu open files|Openfiles=%lu;%lu;%lu;0,0"), open_files, open_files, warning_value, critical_value); - - /* check # of abended threads (Netware > 5.x only) */ - } else if (vars_to_check == ABENDS) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S17\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - abended_threads = atoi(recv_buffer); - - if (check_critical_value && abended_threads >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && abended_threads >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%lu abended threads|Abends=%lu;%lu;%lu;;"), abended_threads, abended_threads, warning_value, - critical_value); - - /* check # of current service processes (Netware 5.x only) */ - } else if (vars_to_check == CSPROCS) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S20\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - max_service_processes = atoi(recv_buffer); - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S21\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - current_service_processes = atoi(recv_buffer); - - if (check_critical_value && current_service_processes >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && current_service_processes >= warning_value) - result = STATE_WARNING; - - xasprintf(&output_message, _("%lu current service processes (%lu max)|Processes=%lu;%lu;%lu;0;%lu"), current_service_processes, - max_service_processes, current_service_processes, warning_value, critical_value, max_service_processes); - - /* check # Timesync Status */ - } else if (vars_to_check == TSYNC) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S22\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - time_sync_status = atoi(recv_buffer); - - if (time_sync_status == 0) { - result = STATE_CRITICAL; - xasprintf(&output_message, _("CRITICAL - Time not in sync with network!")); - } else { - xasprintf(&output_message, _("OK - Time in sync with network!")); - } - - /* check LRU sitting time in secondss */ - } else if (vars_to_check == LRUS) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S4\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - lru_time = strtoul(recv_buffer, NULL, 10); - - if (check_critical_value && lru_time <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && lru_time <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("LRU sitting time = %lu seconds"), lru_time); - - /* check % dirty cacheobuffers as a percentage of the total*/ - } else if (vars_to_check == DCB) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S6\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - dirty_cache_buffers = atoi(recv_buffer); - - if (check_critical_value && dirty_cache_buffers <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && dirty_cache_buffers <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("Dirty cache buffers = %lu%% of the total|DCB=%lu;%lu;%lu;0;100"), dirty_cache_buffers, - dirty_cache_buffers, warning_value, critical_value); - - /* check % total cache buffers as a percentage of the original*/ - } else if (vars_to_check == TCB) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - send_buffer = strdup("S7\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - total_cache_buffers = atoi(recv_buffer); - - if (check_critical_value && total_cache_buffers <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && total_cache_buffers <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("Total cache buffers = %lu%% of the original|TCB=%lu;%lu;%lu;0;100"), total_cache_buffers, - total_cache_buffers, warning_value, critical_value); - - } else if (vars_to_check == DSVER) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S13\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - recv_buffer[strlen(recv_buffer) - 1] = 0; - - xasprintf(&output_message, _("NDS Version %s"), recv_buffer); - - } else if (vars_to_check == UPTIME) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "UPTIME\r\n"); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - recv_buffer[sizeof(recv_buffer) - 1] = 0; - recv_buffer[strlen(recv_buffer) - 1] = 0; - - xasprintf(&output_message, _("Up %s"), recv_buffer); - - } else if (vars_to_check == NLM) { - - close(sd); - my_tcp_connect(server_address, server_port, &sd); - - xasprintf(&send_buffer, "S24:%s\r\n", nlm_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - recv_buffer[strlen(recv_buffer) - 1] = 0; - if (strcmp(recv_buffer, "-1")) { - xasprintf(&output_message, _("Module %s version %s is loaded"), nlm_name, recv_buffer); - } else { - result = STATE_CRITICAL; - xasprintf(&output_message, _("Module %s is not loaded"), nlm_name); - } - } else if (vars_to_check == NRMP) { - - xasprintf(&send_buffer, "NRMP:%s\r\n", nrmp_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nrmp_name); - result = STATE_CRITICAL; - } else { - nrmp_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nrmp_value <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nrmp_value <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nrmp_name, nrmp_value, nrmp_name, nrmp_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NRMM) { - - xasprintf(&send_buffer, "NRMM:%s\r\n", nrmm_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nrmm_name); - result = STATE_CRITICAL; - } else { - nrmm_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nrmm_value <= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nrmm_value <= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nrmm_name, nrmm_value, nrmm_name, nrmm_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NRMS) { - - xasprintf(&send_buffer, "NRMS:%s\r\n", nrms_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nrms_name); - result = STATE_CRITICAL; - } else { - nrms_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nrms_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nrms_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nrms_name, nrms_value, nrms_name, nrms_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS1) { - - xasprintf(&send_buffer, "NSS1:%s\r\n", nss1_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss1_name); - result = STATE_CRITICAL; - } else { - nss1_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss1_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss1_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss1_name, nss1_value, nss1_name, nss1_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS2) { - - xasprintf(&send_buffer, "NSS2:%s\r\n", nss2_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss2_name); - result = STATE_CRITICAL; - } else { - nss2_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss2_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss2_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss2_name, nss2_value, nss2_name, nss2_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS3) { - - xasprintf(&send_buffer, "NSS3:%s\r\n", nss3_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss3_name); - result = STATE_CRITICAL; - } else { - nss3_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss3_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss3_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss3_name, nss3_value, nss3_name, nss3_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS4) { - - xasprintf(&send_buffer, "NSS4:%s\r\n", nss4_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss4_name); - result = STATE_CRITICAL; - } else { - nss4_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss4_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss4_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss4_name, nss4_value, nss4_name, nss4_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS5) { - - xasprintf(&send_buffer, "NSS5:%s\r\n", nss5_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss5_name); - result = STATE_CRITICAL; - } else { - nss5_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss5_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss5_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss5_name, nss5_value, nss5_name, nss5_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS6) { - - xasprintf(&send_buffer, "NSS6:%s\r\n", nss6_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss6_name); - result = STATE_CRITICAL; - } else { - nss6_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss6_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss6_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss6_name, nss6_value, nss6_name, nss6_value, warning_value, - critical_value); - } - - } else if (vars_to_check == NSS7) { - - xasprintf(&send_buffer, "NSS7:%s\r\n", nss7_name); - result = send_tcp_request(sd, send_buffer, recv_buffer, sizeof(recv_buffer)); - if (result != STATE_OK) - return result; - - if (!strcmp(recv_buffer, "-1\n")) { - xasprintf(&output_message, _("CRITICAL - Value '%s' does not exist!"), nss7_name); - result = STATE_CRITICAL; - } else { - nss7_value = strtoul(recv_buffer, NULL, 10); - if (check_critical_value && nss7_value >= critical_value) - result = STATE_CRITICAL; - else if (check_warning_value && nss7_value >= warning_value) - result = STATE_WARNING; - xasprintf(&output_message, _("%s is %lu|%s=%lu;%lu;%lu;;"), nss7_name, nss7_value, nss7_name, nss7_value, warning_value, - critical_value); - } - - } else { - - output_message = strdup(_("Nothing to check!\n")); - result = STATE_UNKNOWN; - } - - close(sd); - - /* reset timeout */ - alarm(0); - - printf("%s%s\n", netware_version, output_message); - - return result; -} - -/* process command-line arguments */ -int process_arguments(int argc, char **argv) { - int c; - - int option = 0; - static struct option longopts[] = {{"port", required_argument, 0, 'p'}, {"timeout", required_argument, 0, 't'}, - {"critical", required_argument, 0, 'c'}, {"warning", required_argument, 0, 'w'}, - {"variable", required_argument, 0, 'v'}, {"hostname", required_argument, 0, 'H'}, - {"osversion", no_argument, 0, 'o'}, {"version", no_argument, 0, 'V'}, - {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; - - /* no options were supplied */ - if (argc < 2) - return ERROR; - - /* backwards compatibility */ - if (!is_option(argv[1])) { - server_address = argv[1]; - argv[1] = argv[0]; - argv = &argv[1]; - argc--; - } - - for (c = 1; c < argc; c++) { - if (strcmp("-to", argv[c]) == 0) - strcpy(argv[c], "-t"); - else if (strcmp("-wv", argv[c]) == 0) - strcpy(argv[c], "-w"); - else if (strcmp("-cv", argv[c]) == 0) - strcpy(argv[c], "-c"); - } - - while (1) { - c = getopt_long(argc, argv, "+hoVH:t:c:w:p:v:", longopts, &option); - - if (c == -1 || c == EOF || c == 1) - break; - - switch (c) { - case '?': /* print short usage statement if args not parsable */ - usage5(); - case 'h': /* help */ - print_help(); - exit(STATE_UNKNOWN); - case 'V': /* version */ - print_revision(progname, NP_VERSION); - exit(STATE_UNKNOWN); - case 'H': /* hostname */ - server_address = optarg; - break; - case 'o': /* display nos version */ - check_netware_version = true; - break; - case 'p': /* port */ - if (is_intnonneg(optarg)) - server_port = atoi(optarg); - else - die(STATE_UNKNOWN, _("Server port an integer\n")); - break; - case 'v': - if (strlen(optarg) < 3) - return ERROR; - if (!strcmp(optarg, "LOAD1")) - vars_to_check = LOAD1; - else if (!strcmp(optarg, "LOAD5")) - vars_to_check = LOAD5; - else if (!strcmp(optarg, "LOAD15")) - vars_to_check = LOAD15; - else if (!strcmp(optarg, "CONNS")) - vars_to_check = CONNS; - else if (!strcmp(optarg, "LTCH")) - vars_to_check = LTCH; - else if (!strcmp(optarg, "DCB")) - vars_to_check = DCB; - else if (!strcmp(optarg, "TCB")) - vars_to_check = TCB; - else if (!strcmp(optarg, "CBUFF")) - vars_to_check = CBUFF; - else if (!strcmp(optarg, "CDBUFF")) - vars_to_check = CDBUFF; - else if (!strcmp(optarg, "LRUM")) - vars_to_check = LRUM; - else if (!strcmp(optarg, "LRUS")) - vars_to_check = LRUS; - else if (strncmp(optarg, "VPF", 3) == 0) { - vars_to_check = VPF; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VKF", 3) == 0) { - vars_to_check = VKF; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VMF", 3) == 0) { - vars_to_check = VMF; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (!strcmp(optarg, "DSDB")) - vars_to_check = DSDB; - else if (!strcmp(optarg, "LOGINS")) - vars_to_check = LOGINS; - else if (!strcmp(optarg, "NRMH")) - vars_to_check = NRMH; - else if (!strcmp(optarg, "UPRB")) - vars_to_check = UPRB; - else if (!strcmp(optarg, "PUPRB")) - vars_to_check = PUPRB; - else if (!strncmp(optarg, "SAPENTRIES", 10)) { - vars_to_check = SAPENTRIES; - if (strlen(optarg) > 10) - sap_number = atoi(optarg + 10); - else - sap_number = -1; - } else if (!strcmp(optarg, "OFILES")) - vars_to_check = OFILES; - else if (strncmp(optarg, "VKP", 3) == 0) { - vars_to_check = VKP; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VMP", 3) == 0) { - vars_to_check = VMP; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VMU", 3) == 0) { - vars_to_check = VMU; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VPU", 3) == 0) { - vars_to_check = VPU; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VPP", 3) == 0) { - vars_to_check = VPP; - volume_name = strdup(optarg + 3); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VKNP", 4) == 0) { - vars_to_check = VKNP; - volume_name = strdup(optarg + 4); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (strncmp(optarg, "VPNP", 4) == 0) { - vars_to_check = VPNP; - volume_name = strdup(optarg + 4); - if (!strcmp(volume_name, "")) - volume_name = strdup("SYS"); - } else if (!strcmp(optarg, "ABENDS")) - vars_to_check = ABENDS; - else if (!strcmp(optarg, "CSPROCS")) - vars_to_check = CSPROCS; - else if (!strcmp(optarg, "TSYNC")) - vars_to_check = TSYNC; - else if (!strcmp(optarg, "DSVER")) - vars_to_check = DSVER; - else if (!strcmp(optarg, "UPTIME")) { - vars_to_check = UPTIME; - } else if (strncmp(optarg, "NLM:", 4) == 0) { - vars_to_check = NLM; - nlm_name = strdup(optarg + 4); - } else if (strncmp(optarg, "NRMP", 4) == 0) { - vars_to_check = NRMP; - nrmp_name = strdup(optarg + 4); - if (!strcmp(nrmp_name, "")) - nrmp_name = strdup("AVAILABLE_MEMORY"); - } else if (strncmp(optarg, "NRMM", 4) == 0) { - vars_to_check = NRMM; - nrmm_name = strdup(optarg + 4); - if (!strcmp(nrmm_name, "")) - nrmm_name = strdup("AVAILABLE_CACHE_MEMORY"); - - } - - else if (strncmp(optarg, "NRMS", 4) == 0) { - vars_to_check = NRMS; - nrms_name = strdup(optarg + 4); - if (!strcmp(nrms_name, "")) - nrms_name = strdup("USED_SWAP_SPACE"); - - } - - else if (strncmp(optarg, "NSS1", 4) == 0) { - vars_to_check = NSS1; - nss1_name = strdup(optarg + 4); - if (!strcmp(nss1_name, "")) - nss1_name = strdup("CURRENTBUFFERCACHESIZE"); - - } - - else if (strncmp(optarg, "NSS2", 4) == 0) { - vars_to_check = NSS2; - nss2_name = strdup(optarg + 4); - if (!strcmp(nss2_name, "")) - nss2_name = strdup("CACHEHITS"); - - } - - else if (strncmp(optarg, "NSS3", 4) == 0) { - vars_to_check = NSS3; - nss3_name = strdup(optarg + 4); - if (!strcmp(nss3_name, "")) - nss3_name = strdup("CACHEGITPERCENT"); - - } - - else if (strncmp(optarg, "NSS4", 4) == 0) { - vars_to_check = NSS4; - nss4_name = strdup(optarg + 4); - if (!strcmp(nss4_name, "")) - nss4_name = strdup("CURRENTOPENCOUNT"); - - } - - else if (strncmp(optarg, "NSS5", 4) == 0) { - vars_to_check = NSS5; - nss5_name = strdup(optarg + 4); - if (!strcmp(nss5_name, "")) - nss5_name = strdup("CACHEMISSES"); - - } - - else if (strncmp(optarg, "NSS6", 4) == 0) { - vars_to_check = NSS6; - nss6_name = strdup(optarg + 4); - if (!strcmp(nss6_name, "")) - nss6_name = strdup("PENDINGWORKSCOUNT"); - - } - - else if (strncmp(optarg, "NSS7", 4) == 0) { - vars_to_check = NSS7; - nss7_name = strdup(optarg + 4); - if (!strcmp(nss7_name, "")) - nss7_name = strdup("CACHESIZE"); - - } - - else - return ERROR; - break; - case 'w': /* warning threshold */ - warning_value = strtoul(optarg, NULL, 10); - check_warning_value = true; - break; - case 'c': /* critical threshold */ - critical_value = strtoul(optarg, NULL, 10); - check_critical_value = true; - break; - case 't': /* timeout */ - socket_timeout = atoi(optarg); - if (socket_timeout <= 0) - return ERROR; - } - } - - return OK; -} - -void print_help(void) { - char *myport; - xasprintf(&myport, "%d", PORT); - - print_revision(progname, NP_VERSION); - - printf("Copyright (c) 1999 Ethan Galstad \n"); - printf(COPYRIGHT, copyright, email); - - printf("%s\n", _("This plugin attempts to contact the MRTGEXT NLM running on a")); - printf("%s\n", _("Novell server to gather the requested system information.")); - - printf("\n\n"); - - print_usage(); - - printf(UT_HELP_VRSN); - printf(UT_EXTRA_OPTS); - - printf(UT_HOST_PORT, 'p', myport); - - printf(" %s\n", "-v, --variable=STRING"); - printf(" %s\n", _("Variable to check. Valid variables include:")); - printf(" %s\n", _("LOAD1 = 1 minute average CPU load")); - printf(" %s\n", _("LOAD5 = 5 minute average CPU load")); - printf(" %s\n", _("LOAD15 = 15 minute average CPU load")); - printf(" %s\n", _("CSPROCS = number of current service processes (NW 5.x only)")); - printf(" %s\n", _("ABENDS = number of abended threads (NW 5.x only)")); - printf(" %s\n", _("UPTIME = server uptime")); - printf(" %s\n", _("LTCH = percent long term cache hits")); - printf(" %s\n", _("CBUFF = current number of cache buffers")); - printf(" %s\n", _("CDBUFF = current number of dirty cache buffers")); - printf(" %s\n", _("DCB = dirty cache buffers as a percentage of the total")); - printf(" %s\n", _("TCB = dirty cache buffers as a percentage of the original")); - printf(" %s\n", _("OFILES = number of open files")); - printf(" %s\n", _(" VMF = MB of free space on Volume ")); - printf(" %s\n", _(" VMU = MB used space on Volume ")); - printf(" %s\n", _(" VPU = percent used space on Volume ")); - printf(" %s\n", _(" VMP = MB of purgeable space on Volume ")); - printf(" %s\n", _(" VPF = percent free space on volume ")); - printf(" %s\n", _(" VKF = KB of free space on volume ")); - printf(" %s\n", _(" VPP = percent purgeable space on volume ")); - printf(" %s\n", _(" VKP = KB of purgeable space on volume ")); - printf(" %s\n", _(" VPNP = percent not yet purgeable space on volume ")); - printf(" %s\n", _(" VKNP = KB of not yet purgeable space on volume ")); - printf(" %s\n", _(" LRUM = LRU sitting time in minutes")); - printf(" %s\n", _(" LRUS = LRU sitting time in seconds")); - printf(" %s\n", _(" DSDB = check to see if DS Database is open")); - printf(" %s\n", _(" DSVER = NDS version")); - printf(" %s\n", _(" UPRB = used packet receive buffers")); - printf(" %s\n", _(" PUPRB = percent (of max) used packet receive buffers")); - printf(" %s\n", _(" SAPENTRIES = number of entries in the SAP table")); - printf(" %s\n", _(" SAPENTRIES = number of entries in the SAP table for SAP type ")); - printf(" %s\n", _(" TSYNC = timesync status")); - printf(" %s\n", _(" LOGINS = check to see if logins are enabled")); - printf(" %s\n", _(" CONNS = number of currently licensed connections")); - printf(" %s\n", _(" NRMH = NRM Summary Status")); - printf(" %s\n", _(" NRMP = Returns the current value for a NRM health item")); - printf(" %s\n", _(" NRMM = Returns the current memory stats from NRM")); - printf(" %s\n", _(" NRMS = Returns the current Swapfile stats from NRM")); - printf(" %s\n", _(" NSS1 = Statistics from _Admin:Manage_NSS\\GeneralStats.xml")); - printf(" %s\n", _(" NSS3 = Statistics from _Admin:Manage_NSS\\NameCache.xml")); - printf(" %s\n", _(" NSS4 = Statistics from _Admin:Manage_NSS\\FileStats.xml")); - printf(" %s\n", _(" NSS5 = Statistics from _Admin:Manage_NSS\\ObjectCache.xml")); - printf(" %s\n", _(" NSS6 = Statistics from _Admin:Manage_NSS\\Thread.xml")); - printf(" %s\n", _(" NSS7 = Statistics from _Admin:Manage_NSS\\AuthorizationCache.xml")); - printf(" %s\n", _(" NLM: = check if NLM is loaded and report version")); - printf(" %s\n", _(" (e.g. NLM:TSANDS.NLM)")); - printf("\n"); - printf(" %s\n", "-w, --warning=INTEGER"); - printf(" %s\n", _("Threshold which will result in a warning status")); - printf(" %s\n", "-c, --critical=INTEGER"); - printf(" %s\n", _("Threshold which will result in a critical status")); - printf(" %s\n", "-o, --osversion"); - printf(" %s\n", _("Include server version string in results")); - - printf(UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); - - printf("\n"); - printf("%s\n", _("Notes:")); - printf(" %s\n", _("- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG")); - printf(" %s\n", _(" extension for NetWare be loaded on the Novell servers you wish to check.")); - printf(" %s\n", _(" (available from http://www.engr.wisc.edu/~drews/mrtg/)")); - printf(" %s\n", _("- Values for critical thresholds should be lower than warning thresholds")); - printf(" %s\n", _(" when the following variables are checked: VPF, VKF, LTCH, CBUFF, DCB, ")); - printf(" %s\n", _(" TCB, LRUS and LRUM.")); - - printf(UT_SUPPORT); -} - -void print_usage(void) { - printf("%s\n", _("Usage:")); - printf("%s -H host [-p port] [-v variable] [-w warning] [-c critical] [-t timeout]\n", progname); -} -- cgit v1.2.3-74-g34f1 From a14b2b35776c7550123ce58af571913eb9d7819f Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 15:29:36 +0100 Subject: Refactor check_procs --- plugins/Makefile.am | 1 + plugins/check_procs.c | 335 ++++++++++++++++++++--------------------- plugins/check_procs.d/config.h | 75 +++++++++ 3 files changed, 243 insertions(+), 168 deletions(-) create mode 100644 plugins/check_procs.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6c582a15..0920adce 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -63,6 +63,7 @@ EXTRA_DIST = t \ check_mrtg.d \ check_apt.d \ check_pgsql.d \ + check_procs.d \ check_by_ssh.d \ check_smtp.d \ check_mysql.d \ diff --git a/plugins/check_procs.c b/plugins/check_procs.c index da2198a7..83e6864e 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c @@ -44,6 +44,7 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils_cmd.h" #include "regex.h" #include "states.h" +#include "check_procs.d/config.h" #include #include @@ -52,17 +53,17 @@ const char *email = "devel@monitoring-plugins.org"; # include #endif -static int process_arguments(int /*argc*/, char ** /*argv*/); -static int validate_arguments(void); -static int convert_to_seconds(char * /*etime*/); +typedef struct { + int errorcode; + check_procs_config config; +} check_procs_config_wrapper; +static check_procs_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_procs_config_wrapper validate_arguments(check_procs_config_wrapper /*config_wrapper*/); + +static int convert_to_seconds(char * /*etime*/, enum metric /*metric*/); static void print_help(void); void print_usage(void); -static char *warning_range = NULL; -static char *critical_range = NULL; -static thresholds *procs_thresholds = NULL; - -static int options = 0; /* bitmask of filter criteria to test against */ #define ALL 1 #define STAT 2 #define PPID 4 @@ -80,36 +81,7 @@ static int options = 0; /* bitmask of filter criteria to test against */ "kthreadd" /* the parent process of kernel threads: \ ppid of procs are compared to pid of this proc*/ -/* Different metrics */ -char *metric_name; -enum metric { - METRIC_PROCS, - METRIC_VSZ, - METRIC_RSS, - METRIC_CPU, - METRIC_ELAPSED -}; -enum metric metric = METRIC_PROCS; - static int verbose = 0; -static uid_t uid; -static pid_t ppid; -static int vsz; -static int rss; -static float pcpu; -static char *statopts; -static char *prog; -static char *exclude_progs; -static char **exclude_progs_arr = NULL; -static char exclude_progs_counter = 0; -static char *args; -static char *input_filename = NULL; -static regex_t re_args; -static char *fmt; -static char *fails; -static char tmp[MAX_INPUT_BUFFER]; -static bool kthread_filter = false; -static bool usepid = false; /* whether to test for pid or /proc/pid/exe */ static int stat_exe(const pid_t pid, struct stat *buf) { char *path; @@ -125,27 +97,27 @@ int main(int argc, char **argv) { bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - xasprintf(&metric_name, "PROCS"); - metric = METRIC_PROCS; - /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - if (process_arguments(argc, argv) == ERROR) { + check_procs_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + check_procs_config config = tmp_config.config; + /* find ourself */ pid_t mypid = getpid(); pid_t myppid = getppid(); dev_t mydev = 0; ino_t myino = 0; struct stat statbuf; - if (usepid || stat_exe(mypid, &statbuf) == -1) { + if (config.usepid || stat_exe(mypid, &statbuf) == -1) { /* usepid might have been set by -T */ - usepid = true; + config.usepid = true; } else { - usepid = false; + config.usepid = false; mydev = statbuf.st_dev; myino = statbuf.st_ino; } @@ -163,14 +135,14 @@ int main(int argc, char **argv) { output chld_out; output chld_err; mp_state_enum result = STATE_UNKNOWN; - if (input_filename == NULL) { + if (config.input_filename == NULL) { result = cmd_run(PS_COMMAND, &chld_out, &chld_err, 0); if (chld_err.lines > 0) { printf("%s: %s", _("System call sent warnings to stderr"), chld_err.line[0]); exit(STATE_WARNING); } } else { - result = cmd_file_read(input_filename, &chld_out, 0); + result = cmd_file_read(config.input_filename, &chld_out, 0); } int pos; /* number of spaces before 'args' in `ps` output */ @@ -222,7 +194,7 @@ int main(int argc, char **argv) { strcpy(procprog, base_name(procprog)); /* we need to convert the elapsed time to seconds */ - procseconds = convert_to_seconds(procetime); + procseconds = convert_to_seconds(procetime, config.metric); if (verbose >= 3) { printf("proc#=%d uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s prog=%s args=%s\n", procs, procuid, procvsz, @@ -231,8 +203,8 @@ int main(int argc, char **argv) { /* Ignore self */ int ret = 0; - if ((usepid && mypid == procpid) || - (((!usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino)) || + if ((config.usepid && mypid == procpid) || + (((!config.usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino)) || (ret == -1 && errno == ENOENT))) { if (verbose >= 3) { printf("not considering - is myself or gone\n"); @@ -256,10 +228,10 @@ int main(int argc, char **argv) { } /* Ignore excluded processes by name */ - if (options & EXCLUDE_PROGS) { + if (config.options & EXCLUDE_PROGS) { bool found = false; - for (int i = 0; i < (exclude_progs_counter); i++) { - if (!strcmp(procprog, exclude_progs_arr[i])) { + for (int i = 0; i < (config.exclude_progs_counter); i++) { + if (!strcmp(procprog, config.exclude_progs_arr[i])) { found = true; } } @@ -275,7 +247,7 @@ int main(int argc, char **argv) { /* filter kernel threads (children of KTHREAD_PARENT)*/ /* TODO adapt for other OSes than GNU/Linux sorry for not doing that, but I've no other OSes to test :-( */ - if (kthread_filter) { + if (config.kthread_filter) { /* get pid KTHREAD_PARENT */ if (kthread_ppid == 0 && !strcmp(procprog, KTHREAD_PARENT)) { kthread_ppid = procpid; @@ -289,38 +261,38 @@ int main(int argc, char **argv) { } } - if ((options & STAT) && (strstr(procstat, statopts))) { + if ((config.options & STAT) && (strstr(procstat, config.statopts))) { resultsum |= STAT; } - if ((options & ARGS) && procargs && (strstr(procargs, args) != NULL)) { + if ((config.options & ARGS) && procargs && (strstr(procargs, config.args) != NULL)) { resultsum |= ARGS; } - if ((options & EREG_ARGS) && procargs && (regexec(&re_args, procargs, (size_t)0, NULL, 0) == 0)) { + if ((config.options & EREG_ARGS) && procargs && (regexec(&config.re_args, procargs, (size_t)0, NULL, 0) == 0)) { resultsum |= EREG_ARGS; } - if ((options & PROG) && procprog && (strcmp(prog, procprog) == 0)) { + if ((config.options & PROG) && procprog && (strcmp(config.prog, procprog) == 0)) { resultsum |= PROG; } - if ((options & PPID) && (procppid == ppid)) { + if ((config.options & PPID) && (procppid == config.ppid)) { resultsum |= PPID; } - if ((options & USER) && (procuid == uid)) { + if ((config.options & USER) && (procuid == config.uid)) { resultsum |= USER; } - if ((options & VSZ) && (procvsz >= vsz)) { + if ((config.options & VSZ) && (procvsz >= config.vsz)) { resultsum |= VSZ; } - if ((options & RSS) && (procrss >= rss)) { + if ((config.options & RSS) && (procrss >= config.rss)) { resultsum |= RSS; } - if ((options & PCPU) && (procpcpu >= pcpu)) { + if ((config.options & PCPU) && (procpcpu >= config.pcpu)) { resultsum |= PCPU; } found++; /* Next line if filters not matched */ - if (!(options == resultsum || options == ALL)) { + if (!(config.options == resultsum || config.options == ALL)) { continue; } @@ -331,27 +303,27 @@ int main(int argc, char **argv) { } mp_state_enum temporary_result = STATE_OK; - if (metric == METRIC_VSZ) { - temporary_result = get_status((double)procvsz, procs_thresholds); - } else if (metric == METRIC_RSS) { - temporary_result = get_status((double)procrss, procs_thresholds); + if (config.metric == METRIC_VSZ) { + temporary_result = get_status((double)procvsz, config.procs_thresholds); + } else if (config.metric == METRIC_RSS) { + temporary_result = get_status((double)procrss, config.procs_thresholds); } /* TODO? float thresholds for --metric=CPU */ - else if (metric == METRIC_CPU) { - temporary_result = get_status(procpcpu, procs_thresholds); - } else if (metric == METRIC_ELAPSED) { - temporary_result = get_status((double)procseconds, procs_thresholds); + else if (config.metric == METRIC_CPU) { + temporary_result = get_status(procpcpu, config.procs_thresholds); + } else if (config.metric == METRIC_ELAPSED) { + temporary_result = get_status((double)procseconds, config.procs_thresholds); } - if (metric != METRIC_PROCS) { + if (config.metric != METRIC_PROCS) { if (temporary_result == STATE_WARNING) { warn++; - xasprintf(&fails, "%s%s%s", fails, (strcmp(fails, "") ? ", " : ""), procprog); + xasprintf(&config.fails, "%s%s%s", config.fails, (strcmp(config.fails, "") ? ", " : ""), procprog); result = max_state(result, temporary_result); } if (temporary_result == STATE_CRITICAL) { crit++; - xasprintf(&fails, "%s%s%s", fails, (strcmp(fails, "") ? ", " : ""), procprog); + xasprintf(&config.fails, "%s%s%s", config.fails, (strcmp(config.fails, "") ? ", " : ""), procprog); result = max_state(result, temporary_result); } } @@ -372,35 +344,36 @@ int main(int argc, char **argv) { } /* Needed if procs found, but none match filter */ - if (metric == METRIC_PROCS) { - result = max_state(result, get_status((double)procs, procs_thresholds)); + if (config.metric == METRIC_PROCS) { + result = max_state(result, get_status((double)procs, config.procs_thresholds)); } if (result == STATE_OK) { - printf("%s %s: ", metric_name, _("OK")); + printf("%s %s: ", config.metric_name, _("OK")); } else if (result == STATE_WARNING) { - printf("%s %s: ", metric_name, _("WARNING")); - if (metric != METRIC_PROCS) { + printf("%s %s: ", config.metric_name, _("WARNING")); + if (config.metric != METRIC_PROCS) { printf(_("%d warn out of "), warn); } } else if (result == STATE_CRITICAL) { - printf("%s %s: ", metric_name, _("CRITICAL")); - if (metric != METRIC_PROCS) { + printf("%s %s: ", config.metric_name, _("CRITICAL")); + if (config.metric != METRIC_PROCS) { printf(_("%d crit, %d warn out of "), crit, warn); } } printf(ngettext("%d process", "%d processes", (unsigned long)procs), procs); - if (strcmp(fmt, "") != 0) { - printf(_(" with %s"), fmt); + if (strcmp(config.fmt, "") != 0) { + printf(_(" with %s"), config.fmt); } - if (verbose >= 1 && strcmp(fails, "")) { - printf(" [%s]", fails); + if (verbose >= 1 && strcmp(config.fails, "")) { + printf(" [%s]", config.fails); } - if (metric == METRIC_PROCS) { - printf(" | procs=%d;%s;%s;0;", procs, warning_range ? warning_range : "", critical_range ? critical_range : ""); + if (config.metric == METRIC_PROCS) { + printf(" | procs=%d;%s;%s;0;", procs, config.warning_range ? config.warning_range : "", + config.critical_range ? config.critical_range : ""); } else { printf(" | procs=%d;;;0; procs_warn=%d;;;0; procs_crit=%d;;;0;", procs, warn, crit); } @@ -410,7 +383,7 @@ int main(int argc, char **argv) { } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_procs_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, {"metric", required_argument, 0, 'm'}, @@ -440,6 +413,11 @@ int process_arguments(int argc, char **argv) { } } + check_procs_config_wrapper result = { + .errorcode = OK, + .config = check_procs_config_init(), + }; + while (true) { int option = 0; int option_index = getopt_long(argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T:X:", longopts, &option); @@ -465,32 +443,36 @@ int process_arguments(int argc, char **argv) { } break; case 'c': /* critical threshold */ - critical_range = optarg; + result.config.critical_range = optarg; break; case 'w': /* warning threshold */ - warning_range = optarg; + result.config.warning_range = optarg; break; - case 'p': /* process id */ - if (sscanf(optarg, "%d%[^0-9]", &ppid, tmp) == 1) { - xasprintf(&fmt, "%s%sPPID = %d", (fmt ? fmt : ""), (options ? ", " : ""), ppid); - options |= PPID; + case 'p': { /* process id */ + static char tmp[MAX_INPUT_BUFFER]; + if (sscanf(optarg, "%d%[^0-9]", &result.config.ppid, tmp) == 1) { + xasprintf(&result.config.fmt, "%s%sPPID = %d", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.ppid); + result.config.options |= PPID; break; } usage4(_("Parent Process ID must be an integer!")); + } case 's': /* status */ - if (statopts) { + if (result.config.statopts) { break; } else { - statopts = optarg; + result.config.statopts = optarg; } - xasprintf(&fmt, _("%s%sSTATE = %s"), (fmt ? fmt : ""), (options ? ", " : ""), statopts); - options |= STAT; + xasprintf(&result.config.fmt, _("%s%sSTATE = %s"), (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.statopts); + result.config.options |= STAT; break; case 'u': /* user or user id */ { struct passwd *pw; if (is_integer(optarg)) { - uid = atoi(optarg); - pw = getpwuid(uid); + result.config.uid = atoi(optarg); + pw = getpwuid(result.config.uid); /* check to be sure user exists */ if (pw == NULL) { usage2(_("UID was not found"), optarg); @@ -502,56 +484,61 @@ int process_arguments(int argc, char **argv) { usage2(_("User name was not found"), optarg); } /* then get uid */ - uid = pw->pw_uid; + result.config.uid = pw->pw_uid; } char *user = pw->pw_name; - xasprintf(&fmt, "%s%sUID = %d (%s)", (fmt ? fmt : ""), (options ? ", " : ""), uid, user); - options |= USER; + xasprintf(&result.config.fmt, "%s%sUID = %d (%s)", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.uid, user); + result.config.options |= USER; } break; case 'C': /* command */ /* TODO: allow this to be passed in with --metric */ - if (prog) { + if (result.config.prog) { break; } else { - prog = optarg; + result.config.prog = optarg; } - xasprintf(&fmt, _("%s%scommand name '%s'"), (fmt ? fmt : ""), (options ? ", " : ""), prog); - options |= PROG; + xasprintf(&result.config.fmt, _("%s%scommand name '%s'"), (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.prog); + result.config.options |= PROG; break; case 'X': - if (exclude_progs) { + if (result.config.exclude_progs) { break; } else { - exclude_progs = optarg; + result.config.exclude_progs = optarg; } - xasprintf(&fmt, _("%s%sexclude progs '%s'"), (fmt ? fmt : ""), (options ? ", " : ""), exclude_progs); - char *tmp_pointer = strtok(exclude_progs, ","); + xasprintf(&result.config.fmt, _("%s%sexclude progs '%s'"), (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.exclude_progs); + char *tmp_pointer = strtok(result.config.exclude_progs, ","); while (tmp_pointer) { - exclude_progs_arr = realloc(exclude_progs_arr, sizeof(char *) * ++exclude_progs_counter); - exclude_progs_arr[exclude_progs_counter - 1] = tmp_pointer; + result.config.exclude_progs_arr = + realloc(result.config.exclude_progs_arr, sizeof(char *) * ++result.config.exclude_progs_counter); + result.config.exclude_progs_arr[result.config.exclude_progs_counter - 1] = tmp_pointer; tmp_pointer = strtok(NULL, ","); } - options |= EXCLUDE_PROGS; + result.config.options |= EXCLUDE_PROGS; break; case 'a': /* args (full path name with args) */ /* TODO: allow this to be passed in with --metric */ - if (args) { + if (result.config.args) { break; } else { - args = optarg; + result.config.args = optarg; } - xasprintf(&fmt, "%s%sargs '%s'", (fmt ? fmt : ""), (options ? ", " : ""), args); - options |= ARGS; + xasprintf(&result.config.fmt, "%s%sargs '%s'", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.args); + result.config.options |= ARGS; break; case CHAR_MAX + 1: { int cflags = REG_NOSUB | REG_EXTENDED; - int err = regcomp(&re_args, optarg, cflags); + int err = regcomp(&result.config.re_args, optarg, cflags); if (err != 0) { char errbuf[MAX_INPUT_BUFFER]; - regerror(err, &re_args, errbuf, MAX_INPUT_BUFFER); + regerror(err, &result.config.re_args, errbuf, MAX_INPUT_BUFFER); die(STATE_UNKNOWN, "PROCS %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf); } /* Strip off any | within the regex optarg */ @@ -563,119 +550,131 @@ int process_arguments(int argc, char **argv) { } index++; } - xasprintf(&fmt, "%s%sregex args '%s'", (fmt ? fmt : ""), (options ? ", " : ""), temp_string); - options |= EREG_ARGS; + xasprintf(&result.config.fmt, "%s%sregex args '%s'", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), temp_string); + result.config.options |= EREG_ARGS; } break; - case 'r': /* RSS */ - if (sscanf(optarg, "%d%[^0-9]", &rss, tmp) == 1) { - xasprintf(&fmt, "%s%sRSS >= %d", (fmt ? fmt : ""), (options ? ", " : ""), rss); - options |= RSS; + case 'r': { /* RSS */ + static char tmp[MAX_INPUT_BUFFER]; + if (sscanf(optarg, "%d%[^0-9]", &result.config.rss, tmp) == 1) { + xasprintf(&result.config.fmt, "%s%sRSS >= %d", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.rss); + result.config.options |= RSS; break; } usage4(_("RSS must be an integer!")); - case 'z': /* VSZ */ - if (sscanf(optarg, "%d%[^0-9]", &vsz, tmp) == 1) { - xasprintf(&fmt, "%s%sVSZ >= %d", (fmt ? fmt : ""), (options ? ", " : ""), vsz); - options |= VSZ; + } + case 'z': { /* VSZ */ + static char tmp[MAX_INPUT_BUFFER]; + if (sscanf(optarg, "%d%[^0-9]", &result.config.vsz, tmp) == 1) { + xasprintf(&result.config.fmt, "%s%sVSZ >= %d", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.vsz); + result.config.options |= VSZ; break; } usage4(_("VSZ must be an integer!")); - case 'P': /* PCPU */ + } + case 'P': { /* PCPU */ /* TODO: -P 1.5.5 is accepted */ - if (sscanf(optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) { - xasprintf(&fmt, "%s%sPCPU >= %.2f", (fmt ? fmt : ""), (options ? ", " : ""), pcpu); - options |= PCPU; + static char tmp[MAX_INPUT_BUFFER]; + if (sscanf(optarg, "%f%[^0-9.]", &result.config.pcpu, tmp) == 1) { + xasprintf(&result.config.fmt, "%s%sPCPU >= %.2f", (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.pcpu); + result.config.options |= PCPU; break; } usage4(_("PCPU must be a float!")); + } case 'm': - xasprintf(&metric_name, "%s", optarg); + xasprintf(&result.config.metric_name, "%s", optarg); if (strcmp(optarg, "PROCS") == 0) { - metric = METRIC_PROCS; + result.config.metric = METRIC_PROCS; break; } if (strcmp(optarg, "VSZ") == 0) { - metric = METRIC_VSZ; + result.config.metric = METRIC_VSZ; break; } if (strcmp(optarg, "RSS") == 0) { - metric = METRIC_RSS; + result.config.metric = METRIC_RSS; break; } if (strcmp(optarg, "CPU") == 0) { - metric = METRIC_CPU; + result.config.metric = METRIC_CPU; break; } if (strcmp(optarg, "ELAPSED") == 0) { - metric = METRIC_ELAPSED; + result.config.metric = METRIC_ELAPSED; break; } usage4(_("Metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!")); case 'k': /* linux kernel thread filter */ - kthread_filter = true; + result.config.kthread_filter = true; break; case 'v': /* command */ verbose++; break; case 'T': - usepid = true; + result.config.usepid = true; break; case CHAR_MAX + 2: - input_filename = optarg; + result.config.input_filename = optarg; break; } } int index = optind; - if ((!warning_range) && argv[index]) { - warning_range = argv[index++]; + if ((!result.config.warning_range) && argv[index]) { + result.config.warning_range = argv[index++]; } - if ((!critical_range) && argv[index]) { - critical_range = argv[index++]; + if ((!result.config.critical_range) && argv[index]) { + result.config.critical_range = argv[index++]; } - if (statopts == NULL && argv[index]) { - xasprintf(&statopts, "%s", argv[index++]); - xasprintf(&fmt, _("%s%sSTATE = %s"), (fmt ? fmt : ""), (options ? ", " : ""), statopts); - options |= STAT; + if (result.config.statopts == NULL && argv[index]) { + xasprintf(&result.config.statopts, "%s", argv[index++]); + xasprintf(&result.config.fmt, _("%s%sSTATE = %s"), (result.config.fmt ? result.config.fmt : ""), + (result.config.options ? ", " : ""), result.config.statopts); + result.config.options |= STAT; } /* this will abort in case of invalid ranges */ - set_thresholds(&procs_thresholds, warning_range, critical_range); + set_thresholds(&result.config.procs_thresholds, result.config.warning_range, result.config.critical_range); - return validate_arguments(); + return validate_arguments(result); } -int validate_arguments() { - if (options == 0) { - options = ALL; +check_procs_config_wrapper validate_arguments(check_procs_config_wrapper config_wrapper) { + if (config_wrapper.config.options == 0) { + config_wrapper.config.options = ALL; } - if (statopts == NULL) { - statopts = strdup(""); + if (config_wrapper.config.statopts == NULL) { + config_wrapper.config.statopts = strdup(""); } - if (prog == NULL) { - prog = strdup(""); + if (config_wrapper.config.prog == NULL) { + config_wrapper.config.prog = strdup(""); } - if (args == NULL) { - args = strdup(""); + if (config_wrapper.config.args == NULL) { + config_wrapper.config.args = strdup(""); } - if (fmt == NULL) { - fmt = strdup(""); + if (config_wrapper.config.fmt == NULL) { + config_wrapper.config.fmt = strdup(""); } - if (fails == NULL) { - fails = strdup(""); + if (config_wrapper.config.fails == NULL) { + config_wrapper.config.fails = strdup(""); } - return options; + // return options; + return config_wrapper; } /* convert the elapsed time to seconds */ -int convert_to_seconds(char *etime) { +int convert_to_seconds(char *etime, enum metric metric) { int hyphcnt = 0; int coloncnt = 0; for (char *ptr = etime; *ptr != '\0'; ptr++) { diff --git a/plugins/check_procs.d/config.h b/plugins/check_procs.d/config.h new file mode 100644 index 00000000..815809d4 --- /dev/null +++ b/plugins/check_procs.d/config.h @@ -0,0 +1,75 @@ +#pragma once + +#include "../../config.h" +#include "regex.h" +#include "thresholds.h" +#include +#include +#include + +enum metric { + METRIC_PROCS, + METRIC_VSZ, + METRIC_RSS, + METRIC_CPU, + METRIC_ELAPSED +}; + +typedef struct { + int options; /* bitmask of filter criteria to test against */ + enum metric metric; + char *metric_name; + char *input_filename; + char *prog; + char *args; + char *fmt; + char *fails; + char *exclude_progs; + char **exclude_progs_arr; + char exclude_progs_counter; + regex_t re_args; + + bool kthread_filter; + bool usepid; /* whether to test for pid or /proc/pid/exe */ + uid_t uid; + pid_t ppid; + int vsz; + int rss; + float pcpu; + char *statopts; + + char *warning_range; + char *critical_range; + thresholds *procs_thresholds; +} check_procs_config; + +check_procs_config check_procs_config_init() { + check_procs_config tmp = { + .options = 0, + .metric = METRIC_PROCS, + .metric_name = strdup("PROCS"), + .input_filename = NULL, + .prog = NULL, + .args = NULL, + .fmt = NULL, + .fails = NULL, + .exclude_progs = NULL, + .exclude_progs_arr = NULL, + .exclude_progs_counter = 0, + .re_args = {}, + + .kthread_filter = false, + .usepid = false, + .uid = {}, + .ppid = {}, + .vsz = 0, + .rss = 0, + .pcpu = 0, + .statopts = NULL, + + .warning_range = NULL, + .critical_range = NULL, + .procs_thresholds = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 3008d521c1284f6f182d9cc10d56afdaa3978a04 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:51:02 +0100 Subject: Refactor check_radius --- plugins/Makefile.am | 1 + plugins/check_radius.c | 126 +++++++++++++++++++++++----------------- plugins/check_radius.d/config.h | 42 ++++++++++++++ 3 files changed, 115 insertions(+), 54 deletions(-) create mode 100644 plugins/check_radius.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6c582a15..dacd36e8 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -53,6 +53,7 @@ EXTRA_DIST = t \ check_ldap.d \ check_hpjd.d \ check_game.d \ + check_radius.d \ check_nagios.d \ check_dbi.d \ check_ssh.d \ diff --git a/plugins/check_radius.c b/plugins/check_radius.c index ab7c6519..6a27e113 100644 --- a/plugins/check_radius.c +++ b/plugins/check_radius.c @@ -36,6 +36,7 @@ const char *email = "devel@monitoring-plugins.org"; #include "utils.h" #include "netutils.h" #include "states.h" +#include "check_radius.d/config.h" #if defined(HAVE_LIBRADCLI) # include @@ -47,7 +48,11 @@ const char *email = "devel@monitoring-plugins.org"; # include #endif -static int process_arguments(int /*argc*/, char ** /*argv*/); +typedef struct { + int errorcode; + check_radius_config config; +} check_radius_config_wrapper; +static check_radius_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); @@ -79,21 +84,8 @@ void print_usage(void); # define REJECT_RC BADRESP_RC #endif -static int my_rc_read_config(char * /*a*/); +static int my_rc_read_config(char * /*a*/, rc_handle ** /*rch*/); -#if defined(HAVE_LIBFREERADIUS_CLIENT) || defined(HAVE_LIBRADIUSCLIENT_NG) || defined(HAVE_LIBRADCLI) -static rc_handle *rch = NULL; -#endif - -static char *server = NULL; -static char *username = NULL; -static char *password = NULL; -static char *nasid = NULL; -static char *nasipaddress = NULL; -static char *expect = NULL; -static char *config_file = NULL; -static unsigned short port = PW_AUTH_UDP_PORT; -static int retries = 1; static bool verbose = false; /****************************************************************************** @@ -157,12 +149,20 @@ 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_radius_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + check_radius_config config = tmp_config.config; + +#if defined(HAVE_LIBFREERADIUS_CLIENT) || defined(HAVE_LIBRADIUSCLIENT_NG) || defined(HAVE_LIBRADCLI) + rc_handle *rch = NULL; +#endif + char *str = strdup("dictionary"); - if ((config_file && my_rc_read_config(config_file)) || my_rc_read_dictionary(my_rc_conf_str(str))) { + if ((config.config_file && my_rc_read_config(config.config_file, &rch)) || my_rc_read_dictionary(my_rc_conf_str(str))) { die(STATE_UNKNOWN, _("Config file error\n")); } @@ -171,36 +171,36 @@ int main(int argc, char **argv) { SEND_DATA data; memset(&data, 0, sizeof(data)); if (!(my_rc_avpair_add(&data.send_pairs, PW_SERVICE_TYPE, &service, 0) && - my_rc_avpair_add(&data.send_pairs, PW_USER_NAME, username, 0) && - my_rc_avpair_add(&data.send_pairs, PW_USER_PASSWORD, password, 0))) { + my_rc_avpair_add(&data.send_pairs, PW_USER_NAME, config.username, 0) && + my_rc_avpair_add(&data.send_pairs, PW_USER_PASSWORD, config.password, 0))) { die(STATE_UNKNOWN, _("Out of Memory?\n")); } - if (nasid != NULL) { - if (!(my_rc_avpair_add(&data.send_pairs, PW_NAS_IDENTIFIER, nasid, 0))) { + if (config.nas_id != NULL) { + if (!(my_rc_avpair_add(&data.send_pairs, PW_NAS_IDENTIFIER, config.nas_id, 0))) { die(STATE_UNKNOWN, _("Invalid NAS-Identifier\n")); } } char name[HOST_NAME_MAX]; - if (nasipaddress == NULL) { + if (config.nas_ip_address == NULL) { if (gethostname(name, sizeof(name)) != 0) { die(STATE_UNKNOWN, _("gethostname() failed!\n")); } - nasipaddress = name; + config.nas_ip_address = name; } - struct sockaddr_storage ss; - if (!dns_lookup(nasipaddress, &ss, AF_INET)) { /* TODO: Support IPv6. */ + struct sockaddr_storage radius_server_socket; + if (!dns_lookup(config.nas_ip_address, &radius_server_socket, AF_INET)) { /* TODO: Support IPv6. */ die(STATE_UNKNOWN, _("Invalid NAS-IP-Address\n")); } - uint32_t client_id = ntohl(((struct sockaddr_in *)&ss)->sin_addr.s_addr); + uint32_t client_id = ntohl(((struct sockaddr_in *)&radius_server_socket)->sin_addr.s_addr); if (my_rc_avpair_add(&(data.send_pairs), PW_NAS_IP_ADDRESS, &client_id, 0) == NULL) { die(STATE_UNKNOWN, _("Invalid NAS-IP-Address\n")); } - my_rc_buildreq(&data, PW_ACCESS_REQUEST, server, port, (int)timeout_interval, retries); + my_rc_buildreq(&data, PW_ACCESS_REQUEST, config.server, config.port, (int)timeout_interval, config.retries); #ifdef RC_BUFFER_LEN char msg[RC_BUFFER_LEN]; @@ -208,36 +208,49 @@ int main(int argc, char **argv) { char msg[BUFFER_LEN]; #endif - mp_state_enum result = my_rc_send_server(&data, msg); + int result = my_rc_send_server(&data, msg); rc_avpair_free(data.send_pairs); if (data.receive_pairs) { rc_avpair_free(data.receive_pairs); } if (result == TIMEOUT_RC) { - die(STATE_CRITICAL, _("Timeout\n")); + printf("Timeout\n"); + exit(STATE_CRITICAL); } + if (result == ERROR_RC) { - die(STATE_CRITICAL, _("Auth Error\n")); + printf(_("Auth Error\n")); + exit(STATE_CRITICAL); } + if (result == REJECT_RC) { - die(STATE_WARNING, _("Auth Failed\n")); + printf(_("Auth Failed\n")); + exit(STATE_WARNING); } + if (result == BADRESP_RC) { - die(STATE_WARNING, _("Bad Response\n")); + printf(_("Bad Response\n")); + exit(STATE_WARNING); } - if (expect && !strstr(msg, expect)) { - die(STATE_WARNING, "%s\n", msg); + + if (config.expect && !strstr(msg, config.expect)) { + printf("%s\n", msg); + exit(STATE_WARNING); } + if (result == OK_RC) { - die(STATE_OK, _("Auth OK\n")); + printf(_("Auth OK\n")); + exit(STATE_OK); } + (void)snprintf(msg, sizeof(msg), _("Unexpected result code %d"), result); - die(STATE_UNKNOWN, "%s\n", msg); + printf("%s\n", msg); + exit(STATE_UNKNOWN); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_radius_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"port", required_argument, 0, 'P'}, {"username", required_argument, 0, 'u'}, {"password", required_argument, 0, 'p'}, {"nas-id", required_argument, 0, 'n'}, {"nas-ip-address", required_argument, 0, 'N'}, @@ -246,6 +259,11 @@ int process_arguments(int argc, char **argv) { {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_radius_config_wrapper result = { + .errorcode = OK, + .config = check_radius_config_init(), + }; + while (true) { int option = 0; int option_index = getopt_long(argc, argv, "+hVvH:P:F:u:p:n:N:t:r:e:", longopts, &option); @@ -270,20 +288,20 @@ int process_arguments(int argc, char **argv) { if (!is_host(optarg)) { usage2(_("Invalid hostname/address"), optarg); } - server = optarg; + result.config.server = optarg; break; case 'P': /* port */ if (is_intnonneg(optarg)) { - port = (unsigned short)atoi(optarg); + result.config.port = (unsigned short)atoi(optarg); } else { usage4(_("Port must be a positive integer")); } break; case 'u': /* username */ - username = optarg; + result.config.username = optarg; break; case 'p': /* password */ - password = strdup(optarg); + result.config.password = strdup(optarg); /* Delete the password from process list */ while (*optarg != '\0') { @@ -292,20 +310,20 @@ int process_arguments(int argc, char **argv) { } break; case 'n': /* nas id */ - nasid = optarg; + result.config.nas_id = optarg; break; case 'N': /* nas ip address */ - nasipaddress = optarg; + result.config.nas_ip_address = optarg; break; case 'F': /* configuration file */ - config_file = optarg; + result.config.config_file = optarg; break; case 'e': /* expect */ - expect = optarg; + result.config.expect = optarg; break; case 'r': /* retries */ if (is_intpos(optarg)) { - retries = atoi(optarg); + result.config.retries = atoi(optarg); } else { usage4(_("Number of retries must be a positive integer")); } @@ -320,20 +338,20 @@ int process_arguments(int argc, char **argv) { } } - if (server == NULL) { + if (result.config.server == NULL) { usage4(_("Hostname was not supplied")); } - if (username == NULL) { + if (result.config.username == NULL) { usage4(_("User not specified")); } - if (password == NULL) { + if (result.config.password == NULL) { usage4(_("Password not specified")); } - if (config_file == NULL) { + if (result.config.config_file == NULL) { usage4(_("Configuration file not specified")); } - return OK; + return result; } void print_help(void) { @@ -395,11 +413,11 @@ void print_usage(void) { progname); } -int my_rc_read_config(char *a) { +int my_rc_read_config(char *config_file_name, rc_handle **rch) { #if defined(HAVE_LIBFREERADIUS_CLIENT) || defined(HAVE_LIBRADIUSCLIENT_NG) || defined(HAVE_LIBRADCLI) - rch = rc_read_config(a); + *rch = rc_read_config(config_file_name); return (rch == NULL) ? 1 : 0; #else - return rc_read_config(a); + return rc_read_config(config_file_name); #endif } diff --git a/plugins/check_radius.d/config.h b/plugins/check_radius.d/config.h new file mode 100644 index 00000000..b27d31e7 --- /dev/null +++ b/plugins/check_radius.d/config.h @@ -0,0 +1,42 @@ +#pragma once + +#include "../../config.h" +#include +#if defined(HAVE_LIBRADCLI) +# include +#elif defined(HAVE_LIBFREERADIUS_CLIENT) +# include +#elif defined(HAVE_LIBRADIUSCLIENT_NG) +# include +#else +# include +#endif + +typedef struct { + char *server; + char *username; + char *password; + char *config_file; + char *nas_id; + char *nas_ip_address; + int retries; + unsigned short port; + + char *expect; +} check_radius_config; + +check_radius_config check_radius_config_init() { + check_radius_config tmp = { + .server = NULL, + .username = NULL, + .password = NULL, + .config_file = NULL, + .nas_id = NULL, + .nas_ip_address = NULL, + .retries = 1, + .port = PW_AUTH_UDP_PORT, + + .expect = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 97e65dddbda048f10b58ef8d190f2c0146a164a0 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:22:17 +0100 Subject: Refactor check_real --- plugins/Makefile.am | 1 + plugins/check_real.c | 167 +++++++++++++++++++++++------------------- plugins/check_real.d/config.h | 37 ++++++++++ 3 files changed, 130 insertions(+), 75 deletions(-) create mode 100644 plugins/check_real.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6c582a15..3269b9fb 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -55,6 +55,7 @@ EXTRA_DIST = t \ check_game.d \ check_nagios.d \ check_dbi.d \ + check_real.d \ check_ssh.d \ check_nt.d \ check_dns.d \ diff --git a/plugins/check_real.c b/plugins/check_real.c index 3737f69d..ec0928ed 100644 --- a/plugins/check_real.c +++ b/plugins/check_real.c @@ -28,6 +28,8 @@ * *****************************************************************************/ +#include "states.h" +#include const char *progname = "check_real"; const char *copyright = "2000-2024"; const char *email = "devel@monitoring-plugins.org"; @@ -35,27 +37,20 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" - -enum { - PORT = 554 -}; +#include "check_real.d/config.h" #define EXPECT "RTSP/1." #define URL "" -static int process_arguments(int, char **); +typedef struct { + int errorcode; + check_real_config config; +} check_real_config_wrapper; +static check_real_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); + static void print_help(void); void print_usage(void); -static int server_port = PORT; -static char *server_address; -static char *host_name; -static char *server_url = NULL; -static char *server_expect; -static int warning_time = 0; -static bool check_warning_time = false; -static int critical_time = 0; -static bool check_critical_time = false; static bool verbose = false; int main(int argc, char **argv) { @@ -66,10 +61,13 @@ 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_real_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_real_config config = tmp_config.config; + /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -79,40 +77,50 @@ int main(int argc, char **argv) { /* try to connect to the host at the given port number */ int socket; - if (my_tcp_connect(server_address, server_port, &socket) != STATE_OK) { - die(STATE_CRITICAL, _("Unable to connect to %s on port %d\n"), server_address, server_port); + if (my_tcp_connect(config.server_address, config.server_port, &socket) != STATE_OK) { + die(STATE_CRITICAL, _("Unable to connect to %s on port %d\n"), config.server_address, config.server_port); } /* Part I - Server Check */ /* send the OPTIONS request */ char buffer[MAX_INPUT_BUFFER]; - sprintf(buffer, "OPTIONS rtsp://%s:%d RTSP/1.0\r\n", host_name, server_port); - int result = send(socket, buffer, strlen(buffer), 0); + sprintf(buffer, "OPTIONS rtsp://%s:%d RTSP/1.0\r\n", config.host_name, config.server_port); + ssize_t sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending options to %s failed\n"), config.host_name); + } /* send the header sync */ sprintf(buffer, "CSeq: 1\r\n"); - result = send(socket, buffer, strlen(buffer), 0); + sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending header sync to %s failed\n"), config.host_name); + } /* send a newline so the server knows we're done with the request */ sprintf(buffer, "\r\n"); - result = send(socket, buffer, strlen(buffer), 0); + sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending newline to %s failed\n"), config.host_name); + } /* watch for the REAL connection string */ - result = recv(socket, buffer, MAX_INPUT_BUFFER - 1, 0); + ssize_t received_bytes = recv(socket, buffer, MAX_INPUT_BUFFER - 1, 0); /* return a CRITICAL status if we couldn't read any data */ - if (result == -1) { - die(STATE_CRITICAL, _("No data received from %s\n"), host_name); + if (received_bytes == -1) { + die(STATE_CRITICAL, _("No data received from %s\n"), config.host_name); } + mp_state_enum result = STATE_OK; char *status_line = NULL; /* make sure we find the response we are looking for */ - if (!strstr(buffer, server_expect)) { - if (server_port == PORT) { + if (!strstr(buffer, config.server_expect)) { + if (config.server_port == PORT) { printf("%s\n", _("Invalid REAL response received from host")); } else { - printf(_("Invalid REAL response received from host on port %d\n"), server_port); + printf(_("Invalid REAL response received from host on port %d\n"), config.server_port); } } else { /* else we got the REAL string, so check the return code */ @@ -121,7 +129,7 @@ int main(int argc, char **argv) { result = STATE_OK; - status_line = (char *)strtok(buffer, "\n"); + status_line = strtok(buffer, "\n"); if (strstr(status_line, "200")) { result = STATE_OK; @@ -138,10 +146,8 @@ int main(int argc, char **argv) { result = STATE_WARNING; } else if (strstr(status_line, "404")) { result = STATE_WARNING; - } - - /* server errors result in a critical state */ - else if (strstr(status_line, "500")) { + } else if (strstr(status_line, "500")) { + /* server errors result in a critical state */ result = STATE_CRITICAL; } else if (strstr(status_line, "501")) { result = STATE_CRITICAL; @@ -149,45 +155,52 @@ int main(int argc, char **argv) { result = STATE_CRITICAL; } else if (strstr(status_line, "503")) { result = STATE_CRITICAL; - } - - else { + } else { result = STATE_UNKNOWN; } } /* Part II - Check stream exists and is ok */ - if ((result == STATE_OK) && (server_url != NULL)) { + if ((result == STATE_OK) && (config.server_url != NULL)) { /* Part I - Server Check */ /* send the DESCRIBE request */ - sprintf(buffer, "DESCRIBE rtsp://%s:%d%s RTSP/1.0\r\n", host_name, server_port, server_url); - result = send(socket, buffer, strlen(buffer), 0); + sprintf(buffer, "DESCRIBE rtsp://%s:%d%s RTSP/1.0\r\n", config.host_name, config.server_port, config.server_url); + + ssize_t sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending DESCRIBE request to %s failed\n"), config.host_name); + } /* send the header sync */ sprintf(buffer, "CSeq: 2\r\n"); - result = send(socket, buffer, strlen(buffer), 0); + sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending DESCRIBE request to %s failed\n"), config.host_name); + } /* send a newline so the server knows we're done with the request */ sprintf(buffer, "\r\n"); - result = send(socket, buffer, strlen(buffer), 0); + sent_bytes = send(socket, buffer, strlen(buffer), 0); + if (sent_bytes == -1) { + die(STATE_CRITICAL, _("Sending DESCRIBE request to %s failed\n"), config.host_name); + } /* watch for the REAL connection string */ - result = recv(socket, buffer, MAX_INPUT_BUFFER - 1, 0); - buffer[result] = '\0'; /* null terminate received buffer */ - - /* return a CRITICAL status if we couldn't read any data */ - if (result == -1) { + ssize_t recv_bytes = recv(socket, buffer, MAX_INPUT_BUFFER - 1, 0); + if (recv_bytes == -1) { + /* return a CRITICAL status if we couldn't read any data */ printf(_("No data received from host\n")); result = STATE_CRITICAL; } else { + buffer[result] = '\0'; /* null terminate received buffer */ /* make sure we find the response we are looking for */ - if (!strstr(buffer, server_expect)) { - if (server_port == PORT) { + if (!strstr(buffer, config.server_expect)) { + if (config.server_port == PORT) { printf("%s\n", _("Invalid REAL response received from host")); } else { - printf(_("Invalid REAL response received from host on port %d\n"), server_port); + printf(_("Invalid REAL response received from host on port %d\n"), config.server_port); } } else { @@ -197,7 +210,7 @@ int main(int argc, char **argv) { result = STATE_OK; - status_line = (char *)strtok(buffer, "\n"); + status_line = strtok(buffer, "\n"); if (strstr(status_line, "200")) { result = STATE_OK; @@ -236,10 +249,9 @@ int main(int argc, char **argv) { /* Return results */ if (result == STATE_OK) { - - if (check_critical_time && (end_time - start_time) > critical_time) { + if (config.check_critical_time && (end_time - start_time) > config.critical_time) { result = STATE_CRITICAL; - } else if (check_warning_time && (end_time - start_time) > warning_time) { + } else if (config.check_warning_time && (end_time - start_time) > config.warning_time) { result = STATE_WARNING; } @@ -255,11 +267,11 @@ int main(int argc, char **argv) { /* reset the alarm */ alarm(0); - return result; + exit(result); } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_real_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"IPaddress", required_argument, 0, 'I'}, {"expect", required_argument, 0, 'e'}, {"url", required_argument, 0, 'u'}, {"port", required_argument, 0, 'p'}, {"critical", required_argument, 0, 'c'}, @@ -267,8 +279,14 @@ int process_arguments(int argc, char **argv) { {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_real_config_wrapper result = { + .errorcode = OK, + .config = check_real_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } for (int i = 1; i < argc; i++) { @@ -281,10 +299,9 @@ int process_arguments(int argc, char **argv) { } } - int option_char; while (true) { int option = 0; - option_char = getopt_long(argc, argv, "+hvVI:H:e:u:p:w:c:t:", longopts, &option); + int option_char = getopt_long(argc, argv, "+hvVI:H:e:u:p:w:c:t:", longopts, &option); if (option_char == -1 || option_char == EOF) { break; @@ -293,39 +310,39 @@ int process_arguments(int argc, char **argv) { switch (option_char) { case 'I': /* hostname */ case 'H': /* hostname */ - if (server_address) { + if (result.config.server_address) { break; } else if (is_host(optarg)) { - server_address = optarg; + result.config.server_address = optarg; } else { usage2(_("Invalid hostname/address"), optarg); } break; case 'e': /* string to expect in response header */ - server_expect = optarg; + result.config.server_expect = optarg; break; case 'u': /* server URL */ - server_url = optarg; + result.config.server_url = optarg; break; case 'p': /* port */ if (is_intpos(optarg)) { - server_port = atoi(optarg); + result.config.server_port = atoi(optarg); } else { usage4(_("Port must be a positive integer")); } break; case 'w': /* warning time threshold */ if (is_intnonneg(optarg)) { - warning_time = atoi(optarg); - check_warning_time = true; + result.config.warning_time = atoi(optarg); + result.config.check_warning_time = true; } else { usage4(_("Warning time must be a positive integer")); } break; case 'c': /* critical time threshold */ if (is_intnonneg(optarg)) { - critical_time = atoi(optarg); - check_critical_time = true; + result.config.critical_time = atoi(optarg); + result.config.check_critical_time = true; } else { usage4(_("Critical time must be a positive integer")); } @@ -351,28 +368,28 @@ int process_arguments(int argc, char **argv) { } } - option_char = optind; - if (server_address == NULL && argc > option_char) { + int option_char = optind; + if (result.config.server_address == NULL && argc > option_char) { if (is_host(argv[option_char])) { - server_address = argv[option_char++]; + result.config.server_address = argv[option_char++]; } else { usage2(_("Invalid hostname/address"), argv[option_char]); } } - if (server_address == NULL) { + if (result.config.server_address == NULL) { usage4(_("You must provide a server to check")); } - if (host_name == NULL) { - host_name = strdup(server_address); + if (result.config.host_name == NULL) { + result.config.host_name = strdup(result.config.server_address); } - if (server_expect == NULL) { - server_expect = strdup(EXPECT); + if (result.config.server_expect == NULL) { + result.config.server_expect = strdup(EXPECT); } - return OK; + return result; } void print_help(void) { diff --git a/plugins/check_real.d/config.h b/plugins/check_real.d/config.h new file mode 100644 index 00000000..c4663cf9 --- /dev/null +++ b/plugins/check_real.d/config.h @@ -0,0 +1,37 @@ +#pragma once + +#include "../../config.h" +#include + +enum { + PORT = 554 +}; + +typedef struct { + char *server_address; + char *host_name; + int server_port; + char *server_url; + + char *server_expect; + int warning_time; + bool check_warning_time; + int critical_time; + bool check_critical_time; +} check_real_config; + +check_real_config check_real_config_init() { + check_real_config tmp = { + .server_address = NULL, + .host_name = NULL, + .server_port = PORT, + .server_url = NULL, + + .server_expect = NULL, + .warning_time = 0, + .check_warning_time = false, + .critical_time = 0, + .check_critical_time = false, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 2d70bd3bc09ff95cd8525449925938ebf56cbfbb Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:14:54 +0100 Subject: Refactor check_time --- plugins/Makefile.am | 1 + plugins/check_time.c | 128 +++++++++++++++++++++--------------------- plugins/check_time.d/config.h | 42 ++++++++++++++ 3 files changed, 107 insertions(+), 64 deletions(-) create mode 100644 plugins/check_time.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index bb3f029e..5d03f160 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -54,6 +54,7 @@ EXTRA_DIST = t \ check_hpjd.d \ check_game.d \ check_radius.d \ + check_time.d \ check_nagios.d \ check_dbi.d \ check_real.d \ diff --git a/plugins/check_time.c b/plugins/check_time.c index 02b152c0..debf59f3 100644 --- a/plugins/check_time.c +++ b/plugins/check_time.c @@ -28,6 +28,7 @@ * *****************************************************************************/ +#include "states.h" const char *progname = "check_time"; const char *copyright = "1999-2024"; const char *email = "devel@monitoring-plugins.org"; @@ -35,28 +36,15 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" - -enum { - TIME_PORT = 37 -}; +#include "check_time.d/config.h" #define UNIX_EPOCH 2208988800UL -static uint32_t raw_server_time; -static unsigned long server_time, diff_time; -static int warning_time = 0; -static bool check_warning_time = false; -static int critical_time = 0; -static bool check_critical_time = false; -static unsigned long warning_diff = 0; -static bool check_warning_diff = false; -static unsigned long critical_diff = 0; -static bool check_critical_diff = false; -static int server_port = TIME_PORT; -static char *server_address = NULL; -static bool use_udp = false; - -static int process_arguments(int, char **); +typedef struct { + int errorcode; + check_time_config config; +} check_time_config_wrapper; +static check_time_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); static void print_help(void); void print_usage(void); @@ -68,10 +56,13 @@ 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_time_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + const check_time_config config = tmp_config.config; + /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -80,39 +71,40 @@ int main(int argc, char **argv) { time(&start_time); int socket; - int result = STATE_UNKNOWN; + mp_state_enum result = STATE_UNKNOWN; /* try to connect to the host at the given port number */ - if (use_udp) { - result = my_udp_connect(server_address, server_port, &socket); + if (config.use_udp) { + result = my_udp_connect(config.server_address, config.server_port, &socket); } else { - result = my_tcp_connect(server_address, server_port, &socket); + result = my_tcp_connect(config.server_address, config.server_port, &socket); } if (result != STATE_OK) { - if (check_critical_time) { + if (config.check_critical_time) { result = STATE_CRITICAL; - } else if (check_warning_time) { + } else if (config.check_warning_time) { result = STATE_WARNING; } else { result = STATE_UNKNOWN; } - die(result, _("TIME UNKNOWN - could not connect to server %s, port %d\n"), server_address, server_port); + die(result, _("TIME UNKNOWN - could not connect to server %s, port %d\n"), config.server_address, config.server_port); } - if (use_udp) { + if (config.use_udp) { if (send(socket, "", 0, 0) < 0) { - if (check_critical_time) { + if (config.check_critical_time) { result = STATE_CRITICAL; - } else if (check_warning_time) { + } else if (config.check_warning_time) { result = STATE_WARNING; } else { result = STATE_UNKNOWN; } - die(result, _("TIME UNKNOWN - could not send UDP request to server %s, port %d\n"), server_address, server_port); + die(result, _("TIME UNKNOWN - could not send UDP request to server %s, port %d\n"), config.server_address, config.server_port); } } /* watch for the connection string */ + uint32_t raw_server_time; result = recv(socket, (void *)&raw_server_time, sizeof(raw_server_time), 0); /* close the connection */ @@ -124,31 +116,33 @@ int main(int argc, char **argv) { /* return a WARNING status if we couldn't read any data */ if (result <= 0) { - if (check_critical_time) { + if (config.check_critical_time) { result = STATE_CRITICAL; - } else if (check_warning_time) { + } else if (config.check_warning_time) { result = STATE_WARNING; } else { result = STATE_UNKNOWN; } - die(result, _("TIME UNKNOWN - no data received from server %s, port %d\n"), server_address, server_port); + die(result, _("TIME UNKNOWN - no data received from server %s, port %d\n"), config.server_address, config.server_port); } result = STATE_OK; time_t conntime = (end_time - start_time); - if (check_critical_time && conntime > critical_time) { + if (config.check_critical_time && conntime > config.critical_time) { result = STATE_CRITICAL; - } else if (check_warning_time && conntime > warning_time) { + } else if (config.check_warning_time && conntime > config.warning_time) { result = STATE_WARNING; } if (result != STATE_OK) { die(result, _("TIME %s - %d second response time|%s\n"), state_text(result), (int)conntime, - perfdata("time", (long)conntime, "s", check_warning_time, (long)warning_time, check_critical_time, (long)critical_time, true, 0, - false, 0)); + perfdata("time", (long)conntime, "s", config.check_warning_time, (long)config.warning_time, config.check_critical_time, + (long)config.critical_time, true, 0, false, 0)); } + unsigned long server_time; + unsigned long diff_time; server_time = ntohl(raw_server_time) - UNIX_EPOCH; if (server_time > (unsigned long)end_time) { diff_time = server_time - (unsigned long)end_time; @@ -156,21 +150,22 @@ int main(int argc, char **argv) { diff_time = (unsigned long)end_time - server_time; } - if (check_critical_diff && diff_time > critical_diff) { + if (config.check_critical_diff && diff_time > config.critical_diff) { result = STATE_CRITICAL; - } else if (check_warning_diff && diff_time > warning_diff) { + } else if (config.check_warning_diff && diff_time > config.warning_diff) { result = STATE_WARNING; } printf(_("TIME %s - %lu second time difference|%s %s\n"), state_text(result), diff_time, - perfdata("time", (long)conntime, "s", check_warning_time, (long)warning_time, check_critical_time, (long)critical_time, true, 0, - false, 0), - perfdata("offset", diff_time, "s", check_warning_diff, warning_diff, check_critical_diff, critical_diff, true, 0, false, 0)); + perfdata("time", (long)conntime, "s", config.check_warning_time, (long)config.warning_time, config.check_critical_time, + (long)config.critical_time, true, 0, false, 0), + perfdata("offset", diff_time, "s", config.check_warning_diff, config.warning_diff, config.check_critical_diff, + config.critical_diff, true, 0, false, 0)); return result; } /* process command-line arguments */ -int process_arguments(int argc, char **argv) { +check_time_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"warning-variance", required_argument, 0, 'w'}, {"critical-variance", required_argument, 0, 'c'}, @@ -201,6 +196,11 @@ int process_arguments(int argc, char **argv) { } } + check_time_config_wrapper result = { + .errorcode = OK, + .config = check_time_config_init(), + }; + int option_char; while (true) { int option = 0; @@ -223,16 +223,16 @@ int process_arguments(int argc, char **argv) { if (!is_host(optarg)) { usage2(_("Invalid hostname/address"), optarg); } - server_address = optarg; + result.config.server_address = optarg; break; case 'w': /* warning-variance */ if (is_intnonneg(optarg)) { - warning_diff = strtoul(optarg, NULL, 10); - check_warning_diff = true; + result.config.warning_diff = strtoul(optarg, NULL, 10); + result.config.check_warning_diff = true; } else if (strspn(optarg, "0123456789:,") > 0) { - if (sscanf(optarg, "%lu%*[:,]%d", &warning_diff, &warning_time) == 2) { - check_warning_diff = true; - check_warning_time = true; + if (sscanf(optarg, "%lu%*[:,]%d", &result.config.warning_diff, &result.config.warning_time) == 2) { + result.config.check_warning_diff = true; + result.config.check_warning_time = true; } else { usage4(_("Warning thresholds must be a positive integer")); } @@ -242,12 +242,12 @@ int process_arguments(int argc, char **argv) { break; case 'c': /* critical-variance */ if (is_intnonneg(optarg)) { - critical_diff = strtoul(optarg, NULL, 10); - check_critical_diff = true; + result.config.critical_diff = strtoul(optarg, NULL, 10); + result.config.check_critical_diff = true; } else if (strspn(optarg, "0123456789:,") > 0) { - if (sscanf(optarg, "%lu%*[:,]%d", &critical_diff, &critical_time) == 2) { - check_critical_diff = true; - check_critical_time = true; + if (sscanf(optarg, "%lu%*[:,]%d", &result.config.critical_diff, &result.config.critical_time) == 2) { + result.config.check_critical_diff = true; + result.config.check_critical_time = true; } else { usage4(_("Critical thresholds must be a positive integer")); } @@ -259,23 +259,23 @@ int process_arguments(int argc, char **argv) { if (!is_intnonneg(optarg)) { usage4(_("Warning threshold must be a positive integer")); } else { - warning_time = atoi(optarg); + result.config.warning_time = atoi(optarg); } - check_warning_time = true; + result.config.check_warning_time = true; break; case 'C': /* critical-connect */ if (!is_intnonneg(optarg)) { usage4(_("Critical threshold must be a positive integer")); } else { - critical_time = atoi(optarg); + result.config.critical_time = atoi(optarg); } - check_critical_time = true; + result.config.check_critical_time = true; break; case 'p': /* port */ if (!is_intnonneg(optarg)) { usage4(_("Port must be a positive integer")); } else { - server_port = atoi(optarg); + result.config.server_port = atoi(optarg); } break; case 't': /* timeout */ @@ -286,23 +286,23 @@ int process_arguments(int argc, char **argv) { } break; case 'u': /* udp */ - use_udp = true; + result.config.use_udp = true; } } option_char = optind; - if (server_address == NULL) { + if (result.config.server_address == NULL) { if (argc > option_char) { if (!is_host(argv[option_char])) { usage2(_("Invalid hostname/address"), optarg); } - server_address = argv[option_char]; + result.config.server_address = argv[option_char]; } else { usage4(_("Hostname was not supplied")); } } - return OK; + return result; } void print_help(void) { diff --git a/plugins/check_time.d/config.h b/plugins/check_time.d/config.h new file mode 100644 index 00000000..09bd7c45 --- /dev/null +++ b/plugins/check_time.d/config.h @@ -0,0 +1,42 @@ +#pragma once + +#include "../../config.h" +#include + +enum { + TIME_PORT = 37 +}; + +typedef struct { + char *server_address; + int server_port; + bool use_udp; + + int warning_time; + bool check_warning_time; + int critical_time; + bool check_critical_time; + unsigned long warning_diff; + bool check_warning_diff; + unsigned long critical_diff; + bool check_critical_diff; +} check_time_config; + +check_time_config check_time_config_init() { + check_time_config tmp = { + .server_address = NULL, + .server_port = TIME_PORT, + .use_udp = false, + + .warning_time = 0, + .check_warning_time = false, + .critical_time = 0, + .check_critical_time = false, + + .warning_diff = 0, + .check_warning_diff = false, + .critical_diff = 0, + .check_critical_diff = false, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 29b1be07c81099013317b10f25c5f48f6d40312b Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:40:14 +0100 Subject: Refactor check_ups --- plugins/Makefile.am | 1 + plugins/check_ups.c | 274 +++++++++++++++++++------------------------ plugins/check_ups.d/config.h | 55 +++++++++ 3 files changed, 178 insertions(+), 152 deletions(-) create mode 100644 plugins/check_ups.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index bb3f029e..f1b9acf6 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -73,6 +73,7 @@ EXTRA_DIST = t \ check_ntp_time.d \ check_dig.d \ check_cluster.d \ + check_ups.d \ check_fping.d PLUGINHDRS = common.h diff --git a/plugins/check_ups.c b/plugins/check_ups.c index 526a29df..ecc0760f 100644 --- a/plugins/check_ups.c +++ b/plugins/check_ups.c @@ -39,69 +39,29 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "netutils.h" #include "utils.h" - -enum { - PORT = 3493 -}; - -#define UPS_NONE 0 /* no supported options */ -#define UPS_UTILITY 1 /* supports utility line */ -#define UPS_BATTPCT 2 /* supports percent battery remaining */ -#define UPS_STATUS 4 /* supports UPS status */ -#define UPS_TEMP 8 /* supports UPS temperature */ -#define UPS_LOADPCT 16 /* supports load percent */ -#define UPS_REALPOWER 32 /* supports real power */ - -#define UPSSTATUS_NONE 0 -#define UPSSTATUS_OFF 1 -#define UPSSTATUS_OL 2 -#define UPSSTATUS_OB 4 -#define UPSSTATUS_LB 8 -#define UPSSTATUS_CAL 16 -#define UPSSTATUS_RB 32 /*Replace Battery */ -#define UPSSTATUS_BYPASS 64 -#define UPSSTATUS_OVER 128 -#define UPSSTATUS_TRIM 256 -#define UPSSTATUS_BOOST 512 -#define UPSSTATUS_CHRG 1024 -#define UPSSTATUS_DISCHRG 2048 -#define UPSSTATUS_UNKNOWN 4096 -#define UPSSTATUS_ALARM 8192 +#include "check_ups.d/config.h" +#include "states.h" enum { NOSUCHVAR = ERROR - 1 }; -typedef struct ups_config { - unsigned int server_port; - char *server_address; - char *ups_name; - double warning_value; - double critical_value; - bool check_warn; - bool check_crit; - int check_variable; - int status; - bool temp_output_c; -} ups_config; - -ups_config ups_config_init(void) { - ups_config tmp = {0}; - tmp.server_port = PORT; - tmp.server_address = NULL; - tmp.ups_name = NULL; - tmp.check_variable = UPS_NONE; - tmp.status = UPSSTATUS_NONE; - - return tmp; -} - // Forward declarations -static int determine_status(ups_config * /*config*/, int *supported_options); -static int get_ups_variable(const char * /*varname*/, char * /*buf*/, ups_config config); +typedef struct { + int errorcode; + int ups_status; + int supported_options; +} determine_status_result; +static determine_status_result determine_status(check_ups_config /*config*/); +static int get_ups_variable(const char * /*varname*/, char * /*buf*/, check_ups_config config); + +typedef struct { + int errorcode; + check_ups_config config; +} check_ups_config_wrapper; +static check_ups_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static check_ups_config_wrapper validate_arguments(check_ups_config_wrapper /*config_wrapper*/); -static int process_arguments(int /*argc*/, char ** /*argv*/, ups_config * /*config*/); -static int validate_arguments(ups_config /*config*/); static void print_help(void); void print_usage(void); @@ -109,28 +69,16 @@ int main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - - char *ups_status; - ups_status = strdup("N/A"); - - char *data; - data = strdup(""); - - char *message; - message = strdup(""); - - // Exit result - int result = STATE_UNKNOWN; - /* Parse extra opts if any */ argv = np_extra_opts(&argc, argv, progname); - // Config from commandline - ups_config config = ups_config_init(); + check_ups_config_wrapper tmp_config = process_arguments(argc, argv); - if (process_arguments(argc, argv, &config) == ERROR) { + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } + // Config from commandline + check_ups_config config = tmp_config.config; /* initialize alarm signal handling */ signal(SIGALRM, socket_timeout_alarm_handler); @@ -138,71 +86,75 @@ int main(int argc, char **argv) { /* set socket timeout */ alarm(socket_timeout); - int supported_options = UPS_NONE; - /* get the ups status if possible */ - if (determine_status(&config, &supported_options) != OK) { + determine_status_result query_result = determine_status(config); + if (query_result.errorcode != OK) { return STATE_CRITICAL; } - if (supported_options & UPS_STATUS) { + int ups_status_flags = query_result.ups_status; + int supported_options = query_result.supported_options; - ups_status = strdup(""); + // Exit result + mp_state_enum result = STATE_UNKNOWN; + char *message = NULL; + if (supported_options & UPS_STATUS) { + char *ups_status = strdup(""); result = STATE_OK; - if (config.status & UPSSTATUS_OFF) { + if (ups_status_flags & UPSSTATUS_OFF) { xasprintf(&ups_status, "Off"); result = STATE_CRITICAL; - } else if ((config.status & (UPSSTATUS_OB | UPSSTATUS_LB)) == (UPSSTATUS_OB | UPSSTATUS_LB)) { + } else if ((ups_status_flags & (UPSSTATUS_OB | UPSSTATUS_LB)) == (UPSSTATUS_OB | UPSSTATUS_LB)) { xasprintf(&ups_status, _("On Battery, Low Battery")); result = STATE_CRITICAL; } else { - if (config.status & UPSSTATUS_OL) { + if (ups_status_flags & UPSSTATUS_OL) { xasprintf(&ups_status, "%s%s", ups_status, _("Online")); } - if (config.status & UPSSTATUS_OB) { + if (ups_status_flags & UPSSTATUS_OB) { xasprintf(&ups_status, "%s%s", ups_status, _("On Battery")); result = max_state(result, STATE_WARNING); } - if (config.status & UPSSTATUS_LB) { + if (ups_status_flags & UPSSTATUS_LB) { xasprintf(&ups_status, "%s%s", ups_status, _(", Low Battery")); result = max_state(result, STATE_WARNING); } - if (config.status & UPSSTATUS_CAL) { + if (ups_status_flags & UPSSTATUS_CAL) { xasprintf(&ups_status, "%s%s", ups_status, _(", Calibrating")); } - if (config.status & UPSSTATUS_RB) { + if (ups_status_flags & UPSSTATUS_RB) { xasprintf(&ups_status, "%s%s", ups_status, _(", Replace Battery")); result = max_state(result, STATE_WARNING); } - if (config.status & UPSSTATUS_BYPASS) { + if (ups_status_flags & UPSSTATUS_BYPASS) { xasprintf(&ups_status, "%s%s", ups_status, _(", On Bypass")); // Bypassing the battery is likely a bad thing result = STATE_CRITICAL; } - if (config.status & UPSSTATUS_OVER) { + if (ups_status_flags & UPSSTATUS_OVER) { xasprintf(&ups_status, "%s%s", ups_status, _(", Overload")); result = max_state(result, STATE_WARNING); } - if (config.status & UPSSTATUS_TRIM) { + if (ups_status_flags & UPSSTATUS_TRIM) { xasprintf(&ups_status, "%s%s", ups_status, _(", Trimming")); } - if (config.status & UPSSTATUS_BOOST) { + if (ups_status_flags & UPSSTATUS_BOOST) { xasprintf(&ups_status, "%s%s", ups_status, _(", Boosting")); } - if (config.status & UPSSTATUS_CHRG) { + if (ups_status_flags & UPSSTATUS_CHRG) { xasprintf(&ups_status, "%s%s", ups_status, _(", Charging")); } - if (config.status & UPSSTATUS_DISCHRG) { + if (ups_status_flags & UPSSTATUS_DISCHRG) { xasprintf(&ups_status, "%s%s", ups_status, _(", Discharging")); result = max_state(result, STATE_WARNING); } - if (config.status & UPSSTATUS_ALARM) { + if (ups_status_flags & UPSSTATUS_ALARM) { xasprintf(&ups_status, "%s%s", ups_status, _(", ALARM")); result = STATE_CRITICAL; } - if (config.status & UPSSTATUS_UNKNOWN) { + if (ups_status_flags & UPSSTATUS_UNKNOWN) { xasprintf(&ups_status, "%s%s", ups_status, _(", Unknown")); } } @@ -211,7 +163,7 @@ int main(int argc, char **argv) { int res; char temp_buffer[MAX_INPUT_BUFFER]; - + char *performance_data = strdup(""); /* get the ups utility voltage if possible */ res = get_ups_variable("input.voltage", temp_buffer, config); if (res == NOSUCHVAR) { @@ -239,11 +191,12 @@ int main(int argc, char **argv) { } else if (config.check_warn && ups_utility_deviation >= config.warning_value) { result = max_state(result, STATE_WARNING); } - xasprintf(&data, "%s", + xasprintf(&performance_data, "%s", perfdata("voltage", (long)(1000 * ups_utility_voltage), "mV", config.check_warn, (long)(1000 * config.warning_value), config.check_crit, (long)(1000 * config.critical_value), true, 0, false, 0)); } else { - xasprintf(&data, "%s", perfdata("voltage", (long)(1000 * ups_utility_voltage), "mV", false, 0, false, 0, true, 0, false, 0)); + xasprintf(&performance_data, "%s", + perfdata("voltage", (long)(1000 * ups_utility_voltage), "mV", false, 0, false, 0, true, 0, false, 0)); } } @@ -266,11 +219,12 @@ int main(int argc, char **argv) { } else if (config.check_warn && ups_battery_percent <= config.warning_value) { result = max_state(result, STATE_WARNING); } - xasprintf(&data, "%s %s", data, + xasprintf(&performance_data, "%s %s", performance_data, perfdata("battery", (long)ups_battery_percent, "%", config.check_warn, (long)(config.warning_value), config.check_crit, (long)(config.critical_value), true, 0, true, 100)); } else { - xasprintf(&data, "%s %s", data, perfdata("battery", (long)ups_battery_percent, "%", false, 0, false, 0, true, 0, true, 100)); + xasprintf(&performance_data, "%s %s", performance_data, + perfdata("battery", (long)ups_battery_percent, "%", false, 0, false, 0, true, 0, true, 100)); } } @@ -293,11 +247,12 @@ int main(int argc, char **argv) { } else if (config.check_warn && ups_load_percent >= config.warning_value) { result = max_state(result, STATE_WARNING); } - xasprintf(&data, "%s %s", data, + xasprintf(&performance_data, "%s %s", performance_data, perfdata("load", (long)ups_load_percent, "%", config.check_warn, (long)(config.warning_value), config.check_crit, (long)(config.critical_value), true, 0, true, 100)); } else { - xasprintf(&data, "%s %s", data, perfdata("load", (long)ups_load_percent, "%", false, 0, false, 0, true, 0, true, 100)); + xasprintf(&performance_data, "%s %s", performance_data, + perfdata("load", (long)ups_load_percent, "%", false, 0, false, 0, true, 0, true, 100)); } } @@ -329,11 +284,12 @@ int main(int argc, char **argv) { } else if (config.check_warn && ups_temperature >= config.warning_value) { result = max_state(result, STATE_WARNING); } - xasprintf(&data, "%s %s", data, + xasprintf(&performance_data, "%s %s", performance_data, perfdata("temp", (long)ups_temperature, tunits, config.check_warn, (long)(config.warning_value), config.check_crit, (long)(config.critical_value), true, 0, false, 0)); } else { - xasprintf(&data, "%s %s", data, perfdata("temp", (long)ups_temperature, tunits, false, 0, false, 0, true, 0, false, 0)); + xasprintf(&performance_data, "%s %s", performance_data, + perfdata("temp", (long)ups_temperature, tunits, false, 0, false, 0, true, 0, false, 0)); } } @@ -355,11 +311,12 @@ int main(int argc, char **argv) { } else if (config.check_warn && ups_realpower >= config.warning_value) { result = max_state(result, STATE_WARNING); } - xasprintf(&data, "%s %s", data, + xasprintf(&performance_data, "%s %s", performance_data, perfdata("realpower", (long)ups_realpower, "W", config.check_warn, (long)(config.warning_value), config.check_crit, (long)(config.critical_value), true, 0, false, 0)); } else { - xasprintf(&data, "%s %s", data, perfdata("realpower", (long)ups_realpower, "W", false, 0, false, 0, true, 0, false, 0)); + xasprintf(&performance_data, "%s %s", performance_data, + perfdata("realpower", (long)ups_realpower, "W", false, 0, false, 0, true, 0, false, 0)); } } @@ -373,66 +330,73 @@ int main(int argc, char **argv) { /* reset timeout */ alarm(0); - printf("UPS %s - %s|%s\n", state_text(result), message, data); - return result; + printf("UPS %s - %s|%s\n", state_text(result), message, performance_data); + exit(result); } /* determines what options are supported by the UPS */ -int determine_status(ups_config *config, int *supported_options) { - char recv_buffer[MAX_INPUT_BUFFER]; +determine_status_result determine_status(const check_ups_config config) { - int res = get_ups_variable("ups.status", recv_buffer, *config); + determine_status_result result = { + .errorcode = OK, + .ups_status = UPSSTATUS_NONE, + .supported_options = 0, + }; + + char recv_buffer[MAX_INPUT_BUFFER]; + int res = get_ups_variable("ups.status", recv_buffer, config); if (res == NOSUCHVAR) { - return OK; + return result; } if (res != STATE_OK) { printf("%s\n", _("Invalid response received from host")); - return ERROR; + result.errorcode = ERROR; + return result; } - *supported_options |= UPS_STATUS; + result.supported_options |= UPS_STATUS; char temp_buffer[MAX_INPUT_BUFFER]; strcpy(temp_buffer, recv_buffer); - for (char *ptr = (char *)strtok(temp_buffer, " "); ptr != NULL; ptr = (char *)strtok(NULL, " ")) { + for (char *ptr = strtok(temp_buffer, " "); ptr != NULL; ptr = strtok(NULL, " ")) { if (!strcmp(ptr, "OFF")) { - config->status |= UPSSTATUS_OFF; + result.ups_status |= UPSSTATUS_OFF; } else if (!strcmp(ptr, "OL")) { - config->status |= UPSSTATUS_OL; + result.ups_status |= UPSSTATUS_OL; } else if (!strcmp(ptr, "OB")) { - config->status |= UPSSTATUS_OB; + result.ups_status |= UPSSTATUS_OB; } else if (!strcmp(ptr, "LB")) { - config->status |= UPSSTATUS_LB; + result.ups_status |= UPSSTATUS_LB; } else if (!strcmp(ptr, "CAL")) { - config->status |= UPSSTATUS_CAL; + result.ups_status |= UPSSTATUS_CAL; } else if (!strcmp(ptr, "RB")) { - config->status |= UPSSTATUS_RB; + result.ups_status |= UPSSTATUS_RB; } else if (!strcmp(ptr, "BYPASS")) { - config->status |= UPSSTATUS_BYPASS; + result.ups_status |= UPSSTATUS_BYPASS; } else if (!strcmp(ptr, "OVER")) { - config->status |= UPSSTATUS_OVER; + result.ups_status |= UPSSTATUS_OVER; } else if (!strcmp(ptr, "TRIM")) { - config->status |= UPSSTATUS_TRIM; + result.ups_status |= UPSSTATUS_TRIM; } else if (!strcmp(ptr, "BOOST")) { - config->status |= UPSSTATUS_BOOST; + result.ups_status |= UPSSTATUS_BOOST; } else if (!strcmp(ptr, "CHRG")) { - config->status |= UPSSTATUS_CHRG; + result.ups_status |= UPSSTATUS_CHRG; } else if (!strcmp(ptr, "DISCHRG")) { - config->status |= UPSSTATUS_DISCHRG; + result.ups_status |= UPSSTATUS_DISCHRG; } else if (!strcmp(ptr, "ALARM")) { - config->status |= UPSSTATUS_ALARM; + result.ups_status |= UPSSTATUS_ALARM; } else { - config->status |= UPSSTATUS_UNKNOWN; + result.ups_status |= UPSSTATUS_UNKNOWN; } } - return OK; + return result; } /* gets a variable value for a specific UPS */ -int get_ups_variable(const char *varname, char *buf, const ups_config config) { +int get_ups_variable(const char *varname, char *buf, const check_ups_config config) { char send_buffer[MAX_INPUT_BUFFER]; /* create the command string to send to the UPS daemon */ @@ -500,7 +464,7 @@ int get_ups_variable(const char *varname, char *buf, const ups_config config) { [-wv warn_value] [-cv crit_value] [-to to_sec] */ /* process command-line arguments */ -int process_arguments(int argc, char **argv, ups_config *config) { +check_ups_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, {"ups", required_argument, 0, 'u'}, @@ -514,8 +478,14 @@ int process_arguments(int argc, char **argv, ups_config *config) { {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; + check_ups_config_wrapper result = { + .errorcode = OK, + .config = check_ups_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } int c; @@ -542,52 +512,52 @@ int process_arguments(int argc, char **argv, ups_config *config) { usage5(); case 'H': /* hostname */ if (is_host(optarg)) { - config->server_address = optarg; + result.config.server_address = optarg; } else { usage2(_("Invalid hostname/address"), optarg); } break; case 'T': /* FIXME: to be improved (ie "-T C" for Celsius or "-T F" for Fahrenheit) */ - config->temp_output_c = true; + result.config.temp_output_c = true; break; case 'u': /* ups name */ - config->ups_name = optarg; + result.config.ups_name = optarg; break; case 'p': /* port */ if (is_intpos(optarg)) { - config->server_port = atoi(optarg); + result.config.server_port = atoi(optarg); } else { usage2(_("Port must be a positive integer"), optarg); } break; case 'c': /* critical time threshold */ if (is_intnonneg(optarg)) { - config->critical_value = atoi(optarg); - config->check_crit = true; + result.config.critical_value = atoi(optarg); + result.config.check_crit = true; } else { usage2(_("Critical time must be a positive integer"), optarg); } break; case 'w': /* warning time threshold */ if (is_intnonneg(optarg)) { - config->warning_value = atoi(optarg); - config->check_warn = true; + result.config.warning_value = atoi(optarg); + result.config.check_warn = true; } else { usage2(_("Warning time must be a positive integer"), optarg); } break; case 'v': /* variable */ if (!strcmp(optarg, "LINE")) { - config->check_variable = UPS_UTILITY; + result.config.check_variable = UPS_UTILITY; } else if (!strcmp(optarg, "TEMP")) { - config->check_variable = UPS_TEMP; + result.config.check_variable = UPS_TEMP; } else if (!strcmp(optarg, "BATTPCT")) { - config->check_variable = UPS_BATTPCT; + result.config.check_variable = UPS_BATTPCT; } else if (!strcmp(optarg, "LOADPCT")) { - config->check_variable = UPS_LOADPCT; + result.config.check_variable = UPS_LOADPCT; } else if (!strcmp(optarg, "REALPOWER")) { - config->check_variable = UPS_REALPOWER; + result.config.check_variable = UPS_REALPOWER; } else { usage2(_("Unrecognized UPS variable"), optarg); } @@ -608,27 +578,27 @@ int process_arguments(int argc, char **argv, ups_config *config) { } } - if (config->server_address == NULL && argc > optind) { + if (result.config.server_address == NULL && argc > optind) { if (is_host(argv[optind])) { - config->server_address = argv[optind++]; + result.config.server_address = argv[optind++]; } else { usage2(_("Invalid hostname/address"), optarg); } } - if (config->server_address == NULL) { - config->server_address = strdup("127.0.0.1"); + if (result.config.server_address == NULL) { + result.config.server_address = strdup("127.0.0.1"); } - return validate_arguments(*config); + return validate_arguments(result); } -int validate_arguments(ups_config config) { - if (!config.ups_name) { +check_ups_config_wrapper validate_arguments(check_ups_config_wrapper config_wrapper) { + if (config_wrapper.config.ups_name) { printf("%s\n", _("Error : no UPS indicated")); - return ERROR; + config_wrapper.errorcode = ERROR; } - return OK; + return config_wrapper; } void print_help(void) { diff --git a/plugins/check_ups.d/config.h b/plugins/check_ups.d/config.h new file mode 100644 index 00000000..353104f2 --- /dev/null +++ b/plugins/check_ups.d/config.h @@ -0,0 +1,55 @@ +#pragma once + +#include "../../config.h" +#include + +#define UPS_NONE 0 /* no supported options */ +#define UPS_UTILITY 1 /* supports utility line */ +#define UPS_BATTPCT 2 /* supports percent battery remaining */ +#define UPS_STATUS 4 /* supports UPS status */ +#define UPS_TEMP 8 /* supports UPS temperature */ +#define UPS_LOADPCT 16 /* supports load percent */ +#define UPS_REALPOWER 32 /* supports real power */ + +#define UPSSTATUS_NONE 0 +#define UPSSTATUS_OFF 1 +#define UPSSTATUS_OL 2 +#define UPSSTATUS_OB 4 +#define UPSSTATUS_LB 8 +#define UPSSTATUS_CAL 16 +#define UPSSTATUS_RB 32 /*Replace Battery */ +#define UPSSTATUS_BYPASS 64 +#define UPSSTATUS_OVER 128 +#define UPSSTATUS_TRIM 256 +#define UPSSTATUS_BOOST 512 +#define UPSSTATUS_CHRG 1024 +#define UPSSTATUS_DISCHRG 2048 +#define UPSSTATUS_UNKNOWN 4096 +#define UPSSTATUS_ALARM 8192 + +enum { + PORT = 3493 +}; + +typedef struct ups_config { + unsigned int server_port; + char *server_address; + char *ups_name; + double warning_value; + double critical_value; + bool check_warn; + bool check_crit; + int check_variable; + bool temp_output_c; +} check_ups_config; + +check_ups_config check_ups_config_init(void) { + check_ups_config tmp = {0}; + tmp.server_port = PORT; + tmp.server_address = NULL; + tmp.ups_name = NULL; + tmp.check_variable = UPS_NONE; + + return tmp; +} + -- cgit v1.2.3-74-g34f1 From 5ae0a8d49559d66695f6f2591f4bbe0bb185ef73 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Wed, 12 Mar 2025 21:22:50 +0100 Subject: Refactor negate --- plugins/Makefile.am | 1 + plugins/negate.c | 73 +++++++++++++++++++++++++++-------------------- plugins/negate.d/config.h | 24 ++++++++++++++++ 3 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 plugins/negate.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index bb3f029e..a420d23d 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -49,6 +49,7 @@ np_test_scripts = tests/test_check_swap.t EXTRA_DIST = t \ tests \ $(np_test_scripts) \ + negate.d \ check_swap.d \ check_ldap.d \ check_hpjd.d \ diff --git a/plugins/negate.c b/plugins/negate.c index 6c53a1b9..08fa1470 100644 --- a/plugins/negate.c +++ b/plugins/negate.c @@ -29,6 +29,7 @@ * *****************************************************************************/ +#include "states.h" const char *progname = "negate"; const char *copyright = "2002-2024"; const char *email = "devel@monitoring-plugins.org"; @@ -38,21 +39,17 @@ const char *email = "devel@monitoring-plugins.org"; #include "common.h" #include "utils.h" #include "utils_cmd.h" +#include "negate.d/config.h" -#include +typedef struct { + int errorcode; + negate_config config; +} negate_config_wrapper; +static negate_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); +static negate_config_wrapper validate_arguments(negate_config_wrapper /*config_wrapper*/); -static const char **process_arguments(int /*argc*/, char ** /*argv*/); -static void validate_arguments(char ** /*command_line*/); static void print_help(void); void print_usage(void); -static bool subst_text = false; - -static int state[4] = { - STATE_OK, - STATE_WARNING, - STATE_CRITICAL, - STATE_UNKNOWN, -}; int main(int argc, char **argv) { setlocale(LC_ALL, ""); @@ -61,16 +58,24 @@ int main(int argc, char **argv) { timeout_interval = DEFAULT_TIMEOUT; - char **command_line = (char **)process_arguments(argc, argv); + negate_config_wrapper tmp_config = process_arguments(argc, argv); + + if (tmp_config.errorcode == ERROR) { + die(STATE_UNKNOWN, _("negate: Failed to parse input")); + } + + negate_config config = tmp_config.config; + + char **command_line = config.command_line; /* Set signal handling and alarm */ if (signal(SIGALRM, timeout_alarm_handler) == SIG_ERR) { die(STATE_UNKNOWN, _("Cannot catch SIGALRM")); } - (void)alarm((unsigned)timeout_interval); + (void)alarm(timeout_interval); - int result = STATE_UNKNOWN; + mp_state_enum result = STATE_UNKNOWN; output chld_out; output chld_err; @@ -93,34 +98,38 @@ int main(int argc, char **argv) { char *sub; for (size_t i = 0; i < chld_out.lines; i++) { - if (subst_text && result >= 0 && result <= 4 && result != state[result]) { + if (config.subst_text && result >= 0 && result <= 4 && result != config.state[result]) { /* Loop over each match found */ while ((sub = strstr(chld_out.line[i], state_text(result)))) { /* Terminate the first part and skip over the string we'll substitute */ *sub = '\0'; sub += strlen(state_text(result)); /* then put everything back together */ - xasprintf(&chld_out.line[i], "%s%s%s", chld_out.line[i], state_text(state[result]), sub); + xasprintf(&chld_out.line[i], "%s%s%s", chld_out.line[i], state_text(config.state[result]), sub); } } printf("%s\n", chld_out.line[i]); } if (result >= 0 && result <= 4) { - exit(state[result]); + exit(config.state[result]); } else { exit(result); } } /* process command-line arguments */ -static const char **process_arguments(int argc, char **argv) { +static negate_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"timeout", required_argument, 0, 't'}, {"timeout-result", required_argument, 0, 'T'}, {"ok", required_argument, 0, 'o'}, {"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, {"unknown", required_argument, 0, 'u'}, {"substitute", no_argument, 0, 's'}, {0, 0, 0, 0}}; + negate_config_wrapper result = { + .errorcode = OK, + .config = negate_config_init(), + }; bool permute = true; while (true) { int option = 0; @@ -154,54 +163,56 @@ static const char **process_arguments(int argc, char **argv) { } break; case 'o': /* replacement for OK */ - if ((state[STATE_OK] = mp_translate_state(optarg)) == ERROR) { + if ((result.config.state[STATE_OK] = mp_translate_state(optarg)) == ERROR) { usage4(_("Ok must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); } permute = false; break; case 'w': /* replacement for WARNING */ - if ((state[STATE_WARNING] = mp_translate_state(optarg)) == ERROR) { + if ((result.config.state[STATE_WARNING] = mp_translate_state(optarg)) == ERROR) { usage4(_("Warning must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); } permute = false; break; case 'c': /* replacement for CRITICAL */ - if ((state[STATE_CRITICAL] = mp_translate_state(optarg)) == ERROR) { + if ((result.config.state[STATE_CRITICAL] = mp_translate_state(optarg)) == ERROR) { usage4(_("Critical must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); } permute = false; break; case 'u': /* replacement for UNKNOWN */ - if ((state[STATE_UNKNOWN] = mp_translate_state(optarg)) == ERROR) { + if ((result.config.state[STATE_UNKNOWN] = mp_translate_state(optarg)) == ERROR) { usage4(_("Unknown must be a valid state name (OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3).")); } permute = false; break; case 's': /* Substitute status text */ - subst_text = true; + result.config.subst_text = true; break; } } - validate_arguments(&argv[optind]); - if (permute) { /* No [owcu] switch specified, default to this */ - state[STATE_OK] = STATE_CRITICAL; - state[STATE_CRITICAL] = STATE_OK; + result.config.state[STATE_OK] = STATE_CRITICAL; + result.config.state[STATE_CRITICAL] = STATE_OK; } - return (const char **)&argv[optind]; + result.config.command_line = &argv[optind]; + + return validate_arguments(result); } -void validate_arguments(char **command_line) { - if (command_line[0] == NULL) { +negate_config_wrapper validate_arguments(negate_config_wrapper config_wrapper) { + if (config_wrapper.config.command_line[0] == NULL) { usage4(_("Could not parse arguments")); } - if (strncmp(command_line[0], "/", 1) != 0 && strncmp(command_line[0], "./", 2) != 0) { + if (strncmp(config_wrapper.config.command_line[0], "/", 1) != 0 && strncmp(config_wrapper.config.command_line[0], "./", 2) != 0) { usage4(_("Require path to command")); } + + return config_wrapper; } void print_help(void) { diff --git a/plugins/negate.d/config.h b/plugins/negate.d/config.h new file mode 100644 index 00000000..0cf30cd4 --- /dev/null +++ b/plugins/negate.d/config.h @@ -0,0 +1,24 @@ +#pragma once + +#include "states.h" + +typedef struct { + mp_state_enum state[4]; + bool subst_text; + char **command_line; +} negate_config; + +negate_config negate_config_init() { + negate_config tmp = { + .state = + { + STATE_OK, + STATE_WARNING, + STATE_CRITICAL, + STATE_UNKNOWN, + }, + .subst_text = false, + .command_line = NULL, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From d2596feaa090c73353412d252cfb7938a9141f9b Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:59:35 +0100 Subject: Add forgotten Makefile change --- plugins/Makefile.am | 1 + 1 file changed, 1 insertion(+) (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 9e4924c3..30ca63d1 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -58,6 +58,7 @@ EXTRA_DIST = t \ check_time.d \ check_nagios.d \ check_dbi.d \ + check_tcp.d \ check_real.d \ check_ssh.d \ check_nt.d \ -- cgit v1.2.3-74-g34f1 From 08a475a14fff2d0eee2e49f4765cb286cac8d2e2 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:41:12 +0100 Subject: Refactor check_load + new ouput --- plugins/Makefile.am | 1 + plugins/check_load.c | 420 ++++++++++++++++++++++++------------------ plugins/check_load.d/config.h | 30 +++ 3 files changed, 274 insertions(+), 177 deletions(-) create mode 100644 plugins/check_load.d/config.h (limited to 'plugins/Makefile.am') diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 30ca63d1..f395e594 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -56,6 +56,7 @@ EXTRA_DIST = t \ check_game.d \ check_radius.d \ check_time.d \ + check_load.d \ check_nagios.d \ check_dbi.d \ check_tcp.d \ diff --git a/plugins/check_load.c b/plugins/check_load.c index e3a45f58..57be8c69 100644 --- a/plugins/check_load.c +++ b/plugins/check_load.c @@ -28,6 +28,9 @@ * *****************************************************************************/ +#include "output.h" +#include "perfdata.h" +#include "thresholds.h" const char *progname = "check_load"; const char *copyright = "1999-2022"; const char *email = "devel@monitoring-plugins.org"; @@ -36,6 +39,10 @@ const char *email = "devel@monitoring-plugins.org"; #include "./runcmd.h" #include "./utils.h" #include "./popen.h" +#include "states.h" +#include "check_load.d/config.h" + +#include "../gl/stdlib.h" #include @@ -50,70 +57,68 @@ const char *email = "devel@monitoring-plugins.org"; # define LOADAVG_15MIN 2 #endif /* !defined LOADAVG_1MIN */ -static int process_arguments(int argc, char **argv); -static int validate_arguments(void); +typedef struct { + int errorcode; + check_load_config config; +} check_load_config_wrapper; +static check_load_config_wrapper process_arguments(int argc, char **argv); +static check_load_config_wrapper validate_arguments(check_load_config_wrapper /*config_wrapper*/); + void print_help(void); void print_usage(void); -static int print_top_consuming_processes(); - -static int n_procs_to_show = 0; - -/* strictly for pretty-print usage in loops */ -static const int nums[3] = {1, 5, 15}; - -/* provide some fairly sane defaults */ -double wload[3] = {0.0, 0.0, 0.0}; -double cload[3] = {0.0, 0.0, 0.0}; -#define la1 la[0] -#define la5 la[1] -#define la15 la[2] - -char *status_line; -bool take_into_account_cpus = false; - -static void get_threshold(char *arg, double *th) { - size_t i, n; - int valid = 0; - char *str = arg, *p; - - n = strlen(arg); - for (i = 0; i < 3; i++) { - th[i] = strtod(str, &p); - if (p == str) { +typedef struct { + int errorcode; + char **top_processes; +} top_processes_result; +static top_processes_result print_top_consuming_processes(int /*n_procs_to_show*/); + +typedef struct { + mp_range load[3]; +} parsed_thresholds; +static parsed_thresholds get_threshold(char *arg) { + size_t index; + char *str = arg; + char *tmp_pointer; + bool valid = false; + + parsed_thresholds result = { + .load[0] = mp_range_init(), + .load[1] = mp_range_init(), + .load[2] = mp_range_init(), + }; + + size_t arg_length = strlen(arg); + for (index = 0; index < 3; index++) { + double tmp = strtod(str, &tmp_pointer); + if (tmp_pointer == str) { break; } - valid = 1; - str = p + 1; - if (n <= (size_t)(str - arg)) { + result.load[index] = mp_range_set_end(result.load[index], mp_create_pd_value(tmp)); + + valid = true; + str = tmp_pointer + 1; + if (arg_length <= (size_t)(str - arg)) { break; } } /* empty argument or non-floatish, so warn about it and die */ - if (!i && !valid) { + if (!index && !valid) { usage(_("Warning threshold must be float or float triplet!\n")); } - if (i != 2) { + if (index != 2) { /* one or more numbers were given, so fill array with last * we got (most likely to NOT produce the least expected result) */ - for (n = i; n < 3; n++) { - th[n] = th[i]; + for (size_t tmp_index = index; tmp_index < 3; tmp_index++) { + result.load[tmp_index] = result.load[index]; } } + return result; } int main(int argc, char **argv) { - int result = -1; - int i; - long numcpus; - - double la[3] = {0.0, 0.0, 0.0}; /* NetBSD complains about uninitialized arrays */ -#ifndef HAVE_GETLOADAVG - char input_buffer[MAX_INPUT_BUFFER]; -#endif - setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -122,112 +127,138 @@ 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_load_config_wrapper tmp_config = process_arguments(argc, argv); + if (tmp_config.errorcode == ERROR) { usage4(_("Could not parse arguments")); } -#ifdef HAVE_GETLOADAVG - result = getloadavg(la, 3); - if (result != 3) { - return STATE_UNKNOWN; - } -#else - child_process = spopen(PATH_TO_UPTIME); - if (child_process == NULL) { - printf(_("Error opening %s\n"), PATH_TO_UPTIME); - return STATE_UNKNOWN; - } - child_stderr = fdopen(child_stderr_array[fileno(child_process)], "r"); - if (child_stderr == NULL) { - printf(_("Could not open stderr for %s\n"), PATH_TO_UPTIME); - } - fgets(input_buffer, MAX_INPUT_BUFFER - 1, child_process); - if (strstr(input_buffer, "load average:")) { - sscanf(input_buffer, "%*[^l]load average: %lf, %lf, %lf", &la1, &la5, &la15); - } else if (strstr(input_buffer, "load averages:")) { - sscanf(input_buffer, "%*[^l]load averages: %lf, %lf, %lf", &la1, &la5, &la15); - } else { - printf(_("could not parse load from uptime %s: %d\n"), PATH_TO_UPTIME, result); - return STATE_UNKNOWN; - } + const check_load_config config = tmp_config.config; - result = spclose(child_process); - if (result) { - printf(_("Error code %d returned in %s\n"), result, PATH_TO_UPTIME); - return STATE_UNKNOWN; - } -#endif + double load_values[3] = {0, 0, 0}; - if ((la[0] < 0.0) || (la[1] < 0.0) || (la[2] < 0.0)) { -#ifdef HAVE_GETLOADAVG - printf(_("Error in getloadavg()\n")); -#else - printf(_("Error processing %s\n"), PATH_TO_UPTIME); -#endif - return STATE_UNKNOWN; + int error = getloadavg(load_values, 3); + if (error != 3) { + die(STATE_UNKNOWN, _("Failed to retrieve load values")); } - /* we got this far, so assume OK until we've measured */ - result = STATE_OK; - - xasprintf(&status_line, _("load average: %.2f, %.2f, %.2f"), la1, la5, la15); - xasprintf(&status_line, ("total %s"), status_line); + mp_check overall = mp_check_init(); + if (config.output_format_set) { + mp_set_format(config.output_format); + } - double scaled_la[3] = {0.0, 0.0, 0.0}; bool is_using_scaled_load_values = false; - - if (take_into_account_cpus == true && (numcpus = GET_NUMBER_OF_CPUS()) > 0) { + long numcpus; + if (config.take_into_account_cpus && ((numcpus = GET_NUMBER_OF_CPUS()) > 0)) { is_using_scaled_load_values = true; - scaled_la[0] = la[0] / numcpus; - scaled_la[1] = la[1] / numcpus; - scaled_la[2] = la[2] / numcpus; + double scaled_la[3] = {0.0, 0.0, 0.0}; + scaled_la[0] = load_values[0] / numcpus; + scaled_la[1] = load_values[1] / numcpus; + scaled_la[2] = load_values[2] / numcpus; + + mp_subcheck scaled_load_sc = mp_subcheck_init(); + scaled_load_sc = mp_set_subcheck_default_state(scaled_load_sc, STATE_OK); + scaled_load_sc.output = "Scaled Load (divided by number of CPUs"; + + mp_perfdata pd_scaled_load1 = perfdata_init(); + pd_scaled_load1.label = "scaled_load1"; + pd_scaled_load1 = mp_set_pd_value(pd_scaled_load1, scaled_la[0]); + pd_scaled_load1 = mp_pd_set_thresholds(pd_scaled_load1, config.th_load[0]); + + mp_subcheck scaled_load_sc1 = mp_subcheck_init(); + scaled_load_sc1 = mp_set_subcheck_state(scaled_load_sc1, mp_get_pd_status(pd_scaled_load1)); + mp_add_perfdata_to_subcheck(&scaled_load_sc1, pd_scaled_load1); + xasprintf(&scaled_load_sc1.output, "1 Minute: %s", pd_value_to_string(pd_scaled_load1.value)); + mp_add_subcheck_to_subcheck(&scaled_load_sc, scaled_load_sc1); + + mp_perfdata pd_scaled_load5 = perfdata_init(); + pd_scaled_load5.label = "scaled_load5"; + pd_scaled_load5 = mp_set_pd_value(pd_scaled_load5, scaled_la[1]); + pd_scaled_load5 = mp_pd_set_thresholds(pd_scaled_load5, config.th_load[1]); + + mp_subcheck scaled_load_sc5 = mp_subcheck_init(); + scaled_load_sc5 = mp_set_subcheck_state(scaled_load_sc5, mp_get_pd_status(pd_scaled_load5)); + mp_add_perfdata_to_subcheck(&scaled_load_sc5, pd_scaled_load5); + xasprintf(&scaled_load_sc5.output, "5 Minutes: %s", pd_value_to_string(pd_scaled_load5.value)); + mp_add_subcheck_to_subcheck(&scaled_load_sc, scaled_load_sc5); + + mp_perfdata pd_scaled_load15 = perfdata_init(); + pd_scaled_load15.label = "scaled_load15"; + pd_scaled_load15 = mp_set_pd_value(pd_scaled_load15, scaled_la[2]); + pd_scaled_load15 = mp_pd_set_thresholds(pd_scaled_load15, config.th_load[2]); + + mp_subcheck scaled_load_sc15 = mp_subcheck_init(); + scaled_load_sc15 = mp_set_subcheck_state(scaled_load_sc15, mp_get_pd_status(pd_scaled_load15)); + mp_add_perfdata_to_subcheck(&scaled_load_sc15, pd_scaled_load15); + xasprintf(&scaled_load_sc15.output, "15 Minutes: %s", pd_value_to_string(pd_scaled_load15.value)); + mp_add_subcheck_to_subcheck(&scaled_load_sc, scaled_load_sc15); + + mp_add_subcheck_to_check(&overall, scaled_load_sc); + } + + mp_subcheck load_sc = mp_subcheck_init(); + load_sc = mp_set_subcheck_default_state(load_sc, STATE_OK); + load_sc.output = "Total Load"; - char *tmp = NULL; - xasprintf(&tmp, _("load average: %.2f, %.2f, %.2f"), scaled_la[0], scaled_la[1], scaled_la[2]); - xasprintf(&status_line, "scaled %s - %s", tmp, status_line); + mp_perfdata pd_load1 = perfdata_init(); + pd_load1.label = "load1"; + pd_load1 = mp_set_pd_value(pd_load1, load_values[0]); + if (!is_using_scaled_load_values) { + pd_load1 = mp_pd_set_thresholds(pd_load1, config.th_load[0]); } - for (i = 0; i < 3; i++) { - if (is_using_scaled_load_values) { - if (scaled_la[i] > cload[i]) { - result = STATE_CRITICAL; - break; - } else if (scaled_la[i] > wload[i]) { - result = STATE_WARNING; - } - } else { - if (la[i] > cload[i]) { - result = STATE_CRITICAL; - break; - } else if (la[i] > wload[i]) { - result = STATE_WARNING; - } - } + mp_subcheck load_sc1 = mp_subcheck_init(); + load_sc1 = mp_set_subcheck_state(load_sc1, mp_get_pd_status(pd_load1)); + mp_add_perfdata_to_subcheck(&load_sc1, pd_load1); + xasprintf(&load_sc1.output, "1 Minute: %s", pd_value_to_string(pd_load1.value)); + mp_add_subcheck_to_subcheck(&load_sc, load_sc1); + + mp_perfdata pd_load5 = perfdata_init(); + pd_load5.label = "load5"; + pd_load5 = mp_set_pd_value(pd_load5, load_values[1]); + if (!is_using_scaled_load_values) { + pd_load5 = mp_pd_set_thresholds(pd_load5, config.th_load[1]); } - printf("LOAD %s - %s|", state_text(result), status_line); - for (i = 0; i < 3; i++) { - if (is_using_scaled_load_values) { - printf("load%d=%.3f;;;0; ", nums[i], la[i]); - printf("scaled_load%d=%.3f;%.3f;%.3f;0; ", nums[i], scaled_la[i], wload[i], cload[i]); - } else { - printf("load%d=%.3f;%.3f;%.3f;0; ", nums[i], la[i], wload[i], cload[i]); - } + mp_subcheck load_sc5 = mp_subcheck_init(); + load_sc5 = mp_set_subcheck_state(load_sc5, mp_get_pd_status(pd_load5)); + mp_add_perfdata_to_subcheck(&load_sc5, pd_load5); + xasprintf(&load_sc5.output, "5 Minutes: %s", pd_value_to_string(pd_load5.value)); + mp_add_subcheck_to_subcheck(&load_sc, load_sc5); + + mp_perfdata pd_load15 = perfdata_init(); + pd_load15.label = "load15"; + pd_load15 = mp_set_pd_value(pd_load15, load_values[2]); + if (!is_using_scaled_load_values) { + pd_load15 = mp_pd_set_thresholds(pd_load15, config.th_load[2]); } - putchar('\n'); - if (n_procs_to_show > 0) { - print_top_consuming_processes(); + mp_subcheck load_sc15 = mp_subcheck_init(); + load_sc15 = mp_set_subcheck_state(load_sc15, mp_get_pd_status(pd_load15)); + mp_add_perfdata_to_subcheck(&load_sc15, pd_load15); + xasprintf(&load_sc15.output, "15 Minutes: %s", pd_value_to_string(pd_load15.value)); + mp_add_subcheck_to_subcheck(&load_sc, load_sc15); + + mp_add_subcheck_to_check(&overall, load_sc); + + if (config.n_procs_to_show > 0) { + mp_subcheck top_proc_sc = mp_subcheck_init(); + top_proc_sc = mp_set_subcheck_state(top_proc_sc, STATE_OK); + top_processes_result top_proc = print_top_consuming_processes(config.n_procs_to_show); + top_proc_sc.output = ""; + + if (top_proc.errorcode == OK) { + for (int i = 0; i < config.n_procs_to_show; i++) { + xasprintf(&top_proc_sc.output, "%s\n%s", top_proc_sc.output, top_proc.top_processes[i]); + } + } } - return result; + + mp_exit(overall); } /* process command-line arguments */ -static int process_arguments(int argc, char **argv) { - int c = 0; - - int option = 0; +static check_load_config_wrapper process_arguments(int argc, char **argv) { static struct option longopts[] = {{"warning", required_argument, 0, 'w'}, {"critical", required_argument, 0, 'c'}, {"percpu", no_argument, 0, 'r'}, @@ -236,26 +267,45 @@ static int process_arguments(int argc, char **argv) { {"procs-to-show", required_argument, 0, 'n'}, {0, 0, 0, 0}}; + check_load_config_wrapper result = { + .errorcode = OK, + .config = check_load_config_init(), + }; + if (argc < 2) { - return ERROR; + result.errorcode = ERROR; + return result; } - while (1) { - c = getopt_long(argc, argv, "Vhrc:w:n:", longopts, &option); + while (true) { + int option = 0; + int option_index = getopt_long(argc, argv, "Vhrc:w:n:", longopts, &option); - if (c == -1 || c == EOF) { + if (option_index == -1 || option_index == EOF) { break; } - switch (c) { - case 'w': /* warning time threshold */ - get_threshold(optarg, wload); - break; - case 'c': /* critical time threshold */ - get_threshold(optarg, cload); - break; + switch (option_index) { + case 'w': /* warning time threshold */ { + parsed_thresholds warning_range = get_threshold(optarg); + result.config.th_load[0].warning = warning_range.load[0]; + result.config.th_load[0].warning_is_set = true; + result.config.th_load[1].warning = warning_range.load[1]; + result.config.th_load[1].warning_is_set = true; + result.config.th_load[2].warning = warning_range.load[2]; + result.config.th_load[2].warning_is_set = true; + } break; + case 'c': /* critical time threshold */ { + parsed_thresholds critical_range = get_threshold(optarg); + result.config.th_load[0].critical = critical_range.load[0]; + result.config.th_load[0].critical_is_set = true; + result.config.th_load[1].critical = critical_range.load[1]; + result.config.th_load[1].critical_is_set = true; + result.config.th_load[2].critical = critical_range.load[2]; + result.config.th_load[2].critical_is_set = true; + } break; case 'r': /* Divide load average by number of CPUs */ - take_into_account_cpus = true; + result.config.take_into_account_cpus = true; break; case 'V': /* version */ print_revision(progname, NP_VERSION); @@ -264,49 +314,49 @@ static int process_arguments(int argc, char **argv) { print_help(); exit(STATE_UNKNOWN); case 'n': - n_procs_to_show = atoi(optarg); + result.config.n_procs_to_show = atoi(optarg); break; case '?': /* help */ usage5(); } } - c = optind; - if (c == argc) { - return validate_arguments(); + int index = optind; + if (index == argc) { + return validate_arguments(result); } /* handle the case if both arguments are missing, * but not if only one is given without -c or -w flag */ - if (c - argc == 2) { - get_threshold(argv[c++], wload); - get_threshold(argv[c++], cload); - } else if (c - argc == 1) { - get_threshold(argv[c++], cload); + if (index - argc == 2) { + parsed_thresholds warning_range = get_threshold(argv[index++]); + result.config.th_load[0].warning = warning_range.load[0]; + result.config.th_load[0].warning_is_set = true; + result.config.th_load[1].warning = warning_range.load[1]; + result.config.th_load[1].warning_is_set = true; + result.config.th_load[2].warning = warning_range.load[2]; + result.config.th_load[2].warning_is_set = true; + parsed_thresholds critical_range = get_threshold(argv[index++]); + result.config.th_load[0].critical = critical_range.load[0]; + result.config.th_load[0].critical_is_set = true; + result.config.th_load[1].critical = critical_range.load[1]; + result.config.th_load[1].critical_is_set = true; + result.config.th_load[2].critical = critical_range.load[2]; + result.config.th_load[2].critical_is_set = true; + } else if (index - argc == 1) { + parsed_thresholds critical_range = get_threshold(argv[index++]); + result.config.th_load[0].critical = critical_range.load[0]; + result.config.th_load[0].critical_is_set = true; + result.config.th_load[1].critical = critical_range.load[1]; + result.config.th_load[1].critical_is_set = true; + result.config.th_load[2].critical = critical_range.load[2]; + result.config.th_load[2].critical_is_set = true; } - return validate_arguments(); + return validate_arguments(result); } -static int validate_arguments(void) { - int i = 0; - - /* match cload first, as it will give the most friendly error message - * if user hasn't given the -c switch properly */ - for (i = 0; i < 3; i++) { - if (cload[i] < 0) { - die(STATE_UNKNOWN, _("Critical threshold for %d-minute load average is not specified\n"), nums[i]); - } - if (wload[i] < 0) { - die(STATE_UNKNOWN, _("Warning threshold for %d-minute load average is not specified\n"), nums[i]); - } - if (wload[i] > cload[i]) { - die(STATE_UNKNOWN, _("Parameter inconsistency: %d-minute \"warning load\" is greater than \"critical load\"\n"), nums[i]); - } - } - - return OK; -} +static check_load_config_wrapper validate_arguments(check_load_config_wrapper config_wrapper) { return config_wrapper; } void print_help(void) { print_revision(progname, NP_VERSION); @@ -363,23 +413,39 @@ int cmpstringp(const void *p1, const void *p2) { } #endif /* PS_USES_PROCPCPU */ -static int print_top_consuming_processes() { - int i = 0; - struct output chld_out, chld_err; +static top_processes_result print_top_consuming_processes(int n_procs_to_show) { + top_processes_result result = { + .errorcode = OK, + }; + struct output chld_out; + struct output chld_err; if (np_runcmd(PS_COMMAND, &chld_out, &chld_err, 0) != 0) { fprintf(stderr, _("'%s' exited with non-zero status.\n"), PS_COMMAND); - return STATE_UNKNOWN; + result.errorcode = ERROR; + return result; } + if (chld_out.lines < 2) { fprintf(stderr, _("some error occurred getting procs list.\n")); - return STATE_UNKNOWN; + result.errorcode = ERROR; + return result; } + #ifdef PS_USES_PROCPCPU qsort(chld_out.line + 1, chld_out.lines - 1, sizeof(char *), cmpstringp); #endif /* PS_USES_PROCPCPU */ int lines_to_show = chld_out.lines < (size_t)(n_procs_to_show + 1) ? (int)chld_out.lines : n_procs_to_show + 1; - for (i = 0; i < lines_to_show; i += 1) { - printf("%s\n", chld_out.line[i]); + + result.top_processes = calloc(lines_to_show, sizeof(char *)); + if (result.top_processes == NULL) { + // Failed allocation + result.errorcode = ERROR; + return result; } - return OK; + + for (int i = 0; i < lines_to_show; i += 1) { + xasprintf(&result.top_processes[i], "%s", chld_out.line[i]); + } + + return result; } diff --git a/plugins/check_load.d/config.h b/plugins/check_load.d/config.h new file mode 100644 index 00000000..d399c19c --- /dev/null +++ b/plugins/check_load.d/config.h @@ -0,0 +1,30 @@ +#pragma once + +#include "output.h" +#include "thresholds.h" +typedef struct { + mp_thresholds th_load[3]; + + bool take_into_account_cpus; + int n_procs_to_show; + + mp_output_format output_format; + bool output_format_set; +} check_load_config; + +check_load_config check_load_config_init() { + check_load_config tmp = { + .th_load = + { + mp_thresholds_init(), + mp_thresholds_init(), + mp_thresholds_init(), + }, + + .take_into_account_cpus = false, + .n_procs_to_show = 0, + + .output_format_set = false, + }; + return tmp; +} -- cgit v1.2.3-74-g34f1 From 285db2a9fa25519cacd48a76347ae2dee0c06605 Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:36:20 +0100 Subject: Move disk specific stuff from lib to plugin specific directory --- lib/Makefile.am | 3 +- lib/utils_disk.c | 255 -------------------------------------- lib/utils_disk.h | 48 ------- plugins/Makefile.am | 2 + plugins/check_disk.d/utils_disk.c | 255 ++++++++++++++++++++++++++++++++++++++ plugins/check_disk.d/utils_disk.h | 48 +++++++ 6 files changed, 306 insertions(+), 305 deletions(-) delete mode 100644 lib/utils_disk.c delete mode 100644 lib/utils_disk.h create mode 100644 plugins/check_disk.d/utils_disk.c create mode 100644 plugins/check_disk.d/utils_disk.h (limited to 'plugins/Makefile.am') diff --git a/lib/Makefile.am b/lib/Makefile.am index e41201c4..a9f3ff40 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -7,10 +7,9 @@ noinst_LIBRARIES = libmonitoringplug.a AM_CPPFLAGS = -DNP_STATE_DIR_PREFIX=\"$(localstatedir)\" \ -I$(srcdir) -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/plugins -libmonitoringplug_a_SOURCES = utils_base.c utils_disk.c utils_tcp.c utils_cmd.c maxfd.c output.c perfdata.c output.c thresholds.c vendor/cJSON/cJSON.c +libmonitoringplug_a_SOURCES = utils_base.c utils_tcp.c utils_cmd.c maxfd.c output.c perfdata.c output.c thresholds.c vendor/cJSON/cJSON.c EXTRA_DIST = utils_base.h \ - utils_disk.h \ utils_tcp.h \ utils_cmd.h \ parse_ini.h \ diff --git a/lib/utils_disk.c b/lib/utils_disk.c deleted file mode 100644 index 2b761f5e..00000000 --- a/lib/utils_disk.c +++ /dev/null @@ -1,255 +0,0 @@ -/***************************************************************************** - * - * Library for check_disk - * - * License: GPL - * Copyright (c) 1999-2024 Monitoring Plugins Development Team - * - * Description: - * - * This file contains utilities for check_disk. These are tested by libtap - * - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - *****************************************************************************/ - -#include "common.h" -#include "utils_disk.h" -#include "gl/fsusage.h" -#include - -void np_add_name(struct name_list **list, const char *name) { - struct name_list *new_entry; - new_entry = (struct name_list *)malloc(sizeof *new_entry); - new_entry->name = (char *)name; - new_entry->next = *list; - *list = new_entry; -} - -/* @brief Initialises a new regex at the begin of list via regcomp(3) - * - * @details if the regex fails to compile the error code of regcomp(3) is returned - * and list is not modified, otherwise list is modified to point to the new - * element - * @param list Pointer to a linked list of regex_list elements - * @param regex the string containing the regex which should be inserted into the list - * @param clags the cflags parameter for regcomp(3) - */ -int np_add_regex(struct regex_list **list, const char *regex, int cflags) { - struct regex_list *new_entry = (struct regex_list *)malloc(sizeof *new_entry); - - if (new_entry == NULL) { - die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), strerror(errno)); - } - - int regcomp_result = regcomp(&new_entry->regex, regex, cflags); - - if (!regcomp_result) { - // regcomp succeeded - new_entry->next = *list; - *list = new_entry; - - return 0; - } else { - // regcomp failed - free(new_entry); - - return regcomp_result; - } -} - -/* Initialises a new parameter at the end of list */ -struct parameter_list *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 *)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; - new_path->usedspace_bytes = NULL; - new_path->usedspace_units = NULL; - new_path->usedspace_percent = NULL; - new_path->usedinodes_percent = NULL; - new_path->freeinodes_percent = NULL; - new_path->group = NULL; - new_path->dfree_pct = -1; - new_path->dused_pct = -1; - new_path->total = 0; - new_path->available = 0; - new_path->available_to_root = 0; - new_path->used = 0; - new_path->dused_units = 0; - new_path->dfree_units = 0; - new_path->dtotal_units = 0; - new_path->inodes_total = 0; - new_path->inodes_free = 0; - new_path->inodes_free_to_root = 0; - new_path->inodes_used = 0; - 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; -} - -/* Delete a given parameter from list and return pointer to next element*/ -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) - next = item->name_next; - else - next = NULL; - - if (next) - next->name_prev = prev; - - if (prev) - prev->name_next = next; - - if (item->name) { - free(item->name); - } - free(item); - - return next; -} - -/* returns a pointer to the struct found in the list */ -struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name) { - struct parameter_list *temp_list; - for (temp_list = list; temp_list; temp_list = temp_list->name_next) { - if (!strcmp(temp_list->name, name)) - return temp_list; - } - - return NULL; -} - -void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, bool exact) { - struct parameter_list *d; - for (d = desired; d; d = d->name_next) { - if (!d->best_match) { - struct mount_entry *me; - size_t name_len = strlen(d->name); - size_t best_match_len = 0; - struct mount_entry *best_match = NULL; - struct fs_usage fsp; - - /* set best match if path name exactly matches a mounted device name */ - for (me = mount_list; me; me = me->me_next) { - if (strcmp(me->me_devname, d->name) == 0) { - if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) { - best_match = me; - } - } - } - - /* set best match by directory name if no match was found by devname */ - if (!best_match) { - for (me = mount_list; me; me = me->me_next) { - size_t len = strlen(me->me_mountdir); - if ((!exact && - (best_match_len <= len && len <= name_len && (len == 1 || strncmp(me->me_mountdir, d->name, len) == 0))) || - (exact && strcmp(me->me_mountdir, d->name) == 0)) { - if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) { - best_match = me; - best_match_len = len; - } - } - } - } - - if (best_match) { - d->best_match = best_match; - } else { - d->best_match = NULL; /* Not sure why this is needed as it should be null on initialisation */ - } - } - } -} - -/* Returns true if name is in list */ -bool np_find_name(struct name_list *list, const char *name) { - const struct name_list *n; - - if (list == NULL || name == NULL) { - return false; - } - for (n = list; n; n = n->next) { - if (!strcmp(name, n->name)) { - return true; - } - } - return false; -} - -/* Returns true if name is in list */ -bool np_find_regmatch(struct regex_list *list, const char *name) { - int len; - regmatch_t m; - - if (name == NULL) { - return false; - } - - len = strlen(name); - - for (; list; list = list->next) { - /* Emulate a full match as if surrounded with ^( )$ - by checking whether the match spans the whole name */ - if (!regexec(&list->regex, name, 1, &m, 0) && m.rm_so == 0 && m.rm_eo == len) { - return true; - } - } - - return false; -} - -bool np_seen_name(struct name_list *list, const char *name) { - const struct name_list *s; - for (s = list; s; s = s->next) { - if (!strcmp(s->name, name)) { - return true; - } - } - return false; -} - -bool np_regex_match_mount_entry(struct mount_entry *me, regex_t *re) { - if (regexec(re, me->me_devname, (size_t)0, NULL, 0) == 0 || regexec(re, me->me_mountdir, (size_t)0, NULL, 0) == 0) { - return true; - } - return false; -} diff --git a/lib/utils_disk.h b/lib/utils_disk.h deleted file mode 100644 index c5e81dc1..00000000 --- a/lib/utils_disk.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Header file for utils_disk */ - -#include "mountlist.h" -#include "utils_base.h" -#include "regex.h" - -struct name_list { - char *name; - struct name_list *next; -}; - -struct regex_list { - regex_t regex; - struct regex_list *next; -}; - -struct parameter_list { - char *name; - thresholds *freespace_bytes; - thresholds *freespace_units; - thresholds *freespace_percent; - thresholds *usedspace_bytes; - thresholds *usedspace_units; - thresholds *usedspace_percent; - thresholds *usedinodes_percent; - thresholds *freeinodes_percent; - 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; - uint64_t dused_units, dfree_units, dtotal_units; - double dused_inodes_percent, dfree_inodes_percent; -}; - -void np_add_name(struct name_list **list, const char *name); -bool np_find_name(struct name_list *list, const char *name); -bool np_seen_name(struct name_list *list, const char *name); -int np_add_regex(struct regex_list **list, const char *regex, int cflags); -bool np_find_regmatch(struct regex_list *list, const char *name); -struct parameter_list *np_add_parameter(struct parameter_list **list, const char *name); -struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name); -struct parameter_list *np_del_parameter(struct parameter_list *item, struct parameter_list *prev); - -int search_parameter_list(struct parameter_list *list, const char *name); -void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, bool exact); -bool np_regex_match_mount_entry(struct mount_entry *me, regex_t *re); diff --git a/plugins/Makefile.am b/plugins/Makefile.am index e2bed4c3..30283cb4 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -55,6 +55,7 @@ EXTRA_DIST = t \ check_hpjd.d \ check_game.d \ check_radius.d \ + check_disk.d \ check_time.d \ check_nagios.d \ check_dbi.d \ @@ -119,6 +120,7 @@ check_curl_LDADD = $(NETLIBS) $(LIBCURLLIBS) $(SSLOBJS) $(URIPARSERLIBS) picohtt check_dbi_LDADD = $(NETLIBS) $(DBILIBS) check_dig_LDADD = $(NETLIBS) check_disk_LDADD = $(BASEOBJS) +check_disk_SOURCES = check_disk.c check_disk.d/utils_disk.c check_dns_LDADD = $(NETLIBS) check_dummy_LDADD = $(BASEOBJS) check_fping_LDADD = $(NETLIBS) diff --git a/plugins/check_disk.d/utils_disk.c b/plugins/check_disk.d/utils_disk.c new file mode 100644 index 00000000..2b761f5e --- /dev/null +++ b/plugins/check_disk.d/utils_disk.c @@ -0,0 +1,255 @@ +/***************************************************************************** + * + * Library for check_disk + * + * License: GPL + * Copyright (c) 1999-2024 Monitoring Plugins Development Team + * + * Description: + * + * This file contains utilities for check_disk. These are tested by libtap + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + *****************************************************************************/ + +#include "common.h" +#include "utils_disk.h" +#include "gl/fsusage.h" +#include + +void np_add_name(struct name_list **list, const char *name) { + struct name_list *new_entry; + new_entry = (struct name_list *)malloc(sizeof *new_entry); + new_entry->name = (char *)name; + new_entry->next = *list; + *list = new_entry; +} + +/* @brief Initialises a new regex at the begin of list via regcomp(3) + * + * @details if the regex fails to compile the error code of regcomp(3) is returned + * and list is not modified, otherwise list is modified to point to the new + * element + * @param list Pointer to a linked list of regex_list elements + * @param regex the string containing the regex which should be inserted into the list + * @param clags the cflags parameter for regcomp(3) + */ +int np_add_regex(struct regex_list **list, const char *regex, int cflags) { + struct regex_list *new_entry = (struct regex_list *)malloc(sizeof *new_entry); + + if (new_entry == NULL) { + die(STATE_UNKNOWN, _("Cannot allocate memory: %s"), strerror(errno)); + } + + int regcomp_result = regcomp(&new_entry->regex, regex, cflags); + + if (!regcomp_result) { + // regcomp succeeded + new_entry->next = *list; + *list = new_entry; + + return 0; + } else { + // regcomp failed + free(new_entry); + + return regcomp_result; + } +} + +/* Initialises a new parameter at the end of list */ +struct parameter_list *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 *)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; + new_path->usedspace_bytes = NULL; + new_path->usedspace_units = NULL; + new_path->usedspace_percent = NULL; + new_path->usedinodes_percent = NULL; + new_path->freeinodes_percent = NULL; + new_path->group = NULL; + new_path->dfree_pct = -1; + new_path->dused_pct = -1; + new_path->total = 0; + new_path->available = 0; + new_path->available_to_root = 0; + new_path->used = 0; + new_path->dused_units = 0; + new_path->dfree_units = 0; + new_path->dtotal_units = 0; + new_path->inodes_total = 0; + new_path->inodes_free = 0; + new_path->inodes_free_to_root = 0; + new_path->inodes_used = 0; + 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; +} + +/* Delete a given parameter from list and return pointer to next element*/ +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) + next = item->name_next; + else + next = NULL; + + if (next) + next->name_prev = prev; + + if (prev) + prev->name_next = next; + + if (item->name) { + free(item->name); + } + free(item); + + return next; +} + +/* returns a pointer to the struct found in the list */ +struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name) { + struct parameter_list *temp_list; + for (temp_list = list; temp_list; temp_list = temp_list->name_next) { + if (!strcmp(temp_list->name, name)) + return temp_list; + } + + return NULL; +} + +void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, bool exact) { + struct parameter_list *d; + for (d = desired; d; d = d->name_next) { + if (!d->best_match) { + struct mount_entry *me; + size_t name_len = strlen(d->name); + size_t best_match_len = 0; + struct mount_entry *best_match = NULL; + struct fs_usage fsp; + + /* set best match if path name exactly matches a mounted device name */ + for (me = mount_list; me; me = me->me_next) { + if (strcmp(me->me_devname, d->name) == 0) { + if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) { + best_match = me; + } + } + } + + /* set best match by directory name if no match was found by devname */ + if (!best_match) { + for (me = mount_list; me; me = me->me_next) { + size_t len = strlen(me->me_mountdir); + if ((!exact && + (best_match_len <= len && len <= name_len && (len == 1 || strncmp(me->me_mountdir, d->name, len) == 0))) || + (exact && strcmp(me->me_mountdir, d->name) == 0)) { + if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) { + best_match = me; + best_match_len = len; + } + } + } + } + + if (best_match) { + d->best_match = best_match; + } else { + d->best_match = NULL; /* Not sure why this is needed as it should be null on initialisation */ + } + } + } +} + +/* Returns true if name is in list */ +bool np_find_name(struct name_list *list, const char *name) { + const struct name_list *n; + + if (list == NULL || name == NULL) { + return false; + } + for (n = list; n; n = n->next) { + if (!strcmp(name, n->name)) { + return true; + } + } + return false; +} + +/* Returns true if name is in list */ +bool np_find_regmatch(struct regex_list *list, const char *name) { + int len; + regmatch_t m; + + if (name == NULL) { + return false; + } + + len = strlen(name); + + for (; list; list = list->next) { + /* Emulate a full match as if surrounded with ^( )$ + by checking whether the match spans the whole name */ + if (!regexec(&list->regex, name, 1, &m, 0) && m.rm_so == 0 && m.rm_eo == len) { + return true; + } + } + + return false; +} + +bool np_seen_name(struct name_list *list, const char *name) { + const struct name_list *s; + for (s = list; s; s = s->next) { + if (!strcmp(s->name, name)) { + return true; + } + } + return false; +} + +bool np_regex_match_mount_entry(struct mount_entry *me, regex_t *re) { + if (regexec(re, me->me_devname, (size_t)0, NULL, 0) == 0 || regexec(re, me->me_mountdir, (size_t)0, NULL, 0) == 0) { + return true; + } + return false; +} diff --git a/plugins/check_disk.d/utils_disk.h b/plugins/check_disk.d/utils_disk.h new file mode 100644 index 00000000..c5e81dc1 --- /dev/null +++ b/plugins/check_disk.d/utils_disk.h @@ -0,0 +1,48 @@ +/* Header file for utils_disk */ + +#include "mountlist.h" +#include "utils_base.h" +#include "regex.h" + +struct name_list { + char *name; + struct name_list *next; +}; + +struct regex_list { + regex_t regex; + struct regex_list *next; +}; + +struct parameter_list { + char *name; + thresholds *freespace_bytes; + thresholds *freespace_units; + thresholds *freespace_percent; + thresholds *usedspace_bytes; + thresholds *usedspace_units; + thresholds *usedspace_percent; + thresholds *usedinodes_percent; + thresholds *freeinodes_percent; + 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; + uint64_t dused_units, dfree_units, dtotal_units; + double dused_inodes_percent, dfree_inodes_percent; +}; + +void np_add_name(struct name_list **list, const char *name); +bool np_find_name(struct name_list *list, const char *name); +bool np_seen_name(struct name_list *list, const char *name); +int np_add_regex(struct regex_list **list, const char *regex, int cflags); +bool np_find_regmatch(struct regex_list *list, const char *name); +struct parameter_list *np_add_parameter(struct parameter_list **list, const char *name); +struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name); +struct parameter_list *np_del_parameter(struct parameter_list *item, struct parameter_list *prev); + +int search_parameter_list(struct parameter_list *list, const char *name); +void np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list, bool exact); +bool np_regex_match_mount_entry(struct mount_entry *me, regex_t *re); -- cgit v1.2.3-74-g34f1 From 59e0a258f9c0f393bf29cced1f35743f74e7b10c Mon Sep 17 00:00:00 2001 From: Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:57:44 +0100 Subject: Migrate disk tests from lib, tool --- .gitignore | 3 +- configure.ac | 4 +- lib/tests/Makefile.am | 6 +- lib/tests/test_disk.c | 192 -------------------------------------- lib/tests/test_disk.t | 6 -- plugins/Makefile.am | 8 +- plugins/check_disk.d/utils_disk.c | 4 +- plugins/check_disk.d/utils_disk.h | 2 +- plugins/common.h | 6 +- plugins/tests/test_check_disk.c | 192 ++++++++++++++++++++++++++++++++++++++ plugins/tests/test_check_disk.t | 6 ++ 11 files changed, 216 insertions(+), 213 deletions(-) delete mode 100644 lib/tests/test_disk.c delete mode 100755 lib/tests/test_disk.t create mode 100644 plugins/tests/test_check_disk.c create mode 100755 plugins/tests/test_check_disk.t (limited to 'plugins/Makefile.am') diff --git a/.gitignore b/.gitignore index 5245495e..8b14f429 100644 --- a/.gitignore +++ b/.gitignore @@ -114,7 +114,6 @@ NP-VERSION-FILE /lib/tests/Makefile.in /lib/tests/test_base64 /lib/tests/test_cmd -/lib/tests/test_disk /lib/tests/test_tcp /lib/tests/test_utils /lib/tests/utils_base.Po @@ -223,7 +222,7 @@ plugins/check_disk.d/.dirstamp /plugins/tests/Makefile /plugins/tests/Makefile.in /plugins/tests/test_utils -/plugins/tests/test_disk +/plugins/tests/test_check_disk /plugins/tests/test_check_swap /plugins/tests/.deps /plugins/tests/.dirstamp diff --git a/configure.ac b/configure.ac index 204fc6e3..fdc9b699 100644 --- a/configure.ac +++ b/configure.ac @@ -181,10 +181,10 @@ fi # Finally, define tests if we use libtap if test "$enable_libtap" = "yes" ; then - EXTRA_TEST="test_utils test_disk test_tcp test_cmd test_base64" + EXTRA_TEST="test_utils test_tcp test_cmd test_base64" AC_SUBST(EXTRA_TEST) - EXTRA_PLUGIN_TESTS="tests/test_check_swap" + EXTRA_PLUGIN_TESTS="tests/test_check_swap tests/test_check_disk" AC_SUBST(EXTRA_PLUGIN_TESTS) fi diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am index 9be94f6d..7798a72e 100644 --- a/lib/tests/Makefile.am +++ b/lib/tests/Makefile.am @@ -8,9 +8,9 @@ check_PROGRAMS = @EXTRA_TEST@ AM_CPPFLAGS = -DNP_STATE_DIR_PREFIX=\"$(localstatedir)\" \ -I$(top_srcdir)/lib -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/plugins -EXTRA_PROGRAMS = test_utils test_disk test_tcp test_cmd test_base64 test_ini1 test_ini3 test_opts1 test_opts2 test_opts3 test_generic_output +EXTRA_PROGRAMS = test_utils test_tcp test_cmd test_base64 test_ini1 test_ini3 test_opts1 test_opts2 test_opts3 test_generic_output -np_test_scripts = test_base64.t test_cmd.t test_disk.t test_ini1.t test_ini3.t test_opts1.t test_opts2.t test_opts3.t test_tcp.t test_utils.t test_generic_output.t +np_test_scripts = test_base64.t test_cmd.t test_ini1.t test_ini3.t test_opts1.t test_opts2.t test_opts3.t test_tcp.t test_utils.t test_generic_output.t np_test_files = config-dos.ini config-opts.ini config-tiny.ini plugin.ini plugins.ini EXTRA_DIST = $(np_test_scripts) $(np_test_files) var @@ -29,7 +29,7 @@ AM_CFLAGS = -g -I$(top_srcdir)/lib -I$(top_srcdir)/gl $(tap_cflags) AM_LDFLAGS = $(tap_ldflags) -ltap LDADD = $(top_srcdir)/lib/libmonitoringplug.a $(top_srcdir)/gl/libgnu.a $(LIB_CRYPTO) -SOURCES = test_utils.c test_disk.c test_tcp.c test_cmd.c test_base64.c test_ini1.c test_ini3.c test_opts1.c test_opts2.c test_opts3.c test_generic_output.c +SOURCES = test_utils.c test_tcp.c test_cmd.c test_base64.c test_ini1.c test_ini3.c test_opts1.c test_opts2.c test_opts3.c test_generic_output.c test: ${noinst_PROGRAMS} perl -MTest::Harness -e '$$Test::Harness::switches=""; runtests(map {$$_ .= ".t"} @ARGV)' $(EXTRA_PROGRAMS) diff --git a/lib/tests/test_disk.c b/lib/tests/test_disk.c deleted file mode 100644 index c18db7a4..00000000 --- a/lib/tests/test_disk.c +++ /dev/null @@ -1,192 +0,0 @@ -/***************************************************************************** - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * - *****************************************************************************/ - -#include "common.h" -#include "utils_disk.h" -#include "tap.h" -#include "regex.h" - -void np_test_mount_entry_regex(struct mount_entry *dummy_mount_list, char *regstr, int cflags, int expect, char *desc); - -int main(int argc, char **argv) { - struct name_list *exclude_filesystem = NULL; - struct name_list *exclude_fstype = NULL; - struct name_list *dummy_mountlist = NULL; - struct name_list *temp_name; - struct parameter_list *paths = NULL; - struct parameter_list *p, *prev = NULL, *last = NULL; - - struct mount_entry *dummy_mount_list; - struct mount_entry *me; - struct mount_entry **mtail = &dummy_mount_list; - int cflags = REG_NOSUB | REG_EXTENDED; - int found = 0, count = 0; - - plan_tests(33); - - ok(np_find_name(exclude_filesystem, "/var/log") == false, "/var/log not in list"); - np_add_name(&exclude_filesystem, "/var/log"); - ok(np_find_name(exclude_filesystem, "/var/log") == true, "is in list now"); - ok(np_find_name(exclude_filesystem, "/home") == false, "/home not in list"); - np_add_name(&exclude_filesystem, "/home"); - ok(np_find_name(exclude_filesystem, "/home") == true, "is in list now"); - ok(np_find_name(exclude_filesystem, "/var/log") == true, "/var/log still in list"); - - ok(np_find_name(exclude_fstype, "iso9660") == false, "iso9660 not in list"); - np_add_name(&exclude_fstype, "iso9660"); - ok(np_find_name(exclude_fstype, "iso9660") == true, "is in list now"); - - ok(np_find_name(exclude_filesystem, "iso9660") == false, "Make sure no clashing in variables"); - - /* - for (temp_name = exclude_filesystem; temp_name; temp_name = temp_name->next) { - printf("Name: %s\n", temp_name->name); - } - */ - - me = (struct mount_entry *)malloc(sizeof *me); - me->me_devname = strdup("/dev/c0t0d0s0"); - me->me_mountdir = strdup("/"); - *mtail = me; - mtail = &me->me_next; - - me = (struct mount_entry *)malloc(sizeof *me); - me->me_devname = strdup("/dev/c1t0d1s0"); - me->me_mountdir = strdup("/var"); - *mtail = me; - mtail = &me->me_next; - - me = (struct mount_entry *)malloc(sizeof *me); - me->me_devname = strdup("/dev/c2t0d0s0"); - me->me_mountdir = strdup("/home"); - *mtail = me; - mtail = &me->me_next; - - np_test_mount_entry_regex(dummy_mount_list, strdup("/"), cflags, 3, strdup("a")); - np_test_mount_entry_regex(dummy_mount_list, strdup("/dev"), cflags, 3, strdup("regex on dev names:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("/foo"), cflags, 0, strdup("regex on non existent dev/path:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("/Foo"), cflags | REG_ICASE, 0, strdup("regi on non existent dev/path:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("/c.t0"), cflags, 3, strdup("partial devname regex match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("c0t0"), cflags, 1, strdup("partial devname regex match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("C0t0"), cflags | REG_ICASE, 1, strdup("partial devname regi match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("home"), cflags, 1, strdup("partial pathname regex match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("hOme"), cflags | REG_ICASE, 1, strdup("partial pathname regi match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("(/home)|(/var)"), cflags, 2, strdup("grouped regex pathname match:")); - np_test_mount_entry_regex(dummy_mount_list, strdup("(/homE)|(/Var)"), cflags | REG_ICASE, 2, strdup("grouped regi pathname match:")); - - np_add_parameter(&paths, "/home/groups"); - np_add_parameter(&paths, "/var"); - np_add_parameter(&paths, "/tmp"); - np_add_parameter(&paths, "/home/tonvoon"); - np_add_parameter(&paths, "/dev/c2t0d0s0"); - - np_set_best_match(paths, dummy_mount_list, false); - for (p = paths; p; p = p->name_next) { - struct mount_entry *temp_me; - temp_me = p->best_match; - if (!strcmp(p->name, "/home/groups")) { - ok(temp_me && !strcmp(temp_me->me_mountdir, "/home"), "/home/groups got right best match: /home"); - } else if (!strcmp(p->name, "/var")) { - ok(temp_me && !strcmp(temp_me->me_mountdir, "/var"), "/var got right best match: /var"); - } else if (!strcmp(p->name, "/tmp")) { - ok(temp_me && !strcmp(temp_me->me_mountdir, "/"), "/tmp got right best match: /"); - } else if (!strcmp(p->name, "/home/tonvoon")) { - ok(temp_me && !strcmp(temp_me->me_mountdir, "/home"), "/home/tonvoon got right best match: /home"); - } else if (!strcmp(p->name, "/dev/c2t0d0s0")) { - ok(temp_me && !strcmp(temp_me->me_devname, "/dev/c2t0d0s0"), "/dev/c2t0d0s0 got right best match: /dev/c2t0d0s0"); - } - } - - paths = NULL; /* Bad boy - should free, but this is a test suite */ - np_add_parameter(&paths, "/home/groups"); - np_add_parameter(&paths, "/var"); - np_add_parameter(&paths, "/tmp"); - np_add_parameter(&paths, "/home/tonvoon"); - np_add_parameter(&paths, "/home"); - - np_set_best_match(paths, dummy_mount_list, true); - for (p = paths; p; p = p->name_next) { - if (!strcmp(p->name, "/home/groups")) { - ok(!p->best_match, "/home/groups correctly not found"); - } else if (!strcmp(p->name, "/var")) { - ok(p->best_match, "/var found"); - } else if (!strcmp(p->name, "/tmp")) { - ok(!p->best_match, "/tmp correctly not found"); - } else if (!strcmp(p->name, "/home/tonvoon")) { - ok(!p->best_match, "/home/tonvoon not found"); - } else if (!strcmp(p->name, "/home")) { - ok(p->best_match, "/home found"); - } - } - - /* test deleting first element in paths */ - paths = np_del_parameter(paths, NULL); - for (p = paths; p; p = p->name_next) { - if (!strcmp(p->name, "/home/groups")) - found = 1; - } - ok(found == 0, "first element successfully deleted"); - found = 0; - - p = paths; - while (p) { - if (!strcmp(p->name, "/tmp")) - p = np_del_parameter(p, prev); - else { - prev = p; - p = p->name_next; - } - } - - for (p = paths; p; p = p->name_next) { - if (!strcmp(p->name, "/tmp")) - found = 1; - if (p->name_next) - prev = p; - else - last = p; - } - ok(found == 0, "/tmp element successfully deleted"); - - p = np_del_parameter(last, prev); - for (p = paths; p; p = p->name_next) { - if (!strcmp(p->name, "/home")) - found = 1; - last = p; - count++; - } - ok(found == 0, "last (/home) element successfully deleted"); - ok(count == 2, "two elements remaining"); - - return exit_status(); -} - -void np_test_mount_entry_regex(struct mount_entry *dummy_mount_list, char *regstr, int cflags, int expect, char *desc) { - int matches = 0; - regex_t re; - struct mount_entry *me; - if (regcomp(&re, regstr, cflags) == 0) { - for (me = dummy_mount_list; me; me = me->me_next) { - if (np_regex_match_mount_entry(me, &re)) - matches++; - } - ok(matches == expect, "%s '%s' matched %i/3 entries. ok: %i/3", desc, regstr, expect, matches); - - } else - ok(false, "regex '%s' not compilable", regstr); -} diff --git a/lib/tests/test_disk.t b/lib/tests/test_disk.t deleted file mode 100755 index da84dfdf..00000000 --- a/lib/tests/test_disk.t +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/perl -use Test::More; -if (! -e "./test_disk") { - plan skip_all => "./test_disk not compiled - please enable libtap library to test"; -} -exec "./test_disk"; diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 30283cb4..04fb7ed2 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -40,11 +40,13 @@ EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \ check_nagios check_by_ssh check_dns check_nt check_ide_smart \ check_procs check_mysql_query check_apt check_dbi check_curl \ \ - tests/test_check_swap + tests/test_check_swap \ + tests/test_check_disk SUBDIRS = picohttpparser -np_test_scripts = tests/test_check_swap.t +np_test_scripts = tests/test_check_swap.t \ + tests/test_check_disk.t EXTRA_DIST = t \ tests \ @@ -167,6 +169,8 @@ endif tests_test_check_swap_LDADD = $(BASEOBJS) $(tap_ldflags) -ltap tests_test_check_swap_SOURCES = tests/test_check_swap.c check_swap.d/swap.c +tests_test_check_disk_LDADD = $(BASEOBJS) $(tap_ldflags) check_disk.d/utils_disk.c -ltap +tests_test_check_disk_SOURCES = tests/test_check_disk.c ############################################################################## # secondary dependencies diff --git a/plugins/check_disk.d/utils_disk.c b/plugins/check_disk.d/utils_disk.c index 1d806715..369c85d5 100644 --- a/plugins/check_disk.d/utils_disk.c +++ b/plugins/check_disk.d/utils_disk.c @@ -26,9 +26,9 @@ * *****************************************************************************/ -#include "common.h" +#include "../common.h" #include "utils_disk.h" -#include "gl/fsusage.h" +#include "../../gl/fsusage.h" #include void np_add_name(struct name_list **list, const char *name) { diff --git a/plugins/check_disk.d/utils_disk.h b/plugins/check_disk.d/utils_disk.h index 1c68fed9..0c69f987 100644 --- a/plugins/check_disk.d/utils_disk.h +++ b/plugins/check_disk.d/utils_disk.h @@ -2,7 +2,7 @@ #include "../../config.h" #include "../../gl/mountlist.h" -#include "utils_base.h" +#include "../../lib/utils_base.h" #include "regex.h" #include diff --git a/plugins/common.h b/plugins/common.h index 603bae55..35d1e549 100644 --- a/plugins/common.h +++ b/plugins/common.h @@ -31,7 +31,7 @@ #ifndef _COMMON_H_ #define _COMMON_H_ -#include "config.h" +#include "../config.h" #include "../lib/monitoringplug.h" #ifdef HAVE_FEATURES_H @@ -110,7 +110,7 @@ /* GNU Libraries */ #include -#include "dirname.h" +#include "../gl/dirname.h" #include @@ -190,7 +190,7 @@ enum { * Internationalization * */ -#include "gettext.h" +#include "../gl/gettext.h" #define _(String) gettext (String) #if ! ENABLE_NLS # undef textdomain diff --git a/plugins/tests/test_check_disk.c b/plugins/tests/test_check_disk.c new file mode 100644 index 00000000..92d0d270 --- /dev/null +++ b/plugins/tests/test_check_disk.c @@ -0,0 +1,192 @@ +/***************************************************************************** + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * + *****************************************************************************/ + +#include "common.h" +#include "../check_disk.d/utils_disk.h" +#include "../../tap/tap.h" +#include "regex.h" + +void np_test_mount_entry_regex(struct mount_entry *dummy_mount_list, char *regstr, int cflags, int expect, char *desc); + +int main(int argc, char **argv) { + struct name_list *exclude_filesystem = NULL; + struct name_list *exclude_fstype = NULL; + struct name_list *dummy_mountlist = NULL; + struct name_list *temp_name; + struct parameter_list *paths = NULL; + struct parameter_list *p, *prev = NULL, *last = NULL; + + struct mount_entry *dummy_mount_list; + struct mount_entry *me; + struct mount_entry **mtail = &dummy_mount_list; + int cflags = REG_NOSUB | REG_EXTENDED; + int found = 0, count = 0; + + plan_tests(33); + + ok(np_find_name(exclude_filesystem, "/var/log") == false, "/var/log not in list"); + np_add_name(&exclude_filesystem, "/var/log"); + ok(np_find_name(exclude_filesystem, "/var/log") == true, "is in list now"); + ok(np_find_name(exclude_filesystem, "/home") == false, "/home not in list"); + np_add_name(&exclude_filesystem, "/home"); + ok(np_find_name(exclude_filesystem, "/home") == true, "is in list now"); + ok(np_find_name(exclude_filesystem, "/var/log") == true, "/var/log still in list"); + + ok(np_find_name(exclude_fstype, "iso9660") == false, "iso9660 not in list"); + np_add_name(&exclude_fstype, "iso9660"); + ok(np_find_name(exclude_fstype, "iso9660") == true, "is in list now"); + + ok(np_find_name(exclude_filesystem, "iso9660") == false, "Make sure no clashing in variables"); + + /* + for (temp_name = exclude_filesystem; temp_name; temp_name = temp_name->next) { + printf("Name: %s\n", temp_name->name); + } + */ + + me = (struct mount_entry *)malloc(sizeof *me); + me->me_devname = strdup("/dev/c0t0d0s0"); + me->me_mountdir = strdup("/"); + *mtail = me; + mtail = &me->me_next; + + me = (struct mount_entry *)malloc(sizeof *me); + me->me_devname = strdup("/dev/c1t0d1s0"); + me->me_mountdir = strdup("/var"); + *mtail = me; + mtail = &me->me_next; + + me = (struct mount_entry *)malloc(sizeof *me); + me->me_devname = strdup("/dev/c2t0d0s0"); + me->me_mountdir = strdup("/home"); + *mtail = me; + mtail = &me->me_next; + + np_test_mount_entry_regex(dummy_mount_list, strdup("/"), cflags, 3, strdup("a")); + np_test_mount_entry_regex(dummy_mount_list, strdup("/dev"), cflags, 3, strdup("regex on dev names:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("/foo"), cflags, 0, strdup("regex on non existent dev/path:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("/Foo"), cflags | REG_ICASE, 0, strdup("regi on non existent dev/path:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("/c.t0"), cflags, 3, strdup("partial devname regex match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("c0t0"), cflags, 1, strdup("partial devname regex match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("C0t0"), cflags | REG_ICASE, 1, strdup("partial devname regi match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("home"), cflags, 1, strdup("partial pathname regex match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("hOme"), cflags | REG_ICASE, 1, strdup("partial pathname regi match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("(/home)|(/var)"), cflags, 2, strdup("grouped regex pathname match:")); + np_test_mount_entry_regex(dummy_mount_list, strdup("(/homE)|(/Var)"), cflags | REG_ICASE, 2, strdup("grouped regi pathname match:")); + + np_add_parameter(&paths, "/home/groups"); + np_add_parameter(&paths, "/var"); + np_add_parameter(&paths, "/tmp"); + np_add_parameter(&paths, "/home/tonvoon"); + np_add_parameter(&paths, "/dev/c2t0d0s0"); + + np_set_best_match(paths, dummy_mount_list, false); + for (p = paths; p; p = p->name_next) { + struct mount_entry *temp_me; + temp_me = p->best_match; + if (!strcmp(p->name, "/home/groups")) { + ok(temp_me && !strcmp(temp_me->me_mountdir, "/home"), "/home/groups got right best match: /home"); + } else if (!strcmp(p->name, "/var")) { + ok(temp_me && !strcmp(temp_me->me_mountdir, "/var"), "/var got right best match: /var"); + } else if (!strcmp(p->name, "/tmp")) { + ok(temp_me && !strcmp(temp_me->me_mountdir, "/"), "/tmp got right best match: /"); + } else if (!strcmp(p->name, "/home/tonvoon")) { + ok(temp_me && !strcmp(temp_me->me_mountdir, "/home"), "/home/tonvoon got right best match: /home"); + } else if (!strcmp(p->name, "/dev/c2t0d0s0")) { + ok(temp_me && !strcmp(temp_me->me_devname, "/dev/c2t0d0s0"), "/dev/c2t0d0s0 got right best match: /dev/c2t0d0s0"); + } + } + + paths = NULL; /* Bad boy - should free, but this is a test suite */ + np_add_parameter(&paths, "/home/groups"); + np_add_parameter(&paths, "/var"); + np_add_parameter(&paths, "/tmp"); + np_add_parameter(&paths, "/home/tonvoon"); + np_add_parameter(&paths, "/home"); + + np_set_best_match(paths, dummy_mount_list, true); + for (p = paths; p; p = p->name_next) { + if (!strcmp(p->name, "/home/groups")) { + ok(!p->best_match, "/home/groups correctly not found"); + } else if (!strcmp(p->name, "/var")) { + ok(p->best_match, "/var found"); + } else if (!strcmp(p->name, "/tmp")) { + ok(!p->best_match, "/tmp correctly not found"); + } else if (!strcmp(p->name, "/home/tonvoon")) { + ok(!p->best_match, "/home/tonvoon not found"); + } else if (!strcmp(p->name, "/home")) { + ok(p->best_match, "/home found"); + } + } + + /* test deleting first element in paths */ + paths = np_del_parameter(paths, NULL); + for (p = paths; p; p = p->name_next) { + if (!strcmp(p->name, "/home/groups")) + found = 1; + } + ok(found == 0, "first element successfully deleted"); + found = 0; + + p = paths; + while (p) { + if (!strcmp(p->name, "/tmp")) + p = np_del_parameter(p, prev); + else { + prev = p; + p = p->name_next; + } + } + + for (p = paths; p; p = p->name_next) { + if (!strcmp(p->name, "/tmp")) + found = 1; + if (p->name_next) + prev = p; + else + last = p; + } + ok(found == 0, "/tmp element successfully deleted"); + + p = np_del_parameter(last, prev); + for (p = paths; p; p = p->name_next) { + if (!strcmp(p->name, "/home")) + found = 1; + last = p; + count++; + } + ok(found == 0, "last (/home) element successfully deleted"); + ok(count == 2, "two elements remaining"); + + return exit_status(); +} + +void np_test_mount_entry_regex(struct mount_entry *dummy_mount_list, char *regstr, int cflags, int expect, char *desc) { + int matches = 0; + regex_t re; + struct mount_entry *me; + if (regcomp(&re, regstr, cflags) == 0) { + for (me = dummy_mount_list; me; me = me->me_next) { + if (np_regex_match_mount_entry(me, &re)) + matches++; + } + ok(matches == expect, "%s '%s' matched %i/3 entries. ok: %i/3", desc, regstr, expect, matches); + + } else + ok(false, "regex '%s' not compilable", regstr); +} diff --git a/plugins/tests/test_check_disk.t b/plugins/tests/test_check_disk.t new file mode 100755 index 00000000..56354650 --- /dev/null +++ b/plugins/tests/test_check_disk.t @@ -0,0 +1,6 @@ +#!/usr/bin/perl +use Test::More; +if (! -e "./test_check_disk") { + plan skip_all => "./test_check_disk not compiled - please enable libtap library to test"; +} +exec "./test_check_disk"; -- cgit v1.2.3-74-g34f1