summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/check_ntp_peer.c70
1 files changed, 38 insertions, 32 deletions
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c
index 2fac2bb..f99e503 100644
--- a/plugins/check_ntp_peer.c
+++ b/plugins/check_ntp_peer.c
@@ -61,7 +61,7 @@ static char *tcrit = "0:";
61static bool syncsource_found = false; 61static bool syncsource_found = false;
62static bool li_alarm = false; 62static bool li_alarm = false;
63 63
64static int process_arguments(int, char **); 64static int process_arguments(int /*argc*/, char ** /*argv*/);
65static thresholds *offset_thresholds = NULL; 65static thresholds *offset_thresholds = NULL;
66static thresholds *jitter_thresholds = NULL; 66static thresholds *jitter_thresholds = NULL;
67static thresholds *stratum_thresholds = NULL; 67static thresholds *stratum_thresholds = NULL;
@@ -158,9 +158,6 @@ typedef struct {
158 } while (0); 158 } while (0);
159 159
160void print_ntp_control_message(const ntp_control_message *p) { 160void print_ntp_control_message(const ntp_control_message *p) {
161 int i = 0, numpeers = 0;
162 const ntp_assoc_status_pair *peer = NULL;
163
164 printf("control packet contents:\n"); 161 printf("control packet contents:\n");
165 printf("\tflags: 0x%.2x , 0x%.2x\n", p->flags, p->op); 162 printf("\tflags: 0x%.2x , 0x%.2x\n", p->flags, p->op);
166 printf("\t li=%d (0x%.2x)\n", LI(p->flags), p->flags & LI_MASK); 163 printf("\t li=%d (0x%.2x)\n", LI(p->flags), p->flags & LI_MASK);
@@ -175,10 +172,11 @@ void print_ntp_control_message(const ntp_control_message *p) {
175 printf("\tassoc: %d (0x%.2x)\n", ntohs(p->assoc), ntohs(p->assoc)); 172 printf("\tassoc: %d (0x%.2x)\n", ntohs(p->assoc), ntohs(p->assoc));
176 printf("\toffset: %d (0x%.2x)\n", ntohs(p->offset), ntohs(p->offset)); 173 printf("\toffset: %d (0x%.2x)\n", ntohs(p->offset), ntohs(p->offset));
177 printf("\tcount: %d (0x%.2x)\n", ntohs(p->count), ntohs(p->count)); 174 printf("\tcount: %d (0x%.2x)\n", ntohs(p->count), ntohs(p->count));
178 numpeers = ntohs(p->count) / (sizeof(ntp_assoc_status_pair)); 175
176 int numpeers = ntohs(p->count) / (sizeof(ntp_assoc_status_pair));
179 if (p->op & REM_RESP && p->op & OP_READSTAT) { 177 if (p->op & REM_RESP && p->op & OP_READSTAT) {
180 peer = (ntp_assoc_status_pair *)p->data; 178 const ntp_assoc_status_pair *peer = (ntp_assoc_status_pair *)p->data;
181 for (i = 0; i < numpeers; i++) { 179 for (int i = 0; i < numpeers; i++) {
182 printf("\tpeer id %.2x status %.2x", ntohs(peer[i].assoc), ntohs(peer[i].status)); 180 printf("\tpeer id %.2x status %.2x", ntohs(peer[i].assoc), ntohs(peer[i].status));
183 if (PEER_SEL(peer[i].status) >= PEER_SYNCSOURCE) { 181 if (PEER_SEL(peer[i].status) >= PEER_SYNCSOURCE) {
184 printf(" <-- current sync source"); 182 printf(" <-- current sync source");
@@ -214,18 +212,6 @@ void setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq)
214 * used later in main to check is the server was synchronized. It works 212 * used later in main to check is the server was synchronized. It works
215 * so I left it alone */ 213 * so I left it alone */
216int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers) { 214int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum, int *num_truechimers) {
217 int conn = -1, i, npeers = 0, num_candidates = 0;
218 double tmp_offset = 0;
219 int min_peer_sel = PEER_INCLUDED;
220 int peers_size = 0, peer_offset = 0;
221 int status;
222 ntp_assoc_status_pair *peers = NULL;
223 ntp_control_message req;
224 const char *getvar = "stratum,offset,jitter";
225 char *data, *value, *nptr;
226 void *tmp;
227
228 status = STATE_OK;
229 *offset_result = STATE_UNKNOWN; 215 *offset_result = STATE_UNKNOWN;
230 *jitter = *stratum = -1; 216 *jitter = *stratum = -1;
231 *num_truechimers = 0; 217 *num_truechimers = 0;
@@ -246,10 +232,19 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
246 * 4) Extract the offset, jitter and stratum value from the data[] 232 * 4) Extract the offset, jitter and stratum value from the data[]
247 * (it's ASCII) 233 * (it's ASCII)
248 */ 234 */
235 int min_peer_sel = PEER_INCLUDED;
236 int num_candidates = 0;
237 void *tmp;
238 ntp_assoc_status_pair *peers = NULL;
239 int peer_offset = 0;
240 int peers_size = 0;
241 int npeers = 0;
242 int conn = -1;
249 my_udp_connect(server_address, port, &conn); 243 my_udp_connect(server_address, port, &conn);
250 244
251 /* keep sending requests until the server stops setting the 245 /* keep sending requests until the server stops setting the
252 * REM_MORE bit, though usually this is only 1 packet. */ 246 * REM_MORE bit, though usually this is only 1 packet. */
247 ntp_control_message req;
253 do { 248 do {
254 setup_control_request(&req, OP_READSTAT, 1); 249 setup_control_request(&req, OP_READSTAT, 1);
255 DBG(printf("sending READSTAT request")); 250 DBG(printf("sending READSTAT request"));
@@ -285,7 +280,7 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
285 /* first, let's find out if we have a sync source, or if there are 280 /* first, let's find out if we have a sync source, or if there are
286 * at least some candidates. In the latter case we'll issue 281 * at least some candidates. In the latter case we'll issue
287 * a warning but go ahead with the check on them. */ 282 * a warning but go ahead with the check on them. */
288 for (i = 0; i < npeers; i++) { 283 for (int i = 0; i < npeers; i++) {
289 if (PEER_SEL(peers[i].status) >= PEER_TRUECHIMER) { 284 if (PEER_SEL(peers[i].status) >= PEER_TRUECHIMER) {
290 (*num_truechimers)++; 285 (*num_truechimers)++;
291 if (PEER_SEL(peers[i].status) >= PEER_INCLUDED) { 286 if (PEER_SEL(peers[i].status) >= PEER_INCLUDED) {
@@ -297,10 +292,13 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
297 } 292 }
298 } 293 }
299 } 294 }
295
300 if (verbose) 296 if (verbose)
301 printf("%d candidate peers available\n", num_candidates); 297 printf("%d candidate peers available\n", num_candidates);
302 if (verbose && syncsource_found) 298 if (verbose && syncsource_found)
303 printf("synchronization source found\n"); 299 printf("synchronization source found\n");
300
301 int status = STATE_OK;
304 if (!syncsource_found) { 302 if (!syncsource_found) {
305 status = STATE_WARNING; 303 status = STATE_WARNING;
306 if (verbose) 304 if (verbose)
@@ -312,7 +310,9 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
312 printf("warning: LI_ALARM bit is set\n"); 310 printf("warning: LI_ALARM bit is set\n");
313 } 311 }
314 312
315 for (i = 0; i < npeers; i++) { 313 const char *getvar = "stratum,offset,jitter";
314 char *data;
315 for (int i = 0; i < npeers; i++) {
316 /* Only query this server if it is the current sync source */ 316 /* Only query this server if it is the current sync source */
317 /* If there's no sync.peer, query all candidates and use the best one */ 317 /* If there's no sync.peer, query all candidates and use the best one */
318 if (PEER_SEL(peers[i].status) >= min_peer_sel) { 318 if (PEER_SEL(peers[i].status) >= min_peer_sel) {
@@ -354,7 +354,8 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
354 getvar = "stratum,offset,dispersion"; 354 getvar = "stratum,offset,dispersion";
355 i--; 355 i--;
356 continue; 356 continue;
357 } else if (strlen(getvar)) { 357 }
358 if (strlen(getvar)) {
358 if (verbose) 359 if (verbose)
359 printf("Server didn't like dispersion either; will retrieve everything\n"); 360 printf("Server didn't like dispersion either; will retrieve everything\n");
360 getvar = ""; 361 getvar = "";
@@ -366,6 +367,9 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
366 if (verbose > 1) 367 if (verbose > 1)
367 printf("Server responded: >>>%s<<<\n", data); 368 printf("Server responded: >>>%s<<<\n", data);
368 369
370 double tmp_offset = 0;
371 char *value;
372 char *nptr;
369 /* get the offset */ 373 /* get the offset */
370 if (verbose) 374 if (verbose)
371 printf("parsing offset from peer %.2x: ", ntohs(peers[i].assoc)); 375 printf("parsing offset from peer %.2x: ", ntohs(peers[i].assoc));
@@ -442,8 +446,6 @@ int ntp_request(double *offset, int *offset_result, double *jitter, int *stratum
442} 446}
443 447
444int process_arguments(int argc, char **argv) { 448int process_arguments(int argc, char **argv) {
445 int c;
446 int option = 0;
447 static struct option longopts[] = { 449 static struct option longopts[] = {
448 {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, 450 {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'},
449 {"use-ipv4", no_argument, 0, '4'}, {"use-ipv6", no_argument, 0, '6'}, {"quiet", no_argument, 0, 'q'}, 451 {"use-ipv4", no_argument, 0, '4'}, {"use-ipv6", no_argument, 0, '6'}, {"quiet", no_argument, 0, 'q'},
@@ -456,11 +458,12 @@ int process_arguments(int argc, char **argv) {
456 usage("\n"); 458 usage("\n");
457 459
458 while (true) { 460 while (true) {
459 c = getopt_long(argc, argv, "Vhv46qw:c:W:C:j:k:m:n:t:H:p:", longopts, &option); 461 int option = 0;
460 if (c == -1 || c == EOF || c == 1) 462 int option_char = getopt_long(argc, argv, "Vhv46qw:c:W:C:j:k:m:n:t:H:p:", longopts, &option);
463 if (option_char == -1 || option_char == EOF || option_char == 1)
461 break; 464 break;
462 465
463 switch (c) { 466 switch (option_char) {
464 case 'h': 467 case 'h':
465 print_help(); 468 print_help();
466 exit(STATE_UNKNOWN); 469 exit(STATE_UNKNOWN);
@@ -561,10 +564,6 @@ char *perfd_truechimers(int num_truechimers) {
561} 564}
562 565
563int main(int argc, char *argv[]) { 566int main(int argc, char *argv[]) {
564 int result, offset_result, stratum, num_truechimers;
565 double offset = 0, jitter = 0;
566 char *result_line, *perfdata_line;
567
568 setlocale(LC_ALL, ""); 567 setlocale(LC_ALL, "");
569 bindtextdomain(PACKAGE, LOCALEDIR); 568 bindtextdomain(PACKAGE, LOCALEDIR);
570 textdomain(PACKAGE); 569 textdomain(PACKAGE);
@@ -586,8 +585,13 @@ int main(int argc, char *argv[]) {
586 /* set socket timeout */ 585 /* set socket timeout */
587 alarm(socket_timeout); 586 alarm(socket_timeout);
588 587
588 int offset_result;
589 int stratum;
590 int num_truechimers;
591 double offset = 0;
592 double jitter = 0;
589 /* This returns either OK or WARNING (See comment preceding ntp_request) */ 593 /* This returns either OK or WARNING (See comment preceding ntp_request) */
590 result = ntp_request(&offset, &offset_result, &jitter, &stratum, &num_truechimers); 594 int result = ntp_request(&offset, &offset_result, &jitter, &stratum, &num_truechimers);
591 595
592 if (offset_result == STATE_UNKNOWN) { 596 if (offset_result == STATE_UNKNOWN) {
593 /* if there's no sync peer (this overrides ntp_request output): */ 597 /* if there's no sync peer (this overrides ntp_request output): */
@@ -622,6 +626,7 @@ int main(int argc, char *argv[]) {
622 result = max_state_alt(result, jresult); 626 result = max_state_alt(result, jresult);
623 } 627 }
624 628
629 char *result_line;
625 switch (result) { 630 switch (result) {
626 case STATE_CRITICAL: 631 case STATE_CRITICAL:
627 xasprintf(&result_line, _("NTP CRITICAL:")); 632 xasprintf(&result_line, _("NTP CRITICAL:"));
@@ -641,6 +646,7 @@ int main(int argc, char *argv[]) {
641 else if (li_alarm) 646 else if (li_alarm)
642 xasprintf(&result_line, "%s %s,", result_line, _("Server has the LI_ALARM bit set")); 647 xasprintf(&result_line, "%s %s,", result_line, _("Server has the LI_ALARM bit set"));
643 648
649 char *perfdata_line;
644 if (offset_result == STATE_UNKNOWN) { 650 if (offset_result == STATE_UNKNOWN) {
645 xasprintf(&result_line, "%s %s", result_line, _("Offset unknown")); 651 xasprintf(&result_line, "%s %s", result_line, _("Offset unknown"));
646 xasprintf(&perfdata_line, ""); 652 xasprintf(&perfdata_line, "");