diff options
Diffstat (limited to 'plugins/check_ntp_time.c')
| -rw-r--r-- | plugins/check_ntp_time.c | 91 |
1 files changed, 48 insertions, 43 deletions
diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c index 31162883..ad69b804 100644 --- a/plugins/check_ntp_time.c +++ b/plugins/check_ntp_time.c | |||
| @@ -93,9 +93,9 @@ typedef struct { | |||
| 93 | /* bits 1,2 are the leap indicator */ | 93 | /* bits 1,2 are the leap indicator */ |
| 94 | #define LI_MASK 0xc0 | 94 | #define LI_MASK 0xc0 |
| 95 | #define LI(x) ((x & LI_MASK) >> 6) | 95 | #define LI(x) ((x & LI_MASK) >> 6) |
| 96 | #define LI_SET(x, y) \ | 96 | #define LI_SET(x, y) \ |
| 97 | do { \ | 97 | do { \ |
| 98 | x |= ((y << 6) & LI_MASK); \ | 98 | x |= ((y << 6) & LI_MASK); \ |
| 99 | } while (0) | 99 | } while (0) |
| 100 | /* and these are the values of the leap indicator */ | 100 | /* and these are the values of the leap indicator */ |
| 101 | #define LI_NOWARNING 0x00 | 101 | #define LI_NOWARNING 0x00 |
| @@ -105,17 +105,17 @@ typedef struct { | |||
| 105 | /* bits 3,4,5 are the ntp version */ | 105 | /* bits 3,4,5 are the ntp version */ |
| 106 | #define VN_MASK 0x38 | 106 | #define VN_MASK 0x38 |
| 107 | #define VN(x) ((x & VN_MASK) >> 3) | 107 | #define VN(x) ((x & VN_MASK) >> 3) |
| 108 | #define VN_SET(x, y) \ | 108 | #define VN_SET(x, y) \ |
| 109 | do { \ | 109 | do { \ |
| 110 | x |= ((y << 3) & VN_MASK); \ | 110 | x |= ((y << 3) & VN_MASK); \ |
| 111 | } while (0) | 111 | } while (0) |
| 112 | #define VN_RESERVED 0x02 | 112 | #define VN_RESERVED 0x02 |
| 113 | /* bits 6,7,8 are the ntp mode */ | 113 | /* bits 6,7,8 are the ntp mode */ |
| 114 | #define MODE_MASK 0x07 | 114 | #define MODE_MASK 0x07 |
| 115 | #define MODE(x) (x & MODE_MASK) | 115 | #define MODE(x) (x & MODE_MASK) |
| 116 | #define MODE_SET(x, y) \ | 116 | #define MODE_SET(x, y) \ |
| 117 | do { \ | 117 | do { \ |
| 118 | x |= (y & MODE_MASK); \ | 118 | x |= (y & MODE_MASK); \ |
| 119 | } while (0) | 119 | } while (0) |
| 120 | /* here are some values */ | 120 | /* here are some values */ |
| 121 | #define MODE_CLIENT 0x03 | 121 | #define MODE_CLIENT 0x03 |
| @@ -127,9 +127,9 @@ typedef struct { | |||
| 127 | #define REM_MORE 0x20 | 127 | #define REM_MORE 0x20 |
| 128 | /* In control message, bits 11 - 15 are opcode */ | 128 | /* In control message, bits 11 - 15 are opcode */ |
| 129 | #define OP_MASK 0x1f | 129 | #define OP_MASK 0x1f |
| 130 | #define OP_SET(x, y) \ | 130 | #define OP_SET(x, y) \ |
| 131 | do { \ | 131 | do { \ |
| 132 | x |= (y & OP_MASK); \ | 132 | x |= (y & OP_MASK); \ |
| 133 | } while (0) | 133 | } while (0) |
| 134 | #define OP_READSTAT 0x01 | 134 | #define OP_READSTAT 0x01 |
| 135 | #define OP_READVAR 0x02 | 135 | #define OP_READVAR 0x02 |
| @@ -163,32 +163,34 @@ typedef struct { | |||
| 163 | #define NTP32asDOUBLE(x) (ntohs(L16(x)) + ((double)ntohs(R16(x)) / 65536.0)) | 163 | #define NTP32asDOUBLE(x) (ntohs(L16(x)) + ((double)ntohs(R16(x)) / 65536.0)) |
| 164 | 164 | ||
| 165 | /* likewise for a 64-bit ntp fp number */ | 165 | /* likewise for a 64-bit ntp fp number */ |
| 166 | #define NTP64asDOUBLE(n) \ | 166 | #define NTP64asDOUBLE(n) \ |
| 167 | (double)(((uint64_t)n) ? (ntohl(L32(n)) - EPOCHDIFF) + (.00000001 * (0.5 + (double)(ntohl(R32(n)) / 42.94967296))) : 0) | 167 | (double)(((uint64_t)n) ? (ntohl(L32(n)) - EPOCHDIFF) + \ |
| 168 | (.00000001 * (0.5 + (double)(ntohl(R32(n)) / 42.94967296))) \ | ||
| 169 | : 0) | ||
| 168 | 170 | ||
| 169 | /* convert a struct timeval to a double */ | 171 | /* convert a struct timeval to a double */ |
| 170 | #define TVasDOUBLE(x) (double)(x.tv_sec + (0.000001 * x.tv_usec)) | 172 | #define TVasDOUBLE(x) (double)(x.tv_sec + (0.000001 * x.tv_usec)) |
| 171 | 173 | ||
| 172 | /* convert an ntp 64-bit fp number to a struct timeval */ | 174 | /* convert an ntp 64-bit fp number to a struct timeval */ |
| 173 | #define NTP64toTV(n, t) \ | 175 | #define NTP64toTV(n, t) \ |
| 174 | do { \ | 176 | do { \ |
| 175 | if (!n) \ | 177 | if (!n) \ |
| 176 | t.tv_sec = t.tv_usec = 0; \ | 178 | t.tv_sec = t.tv_usec = 0; \ |
| 177 | else { \ | 179 | else { \ |
| 178 | t.tv_sec = ntohl(L32(n)) - EPOCHDIFF; \ | 180 | t.tv_sec = ntohl(L32(n)) - EPOCHDIFF; \ |
| 179 | t.tv_usec = (int)(0.5 + (double)(ntohl(R32(n)) / 4294.967296)); \ | 181 | t.tv_usec = (int)(0.5 + (double)(ntohl(R32(n)) / 4294.967296)); \ |
| 180 | } \ | 182 | } \ |
| 181 | } while (0) | 183 | } while (0) |
| 182 | 184 | ||
| 183 | /* convert a struct timeval to an ntp 64-bit fp number */ | 185 | /* convert a struct timeval to an ntp 64-bit fp number */ |
| 184 | #define TVtoNTP64(t, n) \ | 186 | #define TVtoNTP64(t, n) \ |
| 185 | do { \ | 187 | do { \ |
| 186 | if (!t.tv_usec && !t.tv_sec) \ | 188 | if (!t.tv_usec && !t.tv_sec) \ |
| 187 | n = 0x0UL; \ | 189 | n = 0x0UL; \ |
| 188 | else { \ | 190 | else { \ |
| 189 | L32(n) = htonl(t.tv_sec + EPOCHDIFF); \ | 191 | L32(n) = htonl(t.tv_sec + EPOCHDIFF); \ |
| 190 | R32(n) = htonl((uint64_t)((4294.967296 * t.tv_usec) + .5)); \ | 192 | R32(n) = htonl((uint64_t)((4294.967296 * t.tv_usec) + .5)); \ |
| 191 | } \ | 193 | } \ |
| 192 | } while (0) | 194 | } while (0) |
| 193 | 195 | ||
| 194 | /* NTP control message header is 12 bytes, plus any data in the data | 196 | /* NTP control message header is 12 bytes, plus any data in the data |
| @@ -197,15 +199,15 @@ typedef struct { | |||
| 197 | #define SIZEOF_NTPCM(m) (12 + ntohs(m.count) + ((m.count) ? 4 - (ntohs(m.count) % 4) : 0)) | 199 | #define SIZEOF_NTPCM(m) (12 + ntohs(m.count) + ((m.count) ? 4 - (ntohs(m.count) % 4) : 0)) |
| 198 | 200 | ||
| 199 | /* finally, a little helper or two for debugging: */ | 201 | /* finally, a little helper or two for debugging: */ |
| 200 | #define DBG(x) \ | 202 | #define DBG(x) \ |
| 201 | do { \ | 203 | do { \ |
| 202 | if (verbose > 1) { \ | 204 | if (verbose > 1) { \ |
| 203 | x; \ | 205 | x; \ |
| 204 | } \ | 206 | } \ |
| 205 | } while (0); | 207 | } while (0); |
| 206 | #define PRINTSOCKADDR(x) \ | 208 | #define PRINTSOCKADDR(x) \ |
| 207 | do { \ | 209 | do { \ |
| 208 | printf("%u.%u.%u.%u", (x >> 24) & 0xff, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff); \ | 210 | printf("%u.%u.%u.%u", (x >> 24) & 0xff, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff); \ |
| 209 | } while (0); | 211 | } while (0); |
| 210 | 212 | ||
| 211 | /* calculate the offset of the local clock */ | 213 | /* calculate the offset of the local clock */ |
| @@ -358,7 +360,8 @@ double offset_request(const char *host, const char *port, mp_state_enum *status, | |||
| 358 | die(STATE_UNKNOWN, "can not allocate socket array"); | 360 | die(STATE_UNKNOWN, "can not allocate socket array"); |
| 359 | } | 361 | } |
| 360 | 362 | ||
| 361 | ntp_server_results *servers = (ntp_server_results *)malloc(sizeof(ntp_server_results) * num_hosts); | 363 | ntp_server_results *servers = |
| 364 | (ntp_server_results *)malloc(sizeof(ntp_server_results) * num_hosts); | ||
| 362 | if (servers == NULL) { | 365 | if (servers == NULL) { |
| 363 | die(STATE_UNKNOWN, "can not allocate server array"); | 366 | die(STATE_UNKNOWN, "can not allocate server array"); |
| 364 | } | 367 | } |
| @@ -585,8 +588,8 @@ check_ntp_time_config_wrapper process_arguments(int argc, char **argv) { | |||
| 585 | } | 588 | } |
| 586 | 589 | ||
| 587 | char *perfd_offset(double offset, thresholds *offset_thresholds) { | 590 | char *perfd_offset(double offset, thresholds *offset_thresholds) { |
| 588 | return fperfdata("offset", offset, "s", true, offset_thresholds->warning->end, true, offset_thresholds->critical->end, false, 0, false, | 591 | return fperfdata("offset", offset, "s", true, offset_thresholds->warning->end, true, |
| 589 | 0); | 592 | offset_thresholds->critical->end, false, 0, false, 0); |
| 590 | } | 593 | } |
| 591 | 594 | ||
| 592 | int main(int argc, char *argv[]) { | 595 | int main(int argc, char *argv[]) { |
| @@ -613,7 +616,8 @@ int main(int argc, char *argv[]) { | |||
| 613 | 616 | ||
| 614 | mp_state_enum offset_result = STATE_OK; | 617 | mp_state_enum offset_result = STATE_OK; |
| 615 | mp_state_enum result = STATE_OK; | 618 | mp_state_enum result = STATE_OK; |
| 616 | double offset = offset_request(config.server_address, config.port, &offset_result, config.time_offset); | 619 | double offset = |
| 620 | offset_request(config.server_address, config.port, &offset_result, config.time_offset); | ||
| 617 | if (offset_result == STATE_UNKNOWN) { | 621 | if (offset_result == STATE_UNKNOWN) { |
| 618 | result = ((!config.quiet) ? STATE_UNKNOWN : STATE_CRITICAL); | 622 | result = ((!config.quiet) ? STATE_UNKNOWN : STATE_CRITICAL); |
| 619 | } else { | 623 | } else { |
| @@ -701,5 +705,6 @@ void print_help(void) { | |||
| 701 | 705 | ||
| 702 | void print_usage(void) { | 706 | void print_usage(void) { |
| 703 | printf("%s\n", _("Usage:")); | 707 | printf("%s\n", _("Usage:")); |
| 704 | printf(" %s -H <host> [-4|-6] [-w <warn>] [-c <crit>] [-v verbose] [-o <time offset>]\n", progname); | 708 | printf(" %s -H <host> [-4|-6] [-w <warn>] [-c <crit>] [-v verbose] [-o <time offset>]\n", |
| 709 | progname); | ||
| 705 | } | 710 | } |
