diff options
author | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-03-12 17:50:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-12 17:50:51 +0100 |
commit | 9cb0a6f0637713763607ba472db63aaf9bfda671 (patch) | |
tree | c4617e14811f201bc1775dd16e229b15420049b7 | |
parent | 2ae1c42f691f80b3bdda03df5f8156d8d4cd2a48 (diff) | |
parent | 04c5e4024fd922cdae4b6b302668af44187c1193 (diff) | |
download | monitoring-plugins-9cb0a6f0.tar.gz |
Merge pull request #2099 from RincewindsHat/refactor/check_ping
Refactor/check ping
-rw-r--r-- | plugins/Makefile.am | 1 | ||||
-rw-r--r-- | plugins/check_ping.c | 529 | ||||
-rw-r--r-- | plugins/check_ping.d/config.h | 46 |
3 files changed, 342 insertions, 234 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 1edb51a3..a1a8103d 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am | |||
@@ -65,6 +65,7 @@ EXTRA_DIST = t \ | |||
65 | check_ntp_peer.d \ | 65 | check_ntp_peer.d \ |
66 | check_apt.d \ | 66 | check_apt.d \ |
67 | check_pgsql.d \ | 67 | check_pgsql.d \ |
68 | check_ping.d \ | ||
68 | check_by_ssh.d \ | 69 | check_by_ssh.d \ |
69 | check_smtp.d \ | 70 | check_smtp.d \ |
70 | check_mysql.d \ | 71 | check_mysql.d \ |
diff --git a/plugins/check_ping.c b/plugins/check_ping.c index 4aafaf41..940b9475 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c | |||
@@ -36,61 +36,52 @@ const char *email = "devel@monitoring-plugins.org"; | |||
36 | #include "netutils.h" | 36 | #include "netutils.h" |
37 | #include "popen.h" | 37 | #include "popen.h" |
38 | #include "utils.h" | 38 | #include "utils.h" |
39 | #include "check_ping.d/config.h" | ||
40 | #include "../lib/states.h" | ||
39 | 41 | ||
40 | #include <signal.h> | 42 | #include <signal.h> |
41 | 43 | ||
42 | #define WARN_DUPLICATES "DUPLICATES FOUND! " | 44 | #define WARN_DUPLICATES "DUPLICATES FOUND! " |
43 | #define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ | ||
44 | 45 | ||
45 | enum { | 46 | typedef struct { |
46 | UNKNOWN_PACKET_LOSS = 200, /* 200% */ | 47 | int errorcode; |
47 | DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ | 48 | check_ping_config config; |
48 | }; | 49 | } check_ping_config_wrapper; |
50 | static check_ping_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); | ||
51 | static check_ping_config_wrapper validate_arguments(check_ping_config_wrapper /*config_wrapper*/); | ||
49 | 52 | ||
50 | static int process_arguments(int /*argc*/, char ** /*argv*/); | 53 | static int get_threshold(char * /*arg*/, double * /*trta*/, int * /*tpl*/); |
51 | static int get_threshold(char * /*arg*/, float * /*trta*/, int * /*tpl*/); | 54 | |
52 | static int validate_arguments(void); | 55 | typedef struct { |
53 | static int run_ping(const char *cmd, const char *addr); | 56 | mp_state_enum state; |
54 | static int error_scan(char buf[MAX_INPUT_BUFFER], const char *addr); | 57 | double round_trip_average; |
58 | int packet_loss; | ||
59 | } ping_result; | ||
60 | static ping_result run_ping(const char *cmd, const char *addr, double /*crta*/); | ||
61 | |||
62 | static mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr); | ||
55 | static void print_help(void); | 63 | static void print_help(void); |
56 | void print_usage(void); | 64 | void print_usage(void); |
57 | 65 | ||
58 | static bool display_html = false; | ||
59 | static int wpl = UNKNOWN_PACKET_LOSS; | ||
60 | static int cpl = UNKNOWN_PACKET_LOSS; | ||
61 | static float wrta = UNKNOWN_TRIP_TIME; | ||
62 | static float crta = UNKNOWN_TRIP_TIME; | ||
63 | static char **addresses = NULL; | ||
64 | static int n_addresses = 0; | ||
65 | static int max_addr = 1; | ||
66 | static int max_packets = -1; | ||
67 | static int verbose = 0; | 66 | static int verbose = 0; |
68 | 67 | ||
69 | static float rta = UNKNOWN_TRIP_TIME; | ||
70 | static int pl = UNKNOWN_PACKET_LOSS; | ||
71 | |||
72 | static char *warn_text; | 68 | static char *warn_text; |
73 | 69 | ||
74 | int main(int argc, char **argv) { | 70 | int main(int argc, char **argv) { |
75 | char *cmd = NULL; | ||
76 | char *rawcmd = NULL; | ||
77 | int result = STATE_UNKNOWN; | ||
78 | int this_result = STATE_UNKNOWN; | ||
79 | int i; | ||
80 | |||
81 | setlocale(LC_ALL, ""); | 71 | setlocale(LC_ALL, ""); |
82 | setlocale(LC_NUMERIC, "C"); | 72 | setlocale(LC_NUMERIC, "C"); |
83 | bindtextdomain(PACKAGE, LOCALEDIR); | 73 | bindtextdomain(PACKAGE, LOCALEDIR); |
84 | textdomain(PACKAGE); | 74 | textdomain(PACKAGE); |
85 | 75 | ||
86 | addresses = malloc(sizeof(char *) * max_addr); | ||
87 | addresses[0] = NULL; | ||
88 | |||
89 | /* Parse extra opts if any */ | 76 | /* Parse extra opts if any */ |
90 | argv = np_extra_opts(&argc, argv, progname); | 77 | argv = np_extra_opts(&argc, argv, progname); |
91 | 78 | ||
92 | if (process_arguments(argc, argv) == ERROR) | 79 | check_ping_config_wrapper tmp_config = process_arguments(argc, argv); |
80 | if (tmp_config.errorcode == ERROR) { | ||
93 | usage4(_("Could not parse arguments")); | 81 | usage4(_("Could not parse arguments")); |
82 | } | ||
83 | |||
84 | const check_ping_config config = tmp_config.config; | ||
94 | 85 | ||
95 | /* Set signal handling and alarm */ | 86 | /* Set signal handling and alarm */ |
96 | if (signal(SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { | 87 | if (signal(SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { |
@@ -105,71 +96,86 @@ int main(int argc, char **argv) { | |||
105 | alarm(timeout_interval); | 96 | alarm(timeout_interval); |
106 | #endif | 97 | #endif |
107 | 98 | ||
108 | for (i = 0; i < n_addresses; i++) { | 99 | int result = STATE_UNKNOWN; |
109 | 100 | char *rawcmd = NULL; | |
101 | for (size_t i = 0; i < config.n_addresses; i++) { | ||
110 | #ifdef PING6_COMMAND | 102 | #ifdef PING6_COMMAND |
111 | if (address_family != AF_INET && is_inet6_addr(addresses[i])) | 103 | if (address_family != AF_INET && is_inet6_addr(config.addresses[i])) { |
112 | rawcmd = strdup(PING6_COMMAND); | 104 | rawcmd = strdup(PING6_COMMAND); |
113 | else | 105 | } else { |
114 | rawcmd = strdup(PING_COMMAND); | 106 | rawcmd = strdup(PING_COMMAND); |
107 | } | ||
115 | #else | 108 | #else |
116 | rawcmd = strdup(PING_COMMAND); | 109 | rawcmd = strdup(PING_COMMAND); |
117 | #endif | 110 | #endif |
118 | 111 | ||
119 | /* does the host address of number of packets argument come first? */ | 112 | char *cmd = NULL; |
113 | |||
114 | /* does the host address of number of packets argument come first? */ | ||
120 | #ifdef PING_PACKETS_FIRST | 115 | #ifdef PING_PACKETS_FIRST |
121 | # ifdef PING_HAS_TIMEOUT | 116 | # ifdef PING_HAS_TIMEOUT |
122 | xasprintf(&cmd, rawcmd, timeout_interval, max_packets, addresses[i]); | 117 | xasprintf(&cmd, rawcmd, timeout_interval, config.max_packets, config.addresses[i]); |
123 | # else | 118 | # else |
124 | xasprintf(&cmd, rawcmd, max_packets, addresses[i]); | 119 | xasprintf(&cmd, rawcmd, config.max_packets, addresses[i]); |
125 | # endif | 120 | # endif |
126 | #else | 121 | #else |
127 | xasprintf(&cmd, rawcmd, addresses[i], max_packets); | 122 | xasprintf(&cmd, rawcmd, addresses[i], config.max_packets); |
128 | #endif | 123 | #endif |
129 | 124 | ||
130 | if (verbose >= 2) | 125 | if (verbose >= 2) { |
131 | printf("CMD: %s\n", cmd); | 126 | printf("CMD: %s\n", cmd); |
127 | } | ||
132 | 128 | ||
133 | /* run the command */ | 129 | /* run the command */ |
134 | this_result = run_ping(cmd, addresses[i]); | ||
135 | 130 | ||
136 | if (pl == UNKNOWN_PACKET_LOSS || rta < 0.0) { | 131 | ping_result pinged = run_ping(cmd, config.addresses[i], config.crta); |
132 | |||
133 | if (pinged.packet_loss == UNKNOWN_PACKET_LOSS || pinged.round_trip_average < 0.0) { | ||
137 | printf("%s\n", cmd); | 134 | printf("%s\n", cmd); |
138 | die(STATE_UNKNOWN, _("CRITICAL - Could not interpret output from ping command\n")); | 135 | die(STATE_UNKNOWN, _("CRITICAL - Could not interpret output from ping command\n")); |
139 | } | 136 | } |
140 | 137 | ||
141 | if (pl >= cpl || rta >= crta || rta < 0) | 138 | if (pinged.packet_loss >= config.cpl || pinged.round_trip_average >= config.crta || pinged.round_trip_average < 0) { |
142 | this_result = STATE_CRITICAL; | 139 | pinged.state = STATE_CRITICAL; |
143 | else if (pl >= wpl || rta >= wrta) | 140 | } else if (pinged.packet_loss >= config.wpl || pinged.round_trip_average >= config.wrta) { |
144 | this_result = STATE_WARNING; | 141 | pinged.state = STATE_WARNING; |
145 | else if (pl >= 0 && rta >= 0) | 142 | } else if (pinged.packet_loss >= 0 && pinged.round_trip_average >= 0) { |
146 | this_result = max_state(STATE_OK, this_result); | 143 | pinged.state = max_state(STATE_OK, pinged.state); |
147 | 144 | } | |
148 | if (n_addresses > 1 && this_result != STATE_UNKNOWN) | 145 | |
149 | die(STATE_OK, "%s is alive\n", addresses[i]); | 146 | if (config.n_addresses > 1 && pinged.state != STATE_UNKNOWN) { |
150 | 147 | die(STATE_OK, "%s is alive\n", config.addresses[i]); | |
151 | if (display_html == true) | 148 | } |
152 | printf("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]); | 149 | |
153 | if (pl == 100) | 150 | if (config.display_html) { |
154 | printf(_("PING %s - %sPacket loss = %d%%"), state_text(this_result), warn_text, pl); | 151 | printf("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, config.addresses[i]); |
155 | else | 152 | } |
156 | printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(this_result), warn_text, pl, rta); | 153 | if (pinged.packet_loss == 100) { |
157 | if (display_html == true) | 154 | printf(_("PING %s - %sPacket loss = %d%%"), state_text(pinged.state), warn_text, pinged.packet_loss); |
155 | } else { | ||
156 | printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(pinged.state), warn_text, pinged.packet_loss, | ||
157 | pinged.round_trip_average); | ||
158 | } | ||
159 | if (config.display_html) { | ||
158 | printf("</A>"); | 160 | printf("</A>"); |
161 | } | ||
159 | 162 | ||
160 | /* Print performance data */ | 163 | /* Print performance data */ |
161 | if (pl != 100) { | 164 | if (pinged.packet_loss != 100) { |
162 | printf("|%s", | 165 | printf("|%s", fperfdata("rta", pinged.round_trip_average, "ms", (bool)(config.wrta > 0), config.wrta, (bool)(config.crta > 0), |
163 | fperfdata("rta", (double)rta, "ms", wrta > 0 ? true : false, wrta, crta > 0 ? true : false, crta, true, 0, false, 0)); | 166 | config.crta, true, 0, false, 0)); |
164 | } else { | 167 | } else { |
165 | printf("| rta=U;%f;%f;;", wrta, crta); | 168 | printf("| rta=U;%f;%f;;", config.wrta, config.crta); |
166 | } | 169 | } |
167 | printf(" %s\n", perfdata("pl", (long)pl, "%", wpl > 0 ? true : false, wpl, cpl > 0 ? true : false, cpl, true, 0, false, 0)); | ||
168 | 170 | ||
169 | if (verbose >= 2) | 171 | printf(" %s\n", perfdata("pl", (long)pinged.packet_loss, "%", (bool)(config.wpl > 0), config.wpl, (bool)(config.cpl > 0), |
170 | printf("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl); | 172 | config.cpl, true, 0, false, 0)); |
173 | |||
174 | if (verbose >= 2) { | ||
175 | printf("%f:%d%% %f:%d%%\n", config.wrta, config.wpl, config.crta, config.cpl); | ||
176 | } | ||
171 | 177 | ||
172 | result = max_state(result, this_result); | 178 | result = max_state(result, pinged.state); |
173 | free(rawcmd); | 179 | free(rawcmd); |
174 | free(cmd); | 180 | free(cmd); |
175 | } | 181 | } |
@@ -178,11 +184,7 @@ int main(int argc, char **argv) { | |||
178 | } | 184 | } |
179 | 185 | ||
180 | /* process command-line arguments */ | 186 | /* process command-line arguments */ |
181 | int process_arguments(int argc, char **argv) { | 187 | check_ping_config_wrapper process_arguments(int argc, char **argv) { |
182 | int c = 1; | ||
183 | char *ptr; | ||
184 | |||
185 | int option = 0; | ||
186 | static struct option longopts[] = {STD_LONG_OPTS, | 188 | static struct option longopts[] = {STD_LONG_OPTS, |
187 | {"packets", required_argument, 0, 'p'}, | 189 | {"packets", required_argument, 0, 'p'}, |
188 | {"nohtml", no_argument, 0, 'n'}, | 190 | {"nohtml", no_argument, 0, 'n'}, |
@@ -191,23 +193,35 @@ int process_arguments(int argc, char **argv) { | |||
191 | {"use-ipv6", no_argument, 0, '6'}, | 193 | {"use-ipv6", no_argument, 0, '6'}, |
192 | {0, 0, 0, 0}}; | 194 | {0, 0, 0, 0}}; |
193 | 195 | ||
194 | if (argc < 2) | 196 | check_ping_config_wrapper result = { |
195 | return ERROR; | 197 | .errorcode = OK, |
198 | .config = check_ping_config_init(), | ||
199 | }; | ||
200 | |||
201 | if (argc < 2) { | ||
202 | result.errorcode = ERROR; | ||
203 | return result; | ||
204 | } | ||
196 | 205 | ||
197 | for (c = 1; c < argc; c++) { | 206 | for (int index = 1; index < argc; index++) { |
198 | if (strcmp("-to", argv[c]) == 0) | 207 | if (strcmp("-to", argv[index]) == 0) { |
199 | strcpy(argv[c], "-t"); | 208 | strcpy(argv[index], "-t"); |
200 | if (strcmp("-nohtml", argv[c]) == 0) | 209 | } |
201 | strcpy(argv[c], "-n"); | 210 | if (strcmp("-nohtml", argv[index]) == 0) { |
211 | strcpy(argv[index], "-n"); | ||
212 | } | ||
202 | } | 213 | } |
203 | 214 | ||
204 | while (1) { | 215 | int option = 0; |
205 | c = getopt_long(argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option); | 216 | size_t max_addr = MAX_ADDR_START; |
217 | while (true) { | ||
218 | int option_index = getopt_long(argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option); | ||
206 | 219 | ||
207 | if (c == -1 || c == EOF) | 220 | if (option_index == -1 || option_index == EOF) { |
208 | break; | 221 | break; |
222 | } | ||
209 | 223 | ||
210 | switch (c) { | 224 | switch (option_index) { |
211 | case '?': /* usage */ | 225 | case '?': /* usage */ |
212 | usage5(); | 226 | usage5(); |
213 | case 'h': /* help */ | 227 | case 'h': /* help */ |
@@ -234,17 +248,18 @@ int process_arguments(int argc, char **argv) { | |||
234 | usage(_("IPv6 support not available\n")); | 248 | usage(_("IPv6 support not available\n")); |
235 | #endif | 249 | #endif |
236 | break; | 250 | break; |
237 | case 'H': /* hostname */ | 251 | case 'H': /* hostname */ { |
238 | ptr = optarg; | 252 | char *ptr = optarg; |
239 | while (1) { | 253 | while (true) { |
240 | n_addresses++; | 254 | result.config.n_addresses++; |
241 | if (n_addresses > max_addr) { | 255 | if (result.config.n_addresses > max_addr) { |
242 | max_addr *= 2; | 256 | max_addr *= 2; |
243 | addresses = realloc(addresses, sizeof(char *) * max_addr); | 257 | result.config.addresses = realloc(result.config.addresses, sizeof(char *) * max_addr); |
244 | if (addresses == NULL) | 258 | if (result.config.addresses == NULL) { |
245 | die(STATE_UNKNOWN, _("Could not realloc() addresses\n")); | 259 | die(STATE_UNKNOWN, _("Could not realloc() addresses\n")); |
260 | } | ||
246 | } | 261 | } |
247 | addresses[n_addresses - 1] = ptr; | 262 | result.config.addresses[result.config.n_addresses - 1] = ptr; |
248 | if ((ptr = index(ptr, ','))) { | 263 | if ((ptr = index(ptr, ','))) { |
249 | strcpy(ptr, ""); | 264 | strcpy(ptr, ""); |
250 | ptr += sizeof(char); | 265 | ptr += sizeof(char); |
@@ -252,203 +267,248 @@ int process_arguments(int argc, char **argv) { | |||
252 | break; | 267 | break; |
253 | } | 268 | } |
254 | } | 269 | } |
255 | break; | 270 | } break; |
256 | case 'p': /* number of packets to send */ | 271 | case 'p': /* number of packets to send */ |
257 | if (is_intnonneg(optarg)) | 272 | if (is_intnonneg(optarg)) { |
258 | max_packets = atoi(optarg); | 273 | result.config.max_packets = atoi(optarg); |
259 | else | 274 | } else { |
260 | usage2(_("<max_packets> (%s) must be a non-negative number\n"), optarg); | 275 | usage2(_("<max_packets> (%s) must be a non-negative number\n"), optarg); |
276 | } | ||
261 | break; | 277 | break; |
262 | case 'n': /* no HTML */ | 278 | case 'n': /* no HTML */ |
263 | display_html = false; | 279 | result.config.display_html = false; |
264 | break; | 280 | break; |
265 | case 'L': /* show HTML */ | 281 | case 'L': /* show HTML */ |
266 | display_html = true; | 282 | result.config.display_html = true; |
267 | break; | 283 | break; |
268 | case 'c': | 284 | case 'c': |
269 | get_threshold(optarg, &crta, &cpl); | 285 | get_threshold(optarg, &result.config.crta, &result.config.cpl); |
270 | break; | 286 | break; |
271 | case 'w': | 287 | case 'w': |
272 | get_threshold(optarg, &wrta, &wpl); | 288 | get_threshold(optarg, &result.config.wrta, &result.config.wpl); |
273 | break; | 289 | break; |
274 | } | 290 | } |
275 | } | 291 | } |
276 | 292 | ||
277 | c = optind; | 293 | int arg_counter = optind; |
278 | if (c == argc) | 294 | if (arg_counter == argc) { |
279 | return validate_arguments(); | 295 | return validate_arguments(result); |
296 | } | ||
280 | 297 | ||
281 | if (addresses[0] == NULL) { | 298 | if (result.config.addresses[0] == NULL) { |
282 | if (!is_host(argv[c])) { | 299 | if (!is_host(argv[arg_counter])) { |
283 | usage2(_("Invalid hostname/address"), argv[c]); | 300 | usage2(_("Invalid hostname/address"), argv[arg_counter]); |
284 | } else { | 301 | } else { |
285 | addresses[0] = argv[c++]; | 302 | result.config.addresses[0] = argv[arg_counter++]; |
286 | n_addresses++; | 303 | result.config.n_addresses++; |
287 | if (c == argc) | 304 | if (arg_counter == argc) { |
288 | return validate_arguments(); | 305 | return validate_arguments(result); |
306 | } | ||
289 | } | 307 | } |
290 | } | 308 | } |
291 | 309 | ||
292 | if (wpl == UNKNOWN_PACKET_LOSS) { | 310 | if (result.config.wpl == UNKNOWN_PACKET_LOSS) { |
293 | if (!is_intpercent(argv[c])) { | 311 | if (!is_intpercent(argv[arg_counter])) { |
294 | printf(_("<wpl> (%s) must be an integer percentage\n"), argv[c]); | 312 | printf(_("<wpl> (%s) must be an integer percentage\n"), argv[arg_counter]); |
295 | return ERROR; | 313 | result.errorcode = ERROR; |
296 | } else { | 314 | return result; |
297 | wpl = atoi(argv[c++]); | 315 | } |
298 | if (c == argc) | 316 | result.config.wpl = atoi(argv[arg_counter++]); |
299 | return validate_arguments(); | 317 | if (arg_counter == argc) { |
318 | return validate_arguments(result); | ||
300 | } | 319 | } |
301 | } | 320 | } |
302 | 321 | ||
303 | if (cpl == UNKNOWN_PACKET_LOSS) { | 322 | if (result.config.cpl == UNKNOWN_PACKET_LOSS) { |
304 | if (!is_intpercent(argv[c])) { | 323 | if (!is_intpercent(argv[arg_counter])) { |
305 | printf(_("<cpl> (%s) must be an integer percentage\n"), argv[c]); | 324 | printf(_("<cpl> (%s) must be an integer percentage\n"), argv[arg_counter]); |
306 | return ERROR; | 325 | result.errorcode = ERROR; |
307 | } else { | 326 | return result; |
308 | cpl = atoi(argv[c++]); | 327 | } |
309 | if (c == argc) | 328 | result.config.cpl = atoi(argv[arg_counter++]); |
310 | return validate_arguments(); | 329 | if (arg_counter == argc) { |
330 | return validate_arguments(result); | ||
311 | } | 331 | } |
312 | } | 332 | } |
313 | 333 | ||
314 | if (wrta < 0.0) { | 334 | if (result.config.wrta < 0.0) { |
315 | if (is_negative(argv[c])) { | 335 | if (is_negative(argv[arg_counter])) { |
316 | printf(_("<wrta> (%s) must be a non-negative number\n"), argv[c]); | 336 | printf(_("<wrta> (%s) must be a non-negative number\n"), argv[arg_counter]); |
317 | return ERROR; | 337 | result.errorcode = ERROR; |
318 | } else { | 338 | return result; |
319 | wrta = atof(argv[c++]); | 339 | } |
320 | if (c == argc) | 340 | result.config.wrta = atof(argv[arg_counter++]); |
321 | return validate_arguments(); | 341 | if (arg_counter == argc) { |
342 | return validate_arguments(result); | ||
322 | } | 343 | } |
323 | } | 344 | } |
324 | 345 | ||
325 | if (crta < 0.0) { | 346 | if (result.config.crta < 0.0) { |
326 | if (is_negative(argv[c])) { | 347 | if (is_negative(argv[arg_counter])) { |
327 | printf(_("<crta> (%s) must be a non-negative number\n"), argv[c]); | 348 | printf(_("<crta> (%s) must be a non-negative number\n"), argv[arg_counter]); |
328 | return ERROR; | 349 | result.errorcode = ERROR; |
329 | } else { | 350 | return result; |
330 | crta = atof(argv[c++]); | 351 | } |
331 | if (c == argc) | 352 | result.config.crta = atof(argv[arg_counter++]); |
332 | return validate_arguments(); | 353 | if (arg_counter == argc) { |
354 | return validate_arguments(result); | ||
333 | } | 355 | } |
334 | } | 356 | } |
335 | 357 | ||
336 | if (max_packets == -1) { | 358 | if (result.config.max_packets == -1) { |
337 | if (is_intnonneg(argv[c])) { | 359 | if (is_intnonneg(argv[arg_counter])) { |
338 | max_packets = atoi(argv[c++]); | 360 | result.config.max_packets = atoi(argv[arg_counter++]); |
339 | } else { | 361 | } else { |
340 | printf(_("<max_packets> (%s) must be a non-negative number\n"), argv[c]); | 362 | printf(_("<max_packets> (%s) must be a non-negative number\n"), argv[arg_counter]); |
341 | return ERROR; | 363 | result.errorcode = ERROR; |
364 | return result; | ||
342 | } | 365 | } |
343 | } | 366 | } |
344 | 367 | ||
345 | return validate_arguments(); | 368 | return validate_arguments(result); |
346 | } | 369 | } |
347 | 370 | ||
348 | int get_threshold(char *arg, float *trta, int *tpl) { | 371 | int get_threshold(char *arg, double *trta, int *tpl) { |
349 | if (is_intnonneg(arg) && sscanf(arg, "%f", trta) == 1) | 372 | if (is_intnonneg(arg) && sscanf(arg, "%lf", trta) == 1) { |
350 | return OK; | 373 | return OK; |
351 | else if (strpbrk(arg, ",:") && strstr(arg, "%") && sscanf(arg, "%f%*[:,]%d%%", trta, tpl) == 2) | 374 | } |
375 | |||
376 | if (strpbrk(arg, ",:") && strstr(arg, "%") && sscanf(arg, "%lf%*[:,]%d%%", trta, tpl) == 2) { | ||
352 | return OK; | 377 | return OK; |
353 | else if (strstr(arg, "%") && sscanf(arg, "%d%%", tpl) == 1) | 378 | } |
379 | |||
380 | if (strstr(arg, "%") && sscanf(arg, "%d%%", tpl) == 1) { | ||
354 | return OK; | 381 | return OK; |
382 | } | ||
355 | 383 | ||
356 | usage2(_("%s: Warning threshold must be integer or percentage!\n\n"), arg); | 384 | usage2(_("%s: Warning threshold must be integer or percentage!\n\n"), arg); |
357 | return STATE_UNKNOWN; | 385 | return STATE_UNKNOWN; |
358 | } | 386 | } |
359 | 387 | ||
360 | int validate_arguments() { | 388 | check_ping_config_wrapper validate_arguments(check_ping_config_wrapper config_wrapper) { |
361 | float max_seconds; | 389 | if (config_wrapper.config.wrta < 0.0) { |
362 | int i; | ||
363 | |||
364 | if (wrta < 0.0) { | ||
365 | printf(_("<wrta> was not set\n")); | 390 | printf(_("<wrta> was not set\n")); |
366 | return ERROR; | 391 | config_wrapper.errorcode = ERROR; |
367 | } else if (crta < 0.0) { | 392 | return config_wrapper; |
393 | } | ||
394 | |||
395 | if (config_wrapper.config.crta < 0.0) { | ||
368 | printf(_("<crta> was not set\n")); | 396 | printf(_("<crta> was not set\n")); |
369 | return ERROR; | 397 | config_wrapper.errorcode = ERROR; |
370 | } else if (wpl == UNKNOWN_PACKET_LOSS) { | 398 | return config_wrapper; |
399 | } | ||
400 | |||
401 | if (config_wrapper.config.wpl == UNKNOWN_PACKET_LOSS) { | ||
371 | printf(_("<wpl> was not set\n")); | 402 | printf(_("<wpl> was not set\n")); |
372 | return ERROR; | 403 | config_wrapper.errorcode = ERROR; |
373 | } else if (cpl == UNKNOWN_PACKET_LOSS) { | 404 | return config_wrapper; |
405 | } | ||
406 | |||
407 | if (config_wrapper.config.cpl == UNKNOWN_PACKET_LOSS) { | ||
374 | printf(_("<cpl> was not set\n")); | 408 | printf(_("<cpl> was not set\n")); |
375 | return ERROR; | 409 | config_wrapper.errorcode = ERROR; |
376 | } else if (wrta > crta) { | 410 | return config_wrapper; |
377 | printf(_("<wrta> (%f) cannot be larger than <crta> (%f)\n"), wrta, crta); | 411 | } |
378 | return ERROR; | 412 | |
379 | } else if (wpl > cpl) { | 413 | if (config_wrapper.config.wrta > config_wrapper.config.crta) { |
380 | printf(_("<wpl> (%d) cannot be larger than <cpl> (%d)\n"), wpl, cpl); | 414 | printf(_("<wrta> (%f) cannot be larger than <crta> (%f)\n"), config_wrapper.config.wrta, config_wrapper.config.crta); |
381 | return ERROR; | 415 | config_wrapper.errorcode = ERROR; |
416 | return config_wrapper; | ||
382 | } | 417 | } |
383 | 418 | ||
384 | if (max_packets == -1) | 419 | if (config_wrapper.config.wpl > config_wrapper.config.cpl) { |
385 | max_packets = DEFAULT_MAX_PACKETS; | 420 | printf(_("<wpl> (%d) cannot be larger than <cpl> (%d)\n"), config_wrapper.config.wpl, config_wrapper.config.cpl); |
421 | config_wrapper.errorcode = ERROR; | ||
422 | return config_wrapper; | ||
423 | } | ||
386 | 424 | ||
387 | max_seconds = crta / 1000.0 * max_packets + max_packets; | 425 | if (config_wrapper.config.max_packets == -1) { |
388 | if (max_seconds > timeout_interval) | 426 | config_wrapper.config.max_packets = DEFAULT_MAX_PACKETS; |
389 | timeout_interval = (int)max_seconds; | 427 | } |
390 | 428 | ||
391 | for (i = 0; i < n_addresses; i++) { | 429 | double max_seconds = (config_wrapper.config.crta / 1000.0 * config_wrapper.config.max_packets) + config_wrapper.config.max_packets; |
392 | if (!is_host(addresses[i])) | 430 | if (max_seconds > timeout_interval) { |
393 | usage2(_("Invalid hostname/address"), addresses[i]); | 431 | timeout_interval = (unsigned int)max_seconds; |
432 | } | ||
433 | |||
434 | for (size_t i = 0; i < config_wrapper.config.n_addresses; i++) { | ||
435 | if (!is_host(config_wrapper.config.addresses[i])) { | ||
436 | usage2(_("Invalid hostname/address"), config_wrapper.config.addresses[i]); | ||
437 | } | ||
394 | } | 438 | } |
395 | 439 | ||
396 | if (n_addresses == 0) { | 440 | if (config_wrapper.config.n_addresses == 0) { |
397 | usage(_("You must specify a server address or host name")); | 441 | usage(_("You must specify a server address or host name")); |
398 | } | 442 | } |
399 | 443 | ||
400 | return OK; | 444 | return config_wrapper; |
401 | } | 445 | } |
402 | 446 | ||
403 | int run_ping(const char *cmd, const char *addr) { | 447 | ping_result run_ping(const char *cmd, const char *addr, double crta) { |
404 | char buf[MAX_INPUT_BUFFER]; | 448 | if ((child_process = spopen(cmd)) == NULL) { |
405 | int result = STATE_UNKNOWN; | ||
406 | int match; | ||
407 | |||
408 | if ((child_process = spopen(cmd)) == NULL) | ||
409 | die(STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd); | 449 | die(STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd); |
450 | } | ||
410 | 451 | ||
411 | child_stderr = fdopen(child_stderr_array[fileno(child_process)], "r"); | 452 | child_stderr = fdopen(child_stderr_array[fileno(child_process)], "r"); |
412 | if (child_stderr == NULL) | 453 | if (child_stderr == NULL) { |
413 | printf(_("Cannot open stderr for %s\n"), cmd); | 454 | printf(_("Cannot open stderr for %s\n"), cmd); |
455 | } | ||
414 | 456 | ||
415 | while (fgets(buf, MAX_INPUT_BUFFER - 1, child_process)) { | 457 | char buf[MAX_INPUT_BUFFER]; |
458 | ping_result result = { | ||
459 | .state = STATE_UNKNOWN, | ||
460 | .packet_loss = UNKNOWN_PACKET_LOSS, | ||
461 | .round_trip_average = UNKNOWN_TRIP_TIME, | ||
462 | }; | ||
416 | 463 | ||
417 | if (verbose >= 3) | 464 | while (fgets(buf, MAX_INPUT_BUFFER - 1, child_process)) { |
465 | if (verbose >= 3) { | ||
418 | printf("Output: %s", buf); | 466 | printf("Output: %s", buf); |
467 | } | ||
419 | 468 | ||
420 | result = max_state(result, error_scan(buf, addr)); | 469 | result.state = max_state(result.state, error_scan(buf, addr)); |
421 | 470 | ||
422 | /* get the percent loss statistics */ | 471 | /* get the percent loss statistics */ |
423 | match = 0; | 472 | int match = 0; |
424 | if ((sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", &pl, &match) && match) || | 473 | if ((sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == |
425 | (sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n", &pl, &match) && match) || | 474 | 1 && |
426 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", &pl, &match) && match) || | 475 | match) || |
427 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", &pl, &match) && match) || | 476 | (sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, |
428 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", &pl, &match) && match) || | 477 | &match) == 1 && |
429 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", &pl, &match) && match) || | 478 | match) || |
430 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", &pl, &match) && match) || | 479 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, &match) == 1 && |
431 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", &pl, &match) && match) || | 480 | match) || |
432 | (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", &pl, &match) && match) || | 481 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", &result.packet_loss, &match) == 1 && match) || |
433 | (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &pl, &match) && match)) | 482 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", &result.packet_loss, &match) == 1 && match) || |
483 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", &result.packet_loss, &match) == 1 && match) || | ||
484 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", &result.packet_loss, &match) == 1 && match) == | ||
485 | 1 || | ||
486 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == 1 && | ||
487 | match) || | ||
488 | (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == 1 && | ||
489 | match) || | ||
490 | (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &result.packet_loss, &match) == 1 && match)) { | ||
434 | continue; | 491 | continue; |
492 | } | ||
435 | 493 | ||
436 | /* get the round trip average */ | 494 | /* get the round trip average */ |
437 | else if ((sscanf(buf, "round-trip min/avg/max = %*f/%f/%*f%n", &rta, &match) && match) || | 495 | if ((sscanf(buf, "round-trip min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
438 | (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%f/%*f/%*f%n", &rta, &match) && match) || | 496 | (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
439 | (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%f/%*f/%*f%n", &rta, &match) && match) || | 497 | (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
440 | (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%f/%*f/%*f%n", &rta, &match) && match) || | 498 | (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
441 | (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f%n", &rta, &match) && match) || | 499 | (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
442 | (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%f/%*f%n", &rta, &match) && match) || | 500 | (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
443 | (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f%n", &rta, &match) && match) || | 501 | (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || |
444 | (sscanf(buf, "rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms%n", &rta, &match) && match) || | 502 | (sscanf(buf, "rtt min/avg/max/mdev = %*f/%lf/%*f/%*f ms%n", &result.round_trip_average, &match) == 1 && match) || |
445 | (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %fms%n", &rta, &match) && match)) | 503 | (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %lfms%n", &result.round_trip_average, &match) == 1 && match)) { |
446 | continue; | 504 | continue; |
505 | } | ||
447 | } | 506 | } |
448 | 507 | ||
449 | /* this is needed because there is no rta if all packets are lost */ | 508 | /* this is needed because there is no rta if all packets are lost */ |
450 | if (pl == 100) | 509 | if (result.packet_loss == 100) { |
451 | rta = crta; | 510 | result.round_trip_average = crta; |
511 | } | ||
452 | 512 | ||
453 | /* check stderr, setting at least WARNING if there is output here */ | 513 | /* check stderr, setting at least WARNING if there is output here */ |
454 | /* Add warning into warn_text */ | 514 | /* Add warning into warn_text */ |
@@ -459,8 +519,8 @@ int run_ping(const char *cmd, const char *addr) { | |||
459 | if (verbose >= 3) { | 519 | if (verbose >= 3) { |
460 | printf("Got stderr: %s", buf); | 520 | printf("Got stderr: %s", buf); |
461 | } | 521 | } |
462 | if ((result = error_scan(buf, addr)) == STATE_OK) { | 522 | if ((result.state = error_scan(buf, addr)) == STATE_OK) { |
463 | result = STATE_WARNING; | 523 | result.state = STATE_WARNING; |
464 | if (warn_text == NULL) { | 524 | if (warn_text == NULL) { |
465 | warn_text = strdup(_("System call sent warnings to stderr ")); | 525 | warn_text = strdup(_("System call sent warnings to stderr ")); |
466 | } else { | 526 | } else { |
@@ -474,43 +534,46 @@ int run_ping(const char *cmd, const char *addr) { | |||
474 | 534 | ||
475 | spclose(child_process); | 535 | spclose(child_process); |
476 | 536 | ||
477 | if (warn_text == NULL) | 537 | if (warn_text == NULL) { |
478 | warn_text = strdup(""); | 538 | warn_text = strdup(""); |
539 | } | ||
479 | 540 | ||
480 | return result; | 541 | return result; |
481 | } | 542 | } |
482 | 543 | ||
483 | int error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { | 544 | mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { |
484 | if (strstr(buf, "Network is unreachable") || strstr(buf, "Destination Net Unreachable") || strstr(buf, "No route")) | 545 | if (strstr(buf, "Network is unreachable") || strstr(buf, "Destination Net Unreachable") || strstr(buf, "No route")) { |
485 | die(STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr); | 546 | die(STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr); |
486 | else if (strstr(buf, "Destination Host Unreachable") || strstr(buf, "Address unreachable")) | 547 | } else if (strstr(buf, "Destination Host Unreachable") || strstr(buf, "Address unreachable")) { |
487 | die(STATE_CRITICAL, _("CRITICAL - Host Unreachable (%s)\n"), addr); | 548 | die(STATE_CRITICAL, _("CRITICAL - Host Unreachable (%s)\n"), addr); |
488 | else if (strstr(buf, "Destination Port Unreachable") || strstr(buf, "Port unreachable")) | 549 | } else if (strstr(buf, "Destination Port Unreachable") || strstr(buf, "Port unreachable")) { |
489 | die(STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Port Unreachable (%s)\n"), addr); | 550 | die(STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Port Unreachable (%s)\n"), addr); |
490 | else if (strstr(buf, "Destination Protocol Unreachable")) | 551 | } else if (strstr(buf, "Destination Protocol Unreachable")) { |
491 | die(STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Protocol Unreachable (%s)\n"), addr); | 552 | die(STATE_CRITICAL, _("CRITICAL - Bogus ICMP: Protocol Unreachable (%s)\n"), addr); |
492 | else if (strstr(buf, "Destination Net Prohibited")) | 553 | } else if (strstr(buf, "Destination Net Prohibited")) { |
493 | die(STATE_CRITICAL, _("CRITICAL - Network Prohibited (%s)\n"), addr); | 554 | die(STATE_CRITICAL, _("CRITICAL - Network Prohibited (%s)\n"), addr); |
494 | else if (strstr(buf, "Destination Host Prohibited")) | 555 | } else if (strstr(buf, "Destination Host Prohibited")) { |
495 | die(STATE_CRITICAL, _("CRITICAL - Host Prohibited (%s)\n"), addr); | 556 | die(STATE_CRITICAL, _("CRITICAL - Host Prohibited (%s)\n"), addr); |
496 | else if (strstr(buf, "Packet filtered") || strstr(buf, "Administratively prohibited")) | 557 | } else if (strstr(buf, "Packet filtered") || strstr(buf, "Administratively prohibited")) { |
497 | die(STATE_CRITICAL, _("CRITICAL - Packet Filtered (%s)\n"), addr); | 558 | die(STATE_CRITICAL, _("CRITICAL - Packet Filtered (%s)\n"), addr); |
498 | else if (strstr(buf, "unknown host")) | 559 | } else if (strstr(buf, "unknown host")) { |
499 | die(STATE_CRITICAL, _("CRITICAL - Host not found (%s)\n"), addr); | 560 | die(STATE_CRITICAL, _("CRITICAL - Host not found (%s)\n"), addr); |
500 | else if (strstr(buf, "Time to live exceeded") || strstr(buf, "Time exceeded")) | 561 | } else if (strstr(buf, "Time to live exceeded") || strstr(buf, "Time exceeded")) { |
501 | die(STATE_CRITICAL, _("CRITICAL - Time to live exceeded (%s)\n"), addr); | 562 | die(STATE_CRITICAL, _("CRITICAL - Time to live exceeded (%s)\n"), addr); |
502 | else if (strstr(buf, "Destination unreachable: ")) | 563 | } else if (strstr(buf, "Destination unreachable: ")) { |
503 | die(STATE_CRITICAL, _("CRITICAL - Destination Unreachable (%s)\n"), addr); | 564 | die(STATE_CRITICAL, _("CRITICAL - Destination Unreachable (%s)\n"), addr); |
565 | } | ||
504 | 566 | ||
505 | if (strstr(buf, "(DUP!)") || strstr(buf, "DUPLICATES FOUND")) { | 567 | if (strstr(buf, "(DUP!)") || strstr(buf, "DUPLICATES FOUND")) { |
506 | if (warn_text == NULL) | 568 | if (warn_text == NULL) { |
507 | warn_text = strdup(_(WARN_DUPLICATES)); | 569 | warn_text = strdup(_(WARN_DUPLICATES)); |
508 | else if (!strstr(warn_text, _(WARN_DUPLICATES)) && xasprintf(&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) | 570 | } else if (!strstr(warn_text, _(WARN_DUPLICATES)) && xasprintf(&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) { |
509 | die(STATE_UNKNOWN, _("Unable to realloc warn_text\n")); | 571 | die(STATE_UNKNOWN, _("Unable to realloc warn_text\n")); |
510 | return (STATE_WARNING); | 572 | } |
573 | return STATE_WARNING; | ||
511 | } | 574 | } |
512 | 575 | ||
513 | return (STATE_OK); | 576 | return STATE_OK; |
514 | } | 577 | } |
515 | 578 | ||
516 | void print_help(void) { | 579 | void print_help(void) { |
@@ -551,9 +614,7 @@ void print_help(void) { | |||
551 | 614 | ||
552 | printf("\n"); | 615 | printf("\n"); |
553 | printf("%s\n", _("This plugin uses the ping command to probe the specified host for packet loss")); | 616 | printf("%s\n", _("This plugin uses the ping command to probe the specified host for packet loss")); |
554 | printf("%s\n", _("(percentage) and round trip average (milliseconds). It can produce HTML output")); | 617 | printf("%s\n", _("(percentage) and round trip average (milliseconds). It can produce HTML output.")); |
555 | printf("%s\n", _("linking to a traceroute CGI contributed by Ian Cass. The CGI can be found in")); | ||
556 | printf("%s\n", _("the contrib area of the downloads section at http://www.nagios.org/")); | ||
557 | 618 | ||
558 | printf(UT_SUPPORT); | 619 | printf(UT_SUPPORT); |
559 | } | 620 | } |
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 @@ | |||
1 | #pragma once | ||
2 | |||
3 | #include "../../config.h" | ||
4 | #include <stddef.h> | ||
5 | #include <stdlib.h> | ||
6 | |||
7 | enum { | ||
8 | UNKNOWN_PACKET_LOSS = 200, /* 200% */ | ||
9 | DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ | ||
10 | }; | ||
11 | |||
12 | #define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ | ||
13 | |||
14 | #define MAX_ADDR_START 1 | ||
15 | |||
16 | typedef struct { | ||
17 | bool display_html; | ||
18 | int max_packets; | ||
19 | |||
20 | char **addresses; | ||
21 | size_t n_addresses; | ||
22 | |||
23 | int wpl; | ||
24 | int cpl; | ||
25 | double wrta; | ||
26 | double crta; | ||
27 | } check_ping_config; | ||
28 | |||
29 | check_ping_config check_ping_config_init() { | ||
30 | check_ping_config tmp = { | ||
31 | .display_html = false, | ||
32 | .max_packets = -1, | ||
33 | |||
34 | .addresses = NULL, | ||
35 | .n_addresses = 0, | ||
36 | |||
37 | .wpl = UNKNOWN_PACKET_LOSS, | ||
38 | .cpl = UNKNOWN_PACKET_LOSS, | ||
39 | .wrta = UNKNOWN_TRIP_TIME, | ||
40 | .crta = UNKNOWN_TRIP_TIME, | ||
41 | }; | ||
42 | |||
43 | tmp.addresses = calloc(MAX_ADDR_START, sizeof(char *)); | ||
44 | tmp.addresses[0] = NULL; | ||
45 | return tmp; | ||
46 | } | ||