diff options
Diffstat (limited to 'plugins/check_fping.c')
-rw-r--r-- | plugins/check_fping.c | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/plugins/check_fping.c b/plugins/check_fping.c index 675a547c..c7cce97d 100644 --- a/plugins/check_fping.c +++ b/plugins/check_fping.c | |||
@@ -52,6 +52,8 @@ void print_help (void); | |||
52 | void print_usage (void); | 52 | void print_usage (void); |
53 | 53 | ||
54 | char *server_name = NULL; | 54 | char *server_name = NULL; |
55 | char *sourceip = NULL; | ||
56 | char *sourceif = NULL; | ||
55 | int packet_size = PACKET_SIZE; | 57 | int packet_size = PACKET_SIZE; |
56 | int packet_count = PACKET_COUNT; | 58 | int packet_count = PACKET_COUNT; |
57 | int target_timeout = 0; | 59 | int target_timeout = 0; |
@@ -72,6 +74,8 @@ main (int argc, char **argv) | |||
72 | /* normaly should be int result = STATE_UNKNOWN; */ | 74 | /* normaly should be int result = STATE_UNKNOWN; */ |
73 | 75 | ||
74 | int status = STATE_UNKNOWN; | 76 | int status = STATE_UNKNOWN; |
77 | int result = 0; | ||
78 | char *fping_prog = NULL; | ||
75 | char *server = NULL; | 79 | char *server = NULL; |
76 | char *command_line = NULL; | 80 | char *command_line = NULL; |
77 | char *input_buffer = NULL; | 81 | char *input_buffer = NULL; |
@@ -95,8 +99,21 @@ main (int argc, char **argv) | |||
95 | xasprintf(&option_string, "%s-t %d ", option_string, target_timeout); | 99 | xasprintf(&option_string, "%s-t %d ", option_string, target_timeout); |
96 | if (packet_interval) | 100 | if (packet_interval) |
97 | xasprintf(&option_string, "%s-p %d ", option_string, packet_interval); | 101 | xasprintf(&option_string, "%s-p %d ", option_string, packet_interval); |
98 | 102 | if (sourceip) | |
99 | xasprintf (&command_line, "%s %s-b %d -c %d %s", PATH_TO_FPING, | 103 | xasprintf(&option_string, "%s-S %s ", option_string, sourceip); |
104 | if (sourceif) | ||
105 | xasprintf(&option_string, "%s-I %s ", option_string, sourceif); | ||
106 | |||
107 | #ifdef PATH_TO_FPING6 | ||
108 | if (address_family == AF_INET6) | ||
109 | fping_prog = strdup(PATH_TO_FPING6); | ||
110 | else | ||
111 | fping_prog = strdup(PATH_TO_FPING); | ||
112 | #else | ||
113 | fping_prog = strdup(PATH_TO_FPING); | ||
114 | #endif | ||
115 | |||
116 | xasprintf (&command_line, "%s %s-b %d -c %d %s", fping_prog, | ||
100 | option_string, packet_size, packet_count, server); | 117 | option_string, packet_size, packet_count, server); |
101 | 118 | ||
102 | if (verbose) | 119 | if (verbose) |
@@ -130,10 +147,24 @@ main (int argc, char **argv) | |||
130 | (void) fclose (child_stderr); | 147 | (void) fclose (child_stderr); |
131 | 148 | ||
132 | /* close the pipe */ | 149 | /* close the pipe */ |
133 | if (spclose (child_process)) | 150 | if (result = spclose (child_process)) |
134 | /* need to use max_state not max */ | 151 | /* need to use max_state not max */ |
135 | status = max_state (status, STATE_WARNING); | 152 | status = max_state (status, STATE_WARNING); |
136 | 153 | ||
154 | if (result > 1 ) { | ||
155 | status = max_state (status, STATE_UNKNOWN); | ||
156 | if (result == 2) { | ||
157 | die (STATE_UNKNOWN, _("FPING UNKNOWN - IP address not found\n")); | ||
158 | } | ||
159 | if (result == 3) { | ||
160 | die (STATE_UNKNOWN, _("FPING UNKNOWN - invalid commandline argument\n")); | ||
161 | } | ||
162 | if (result == 4) { | ||
163 | die (STATE_UNKNOWN, _("FPING UNKNOWN - failed system call\n")); | ||
164 | } | ||
165 | |||
166 | } | ||
167 | |||
137 | printf ("FPING %s - %s\n", state_text (status), server_name); | 168 | printf ("FPING %s - %s\n", state_text (status), server_name); |
138 | 169 | ||
139 | return status; | 170 | return status; |
@@ -159,6 +190,10 @@ textscan (char *buf) | |||
159 | "host"); | 190 | "host"); |
160 | 191 | ||
161 | } | 192 | } |
193 | else if (strstr (buf, "Operation not permitted") || strstr (buf, "No such device") ) { | ||
194 | die (STATE_UNKNOWN, _("FPING UNKNOWN - %s parameter error\n"), | ||
195 | "host"); | ||
196 | } | ||
162 | else if (strstr (buf, "is down")) { | 197 | else if (strstr (buf, "is down")) { |
163 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); | 198 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); |
164 | 199 | ||
@@ -232,6 +267,8 @@ process_arguments (int argc, char **argv) | |||
232 | int option = 0; | 267 | int option = 0; |
233 | static struct option longopts[] = { | 268 | static struct option longopts[] = { |
234 | {"hostname", required_argument, 0, 'H'}, | 269 | {"hostname", required_argument, 0, 'H'}, |
270 | {"sourceip", required_argument, 0, 'S'}, | ||
271 | {"sourceif", required_argument, 0, 'I'}, | ||
235 | {"critical", required_argument, 0, 'c'}, | 272 | {"critical", required_argument, 0, 'c'}, |
236 | {"warning", required_argument, 0, 'w'}, | 273 | {"warning", required_argument, 0, 'w'}, |
237 | {"bytes", required_argument, 0, 'b'}, | 274 | {"bytes", required_argument, 0, 'b'}, |
@@ -241,6 +278,8 @@ process_arguments (int argc, char **argv) | |||
241 | {"verbose", no_argument, 0, 'v'}, | 278 | {"verbose", no_argument, 0, 'v'}, |
242 | {"version", no_argument, 0, 'V'}, | 279 | {"version", no_argument, 0, 'V'}, |
243 | {"help", no_argument, 0, 'h'}, | 280 | {"help", no_argument, 0, 'h'}, |
281 | {"use-ipv4", no_argument, 0, '4'}, | ||
282 | {"use-ipv6", no_argument, 0, '6'}, | ||
244 | {0, 0, 0, 0} | 283 | {0, 0, 0, 0} |
245 | }; | 284 | }; |
246 | 285 | ||
@@ -258,7 +297,7 @@ process_arguments (int argc, char **argv) | |||
258 | } | 297 | } |
259 | 298 | ||
260 | while (1) { | 299 | while (1) { |
261 | c = getopt_long (argc, argv, "+hVvH:c:w:b:n:T:i:", longopts, &option); | 300 | c = getopt_long (argc, argv, "+hVvH:S:c:w:b:n:T:i:I:46", longopts, &option); |
262 | 301 | ||
263 | if (c == -1 || c == EOF || c == 1) | 302 | if (c == -1 || c == EOF || c == 1) |
264 | break; | 303 | break; |
@@ -281,6 +320,24 @@ process_arguments (int argc, char **argv) | |||
281 | } | 320 | } |
282 | server_name = strscpy (server_name, optarg); | 321 | server_name = strscpy (server_name, optarg); |
283 | break; | 322 | break; |
323 | case 'S': /* sourceip */ | ||
324 | if (is_host (optarg) == FALSE) { | ||
325 | usage2 (_("Invalid hostname/address"), optarg); | ||
326 | } | ||
327 | sourceip = strscpy (sourceip, optarg); | ||
328 | break; | ||
329 | case 'I': /* sourceip */ | ||
330 | sourceif = strscpy (sourceif, optarg); | ||
331 | case '4': /* IPv4 only */ | ||
332 | address_family = AF_INET; | ||
333 | break; | ||
334 | case '6': /* IPv6 only */ | ||
335 | #ifdef USE_IPV6 | ||
336 | address_family = AF_INET6; | ||
337 | #else | ||
338 | usage (_("IPv6 support not available\n")); | ||
339 | #endif | ||
340 | break; | ||
284 | case 'c': | 341 | case 'c': |
285 | get_threshold (optarg, rv); | 342 | get_threshold (optarg, rv); |
286 | if (rv[RTA]) { | 343 | if (rv[RTA]) { |
@@ -402,6 +459,8 @@ print_help (void) | |||
402 | printf (UT_HELP_VRSN); | 459 | printf (UT_HELP_VRSN); |
403 | printf (UT_EXTRA_OPTS); | 460 | printf (UT_EXTRA_OPTS); |
404 | 461 | ||
462 | printf (UT_IPv46); | ||
463 | |||
405 | printf (" %s\n", "-H, --hostname=HOST"); | 464 | printf (" %s\n", "-H, --hostname=HOST"); |
406 | printf (" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); | 465 | printf (" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); |
407 | printf (" %s\n", "-w, --warning=THRESHOLD"); | 466 | printf (" %s\n", "-w, --warning=THRESHOLD"); |
@@ -413,15 +472,22 @@ print_help (void) | |||
413 | printf (" %s\n", "-n, --number=INTEGER"); | 472 | printf (" %s\n", "-n, --number=INTEGER"); |
414 | printf (" %s (default: %d)\n", _("number of ICMP packets to send"),PACKET_COUNT); | 473 | printf (" %s (default: %d)\n", _("number of ICMP packets to send"),PACKET_COUNT); |
415 | printf (" %s\n", "-T, --target-timeout=INTEGER"); | 474 | printf (" %s\n", "-T, --target-timeout=INTEGER"); |
416 | printf (" %s (default: fping's default for -t)\n", _("Target timeout (ms)"),PACKET_COUNT); | 475 | printf (" %s (default: fping's default for -t)\n", _("Target timeout (ms)")); |
417 | printf (" %s\n", "-i, --interval=INTEGER"); | 476 | printf (" %s\n", "-i, --interval=INTEGER"); |
418 | printf (" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets"),PACKET_COUNT); | 477 | printf (" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets")); |
478 | printf (" %s\n", "-S, --sourceip=HOST"); | ||
479 | printf (" %s\n", _("name or IP Address of sourceip")); | ||
480 | printf (" %s\n", "-I, --sourceif=IF"); | ||
481 | printf (" %s\n", _("source interface name")); | ||
419 | printf (UT_VERBOSE); | 482 | printf (UT_VERBOSE); |
420 | printf ("\n"); | 483 | printf ("\n"); |
421 | printf (" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); | 484 | printf (" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); |
422 | printf (" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); | 485 | printf (" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); |
423 | printf (" %s\n", _("packet loss to trigger an alarm state.")); | 486 | printf (" %s\n", _("packet loss to trigger an alarm state.")); |
424 | 487 | ||
488 | printf ("\n"); | ||
489 | printf (" %s\n", _("IPv4 is used by default. Specify -6 to use IPv6.")); | ||
490 | |||
425 | printf (UT_SUPPORT); | 491 | printf (UT_SUPPORT); |
426 | } | 492 | } |
427 | 493 | ||