diff options
| author | RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> | 2024-10-31 03:36:59 +0100 |
|---|---|---|
| committer | RincewindsHat <12514511+RincewindsHat@users.noreply.github.com> | 2024-10-31 03:36:59 +0100 |
| commit | 82975ac988cad3f555fb381da98fc3b018a5769f (patch) | |
| tree | 08eedc19802247a1672f3c382b7d3ed7ec9f08ef | |
| parent | 5f2ae6d5e5240570de28a344fea2e822e1fa0bf4 (diff) | |
| download | monitoring-plugins-82975ac988cad3f555fb381da98fc3b018a5769f.tar.gz | |
check_fping: clang-format
| -rw-r--r-- | plugins/check_fping.c | 881 |
1 files changed, 421 insertions, 460 deletions
diff --git a/plugins/check_fping.c b/plugins/check_fping.c index 70d6f9fc..ec151143 100644 --- a/plugins/check_fping.c +++ b/plugins/check_fping.c | |||
| @@ -1,33 +1,33 @@ | |||
| 1 | /***************************************************************************** | 1 | /***************************************************************************** |
| 2 | * | 2 | * |
| 3 | * Monitoring check_fping plugin | 3 | * Monitoring check_fping plugin |
| 4 | * | 4 | * |
| 5 | * License: GPL | 5 | * License: GPL |
| 6 | * Copyright (c) 2000-2007 Monitoring Plugins Development Team | 6 | * Copyright (c) 2000-2007 Monitoring Plugins Development Team |
| 7 | * | 7 | * |
| 8 | * Description: | 8 | * Description: |
| 9 | * | 9 | * |
| 10 | * This file contains the check_disk plugin | 10 | * This file contains the check_disk plugin |
| 11 | * | 11 | * |
| 12 | * This plugin will use the fping command to ping the specified host for a | 12 | * This plugin will use the fping command to ping the specified host for a |
| 13 | * fast check | 13 | * fast check |
| 14 | * | 14 | * |
| 15 | * | 15 | * |
| 16 | * This program is free software: you can redistribute it and/or modify | 16 | * This program is free software: you can redistribute it and/or modify |
| 17 | * it under the terms of the GNU General Public License as published by | 17 | * it under the terms of the GNU General Public License as published by |
| 18 | * the Free Software Foundation, either version 3 of the License, or | 18 | * the Free Software Foundation, either version 3 of the License, or |
| 19 | * (at your option) any later version. | 19 | * (at your option) any later version. |
| 20 | * | 20 | * |
| 21 | * This program is distributed in the hope that it will be useful, | 21 | * This program is distributed in the hope that it will be useful, |
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 24 | * GNU General Public License for more details. | 24 | * GNU General Public License for more details. |
| 25 | * | 25 | * |
| 26 | * You should have received a copy of the GNU General Public License | 26 | * You should have received a copy of the GNU General Public License |
| 27 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 27 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 28 | * | 28 | * |
| 29 | * | 29 | * |
| 30 | *****************************************************************************/ | 30 | *****************************************************************************/ |
| 31 | 31 | ||
| 32 | const char *progname = "check_fping"; | 32 | const char *progname = "check_fping"; |
| 33 | const char *copyright = "2000-2007"; | 33 | const char *copyright = "2000-2007"; |
| @@ -40,17 +40,17 @@ const char *email = "devel@monitoring-plugins.org"; | |||
| 40 | #include <stdbool.h> | 40 | #include <stdbool.h> |
| 41 | 41 | ||
| 42 | enum { | 42 | enum { |
| 43 | PACKET_COUNT = 1, | 43 | PACKET_COUNT = 1, |
| 44 | PACKET_SIZE = 56, | 44 | PACKET_SIZE = 56, |
| 45 | PL = 0, | 45 | PL = 0, |
| 46 | RTA = 1 | 46 | RTA = 1 |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | int textscan (char *buf); | 49 | int textscan(char *buf); |
| 50 | int process_arguments (int, char **); | 50 | int process_arguments(int, char **); |
| 51 | int get_threshold (char *arg, char *rv[2]); | 51 | int get_threshold(char *arg, char *rv[2]); |
| 52 | void print_help (void); | 52 | void print_help(void); |
| 53 | void print_usage (void); | 53 | void print_usage(void); |
| 54 | 54 | ||
| 55 | char *server_name = NULL; | 55 | char *server_name = NULL; |
| 56 | char *sourceip = NULL; | 56 | char *sourceip = NULL; |
| @@ -70,458 +70,419 @@ bool alive_p = false; | |||
| 70 | bool crta_p = false; | 70 | bool crta_p = false; |
| 71 | bool wrta_p = false; | 71 | bool wrta_p = false; |
| 72 | 72 | ||
| 73 | int | 73 | int main(int argc, char **argv) { |
| 74 | main (int argc, char **argv) | 74 | /* normally should be int result = STATE_UNKNOWN; */ |
| 75 | { | 75 | |
| 76 | /* normally should be int result = STATE_UNKNOWN; */ | 76 | int status = STATE_UNKNOWN; |
| 77 | 77 | int result = 0; | |
| 78 | int status = STATE_UNKNOWN; | 78 | char *fping_prog = NULL; |
| 79 | int result = 0; | 79 | char *server = NULL; |
| 80 | char *fping_prog = NULL; | 80 | char *command_line = NULL; |
| 81 | char *server = NULL; | 81 | char *input_buffer = NULL; |
| 82 | char *command_line = NULL; | 82 | char *option_string = ""; |
| 83 | char *input_buffer = NULL; | 83 | input_buffer = malloc(MAX_INPUT_BUFFER); |
| 84 | char *option_string = ""; | 84 | |
| 85 | input_buffer = malloc (MAX_INPUT_BUFFER); | 85 | setlocale(LC_ALL, ""); |
| 86 | 86 | bindtextdomain(PACKAGE, LOCALEDIR); | |
| 87 | setlocale (LC_ALL, ""); | 87 | textdomain(PACKAGE); |
| 88 | bindtextdomain (PACKAGE, LOCALEDIR); | 88 | |
| 89 | textdomain (PACKAGE); | 89 | /* Parse extra opts if any */ |
| 90 | 90 | argv = np_extra_opts(&argc, argv, progname); | |
| 91 | /* Parse extra opts if any */ | 91 | |
| 92 | argv=np_extra_opts (&argc, argv, progname); | 92 | if (process_arguments(argc, argv) == ERROR) |
| 93 | 93 | usage4(_("Could not parse arguments")); | |
| 94 | if (process_arguments (argc, argv) == ERROR) | 94 | |
| 95 | usage4 (_("Could not parse arguments")); | 95 | server = strscpy(server, server_name); |
| 96 | 96 | ||
| 97 | server = strscpy (server, server_name); | 97 | /* compose the command */ |
| 98 | 98 | if (target_timeout) | |
| 99 | /* compose the command */ | 99 | xasprintf(&option_string, "%s-t %d ", option_string, target_timeout); |
| 100 | if (target_timeout) | 100 | if (packet_interval) |
| 101 | xasprintf(&option_string, "%s-t %d ", option_string, target_timeout); | 101 | xasprintf(&option_string, "%s-p %d ", option_string, packet_interval); |
| 102 | if (packet_interval) | 102 | if (sourceip) |
| 103 | xasprintf(&option_string, "%s-p %d ", option_string, packet_interval); | 103 | xasprintf(&option_string, "%s-S %s ", option_string, sourceip); |
| 104 | if (sourceip) | 104 | if (sourceif) |
| 105 | xasprintf(&option_string, "%s-S %s ", option_string, sourceip); | 105 | xasprintf(&option_string, "%s-I %s ", option_string, sourceif); |
| 106 | if (sourceif) | ||
| 107 | xasprintf(&option_string, "%s-I %s ", option_string, sourceif); | ||
| 108 | 106 | ||
| 109 | #ifdef PATH_TO_FPING6 | 107 | #ifdef PATH_TO_FPING6 |
| 110 | if (address_family != AF_INET && is_inet6_addr(server)) | 108 | if (address_family != AF_INET && is_inet6_addr(server)) |
| 111 | fping_prog = strdup(PATH_TO_FPING6); | 109 | fping_prog = strdup(PATH_TO_FPING6); |
| 112 | else | 110 | else |
| 113 | fping_prog = strdup(PATH_TO_FPING); | 111 | fping_prog = strdup(PATH_TO_FPING); |
| 114 | #else | 112 | #else |
| 115 | fping_prog = strdup(PATH_TO_FPING); | 113 | fping_prog = strdup(PATH_TO_FPING); |
| 116 | #endif | 114 | #endif |
| 117 | 115 | ||
| 118 | xasprintf (&command_line, "%s %s-b %d -c %d %s", fping_prog, | 116 | xasprintf(&command_line, "%s %s-b %d -c %d %s", fping_prog, option_string, packet_size, packet_count, server); |
| 119 | option_string, packet_size, packet_count, server); | 117 | |
| 120 | 118 | if (verbose) | |
| 121 | if (verbose) | 119 | printf("%s\n", command_line); |
| 122 | printf ("%s\n", command_line); | 120 | |
| 123 | 121 | /* run the command */ | |
| 124 | /* run the command */ | 122 | child_process = spopen(command_line); |
| 125 | child_process = spopen (command_line); | 123 | if (child_process == NULL) { |
| 126 | if (child_process == NULL) { | 124 | printf(_("Could not open pipe: %s\n"), command_line); |
| 127 | printf (_("Could not open pipe: %s\n"), command_line); | 125 | return STATE_UNKNOWN; |
| 128 | return STATE_UNKNOWN; | 126 | } |
| 129 | } | 127 | |
| 130 | 128 | child_stderr = fdopen(child_stderr_array[fileno(child_process)], "r"); | |
| 131 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 129 | if (child_stderr == NULL) { |
| 132 | if (child_stderr == NULL) { | 130 | printf(_("Could not open stderr for %s\n"), command_line); |
| 133 | printf (_("Could not open stderr for %s\n"), command_line); | 131 | } |
| 134 | } | 132 | |
| 135 | 133 | while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | |
| 136 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 134 | if (verbose) |
| 137 | if (verbose) | 135 | printf("%s", input_buffer); |
| 138 | printf ("%s", input_buffer); | 136 | status = max_state(status, textscan(input_buffer)); |
| 139 | status = max_state (status, textscan (input_buffer)); | 137 | } |
| 140 | } | 138 | |
| 141 | 139 | /* If we get anything on STDERR, at least set warning */ | |
| 142 | /* If we get anything on STDERR, at least set warning */ | 140 | while (fgets(input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { |
| 143 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { | 141 | status = max_state(status, STATE_WARNING); |
| 144 | status = max_state (status, STATE_WARNING); | 142 | if (verbose) |
| 145 | if (verbose) | 143 | printf("%s", input_buffer); |
| 146 | printf ("%s", input_buffer); | 144 | status = max_state(status, textscan(input_buffer)); |
| 147 | status = max_state (status, textscan (input_buffer)); | 145 | } |
| 148 | } | 146 | (void)fclose(child_stderr); |
| 149 | (void) fclose (child_stderr); | 147 | |
| 150 | 148 | /* close the pipe */ | |
| 151 | /* close the pipe */ | 149 | result = spclose(child_process); |
| 152 | result = spclose (child_process); | 150 | if (result) { |
| 153 | if (result) { | 151 | /* need to use max_state not max */ |
| 154 | /* need to use max_state not max */ | 152 | status = max_state(status, STATE_WARNING); |
| 155 | status = max_state (status, STATE_WARNING); | 153 | } |
| 156 | } | 154 | |
| 157 | 155 | if (result > 1) { | |
| 158 | if (result > 1 ) { | 156 | status = max_state(status, STATE_UNKNOWN); |
| 159 | status = max_state (status, STATE_UNKNOWN); | 157 | if (result == 2) { |
| 160 | if (result == 2) { | 158 | die(STATE_UNKNOWN, _("FPING UNKNOWN - IP address not found\n")); |
| 161 | die (STATE_UNKNOWN, _("FPING UNKNOWN - IP address not found\n")); | 159 | } |
| 162 | } | 160 | if (result == 3) { |
| 163 | if (result == 3) { | 161 | die(STATE_UNKNOWN, _("FPING UNKNOWN - invalid commandline argument\n")); |
| 164 | die (STATE_UNKNOWN, _("FPING UNKNOWN - invalid commandline argument\n")); | 162 | } |
| 165 | } | 163 | if (result == 4) { |
| 166 | if (result == 4) { | 164 | die(STATE_UNKNOWN, _("FPING UNKNOWN - failed system call\n")); |
| 167 | die (STATE_UNKNOWN, _("FPING UNKNOWN - failed system call\n")); | 165 | } |
| 168 | } | 166 | } |
| 169 | 167 | ||
| 170 | } | 168 | printf("FPING %s - %s\n", state_text(status), server_name); |
| 171 | 169 | ||
| 172 | printf ("FPING %s - %s\n", state_text (status), server_name); | 170 | return status; |
| 173 | |||
| 174 | return status; | ||
| 175 | } | 171 | } |
| 176 | 172 | ||
| 177 | 173 | int textscan(char *buf) { | |
| 178 | int textscan (char *buf) { | 174 | char *rtastr = NULL; |
| 179 | char *rtastr = NULL; | 175 | char *losstr = NULL; |
| 180 | char *losstr = NULL; | 176 | char *xmtstr = NULL; |
| 181 | char *xmtstr = NULL; | 177 | double loss; |
| 182 | double loss; | 178 | double rta; |
| 183 | double rta; | 179 | double xmt; |
| 184 | double xmt; | 180 | int status = STATE_UNKNOWN; |
| 185 | int status = STATE_UNKNOWN; | 181 | |
| 186 | 182 | /* stops testing after the first successful reply. */ | |
| 187 | /* stops testing after the first successful reply. */ | 183 | if (alive_p && strstr(buf, "avg, 0% loss)")) { |
| 188 | if (alive_p && strstr(buf, "avg, 0% loss)")) { | 184 | rtastr = strstr(buf, "ms ("); |
| 189 | rtastr = strstr (buf, "ms ("); | 185 | rtastr = 1 + index(rtastr, '('); |
| 190 | rtastr = 1 + index(rtastr, '('); | 186 | rta = strtod(rtastr, NULL); |
| 191 | rta = strtod(rtastr, NULL); | 187 | loss = strtod("0", NULL); |
| 192 | loss=strtod("0",NULL); | 188 | die(STATE_OK, _("FPING %s - %s (rta=%f ms)|%s\n"), state_text(STATE_OK), server_name, rta, |
| 193 | die (STATE_OK, | 189 | /* No loss since we only waited for the first reply |
| 194 | _("FPING %s - %s (rta=%f ms)|%s\n"), | 190 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100), */ |
| 195 | state_text (STATE_OK), server_name,rta, | 191 | fperfdata("rta", rta / 1.0e3, "s", wrta_p, wrta / 1.0e3, crta_p, crta / 1.0e3, true, 0, false, 0)); |
| 196 | /* No loss since we only waited for the first reply | 192 | } |
| 197 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100), */ | 193 | |
| 198 | fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, true, 0, false, 0)); | 194 | if (strstr(buf, "not found")) { |
| 199 | } | 195 | die(STATE_CRITICAL, _("FPING UNKNOWN - %s not found\n"), server_name); |
| 200 | 196 | ||
| 201 | if (strstr (buf, "not found")) { | 197 | } else if (strstr(buf, "is unreachable") || strstr(buf, "Unreachable")) { |
| 202 | die (STATE_CRITICAL, _("FPING UNKNOWN - %s not found\n"), server_name); | 198 | die(STATE_CRITICAL, _("FPING CRITICAL - %s is unreachable\n"), "host"); |
| 203 | 199 | ||
| 204 | } | 200 | } else if (strstr(buf, "Operation not permitted") || strstr(buf, "No such device")) { |
| 205 | else if (strstr (buf, "is unreachable") || strstr (buf, "Unreachable")) { | 201 | die(STATE_UNKNOWN, _("FPING UNKNOWN - %s parameter error\n"), "host"); |
| 206 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is unreachable\n"), | 202 | } else if (strstr(buf, "is down")) { |
| 207 | "host"); | 203 | die(STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); |
| 208 | 204 | ||
| 209 | } | 205 | } else if (strstr(buf, "is alive")) { |
| 210 | else if (strstr (buf, "Operation not permitted") || strstr (buf, "No such device") ) { | 206 | status = STATE_OK; |
| 211 | die (STATE_UNKNOWN, _("FPING UNKNOWN - %s parameter error\n"), | 207 | |
| 212 | "host"); | 208 | } else if (strstr(buf, "xmt/rcv/%loss") && strstr(buf, "min/avg/max")) { |
| 213 | } | 209 | losstr = strstr(buf, "="); |
| 214 | else if (strstr (buf, "is down")) { | 210 | losstr = 1 + strstr(losstr, "/"); |
| 215 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); | 211 | losstr = 1 + strstr(losstr, "/"); |
| 216 | 212 | rtastr = strstr(buf, "min/avg/max"); | |
| 217 | } | 213 | rtastr = strstr(rtastr, "="); |
| 218 | else if (strstr (buf, "is alive")) { | 214 | rtastr = 1 + index(rtastr, '/'); |
| 219 | status = STATE_OK; | 215 | loss = strtod(losstr, NULL); |
| 220 | 216 | rta = strtod(rtastr, NULL); | |
| 221 | } | 217 | if (cpl_p && loss > cpl) |
| 222 | else if (strstr (buf, "xmt/rcv/%loss") && strstr (buf, "min/avg/max")) { | 218 | status = STATE_CRITICAL; |
| 223 | losstr = strstr (buf, "="); | 219 | else if (crta_p && rta > crta) |
| 224 | losstr = 1 + strstr (losstr, "/"); | 220 | status = STATE_CRITICAL; |
| 225 | losstr = 1 + strstr (losstr, "/"); | 221 | else if (wpl_p && loss > wpl) |
| 226 | rtastr = strstr (buf, "min/avg/max"); | 222 | status = STATE_WARNING; |
| 227 | rtastr = strstr (rtastr, "="); | 223 | else if (wrta_p && rta > wrta) |
| 228 | rtastr = 1 + index (rtastr, '/'); | 224 | status = STATE_WARNING; |
| 229 | loss = strtod (losstr, NULL); | 225 | else |
| 230 | rta = strtod (rtastr, NULL); | 226 | status = STATE_OK; |
| 231 | if (cpl_p && loss > cpl) | 227 | die(status, _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), state_text(status), server_name, loss, rta, |
| 232 | status = STATE_CRITICAL; | 228 | perfdata("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100), |
| 233 | else if (crta_p && rta > crta) | 229 | fperfdata("rta", rta / 1.0e3, "s", wrta_p, wrta / 1.0e3, crta_p, crta / 1.0e3, true, 0, false, 0)); |
| 234 | status = STATE_CRITICAL; | 230 | |
| 235 | else if (wpl_p && loss > wpl) | 231 | } else if (strstr(buf, "xmt/rcv/%loss")) { |
| 236 | status = STATE_WARNING; | 232 | /* no min/max/avg if host was unreachable in fping v2.2.b1 */ |
| 237 | else if (wrta_p && rta > wrta) | 233 | /* in v2.4b2: 10.99.0.1 : xmt/rcv/%loss = 0/0/0% */ |
| 238 | status = STATE_WARNING; | 234 | losstr = strstr(buf, "="); |
| 239 | else | 235 | xmtstr = 1 + losstr; |
| 240 | status = STATE_OK; | 236 | xmt = strtod(xmtstr, NULL); |
| 241 | die (status, | 237 | if (xmt == 0) |
| 242 | _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), | 238 | die(STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); |
| 243 | state_text (status), server_name, loss, rta, | 239 | losstr = 1 + strstr(losstr, "/"); |
| 244 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100), | 240 | losstr = 1 + strstr(losstr, "/"); |
| 245 | fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, true, 0, false, 0)); | 241 | loss = strtod(losstr, NULL); |
| 246 | 242 | if (atoi(losstr) == 100) | |
| 247 | } | 243 | status = STATE_CRITICAL; |
| 248 | else if(strstr (buf, "xmt/rcv/%loss") ) { | 244 | else if (cpl_p && loss > cpl) |
| 249 | /* no min/max/avg if host was unreachable in fping v2.2.b1 */ | 245 | status = STATE_CRITICAL; |
| 250 | /* in v2.4b2: 10.99.0.1 : xmt/rcv/%loss = 0/0/0% */ | 246 | else if (wpl_p && loss > wpl) |
| 251 | losstr = strstr (buf, "="); | 247 | status = STATE_WARNING; |
| 252 | xmtstr = 1 + losstr; | 248 | else |
| 253 | xmt = strtod (xmtstr, NULL); | 249 | status = STATE_OK; |
| 254 | if(xmt == 0) | 250 | /* loss=%.0f%%;%d;%d;0;100 */ |
| 255 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); | 251 | die(status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), state_text(status), server_name, loss, |
| 256 | losstr = 1 + strstr (losstr, "/"); | 252 | perfdata("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100)); |
| 257 | losstr = 1 + strstr (losstr, "/"); | 253 | |
| 258 | loss = strtod (losstr, NULL); | 254 | } else { |
| 259 | if (atoi(losstr) == 100) | 255 | status = max_state(status, STATE_WARNING); |
| 260 | status = STATE_CRITICAL; | 256 | } |
| 261 | else if (cpl_p && loss > cpl) | 257 | |
| 262 | status = STATE_CRITICAL; | 258 | return status; |
| 263 | else if (wpl_p && loss > wpl) | ||
| 264 | status = STATE_WARNING; | ||
| 265 | else | ||
| 266 | status = STATE_OK; | ||
| 267 | /* loss=%.0f%%;%d;%d;0;100 */ | ||
| 268 | die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), | ||
| 269 | state_text (status), server_name, loss , | ||
| 270 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, true, 0, true, 100)); | ||
| 271 | |||
| 272 | } | ||
| 273 | else { | ||
| 274 | status = max_state (status, STATE_WARNING); | ||
| 275 | } | ||
| 276 | |||
| 277 | return status; | ||
| 278 | } | 259 | } |
| 279 | 260 | ||
| 280 | |||
| 281 | |||
| 282 | /* process command-line arguments */ | 261 | /* process command-line arguments */ |
| 283 | int | 262 | int process_arguments(int argc, char **argv) { |
| 284 | process_arguments (int argc, char **argv) | 263 | int c; |
| 285 | { | 264 | char *rv[2]; |
| 286 | int c; | 265 | |
| 287 | char *rv[2]; | 266 | int option = 0; |
| 288 | 267 | static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, | |
| 289 | int option = 0; | 268 | {"sourceip", required_argument, 0, 'S'}, |
| 290 | static struct option longopts[] = { | 269 | {"sourceif", required_argument, 0, 'I'}, |
| 291 | {"hostname", required_argument, 0, 'H'}, | 270 | {"critical", required_argument, 0, 'c'}, |
| 292 | {"sourceip", required_argument, 0, 'S'}, | 271 | {"warning", required_argument, 0, 'w'}, |
| 293 | {"sourceif", required_argument, 0, 'I'}, | 272 | {"alive", no_argument, 0, 'a'}, |
| 294 | {"critical", required_argument, 0, 'c'}, | 273 | {"bytes", required_argument, 0, 'b'}, |
| 295 | {"warning", required_argument, 0, 'w'}, | 274 | {"number", required_argument, 0, 'n'}, |
| 296 | {"alive", no_argument, 0, 'a'}, | 275 | {"target-timeout", required_argument, 0, 'T'}, |
| 297 | {"bytes", required_argument, 0, 'b'}, | 276 | {"interval", required_argument, 0, 'i'}, |
| 298 | {"number", required_argument, 0, 'n'}, | 277 | {"verbose", no_argument, 0, 'v'}, |
| 299 | {"target-timeout", required_argument, 0, 'T'}, | 278 | {"version", no_argument, 0, 'V'}, |
| 300 | {"interval", required_argument, 0, 'i'}, | 279 | {"help", no_argument, 0, 'h'}, |
| 301 | {"verbose", no_argument, 0, 'v'}, | 280 | {"use-ipv4", no_argument, 0, '4'}, |
| 302 | {"version", no_argument, 0, 'V'}, | 281 | {"use-ipv6", no_argument, 0, '6'}, |
| 303 | {"help", no_argument, 0, 'h'}, | 282 | {0, 0, 0, 0}}; |
| 304 | {"use-ipv4", no_argument, 0, '4'}, | 283 | |
| 305 | {"use-ipv6", no_argument, 0, '6'}, | 284 | rv[PL] = NULL; |
| 306 | {0, 0, 0, 0} | 285 | rv[RTA] = NULL; |
| 307 | }; | 286 | |
| 308 | 287 | if (argc < 2) | |
| 309 | rv[PL] = NULL; | 288 | return ERROR; |
| 310 | rv[RTA] = NULL; | 289 | |
| 311 | 290 | if (!is_option(argv[1])) { | |
| 312 | if (argc < 2) | 291 | server_name = argv[1]; |
| 313 | return ERROR; | 292 | argv[1] = argv[0]; |
| 314 | 293 | argv = &argv[1]; | |
| 315 | if (!is_option (argv[1])) { | 294 | argc--; |
| 316 | server_name = argv[1]; | 295 | } |
| 317 | argv[1] = argv[0]; | 296 | |
| 318 | argv = &argv[1]; | 297 | while (1) { |
| 319 | argc--; | 298 | c = getopt_long(argc, argv, "+hVvaH:S:c:w:b:n:T:i:I:46", longopts, &option); |
| 320 | } | 299 | |
| 321 | 300 | if (c == -1 || c == EOF || c == 1) | |
| 322 | while (1) { | 301 | break; |
| 323 | c = getopt_long (argc, argv, "+hVvaH:S:c:w:b:n:T:i:I:46", longopts, &option); | 302 | |
| 324 | 303 | switch (c) { | |
| 325 | if (c == -1 || c == EOF || c == 1) | 304 | case '?': /* print short usage statement if args not parsable */ |
| 326 | break; | 305 | usage5(); |
| 327 | 306 | case 'a': /* host alive mode */ | |
| 328 | switch (c) { | 307 | alive_p = true; |
| 329 | case '?': /* print short usage statement if args not parsable */ | 308 | break; |
| 330 | usage5 (); | 309 | case 'h': /* help */ |
| 331 | case 'a': /* host alive mode */ | 310 | print_help(); |
| 332 | alive_p = true; | 311 | exit(STATE_UNKNOWN); |
| 333 | break; | 312 | case 'V': /* version */ |
| 334 | case 'h': /* help */ | 313 | print_revision(progname, NP_VERSION); |
| 335 | print_help (); | 314 | exit(STATE_UNKNOWN); |
| 336 | exit (STATE_UNKNOWN); | 315 | case 'v': /* verbose mode */ |
| 337 | case 'V': /* version */ | 316 | verbose = true; |
| 338 | print_revision (progname, NP_VERSION); | 317 | break; |
| 339 | exit (STATE_UNKNOWN); | 318 | case 'H': /* hostname */ |
| 340 | case 'v': /* verbose mode */ | 319 | if (is_host(optarg) == false) { |
| 341 | verbose = true; | 320 | usage2(_("Invalid hostname/address"), optarg); |
| 342 | break; | 321 | } |
| 343 | case 'H': /* hostname */ | 322 | server_name = strscpy(server_name, optarg); |
| 344 | if (is_host (optarg) == false) { | ||
| 345 | usage2 (_("Invalid hostname/address"), optarg); | ||
| 346 | } | ||
| 347 | server_name = strscpy (server_name, optarg); | ||
| 348 | break; | ||
| 349 | case 'S': /* sourceip */ | ||
| 350 | if (is_host (optarg) == false) { | ||
| 351 | usage2 (_("Invalid hostname/address"), optarg); | ||
| 352 | } | ||
| 353 | sourceip = strscpy (sourceip, optarg); | ||
| 354 | break; | ||
| 355 | case 'I': /* sourceip */ | ||
| 356 | sourceif = strscpy (sourceif, optarg); | ||
| 357 | break; | 323 | break; |
| 358 | case '4': /* IPv4 only */ | 324 | case 'S': /* sourceip */ |
| 359 | address_family = AF_INET; | 325 | if (is_host(optarg) == false) { |
| 360 | break; | 326 | usage2(_("Invalid hostname/address"), optarg); |
| 361 | case '6': /* IPv6 only */ | 327 | } |
| 328 | sourceip = strscpy(sourceip, optarg); | ||
| 329 | break; | ||
| 330 | case 'I': /* sourceip */ | ||
| 331 | sourceif = strscpy(sourceif, optarg); | ||
| 332 | break; | ||
| 333 | case '4': /* IPv4 only */ | ||
| 334 | address_family = AF_INET; | ||
| 335 | break; | ||
| 336 | case '6': /* IPv6 only */ | ||
| 362 | #ifdef USE_IPV6 | 337 | #ifdef USE_IPV6 |
| 363 | address_family = AF_INET6; | 338 | address_family = AF_INET6; |
| 364 | #else | 339 | #else |
| 365 | usage (_("IPv6 support not available\n")); | 340 | usage(_("IPv6 support not available\n")); |
| 366 | #endif | 341 | #endif |
| 367 | break; | 342 | break; |
| 368 | case 'c': | 343 | case 'c': |
| 369 | get_threshold (optarg, rv); | 344 | get_threshold(optarg, rv); |
| 370 | if (rv[RTA]) { | 345 | if (rv[RTA]) { |
| 371 | crta = strtod (rv[RTA], NULL); | 346 | crta = strtod(rv[RTA], NULL); |
| 372 | crta_p = true; | 347 | crta_p = true; |
| 373 | rv[RTA] = NULL; | 348 | rv[RTA] = NULL; |
| 374 | } | 349 | } |
| 375 | if (rv[PL]) { | 350 | if (rv[PL]) { |
| 376 | cpl = atoi (rv[PL]); | 351 | cpl = atoi(rv[PL]); |
| 377 | cpl_p = true; | 352 | cpl_p = true; |
| 378 | rv[PL] = NULL; | 353 | rv[PL] = NULL; |
| 379 | } | 354 | } |
| 380 | break; | 355 | break; |
| 381 | case 'w': | 356 | case 'w': |
| 382 | get_threshold (optarg, rv); | 357 | get_threshold(optarg, rv); |
| 383 | if (rv[RTA]) { | 358 | if (rv[RTA]) { |
| 384 | wrta = strtod (rv[RTA], NULL); | 359 | wrta = strtod(rv[RTA], NULL); |
| 385 | wrta_p = true; | 360 | wrta_p = true; |
| 386 | rv[RTA] = NULL; | 361 | rv[RTA] = NULL; |
| 387 | } | 362 | } |
| 388 | if (rv[PL]) { | 363 | if (rv[PL]) { |
| 389 | wpl = atoi (rv[PL]); | 364 | wpl = atoi(rv[PL]); |
| 390 | wpl_p = true; | 365 | wpl_p = true; |
| 391 | rv[PL] = NULL; | 366 | rv[PL] = NULL; |
| 392 | } | 367 | } |
| 393 | break; | 368 | break; |
| 394 | case 'b': /* bytes per packet */ | 369 | case 'b': /* bytes per packet */ |
| 395 | if (is_intpos (optarg)) | 370 | if (is_intpos(optarg)) |
| 396 | packet_size = atoi (optarg); | 371 | packet_size = atoi(optarg); |
| 397 | else | 372 | else |
| 398 | usage (_("Packet size must be a positive integer")); | 373 | usage(_("Packet size must be a positive integer")); |
| 399 | break; | 374 | break; |
| 400 | case 'n': /* number of packets */ | 375 | case 'n': /* number of packets */ |
| 401 | if (is_intpos (optarg)) | 376 | if (is_intpos(optarg)) |
| 402 | packet_count = atoi (optarg); | 377 | packet_count = atoi(optarg); |
| 403 | else | 378 | else |
| 404 | usage (_("Packet count must be a positive integer")); | 379 | usage(_("Packet count must be a positive integer")); |
| 405 | break; | 380 | break; |
| 406 | case 'T': /* timeout in msec */ | 381 | case 'T': /* timeout in msec */ |
| 407 | if (is_intpos (optarg)) | 382 | if (is_intpos(optarg)) |
| 408 | target_timeout = atoi (optarg); | 383 | target_timeout = atoi(optarg); |
| 409 | else | 384 | else |
| 410 | usage (_("Target timeout must be a positive integer")); | 385 | usage(_("Target timeout must be a positive integer")); |
| 411 | break; | 386 | break; |
| 412 | case 'i': /* interval in msec */ | 387 | case 'i': /* interval in msec */ |
| 413 | if (is_intpos (optarg)) | 388 | if (is_intpos(optarg)) |
| 414 | packet_interval = atoi (optarg); | 389 | packet_interval = atoi(optarg); |
| 415 | else | 390 | else |
| 416 | usage (_("Interval must be a positive integer")); | 391 | usage(_("Interval must be a positive integer")); |
| 417 | break; | 392 | break; |
| 418 | } | 393 | } |
| 419 | } | 394 | } |
| 420 | |||
| 421 | if (server_name == NULL) | ||
| 422 | usage4 (_("Hostname was not supplied")); | ||
| 423 | |||
| 424 | return OK; | ||
| 425 | } | ||
| 426 | 395 | ||
| 396 | if (server_name == NULL) | ||
| 397 | usage4(_("Hostname was not supplied")); | ||
| 427 | 398 | ||
| 428 | int | 399 | return OK; |
| 429 | get_threshold (char *arg, char *rv[2]) | ||
| 430 | { | ||
| 431 | char *arg1 = NULL; | ||
| 432 | char *arg2 = NULL; | ||
| 433 | |||
| 434 | arg1 = strscpy (arg1, arg); | ||
| 435 | if (strpbrk (arg1, ",:")) | ||
| 436 | arg2 = 1 + strpbrk (arg1, ",:"); | ||
| 437 | |||
| 438 | if (arg2) { | ||
| 439 | arg1[strcspn (arg1, ",:")] = 0; | ||
| 440 | if (strstr (arg1, "%") && strstr (arg2, "%")) | ||
| 441 | die (STATE_UNKNOWN, | ||
| 442 | _("%s: Only one threshold may be packet loss (%s)\n"), progname, | ||
| 443 | arg); | ||
| 444 | if (!strstr (arg1, "%") && !strstr (arg2, "%")) | ||
| 445 | die (STATE_UNKNOWN, | ||
| 446 | _("%s: Only one threshold must be packet loss (%s)\n"), | ||
| 447 | progname, arg); | ||
| 448 | } | ||
| 449 | |||
| 450 | if (arg2 && strstr (arg2, "%")) { | ||
| 451 | rv[PL] = arg2; | ||
| 452 | rv[RTA] = arg1; | ||
| 453 | } | ||
| 454 | else if (arg2) { | ||
| 455 | rv[PL] = arg1; | ||
| 456 | rv[RTA] = arg2; | ||
| 457 | } | ||
| 458 | else if (strstr (arg1, "%")) { | ||
| 459 | rv[PL] = arg1; | ||
| 460 | } | ||
| 461 | else { | ||
| 462 | rv[RTA] = arg1; | ||
| 463 | } | ||
| 464 | |||
| 465 | return OK; | ||
| 466 | } | 400 | } |
| 467 | 401 | ||
| 402 | int get_threshold(char *arg, char *rv[2]) { | ||
| 403 | char *arg1 = NULL; | ||
| 404 | char *arg2 = NULL; | ||
| 405 | |||
| 406 | arg1 = strscpy(arg1, arg); | ||
| 407 | if (strpbrk(arg1, ",:")) | ||
| 408 | arg2 = 1 + strpbrk(arg1, ",:"); | ||
| 409 | |||
| 410 | if (arg2) { | ||
| 411 | arg1[strcspn(arg1, ",:")] = 0; | ||
| 412 | if (strstr(arg1, "%") && strstr(arg2, "%")) | ||
| 413 | die(STATE_UNKNOWN, _("%s: Only one threshold may be packet loss (%s)\n"), progname, arg); | ||
| 414 | if (!strstr(arg1, "%") && !strstr(arg2, "%")) | ||
| 415 | die(STATE_UNKNOWN, _("%s: Only one threshold must be packet loss (%s)\n"), progname, arg); | ||
| 416 | } | ||
| 417 | |||
| 418 | if (arg2 && strstr(arg2, "%")) { | ||
| 419 | rv[PL] = arg2; | ||
| 420 | rv[RTA] = arg1; | ||
| 421 | } else if (arg2) { | ||
| 422 | rv[PL] = arg1; | ||
| 423 | rv[RTA] = arg2; | ||
| 424 | } else if (strstr(arg1, "%")) { | ||
| 425 | rv[PL] = arg1; | ||
| 426 | } else { | ||
| 427 | rv[RTA] = arg1; | ||
| 428 | } | ||
| 429 | |||
| 430 | return OK; | ||
| 431 | } | ||
| 468 | 432 | ||
| 469 | void print_help (void) { | 433 | void print_help(void) { |
| 470 | 434 | ||
| 471 | print_revision (progname, NP_VERSION); | 435 | print_revision(progname, NP_VERSION); |
| 472 | 436 | ||
| 473 | printf ("Copyright (c) 1999 Didi Rieder <adrieder@sbox.tu-graz.ac.at>\n"); | 437 | printf("Copyright (c) 1999 Didi Rieder <adrieder@sbox.tu-graz.ac.at>\n"); |
| 474 | printf (COPYRIGHT, copyright, email); | 438 | printf(COPYRIGHT, copyright, email); |
| 475 | 439 | ||
| 476 | printf ("%s\n", _("This plugin will use the fping command to ping the specified host for a fast check")); | 440 | printf("%s\n", _("This plugin will use the fping command to ping the specified host for a fast check")); |
| 477 | 441 | ||
| 478 | printf ("%s\n", _("Note that it is necessary to set the suid flag on fping.")); | 442 | printf("%s\n", _("Note that it is necessary to set the suid flag on fping.")); |
| 479 | 443 | ||
| 480 | printf ("\n\n"); | 444 | printf("\n\n"); |
| 481 | 445 | ||
| 482 | print_usage (); | 446 | print_usage(); |
| 483 | 447 | ||
| 484 | printf (UT_HELP_VRSN); | 448 | printf(UT_HELP_VRSN); |
| 485 | printf (UT_EXTRA_OPTS); | 449 | printf(UT_EXTRA_OPTS); |
| 486 | 450 | ||
| 487 | printf (UT_IPv46); | 451 | printf(UT_IPv46); |
| 488 | 452 | ||
| 489 | printf (" %s\n", "-H, --hostname=HOST"); | 453 | printf(" %s\n", "-H, --hostname=HOST"); |
| 490 | printf (" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); | 454 | printf(" %s\n", _("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); |
| 491 | printf (" %s\n", "-w, --warning=THRESHOLD"); | 455 | printf(" %s\n", "-w, --warning=THRESHOLD"); |
| 492 | printf (" %s\n", _("warning threshold pair")); | 456 | printf(" %s\n", _("warning threshold pair")); |
| 493 | printf (" %s\n", "-c, --critical=THRESHOLD"); | 457 | printf(" %s\n", "-c, --critical=THRESHOLD"); |
| 494 | printf (" %s\n", _("critical threshold pair")); | 458 | printf(" %s\n", _("critical threshold pair")); |
| 495 | printf (" %s\n", "-a, --alive"); | 459 | printf(" %s\n", "-a, --alive"); |
| 496 | printf (" %s\n", _("Return OK after first successful reply")); | 460 | printf(" %s\n", _("Return OK after first successful reply")); |
| 497 | printf (" %s\n", "-b, --bytes=INTEGER"); | 461 | printf(" %s\n", "-b, --bytes=INTEGER"); |
| 498 | printf (" %s (default: %d)\n", _("size of ICMP packet"),PACKET_SIZE); | 462 | printf(" %s (default: %d)\n", _("size of ICMP packet"), PACKET_SIZE); |
| 499 | printf (" %s\n", "-n, --number=INTEGER"); | 463 | printf(" %s\n", "-n, --number=INTEGER"); |
| 500 | printf (" %s (default: %d)\n", _("number of ICMP packets to send"),PACKET_COUNT); | 464 | printf(" %s (default: %d)\n", _("number of ICMP packets to send"), PACKET_COUNT); |
| 501 | printf (" %s\n", "-T, --target-timeout=INTEGER"); | 465 | printf(" %s\n", "-T, --target-timeout=INTEGER"); |
| 502 | printf (" %s (default: fping's default for -t)\n", _("Target timeout (ms)")); | 466 | printf(" %s (default: fping's default for -t)\n", _("Target timeout (ms)")); |
| 503 | printf (" %s\n", "-i, --interval=INTEGER"); | 467 | printf(" %s\n", "-i, --interval=INTEGER"); |
| 504 | printf (" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets")); | 468 | printf(" %s (default: fping's default for -p)\n", _("Interval (ms) between sending packets")); |
| 505 | printf (" %s\n", "-S, --sourceip=HOST"); | 469 | printf(" %s\n", "-S, --sourceip=HOST"); |
| 506 | printf (" %s\n", _("name or IP Address of sourceip")); | 470 | printf(" %s\n", _("name or IP Address of sourceip")); |
| 507 | printf (" %s\n", "-I, --sourceif=IF"); | 471 | printf(" %s\n", "-I, --sourceif=IF"); |
| 508 | printf (" %s\n", _("source interface name")); | 472 | printf(" %s\n", _("source interface name")); |
| 509 | printf (UT_VERBOSE); | 473 | printf(UT_VERBOSE); |
| 510 | printf ("\n"); | 474 | printf("\n"); |
| 511 | printf (" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); | 475 | printf(" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); |
| 512 | printf (" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); | 476 | printf(" %s\n", _("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); |
| 513 | printf (" %s\n", _("packet loss to trigger an alarm state.")); | 477 | printf(" %s\n", _("packet loss to trigger an alarm state.")); |
| 514 | 478 | ||
| 515 | printf ("\n"); | 479 | printf("\n"); |
| 516 | printf (" %s\n", _("IPv4 is used by default. Specify -6 to use IPv6.")); | 480 | printf(" %s\n", _("IPv4 is used by default. Specify -6 to use IPv6.")); |
| 517 | 481 | ||
| 518 | printf (UT_SUPPORT); | 482 | printf(UT_SUPPORT); |
| 519 | } | 483 | } |
| 520 | 484 | ||
| 521 | 485 | void print_usage(void) { | |
| 522 | void | 486 | printf("%s\n", _("Usage:")); |
| 523 | print_usage (void) | 487 | printf(" %s <host_address> -w limit -c limit [-b size] [-n number] [-T number] [-i number]\n", progname); |
| 524 | { | ||
| 525 | printf ("%s\n", _("Usage:")); | ||
| 526 | printf (" %s <host_address> -w limit -c limit [-b size] [-n number] [-T number] [-i number]\n", progname); | ||
| 527 | } | 488 | } |
