[monitoring-plugins] Refactor check_ntp_peer

Lorenz Kästle git at monitoring-plugins.org
Wed Mar 12 16:00:12 CET 2025


 Module: monitoring-plugins
 Branch: master
 Commit: 8b2222e8b704fc451093996e906c07a6a8e3538a
 Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
   Date: Wed Mar 12 01:00:48 2025 +0100
    URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=8b2222e8

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(-)

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 at monitoring-plugins.org";
@@ -42,26 +43,17 @@ const char *email = "devel at 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 <stddef.h>
+
+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;
+}



More information about the Commits mailing list