diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/check_dig.c | 481 | ||||
-rw-r--r-- | plugins/check_disk.c | 1073 | ||||
-rw-r--r-- | plugins/check_dns.c | 667 | ||||
-rw-r--r-- | plugins/check_dummy.c | 117 | ||||
-rw-r--r-- | plugins/check_fping.c | 633 | ||||
-rw-r--r-- | plugins/check_game.c | 453 |
6 files changed, 1806 insertions, 1618 deletions
diff --git a/plugins/check_dig.c b/plugins/check_dig.c index bc4dcd5c..c9fce613 100644 --- a/plugins/check_dig.c +++ b/plugins/check_dig.c | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | const char *progname = "check_dig"; | 27 | const char *progname = "check_dig"; |
28 | const char *revision = "$Revision$"; | 28 | const char *revision = "$Revision$"; |
29 | const char *copyright = "2002-2004"; | 29 | const char *copyright = "2002-2005"; |
30 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 30 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
31 | 31 | ||
32 | #include "common.h" | 32 | #include "common.h" |
@@ -55,113 +55,113 @@ struct timeval tv; | |||
55 | int | 55 | int |
56 | main (int argc, char **argv) | 56 | main (int argc, char **argv) |
57 | { | 57 | { |
58 | char *command_line; | 58 | char *command_line; |
59 | output chld_out, chld_err; | 59 | output chld_out, chld_err; |
60 | char *msg = NULL; | 60 | char *msg = NULL; |
61 | size_t i; | 61 | size_t i; |
62 | char *t; | 62 | char *t; |
63 | long microsec; | 63 | long microsec; |
64 | double elapsed_time; | 64 | double elapsed_time; |
65 | int result = STATE_UNKNOWN; | 65 | int result = STATE_UNKNOWN; |
66 | 66 | ||
67 | setlocale (LC_ALL, ""); | 67 | setlocale (LC_ALL, ""); |
68 | bindtextdomain (PACKAGE, LOCALEDIR); | 68 | bindtextdomain (PACKAGE, LOCALEDIR); |
69 | textdomain (PACKAGE); | 69 | textdomain (PACKAGE); |
70 | 70 | ||
71 | /* Set signal handling and alarm */ | 71 | /* Set signal handling and alarm */ |
72 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) | 72 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) |
73 | usage_va(_("Cannot catch SIGALRM")); | 73 | usage_va(_("Cannot catch SIGALRM")); |
74 | 74 | ||
75 | if (process_arguments (argc, argv) == ERROR) | 75 | if (process_arguments (argc, argv) == ERROR) |
76 | usage_va(_("Could not parse arguments")); | 76 | usage_va(_("Could not parse arguments")); |
77 | 77 | ||
78 | /* get the command to run */ | 78 | /* get the command to run */ |
79 | asprintf (&command_line, "%s @%s -p %d %s -t %s", | 79 | asprintf (&command_line, "%s @%s -p %d %s -t %s", |
80 | PATH_TO_DIG, dns_server, server_port, query_address, record_type); | 80 | PATH_TO_DIG, dns_server, server_port, query_address, record_type); |
81 | 81 | ||
82 | alarm (timeout_interval); | 82 | alarm (timeout_interval); |
83 | gettimeofday (&tv, NULL); | 83 | gettimeofday (&tv, NULL); |
84 | 84 | ||
85 | if (verbose) { | 85 | if (verbose) { |
86 | printf ("%s\n", command_line); | 86 | printf ("%s\n", command_line); |
87 | if(expected_address != NULL) { | 87 | if(expected_address != NULL) { |
88 | printf (_("Looking for: '%s'\n"), expected_address); | 88 | printf (_("Looking for: '%s'\n"), expected_address); |
89 | } else { | 89 | } else { |
90 | printf (_("Looking for: '%s'\n"), query_address); | 90 | printf (_("Looking for: '%s'\n"), query_address); |
91 | } | 91 | } |
92 | } | 92 | } |
93 | 93 | ||
94 | /* run the command */ | 94 | /* run the command */ |
95 | if(np_runcmd(command_line, &chld_out, &chld_err, 0) != 0) { | 95 | if(np_runcmd(command_line, &chld_out, &chld_err, 0) != 0) { |
96 | result = STATE_WARNING; | 96 | result = STATE_WARNING; |
97 | msg = (char *)_("dig returned an error status"); | 97 | msg = (char *)_("dig returned an error status"); |
98 | } | 98 | } |
99 | 99 | ||
100 | for(i = 0; i < chld_out.lines; i++) { | 100 | for(i = 0; i < chld_out.lines; i++) { |
101 | /* the server is responding, we just got the host name... */ | 101 | /* the server is responding, we just got the host name... */ |
102 | if (strstr (chld_out.line[i], ";; ANSWER SECTION:")) { | 102 | if (strstr (chld_out.line[i], ";; ANSWER SECTION:")) { |
103 | 103 | ||
104 | /* loop through the whole 'ANSWER SECTION' */ | 104 | /* loop through the whole 'ANSWER SECTION' */ |
105 | for(; i < chld_out.lines; i++) { | 105 | for(; i < chld_out.lines; i++) { |
106 | /* get the host address */ | 106 | /* get the host address */ |
107 | if (verbose) | 107 | if (verbose) |
108 | printf ("%s\n", chld_out.line[i]); | 108 | printf ("%s\n", chld_out.line[i]); |
109 | 109 | ||
110 | if (strstr (chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { | 110 | if (strstr (chld_out.line[i], (expected_address == NULL ? query_address : expected_address)) != NULL) { |
111 | msg = chld_out.line[i]; | 111 | msg = chld_out.line[i]; |
112 | result = STATE_OK; | 112 | result = STATE_OK; |
113 | 113 | ||
114 | /* Translate output TAB -> SPACE */ | 114 | /* Translate output TAB -> SPACE */ |
115 | t = msg; | 115 | t = msg; |
116 | while ((t = strchr(t, '\t')) != NULL) *t = ' '; | 116 | while ((t = strchr(t, '\t')) != NULL) *t = ' '; |
117 | break; | 117 | break; |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
121 | if (result == STATE_UNKNOWN) { | 121 | if (result == STATE_UNKNOWN) { |
122 | msg = (char *)_("Server not found in ANSWER SECTION"); | 122 | msg = (char *)_("Server not found in ANSWER SECTION"); |
123 | result = STATE_WARNING; | 123 | result = STATE_WARNING; |
124 | } | 124 | } |
125 | 125 | ||
126 | /* we found the answer section, so break out of the loop */ | 126 | /* we found the answer section, so break out of the loop */ |
127 | break; | 127 | break; |
128 | } | 128 | } |
129 | } | 129 | } |
130 | 130 | ||
131 | if (result == STATE_UNKNOWN) | 131 | if (result == STATE_UNKNOWN) |
132 | msg = (char *)_("No ANSWER SECTION found"); | 132 | msg = (char *)_("No ANSWER SECTION found"); |
133 | 133 | ||
134 | /* If we get anything on STDERR, at least set warning */ | 134 | /* If we get anything on STDERR, at least set warning */ |
135 | if(chld_err.buflen > 0) { | 135 | if(chld_err.buflen > 0) { |
136 | result = max_state(result, STATE_WARNING); | 136 | result = max_state(result, STATE_WARNING); |
137 | if(!msg) for(i = 0; i < chld_err.lines; i++) { | 137 | if(!msg) for(i = 0; i < chld_err.lines; i++) { |
138 | msg = strchr(chld_err.line[0], ':'); | 138 | msg = strchr(chld_err.line[0], ':'); |
139 | if(msg) { | 139 | if(msg) { |
140 | msg++; | 140 | msg++; |
141 | break; | 141 | break; |
142 | } | 142 | } |
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | microsec = deltime (tv); | 146 | microsec = deltime (tv); |
147 | elapsed_time = (double)microsec / 1.0e6; | 147 | elapsed_time = (double)microsec / 1.0e6; |
148 | 148 | ||
149 | if (critical_interval > UNDEFINED && elapsed_time > critical_interval) | 149 | if (critical_interval > UNDEFINED && elapsed_time > critical_interval) |
150 | result = STATE_CRITICAL; | 150 | result = STATE_CRITICAL; |
151 | 151 | ||
152 | else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) | 152 | else if (warning_interval > UNDEFINED && elapsed_time > warning_interval) |
153 | result = STATE_WARNING; | 153 | result = STATE_WARNING; |
154 | 154 | ||
155 | printf ("DNS %s - %.3f seconds response time (%s)|%s\n", | 155 | printf ("DNS %s - %.3f seconds response time (%s)|%s\n", |
156 | state_text (result), elapsed_time, | 156 | state_text (result), elapsed_time, |
157 | msg ? msg : _("Probably a non-existent host/domain"), | 157 | msg ? msg : _("Probably a non-existent host/domain"), |
158 | fperfdata("time", elapsed_time, "s", | 158 | fperfdata("time", elapsed_time, "s", |
159 | (warning_interval>UNDEFINED?TRUE:FALSE), | 159 | (warning_interval>UNDEFINED?TRUE:FALSE), |
160 | warning_interval, | 160 | warning_interval, |
161 | (critical_interval>UNDEFINED?TRUE:FALSE), | 161 | (critical_interval>UNDEFINED?TRUE:FALSE), |
162 | critical_interval, | 162 | critical_interval, |
163 | TRUE, 0, FALSE, 0)); | 163 | TRUE, 0, FALSE, 0)); |
164 | return result; | 164 | return result; |
165 | } | 165 | } |
166 | 166 | ||
167 | 167 | ||
@@ -170,104 +170,104 @@ main (int argc, char **argv) | |||
170 | int | 170 | int |
171 | process_arguments (int argc, char **argv) | 171 | process_arguments (int argc, char **argv) |
172 | { | 172 | { |
173 | int c; | 173 | int c; |
174 | 174 | ||
175 | int option = 0; | 175 | int option = 0; |
176 | static struct option longopts[] = { | 176 | static struct option longopts[] = { |
177 | {"hostname", required_argument, 0, 'H'}, | 177 | {"hostname", required_argument, 0, 'H'}, |
178 | {"query_address", required_argument, 0, 'l'}, | 178 | {"query_address", required_argument, 0, 'l'}, |
179 | {"warning", required_argument, 0, 'w'}, | 179 | {"warning", required_argument, 0, 'w'}, |
180 | {"critical", required_argument, 0, 'c'}, | 180 | {"critical", required_argument, 0, 'c'}, |
181 | {"timeout", required_argument, 0, 't'}, | 181 | {"timeout", required_argument, 0, 't'}, |
182 | {"verbose", no_argument, 0, 'v'}, | 182 | {"verbose", no_argument, 0, 'v'}, |
183 | {"version", no_argument, 0, 'V'}, | 183 | {"version", no_argument, 0, 'V'}, |
184 | {"help", no_argument, 0, 'h'}, | 184 | {"help", no_argument, 0, 'h'}, |
185 | {"record_type", required_argument, 0, 'T'}, | 185 | {"record_type", required_argument, 0, 'T'}, |
186 | {"expected_address", required_argument, 0, 'a'}, | 186 | {"expected_address", required_argument, 0, 'a'}, |
187 | {0, 0, 0, 0} | 187 | {0, 0, 0, 0} |
188 | }; | 188 | }; |
189 | 189 | ||
190 | if (argc < 2) | 190 | if (argc < 2) |
191 | return ERROR; | 191 | return ERROR; |
192 | 192 | ||
193 | while (1) { | 193 | while (1) { |
194 | c = getopt_long (argc, argv, "hVvt:l:H:w:c:T:a:", longopts, &option); | 194 | c = getopt_long (argc, argv, "hVvt:l:H:w:c:T:a:", longopts, &option); |
195 | 195 | ||
196 | if (c == -1 || c == EOF) | 196 | if (c == -1 || c == EOF) |
197 | break; | 197 | break; |
198 | 198 | ||
199 | switch (c) { | 199 | switch (c) { |
200 | case 'h': /* help */ | 200 | case 'h': /* help */ |
201 | print_help (); | 201 | print_help (); |
202 | exit (STATE_OK); | 202 | exit (STATE_OK); |
203 | case 'V': /* version */ | 203 | case 'V': /* version */ |
204 | print_revision (progname, revision); | 204 | print_revision (progname, revision); |
205 | exit (STATE_OK); | 205 | exit (STATE_OK); |
206 | case 'H': /* hostname */ | 206 | case 'H': /* hostname */ |
207 | host_or_die(optarg); | 207 | host_or_die(optarg); |
208 | dns_server = optarg; | 208 | dns_server = optarg; |
209 | break; | 209 | break; |
210 | case 'p': /* server port */ | 210 | case 'p': /* server port */ |
211 | if (is_intpos (optarg)) { | 211 | if (is_intpos (optarg)) { |
212 | server_port = atoi (optarg); | 212 | server_port = atoi (optarg); |
213 | } | 213 | } |
214 | else { | 214 | else { |
215 | usage_va(_("Port must be a positive integer - %s"), optarg); | 215 | usage_va(_("Port must be a positive integer - %s"), optarg); |
216 | } | 216 | } |
217 | break; | 217 | break; |
218 | case 'l': /* address to lookup */ | 218 | case 'l': /* address to lookup */ |
219 | query_address = optarg; | 219 | query_address = optarg; |
220 | break; | 220 | break; |
221 | case 'w': /* warning */ | 221 | case 'w': /* warning */ |
222 | if (is_nonnegative (optarg)) { | 222 | if (is_nonnegative (optarg)) { |
223 | warning_interval = strtod (optarg, NULL); | 223 | warning_interval = strtod (optarg, NULL); |
224 | } | 224 | } |
225 | else { | 225 | else { |
226 | usage_va(_("Warning interval must be a positive integer - %s"), optarg); | 226 | usage_va(_("Warning interval must be a positive integer - %s"), optarg); |
227 | } | 227 | } |
228 | break; | 228 | break; |
229 | case 'c': /* critical */ | 229 | case 'c': /* critical */ |
230 | if (is_nonnegative (optarg)) { | 230 | if (is_nonnegative (optarg)) { |
231 | critical_interval = strtod (optarg, NULL); | 231 | critical_interval = strtod (optarg, NULL); |
232 | } | 232 | } |
233 | else { | 233 | else { |
234 | usage_va(_("Critical interval must be a positive integer - %s"), optarg); | 234 | usage_va(_("Critical interval must be a positive integer - %s"), optarg); |
235 | } | 235 | } |
236 | break; | 236 | break; |
237 | case 't': /* timeout */ | 237 | case 't': /* timeout */ |
238 | if (is_intnonneg (optarg)) { | 238 | if (is_intnonneg (optarg)) { |
239 | timeout_interval = atoi (optarg); | 239 | timeout_interval = atoi (optarg); |
240 | } | 240 | } |
241 | else { | 241 | else { |
242 | usage_va(_("Timeout interval must be a positive integer - %s"), optarg); | 242 | usage_va(_("Timeout interval must be a positive integer - %s"), optarg); |
243 | } | 243 | } |
244 | break; | 244 | break; |
245 | case 'v': /* verbose */ | 245 | case 'v': /* verbose */ |
246 | verbose = TRUE; | 246 | verbose = TRUE; |
247 | break; | 247 | break; |
248 | case 'T': | 248 | case 'T': |
249 | record_type = optarg; | 249 | record_type = optarg; |
250 | break; | 250 | break; |
251 | case 'a': | 251 | case 'a': |
252 | expected_address = optarg; | 252 | expected_address = optarg; |
253 | break; | 253 | break; |
254 | default: /* usage_va */ | 254 | default: /* usage_va */ |
255 | usage_va(_("Unknown argument - %s"), optarg); | 255 | usage_va(_("Unknown argument - %s"), optarg); |
256 | } | 256 | } |
257 | } | 257 | } |
258 | 258 | ||
259 | c = optind; | 259 | c = optind; |
260 | if (dns_server == NULL) { | 260 | if (dns_server == NULL) { |
261 | if (c < argc) { | 261 | if (c < argc) { |
262 | host_or_die(argv[c]); | 262 | host_or_die(argv[c]); |
263 | dns_server = argv[c]; | 263 | dns_server = argv[c]; |
264 | } | 264 | } |
265 | else { | 265 | else { |
266 | dns_server = strdup ("127.0.0.1"); | 266 | dns_server = strdup ("127.0.0.1"); |
267 | } | 267 | } |
268 | } | 268 | } |
269 | 269 | ||
270 | return validate_arguments (); | 270 | return validate_arguments (); |
271 | } | 271 | } |
272 | 272 | ||
273 | 273 | ||
@@ -275,7 +275,7 @@ process_arguments (int argc, char **argv) | |||
275 | int | 275 | int |
276 | validate_arguments (void) | 276 | validate_arguments (void) |
277 | { | 277 | { |
278 | return OK; | 278 | return OK; |
279 | } | 279 | } |
280 | 280 | ||
281 | 281 | ||
@@ -283,43 +283,56 @@ validate_arguments (void) | |||
283 | void | 283 | void |
284 | print_help (void) | 284 | print_help (void) |
285 | { | 285 | { |
286 | char *myport; | 286 | char *myport; |
287 | 287 | ||
288 | asprintf (&myport, "%d", DEFAULT_PORT); | 288 | asprintf (&myport, "%d", DEFAULT_PORT); |
289 | 289 | ||
290 | print_revision (progname, revision); | 290 | print_revision (progname, revision); |
291 | 291 | ||
292 | printf ("Copyright (c) 2000 Karl DeBisschop <kdebisschop@users.sourceforge.net>\n"); | 292 | printf ("Copyright (c) 2000 Karl DeBisschop <kdebisschop@users.sourceforge.net>\n"); |
293 | printf (COPYRIGHT, copyright, email); | 293 | printf (COPYRIGHT, copyright, email); |
294 | 294 | ||
295 | printf (_("Test the DNS service on the specified host using dig\n\n")); | 295 | printf (_("This plugin test the DNS service on the specified host using dig")); |
296 | 296 | ||
297 | print_usage (); | 297 | printf ("\n\n"); |
298 | 298 | ||
299 | printf (_(UT_HELP_VRSN)); | 299 | print_usage (); |
300 | 300 | ||
301 | printf (_(UT_HOST_PORT), 'P', myport); | 301 | printf (_(UT_HELP_VRSN)); |
302 | 302 | ||
303 | printf (_("\ | 303 | printf (_(UT_HOST_PORT), 'P', myport); |
304 | -l, --lookup=STRING\n\ | ||
305 | machine name to lookup\n")); | ||
306 | 304 | ||
307 | printf (_("\ | 305 | printf ("-l, --lookup=STRING"); |
308 | -T, --record_type=STRING\n\ | 306 | |
309 | record type to lookup (default: A)\n")); | 307 | printf ("\n"); |
310 | 308 | ||
311 | printf (_("\ | 309 | printf (_("machine name to lookup")); |
312 | -a, --expected_address=STRING\n\ | ||
313 | an address expected to be in the answer section.\n\ | ||
314 | if not set, uses whatever was in -l\n")); | ||
315 | 310 | ||
316 | printf (_(UT_WARN_CRIT)); | 311 | printf ("\n"); |
317 | 312 | ||
318 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | 313 | printf ("-T, --record_type=STRING"); |
319 | 314 | ||
320 | printf (_(UT_VERBOSE)); | 315 | printf ("\n"); |
321 | 316 | ||
322 | printf (_(UT_SUPPORT)); | 317 | printf (_("record type to lookup (default: A)")); |
318 | |||
319 | printf ("\n"); | ||
320 | |||
321 | printf ("-a, --expected_address=STRING"); | ||
322 | |||
323 | printf ("\n"); | ||
324 | |||
325 | printf (_("an address expected to be in the answer section.if not set, uses whatever was in -l")); | ||
326 | |||
327 | printf ("\n"); | ||
328 | |||
329 | printf (_(UT_WARN_CRIT)); | ||
330 | |||
331 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
332 | |||
333 | printf (_(UT_VERBOSE)); | ||
334 | |||
335 | printf (_(UT_SUPPORT)); | ||
323 | } | 336 | } |
324 | 337 | ||
325 | 338 | ||
@@ -327,8 +340,8 @@ print_help (void) | |||
327 | void | 340 | void |
328 | print_usage (void) | 341 | print_usage (void) |
329 | { | 342 | { |
330 | printf ("\ | 343 | printf (_("Usage:")); |
331 | Usage: %s -H host -l lookup [-p <server port>] [-T <query type>]\n\ | 344 | printf ("%s -H host -l lookup [-p <server port>] [-T <query type>]", progname); |
332 | [-w <warning interval>] [-c <critical interval>] [-t <timeout>]\n\ | 345 | printf (" [-w <warning interval>] [-c <critical interval>] [-t <timeout>]"); |
333 | [-a <expected answer address>] [-v]\n", progname); | 346 | printf (" [-a <expected answer address>] [-v]\n"); |
334 | } | 347 | } |
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 81dd6c73..3a5f4761 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
@@ -19,9 +19,9 @@ | |||
19 | *****************************************************************************/ | 19 | *****************************************************************************/ |
20 | 20 | ||
21 | const char *progname = "check_disk"; | 21 | const char *progname = "check_disk"; |
22 | const char *program_name = "check_disk"; /* Required for coreutils libs */ | 22 | const char *program_name = "check_disk"; /* Required for coreutils libs */ |
23 | const char *revision = "$Revision$"; | 23 | const char *revision = "$Revision$"; |
24 | const char *copyright = "1999-2004"; | 24 | const char *copyright = "1999-2005"; |
25 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 25 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
26 | 26 | ||
27 | /* | 27 | /* |
@@ -149,92 +149,92 @@ static struct mount_entry *mount_list; | |||
149 | int | 149 | int |
150 | main (int argc, char **argv) | 150 | main (int argc, char **argv) |
151 | { | 151 | { |
152 | double usp = -1.0, uisp = -1.0; | 152 | double usp = -1.0, uisp = -1.0; |
153 | int result = STATE_UNKNOWN; | 153 | int result = STATE_UNKNOWN; |
154 | int disk_result = STATE_UNKNOWN; | 154 | int disk_result = STATE_UNKNOWN; |
155 | char file_system[MAX_INPUT_BUFFER]; | 155 | char file_system[MAX_INPUT_BUFFER]; |
156 | char *output; | 156 | char *output; |
157 | char *details; | 157 | char *details; |
158 | char *perf; | 158 | char *perf; |
159 | uintmax_t psize; | 159 | uintmax_t psize; |
160 | float free_space, free_space_pct, total_space, inode_space_pct; | 160 | float free_space, free_space_pct, total_space, inode_space_pct; |
161 | 161 | ||
162 | struct mount_entry *me; | 162 | struct mount_entry *me; |
163 | struct fs_usage fsp; | 163 | struct fs_usage fsp; |
164 | struct name_list *temp_list; | 164 | struct name_list *temp_list; |
165 | 165 | ||
166 | output = strdup (" - free space:"); | 166 | output = strdup (" - free space:"); |
167 | details = strdup (""); | 167 | details = strdup (""); |
168 | perf = strdup (""); | 168 | perf = strdup (""); |
169 | 169 | ||
170 | setlocale (LC_ALL, ""); | 170 | setlocale (LC_ALL, ""); |
171 | bindtextdomain (PACKAGE, LOCALEDIR); | 171 | bindtextdomain (PACKAGE, LOCALEDIR); |
172 | textdomain (PACKAGE); | 172 | textdomain (PACKAGE); |
173 | 173 | ||
174 | mount_list = read_filesystem_list (0); | 174 | mount_list = read_filesystem_list (0); |
175 | 175 | ||
176 | if (process_arguments (argc, argv) == ERROR) | 176 | if (process_arguments (argc, argv) == ERROR) |
177 | usage4 (_("Could not parse arguments")); | 177 | usage4 (_("Could not parse arguments")); |
178 | 178 | ||
179 | /* if a list of paths has been selected, preseed the list with | 179 | /* if a list of paths has been selected, preseed the list with |
180 | * the longest matching filesystem name by iterating across | 180 | * the longest matching filesystem name by iterating across |
181 | * the mountlist once ahead of time. this will allow a query on | 181 | * the mountlist once ahead of time. this will allow a query on |
182 | * "/var/log" to return information about "/var" if no "/var/log" | 182 | * "/var/log" to return information about "/var" if no "/var/log" |
183 | * filesystem exists, etc. this is the default behavior already | 183 | * filesystem exists, etc. this is the default behavior already |
184 | * with df-based checks, but for systems with their own space | 184 | * with df-based checks, but for systems with their own space |
185 | * checking routines, this should make them more consistent. | 185 | * checking routines, this should make them more consistent. |
186 | */ | 186 | */ |
187 | if(path_select_list){ | 187 | if(path_select_list){ |
188 | for (me = mount_list; me; me = me->me_next) { | 188 | for (me = mount_list; me; me = me->me_next) { |
189 | walk_name_list(path_select_list, me->me_mountdir); | 189 | walk_name_list(path_select_list, me->me_mountdir); |
190 | walk_name_list(path_select_list, me->me_devname); | 190 | walk_name_list(path_select_list, me->me_devname); |
191 | } | 191 | } |
192 | /* now pretend we never saw anything, but keep found_len. | 192 | /* now pretend we never saw anything, but keep found_len. |
193 | * thus future searches will only match the best match */ | 193 | * thus future searches will only match the best match */ |
194 | for (temp_list = path_select_list; temp_list; temp_list=temp_list->name_next){ | 194 | for (temp_list = path_select_list; temp_list; temp_list=temp_list->name_next){ |
195 | temp_list->found=0; | 195 | temp_list->found=0; |
196 | } | 196 | } |
197 | } | 197 | } |
198 | 198 | ||
199 | /* for every mount entry */ | 199 | /* for every mount entry */ |
200 | for (me = mount_list; me; me = me->me_next) { | 200 | for (me = mount_list; me; me = me->me_next) { |
201 | /* if there's a list of paths to select, the current mount | 201 | /* if there's a list of paths to select, the current mount |
202 | * entry matches in path or device name, get fs usage */ | 202 | * entry matches in path or device name, get fs usage */ |
203 | if (path_select_list && | 203 | if (path_select_list && |
204 | (walk_name_list (path_select_list, me->me_mountdir) || | 204 | (walk_name_list (path_select_list, me->me_mountdir) || |
205 | walk_name_list (path_select_list, me->me_devname) ) ) { | 205 | walk_name_list (path_select_list, me->me_devname) ) ) { |
206 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 206 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); |
207 | /* else if there's a list of paths/devices to select (but | 207 | /* else if there's a list of paths/devices to select (but |
208 | * we didn't match above) skip to the next mount entry */ | 208 | * we didn't match above) skip to the next mount entry */ |
209 | } else if (dev_select_list || path_select_list) { | 209 | } else if (dev_select_list || path_select_list) { |
210 | continue; | 210 | continue; |
211 | /* skip remote filesystems if we're not interested in them */ | 211 | /* skip remote filesystems if we're not interested in them */ |
212 | } else if (me->me_remote && show_local_fs) { | 212 | } else if (me->me_remote && show_local_fs) { |
213 | continue; | 213 | continue; |
214 | /* skip pseudo fs's if we haven't asked for all fs's */ | 214 | /* skip pseudo fs's if we haven't asked for all fs's */ |
215 | } else if (me->me_dummy && !show_all_fs) { | 215 | } else if (me->me_dummy && !show_all_fs) { |
216 | continue; | 216 | continue; |
217 | /* skip excluded fstypes */ | 217 | /* skip excluded fstypes */ |
218 | } else if (fs_exclude_list && walk_name_list (fs_exclude_list, me->me_type)) { | 218 | } else if (fs_exclude_list && walk_name_list (fs_exclude_list, me->me_type)) { |
219 | continue; | 219 | continue; |
220 | /* skip excluded fs's */ | 220 | /* skip excluded fs's */ |
221 | } else if (dp_exclude_list && | 221 | } else if (dp_exclude_list && |
222 | (walk_name_list (dp_exclude_list, me->me_devname) || | 222 | (walk_name_list (dp_exclude_list, me->me_devname) || |
223 | walk_name_list (dp_exclude_list, me->me_mountdir))) { | 223 | walk_name_list (dp_exclude_list, me->me_mountdir))) { |
224 | continue; | 224 | continue; |
225 | /* otherwise, get fs usage */ | 225 | /* otherwise, get fs usage */ |
226 | } else { | 226 | } else { |
227 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); | 227 | get_fs_usage (me->me_mountdir, me->me_devname, &fsp); |
228 | } | 228 | } |
229 | 229 | ||
230 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { | 230 | if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) { |
231 | usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; | 231 | usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks; |
232 | uisp = (double)(fsp.fsu_files - fsp.fsu_ffree) * 100 / fsp.fsu_files; | 232 | uisp = (double)(fsp.fsu_files - fsp.fsu_ffree) * 100 / fsp.fsu_files; |
233 | disk_result = check_disk (usp, fsp.fsu_bavail, uisp); | 233 | disk_result = check_disk (usp, fsp.fsu_bavail, uisp); |
234 | 234 | ||
235 | 235 | ||
236 | result = max_state (disk_result, result); | 236 | result = max_state (disk_result, result); |
237 | psize = fsp.fsu_blocks*fsp.fsu_blocksize/mult; | 237 | psize = fsp.fsu_blocks*fsp.fsu_blocksize/mult; |
238 | 238 | ||
239 | 239 | ||
240 | /* Moved this computation up here so we can add it | 240 | /* Moved this computation up here so we can add it |
@@ -242,56 +242,56 @@ main (int argc, char **argv) | |||
242 | inode_space_pct = (float)fsp.fsu_ffree*100/fsp.fsu_files; | 242 | inode_space_pct = (float)fsp.fsu_ffree*100/fsp.fsu_files; |
243 | 243 | ||
244 | 244 | ||
245 | asprintf (&perf, "%s %s", perf, | 245 | asprintf (&perf, "%s %s", perf, |
246 | perfdata ((!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir, | 246 | perfdata ((!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir, |
247 | psize-(fsp.fsu_bavail*fsp.fsu_blocksize/mult), units, | 247 | psize-(fsp.fsu_bavail*fsp.fsu_blocksize/mult), units, |
248 | TRUE, min ((uintmax_t)psize-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*psize)), | 248 | TRUE, min ((uintmax_t)psize-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*psize)), |
249 | TRUE, min ((uintmax_t)psize-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*psize)), | 249 | TRUE, min ((uintmax_t)psize-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*psize)), |
250 | TRUE, inode_space_pct, | 250 | TRUE, inode_space_pct, |
251 | 251 | ||
252 | TRUE, psize)); | 252 | TRUE, psize)); |
253 | if (disk_result==STATE_OK && erronly && !verbose) | 253 | if (disk_result==STATE_OK && erronly && !verbose) |
254 | continue; | 254 | continue; |
255 | 255 | ||
256 | free_space = (float)fsp.fsu_bavail*fsp.fsu_blocksize/mult; | 256 | free_space = (float)fsp.fsu_bavail*fsp.fsu_blocksize/mult; |
257 | free_space_pct = (float)fsp.fsu_bavail*100/fsp.fsu_blocks; | 257 | free_space_pct = (float)fsp.fsu_bavail*100/fsp.fsu_blocks; |
258 | total_space = (float)fsp.fsu_blocks*fsp.fsu_blocksize/mult; | 258 | total_space = (float)fsp.fsu_blocks*fsp.fsu_blocksize/mult; |
259 | if (disk_result!=STATE_OK || verbose>=0) | 259 | if (disk_result!=STATE_OK || verbose>=0) |
260 | asprintf (&output, ("%s %s %.0f %s (%.0f%% inode=%.0f%%);"), | 260 | asprintf (&output, ("%s %s %.0f %s (%.0f%% inode=%.0f%%);"), |
261 | output, | 261 | output, |
262 | (!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir, | 262 | (!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir, |
263 | free_space, | 263 | free_space, |
264 | units, | 264 | units, |
265 | free_space_pct, | 265 | free_space_pct, |
266 | inode_space_pct); | 266 | inode_space_pct); |
267 | 267 | ||
268 | asprintf (&details, _("%s\n\ | 268 | asprintf (&details, _("%s\n\ |
269 | %.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"), | 269 | %.0f of %.0f %s (%.0f%% inode=%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"), |
270 | details, free_space, total_space, units, free_space_pct, inode_space_pct, | 270 | details, free_space, total_space, units, free_space_pct, inode_space_pct, |
271 | me->me_devname, me->me_type, me->me_mountdir, | 271 | me->me_devname, me->me_type, me->me_mountdir, |
272 | (unsigned long)w_df, (unsigned long)c_df, w_dfp, c_dfp); | 272 | (unsigned long)w_df, (unsigned long)c_df, w_dfp, c_dfp); |
273 | 273 | ||
274 | } | 274 | } |
275 | 275 | ||
276 | } | 276 | } |
277 | 277 | ||
278 | asprintf (&output, "%s|%s", output, perf); | 278 | asprintf (&output, "%s|%s", output, perf); |
279 | 279 | ||
280 | if (verbose > 2) | 280 | if (verbose > 2) |
281 | asprintf (&output, "%s%s", output, details); | 281 | asprintf (&output, "%s%s", output, details); |
282 | 282 | ||
283 | /* Override result if paths specified and not found */ | 283 | /* Override result if paths specified and not found */ |
284 | temp_list = path_select_list; | 284 | temp_list = path_select_list; |
285 | while (temp_list) { | 285 | while (temp_list) { |
286 | if (!temp_list->found) { | 286 | if (!temp_list->found) { |
287 | asprintf (&output, _("%s [%s not found]"), output, temp_list->name); | 287 | asprintf (&output, _("%s [%s not found]"), output, temp_list->name); |
288 | result = STATE_CRITICAL; | 288 | result = STATE_CRITICAL; |
289 | } | 289 | } |
290 | temp_list = temp_list->name_next; | 290 | temp_list = temp_list->name_next; |
291 | } | 291 | } |
292 | 292 | ||
293 | printf ("DISK %s%s\n", state_text (result), output); | 293 | printf ("DISK %s%s\n", state_text (result), output); |
294 | return result; | 294 | return result; |
295 | } | 295 | } |
296 | 296 | ||
297 | 297 | ||
@@ -300,106 +300,106 @@ main (int argc, char **argv) | |||
300 | int | 300 | int |
301 | process_arguments (int argc, char **argv) | 301 | process_arguments (int argc, char **argv) |
302 | { | 302 | { |
303 | int c; | 303 | int c; |
304 | struct name_list *se; | 304 | struct name_list *se; |
305 | struct name_list **pathtail = &path_select_list; | 305 | struct name_list **pathtail = &path_select_list; |
306 | struct name_list **fstail = &fs_exclude_list; | 306 | struct name_list **fstail = &fs_exclude_list; |
307 | struct name_list **dptail = &dp_exclude_list; | 307 | struct name_list **dptail = &dp_exclude_list; |
308 | struct name_list *temp_list; | 308 | struct name_list *temp_list; |
309 | int result = OK; | 309 | int result = OK; |
310 | 310 | ||
311 | unsigned long l; | 311 | unsigned long l; |
312 | 312 | ||
313 | int option = 0; | 313 | int option = 0; |
314 | static struct option longopts[] = { | 314 | static struct option longopts[] = { |
315 | {"timeout", required_argument, 0, 't'}, | 315 | {"timeout", required_argument, 0, 't'}, |
316 | {"warning", required_argument, 0, 'w'}, | 316 | {"warning", required_argument, 0, 'w'}, |
317 | {"critical", required_argument, 0, 'c'}, | 317 | {"critical", required_argument, 0, 'c'}, |
318 | {"iwarning", required_argument, 0, 'W'}, | 318 | {"iwarning", required_argument, 0, 'W'}, |
319 | /* Dang, -C is taken. We might want to reshuffle this. */ | 319 | /* Dang, -C is taken. We might want to reshuffle this. */ |
320 | {"icritical", required_argument, 0, 'K'}, | 320 | {"icritical", required_argument, 0, 'K'}, |
321 | {"local", required_argument, 0, 'l'}, | 321 | {"local", required_argument, 0, 'l'}, |
322 | {"kilobytes", required_argument, 0, 'k'}, | 322 | {"kilobytes", required_argument, 0, 'k'}, |
323 | {"megabytes", required_argument, 0, 'm'}, | 323 | {"megabytes", required_argument, 0, 'm'}, |
324 | {"units", required_argument, 0, 'u'}, | 324 | {"units", required_argument, 0, 'u'}, |
325 | {"path", required_argument, 0, 'p'}, | 325 | {"path", required_argument, 0, 'p'}, |
326 | {"partition", required_argument, 0, 'p'}, | 326 | {"partition", required_argument, 0, 'p'}, |
327 | {"exclude_device", required_argument, 0, 'x'}, | 327 | {"exclude_device", required_argument, 0, 'x'}, |
328 | {"exclude-type", required_argument, 0, 'X'}, | 328 | {"exclude-type", required_argument, 0, 'X'}, |
329 | {"mountpoint", no_argument, 0, 'M'}, | 329 | {"mountpoint", no_argument, 0, 'M'}, |
330 | {"errors-only", no_argument, 0, 'e'}, | 330 | {"errors-only", no_argument, 0, 'e'}, |
331 | {"verbose", no_argument, 0, 'v'}, | 331 | {"verbose", no_argument, 0, 'v'}, |
332 | {"quiet", no_argument, 0, 'q'}, | 332 | {"quiet", no_argument, 0, 'q'}, |
333 | {"clear", no_argument, 0, 'C'}, | 333 | {"clear", no_argument, 0, 'C'}, |
334 | {"version", no_argument, 0, 'V'}, | 334 | {"version", no_argument, 0, 'V'}, |
335 | {"help", no_argument, 0, 'h'}, | 335 | {"help", no_argument, 0, 'h'}, |
336 | {0, 0, 0, 0} | 336 | {0, 0, 0, 0} |
337 | }; | 337 | }; |
338 | 338 | ||
339 | if (argc < 2) | 339 | if (argc < 2) |
340 | return ERROR; | 340 | return ERROR; |
341 | 341 | ||
342 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 342 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
343 | se->name = strdup ("iso9660"); | 343 | se->name = strdup ("iso9660"); |
344 | se->name_next = NULL; | 344 | se->name_next = NULL; |
345 | se->found = 0; | 345 | se->found = 0; |
346 | se->found_len = 0; | 346 | se->found_len = 0; |
347 | *fstail = se; | 347 | *fstail = se; |
348 | fstail = &se->name_next; | 348 | fstail = &se->name_next; |
349 | 349 | ||
350 | for (c = 1; c < argc; c++) | 350 | for (c = 1; c < argc; c++) |
351 | if (strcmp ("-to", argv[c]) == 0) | 351 | if (strcmp ("-to", argv[c]) == 0) |
352 | strcpy (argv[c], "-t"); | 352 | strcpy (argv[c], "-t"); |
353 | 353 | ||
354 | while (1) { | 354 | while (1) { |
355 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklM", longopts, &option); | 355 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:mklM", longopts, &option); |
356 | 356 | ||
357 | if (c == -1 || c == EOF) | 357 | if (c == -1 || c == EOF) |
358 | break; | 358 | break; |
359 | 359 | ||
360 | switch (c) { | 360 | switch (c) { |
361 | case 't': /* timeout period */ | 361 | case 't': /* timeout period */ |
362 | if (is_integer (optarg)) { | 362 | if (is_integer (optarg)) { |
363 | timeout_interval = atoi (optarg); | 363 | timeout_interval = atoi (optarg); |
364 | break; | 364 | break; |
365 | } | 365 | } |
366 | else { | 366 | else { |
367 | usage2 (_("Timeout interval must be a positive integer"), optarg); | 367 | usage2 (_("Timeout interval must be a positive integer"), optarg); |
368 | } | 368 | } |
369 | case 'w': /* warning threshold */ | 369 | case 'w': /* warning threshold */ |
370 | if (is_intnonneg (optarg)) { | 370 | if (is_intnonneg (optarg)) { |
371 | w_df = atoi (optarg); | 371 | w_df = atoi (optarg); |
372 | break; | 372 | break; |
373 | } | 373 | } |
374 | else if (strpbrk (optarg, ",:") && | 374 | else if (strpbrk (optarg, ",:") && |
375 | strstr (optarg, "%") && | 375 | strstr (optarg, "%") && |
376 | sscanf (optarg, "%lu%*[:,]%lf%%", &l, &w_dfp) == 2) { | 376 | sscanf (optarg, "%lu%*[:,]%lf%%", &l, &w_dfp) == 2) { |
377 | w_df = (uintmax_t)l; | 377 | w_df = (uintmax_t)l; |
378 | break; | 378 | break; |
379 | } | 379 | } |
380 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &w_dfp) == 1) { | 380 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &w_dfp) == 1) { |
381 | break; | 381 | break; |
382 | } | 382 | } |
383 | else { | 383 | else { |
384 | usage4 (_("Warning threshold must be integer or percentage!")); | 384 | usage4 (_("Warning threshold must be integer or percentage!")); |
385 | } | 385 | } |
386 | case 'c': /* critical threshold */ | 386 | case 'c': /* critical threshold */ |
387 | if (is_intnonneg (optarg)) { | 387 | if (is_intnonneg (optarg)) { |
388 | c_df = atoi (optarg); | 388 | c_df = atoi (optarg); |
389 | break; | 389 | break; |
390 | } | 390 | } |
391 | else if (strpbrk (optarg, ",:") && | 391 | else if (strpbrk (optarg, ",:") && |
392 | strstr (optarg, "%") && | 392 | strstr (optarg, "%") && |
393 | sscanf (optarg, "%lu%*[,:]%lf%%", &l, &c_dfp) == 2) { | 393 | sscanf (optarg, "%lu%*[,:]%lf%%", &l, &c_dfp) == 2) { |
394 | c_df = (uintmax_t)l; | 394 | c_df = (uintmax_t)l; |
395 | break; | 395 | break; |
396 | } | 396 | } |
397 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_dfp) == 1) { | 397 | else if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_dfp) == 1) { |
398 | break; | 398 | break; |
399 | } | 399 | } |
400 | else { | 400 | else { |
401 | usage4 (_("Critical threshold must be integer or percentage!")); | 401 | usage4 (_("Critical threshold must be integer or percentage!")); |
402 | } | 402 | } |
403 | 403 | ||
404 | 404 | ||
405 | case 'W': /* warning inode threshold */ | 405 | case 'W': /* warning inode threshold */ |
@@ -407,71 +407,71 @@ process_arguments (int argc, char **argv) | |||
407 | break; | 407 | break; |
408 | } | 408 | } |
409 | else { | 409 | else { |
410 | usage (_("Warning inode threshold must be percentage!\n")); | 410 | usage (_("Warning inode threshold must be percentage!\n")); |
411 | } | 411 | } |
412 | case 'K': /* kritical inode threshold */ | 412 | case 'K': /* kritical inode threshold */ |
413 | if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_idfp) == 1) { | 413 | if (strstr (optarg, "%") && sscanf (optarg, "%lf%%", &c_idfp) == 1) { |
414 | break; | 414 | break; |
415 | } | 415 | } |
416 | else { | 416 | else { |
417 | usage (_("Critical inode threshold must be percentage!\n")); | 417 | usage (_("Critical inode threshold must be percentage!\n")); |
418 | } | 418 | } |
419 | case 'u': | 419 | case 'u': |
420 | if (units) | 420 | if (units) |
421 | free(units); | 421 | free(units); |
422 | if (! strcmp (optarg, "bytes")) { | 422 | if (! strcmp (optarg, "bytes")) { |
423 | mult = (uintmax_t)1; | 423 | mult = (uintmax_t)1; |
424 | units = strdup ("B"); | 424 | units = strdup ("B"); |
425 | } else if (! strcmp (optarg, "kB")) { | 425 | } else if (! strcmp (optarg, "kB")) { |
426 | mult = (uintmax_t)1024; | 426 | mult = (uintmax_t)1024; |
427 | units = strdup ("kB"); | 427 | units = strdup ("kB"); |
428 | } else if (! strcmp (optarg, "MB")) { | 428 | } else if (! strcmp (optarg, "MB")) { |
429 | mult = (uintmax_t)1024 * 1024; | 429 | mult = (uintmax_t)1024 * 1024; |
430 | units = strdup ("MB"); | 430 | units = strdup ("MB"); |
431 | } else if (! strcmp (optarg, "GB")) { | 431 | } else if (! strcmp (optarg, "GB")) { |
432 | mult = (uintmax_t)1024 * 1024 * 1024; | 432 | mult = (uintmax_t)1024 * 1024 * 1024; |
433 | units = strdup ("GB"); | 433 | units = strdup ("GB"); |
434 | } else if (! strcmp (optarg, "TB")) { | 434 | } else if (! strcmp (optarg, "TB")) { |
435 | mult = (uintmax_t)1024 * 1024 * 1024 * 1024; | 435 | mult = (uintmax_t)1024 * 1024 * 1024 * 1024; |
436 | units = strdup ("TB"); | 436 | units = strdup ("TB"); |
437 | } else { | 437 | } else { |
438 | die (STATE_UNKNOWN, _("unit type %s not known\n"), optarg); | 438 | die (STATE_UNKNOWN, _("unit type %s not known\n"), optarg); |
439 | } | 439 | } |
440 | if (units == NULL) | 440 | if (units == NULL) |
441 | die (STATE_UNKNOWN, _("failed allocating storage for '%s'\n"), "units"); | 441 | die (STATE_UNKNOWN, _("failed allocating storage for '%s'\n"), "units"); |
442 | break; | 442 | break; |
443 | case 'k': /* display mountpoint */ | 443 | case 'k': /* display mountpoint */ |
444 | mult = 1024; | 444 | mult = 1024; |
445 | if (units) | 445 | if (units) |
446 | free(units); | 446 | free(units); |
447 | units = strdup ("kB"); | 447 | units = strdup ("kB"); |
448 | break; | 448 | break; |
449 | case 'm': /* display mountpoint */ | 449 | case 'm': /* display mountpoint */ |
450 | mult = 1024 * 1024; | 450 | mult = 1024 * 1024; |
451 | if (units) | 451 | if (units) |
452 | free(units); | 452 | free(units); |
453 | units = strdup ("MB"); | 453 | units = strdup ("MB"); |
454 | break; | 454 | break; |
455 | case 'l': | 455 | case 'l': |
456 | show_local_fs = 1; | 456 | show_local_fs = 1; |
457 | break; | 457 | break; |
458 | case 'p': /* select path */ | 458 | case 'p': /* select path */ |
459 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 459 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
460 | se->name = optarg; | 460 | se->name = optarg; |
461 | se->name_next = NULL; | 461 | se->name_next = NULL; |
462 | se->w_df = w_df; | 462 | se->w_df = w_df; |
463 | se->c_df = c_df; | 463 | se->c_df = c_df; |
464 | se->w_dfp = w_dfp; | 464 | se->w_dfp = w_dfp; |
465 | se->c_dfp = c_dfp; | 465 | se->c_dfp = c_dfp; |
466 | se->found = 0; | 466 | se->found = 0; |
467 | se->found_len = 0; | 467 | se->found_len = 0; |
468 | *pathtail = se; | 468 | *pathtail = se; |
469 | pathtail = &se->name_next; | 469 | pathtail = &se->name_next; |
470 | break; | 470 | break; |
471 | case 'x': /* exclude path or partition */ | 471 | case 'x': /* exclude path or partition */ |
472 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 472 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
473 | se->name = optarg; | 473 | se->name = optarg; |
474 | se->name_next = NULL; | 474 | se->name_next = NULL; |
475 | 475 | ||
476 | /* If you don't clear the w_fd etc values here, they | 476 | /* If you don't clear the w_fd etc values here, they |
477 | * get processed when you walk the list and assigned | 477 | * get processed when you walk the list and assigned |
@@ -481,15 +481,15 @@ process_arguments (int argc, char **argv) | |||
481 | se->c_df = 0; | 481 | se->c_df = 0; |
482 | se->w_dfp = 0; | 482 | se->w_dfp = 0; |
483 | se->c_dfp = 0; | 483 | se->c_dfp = 0; |
484 | se->found = 0; | 484 | se->found = 0; |
485 | se->found_len = 0; | 485 | se->found_len = 0; |
486 | *dptail = se; | 486 | *dptail = se; |
487 | dptail = &se->name_next; | 487 | dptail = &se->name_next; |
488 | break; | 488 | break; |
489 | case 'X': /* exclude file system type */ | 489 | case 'X': /* exclude file system type */ |
490 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 490 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
491 | se->name = optarg; | 491 | se->name = optarg; |
492 | se->name_next = NULL; | 492 | se->name_next = NULL; |
493 | /* If you don't clear the w_fd etc values here, they | 493 | /* If you don't clear the w_fd etc values here, they |
494 | * get processed when you walk the list and assigned | 494 | * get processed when you walk the list and assigned |
495 | * to the global w_df! | 495 | * to the global w_df! |
@@ -498,78 +498,78 @@ process_arguments (int argc, char **argv) | |||
498 | se->c_df = 0; | 498 | se->c_df = 0; |
499 | se->w_dfp = 0; | 499 | se->w_dfp = 0; |
500 | se->c_dfp = 0; | 500 | se->c_dfp = 0; |
501 | se->found = 0; | 501 | se->found = 0; |
502 | se->found_len = 0; | 502 | se->found_len = 0; |
503 | *fstail = se; | 503 | *fstail = se; |
504 | fstail = &se->name_next; | 504 | fstail = &se->name_next; |
505 | break; | 505 | break; |
506 | case 'v': /* verbose */ | 506 | case 'v': /* verbose */ |
507 | verbose++; | 507 | verbose++; |
508 | break; | 508 | break; |
509 | case 'q': /* verbose */ | 509 | case 'q': /* verbose */ |
510 | verbose--; | 510 | verbose--; |
511 | break; | 511 | break; |
512 | case 'e': | 512 | case 'e': |
513 | erronly = TRUE; | 513 | erronly = TRUE; |
514 | break; | 514 | break; |
515 | case 'M': /* display mountpoint */ | 515 | case 'M': /* display mountpoint */ |
516 | display_mntp = TRUE; | 516 | display_mntp = TRUE; |
517 | break; | 517 | break; |
518 | case 'C': | 518 | case 'C': |
519 | w_df = 0; | 519 | w_df = 0; |
520 | c_df = 0; | 520 | c_df = 0; |
521 | w_dfp = -1.0; | 521 | w_dfp = -1.0; |
522 | c_dfp = -1.0; | 522 | c_dfp = -1.0; |
523 | break; | 523 | break; |
524 | case 'V': /* version */ | 524 | case 'V': /* version */ |
525 | print_revision (progname, revision); | 525 | print_revision (progname, revision); |
526 | exit (STATE_OK); | 526 | exit (STATE_OK); |
527 | case 'h': /* help */ | 527 | case 'h': /* help */ |
528 | print_help (); | 528 | print_help (); |
529 | exit (STATE_OK); | 529 | exit (STATE_OK); |
530 | case '?': /* help */ | 530 | case '?': /* help */ |
531 | usage2 (_("Unknown argument"), optarg); | 531 | usage (_("Unknown argument")); |
532 | } | 532 | } |
533 | } | 533 | } |
534 | 534 | ||
535 | /* Support for "check_disk warn crit [fs]" with thresholds at used level */ | 535 | /* Support for "check_disk warn crit [fs]" with thresholds at used level */ |
536 | c = optind; | 536 | c = optind; |
537 | if (w_dfp < 0 && argc > c && is_intnonneg (argv[c])) | 537 | if (w_dfp < 0 && argc > c && is_intnonneg (argv[c])) |
538 | w_dfp = (100.0 - atof (argv[c++])); | 538 | w_dfp = (100.0 - atof (argv[c++])); |
539 | 539 | ||
540 | if (c_dfp < 0 && argc > c && is_intnonneg (argv[c])) | 540 | if (c_dfp < 0 && argc > c && is_intnonneg (argv[c])) |
541 | c_dfp = (100.0 - atof (argv[c++])); | 541 | c_dfp = (100.0 - atof (argv[c++])); |
542 | 542 | ||
543 | if (argc > c && path == NULL) { | 543 | if (argc > c && path == NULL) { |
544 | se = (struct name_list *) malloc (sizeof (struct name_list)); | 544 | se = (struct name_list *) malloc (sizeof (struct name_list)); |
545 | se->name = strdup (argv[c++]); | 545 | se->name = strdup (argv[c++]); |
546 | se->name_next = NULL; | 546 | se->name_next = NULL; |
547 | se->w_df = w_df; | 547 | se->w_df = w_df; |
548 | se->c_df = c_df; | 548 | se->c_df = c_df; |
549 | se->w_dfp = w_dfp; | 549 | se->w_dfp = w_dfp; |
550 | se->c_dfp = c_dfp; | 550 | se->c_dfp = c_dfp; |
551 | se->found =0; | 551 | se->found =0; |
552 | se->found_len = 0; | 552 | se->found_len = 0; |
553 | *pathtail = se; | 553 | *pathtail = se; |
554 | } | 554 | } |
555 | 555 | ||
556 | if (path_select_list) { | 556 | if (path_select_list) { |
557 | temp_list = path_select_list; | 557 | temp_list = path_select_list; |
558 | while (temp_list) { | 558 | while (temp_list) { |
559 | if (validate_arguments (temp_list->w_df, | 559 | if (validate_arguments (temp_list->w_df, |
560 | temp_list->c_df, | 560 | temp_list->c_df, |
561 | temp_list->w_dfp, | 561 | temp_list->w_dfp, |
562 | temp_list->c_dfp, | 562 | temp_list->c_dfp, |
563 | temp_list->w_idfp, | 563 | temp_list->w_idfp, |
564 | temp_list->c_idfp, | 564 | temp_list->c_idfp, |
565 | temp_list->name) == ERROR) | 565 | temp_list->name) == ERROR) |
566 | result = ERROR; | 566 | result = ERROR; |
567 | temp_list = temp_list->name_next; | 567 | temp_list = temp_list->name_next; |
568 | } | 568 | } |
569 | return result; | 569 | return result; |
570 | } else { | 570 | } else { |
571 | return validate_arguments (w_df, c_df, w_dfp, c_dfp, w_idfp, c_idfp, NULL); | 571 | return validate_arguments (w_df, c_df, w_dfp, c_dfp, w_idfp, c_idfp, NULL); |
572 | } | 572 | } |
573 | } | 573 | } |
574 | 574 | ||
575 | 575 | ||
@@ -577,12 +577,12 @@ process_arguments (int argc, char **argv) | |||
577 | void | 577 | void |
578 | print_path (const char *mypath) | 578 | print_path (const char *mypath) |
579 | { | 579 | { |
580 | if (mypath == NULL) | 580 | if (mypath == NULL) |
581 | printf ("\n"); | 581 | printf ("\n"); |
582 | else | 582 | else |
583 | printf (_(" for %s\n"), mypath); | 583 | printf (_(" for %s\n"), mypath); |
584 | 584 | ||
585 | return; | 585 | return; |
586 | } | 586 | } |
587 | 587 | ||
588 | 588 | ||
@@ -590,40 +590,40 @@ print_path (const char *mypath) | |||
590 | int | 590 | int |
591 | validate_arguments (uintmax_t w, uintmax_t c, double wp, double cp, double iwp, double icp, char *mypath) | 591 | validate_arguments (uintmax_t w, uintmax_t c, double wp, double cp, double iwp, double icp, char *mypath) |
592 | { | 592 | { |
593 | if (w < 0 && c < 0 && wp < 0.0 && cp < 0.0) { | 593 | if (w < 0 && c < 0 && wp < 0.0 && cp < 0.0) { |
594 | printf (_("INPUT ERROR: No thresholds specified")); | 594 | printf (_("INPUT ERROR: No thresholds specified")); |
595 | print_path (mypath); | 595 | print_path (mypath); |
596 | return ERROR; | 596 | return ERROR; |
597 | } | 597 | } |
598 | else if ((wp >= 0.0 || cp >= 0.0) && | 598 | else if ((wp >= 0.0 || cp >= 0.0) && |
599 | (wp < 0.0 || cp < 0.0 || wp > 100.0 || cp > 100.0 || cp > wp)) { | 599 | (wp < 0.0 || cp < 0.0 || wp > 100.0 || cp > 100.0 || cp > wp)) { |
600 | printf (_("\ | 600 | printf (_("\ |
601 | INPUT ERROR: C_DFP (%f) should be less than W_DFP (%.1f) and both should be between zero and 100 percent, inclusive"), | 601 | INPUT ERROR: C_DFP (%f) should be less than W_DFP (%.1f) and both should be between zero and 100 percent, inclusive"), |
602 | cp, wp); | 602 | cp, wp); |
603 | print_path (mypath); | 603 | print_path (mypath); |
604 | return ERROR; | 604 | return ERROR; |
605 | } | 605 | } |
606 | else if ((iwp >= 0.0 || icp >= 0.0) && | 606 | else if ((iwp >= 0.0 || icp >= 0.0) && |
607 | (iwp < 0.0 || icp < 0.0 || iwp > 100.0 || icp > 100.0 || icp > iwp)) { | 607 | (iwp < 0.0 || icp < 0.0 || iwp > 100.0 || icp > 100.0 || icp > iwp)) { |
608 | printf (_("\ | 608 | printf (_("\ |
609 | INPUT ERROR: C_IDFP (%f) should be less than W_IDFP (%.1f) and both should be between zero and 100 percent, inclusive"), | 609 | INPUT ERROR: C_IDFP (%f) should be less than W_IDFP (%.1f) and both should be between zero and 100 percent, inclusive"), |
610 | icp, iwp); | 610 | icp, iwp); |
611 | print_path (mypath); | 611 | print_path (mypath); |
612 | return ERROR; | 612 | return ERROR; |
613 | } | 613 | } |
614 | else if ((w > 0 || c > 0) && (w == 0 || c == 0 || c > w)) { | 614 | else if ((w > 0 || c > 0) && (w == 0 || c == 0 || c > w)) { |
615 | printf (_("\ | 615 | printf (_("\ |
616 | INPUT ERROR: C_DF (%lu) should be less than W_DF (%lu) and both should be greater than zero"), | 616 | INPUT ERROR: C_DF (%lu) should be less than W_DF (%lu) and both should be greater than zero"), |
617 | (unsigned long)c, (unsigned long)w); | 617 | (unsigned long)c, (unsigned long)w); |
618 | print_path (mypath); | 618 | print_path (mypath); |
619 | return ERROR; | 619 | return ERROR; |
620 | } | 620 | } |
621 | 621 | ||
622 | if (units == NULL) { | 622 | if (units == NULL) { |
623 | units = strdup ("MB"); | 623 | units = strdup ("MB"); |
624 | mult = (uintmax_t)1024 * 1024; | 624 | mult = (uintmax_t)1024 * 1024; |
625 | } | 625 | } |
626 | return OK; | 626 | return OK; |
627 | } | 627 | } |
628 | 628 | ||
629 | 629 | ||
@@ -647,8 +647,8 @@ check_disk (double usp, uintmax_t free_disk, double uisp) | |||
647 | else if (w_df > 0 && free_disk <= w_df) | 647 | else if (w_df > 0 && free_disk <= w_df) |
648 | result = STATE_WARNING; | 648 | result = STATE_WARNING; |
649 | else if (usp >= 0.0) | 649 | else if (usp >= 0.0) |
650 | result = STATE_OK; | 650 | result = STATE_OK; |
651 | return result; | 651 | return result; |
652 | } | 652 | } |
653 | 653 | ||
654 | 654 | ||
@@ -656,26 +656,26 @@ check_disk (double usp, uintmax_t free_disk, double uisp) | |||
656 | int | 656 | int |
657 | walk_name_list (struct name_list *list, const char *name) | 657 | walk_name_list (struct name_list *list, const char *name) |
658 | { | 658 | { |
659 | int name_len; | 659 | int name_len; |
660 | name_len = strlen(name); | 660 | name_len = strlen(name); |
661 | while (list) { | 661 | while (list) { |
662 | /* if the paths match up to the length of the mount path, | 662 | /* if the paths match up to the length of the mount path, |
663 | * AND if the mount path name is longer than the longest | 663 | * AND if the mount path name is longer than the longest |
664 | * found match, we have a new winner */ | 664 | * found match, we have a new winner */ |
665 | if (name_len >= list->found_len && | 665 | if (name_len >= list->found_len && |
666 | ! strncmp(list->name, name, name_len)) { | 666 | ! strncmp(list->name, name, name_len)) { |
667 | list->found = 1; | 667 | list->found = 1; |
668 | list->found_len = name_len; | 668 | list->found_len = name_len; |
669 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ | 669 | /* if required for name_lists that have not saved w_df, etc (eg exclude lists) */ |
670 | if (list->w_df) w_df = list->w_df; | 670 | if (list->w_df) w_df = list->w_df; |
671 | if (list->c_df) c_df = list->c_df; | 671 | if (list->c_df) c_df = list->c_df; |
672 | if (list->w_dfp>=0.0) w_dfp = list->w_dfp; | 672 | if (list->w_dfp>=0.0) w_dfp = list->w_dfp; |
673 | if (list->c_dfp>=0.0) c_dfp = list->c_dfp; | 673 | if (list->c_dfp>=0.0) c_dfp = list->c_dfp; |
674 | return TRUE; | 674 | return TRUE; |
675 | } | 675 | } |
676 | list = list->name_next; | 676 | list = list->name_next; |
677 | } | 677 | } |
678 | return FALSE; | 678 | return FALSE; |
679 | } | 679 | } |
680 | 680 | ||
681 | 681 | ||
@@ -683,68 +683,163 @@ walk_name_list (struct name_list *list, const char *name) | |||
683 | void | 683 | void |
684 | print_help (void) | 684 | print_help (void) |
685 | { | 685 | { |
686 | print_revision (progname, revision); | 686 | print_revision (progname, revision); |
687 | 687 | ||
688 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); | 688 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); |
689 | printf (COPYRIGHT, copyright, email); | 689 | printf (COPYRIGHT, copyright, email); |
690 | 690 | ||
691 | printf (_("\ | 691 | printf (_("This plugin checks the amount of used disk space on a mounted file system")); |
692 | This plugin checks the amount of used disk space on a mounted file system\n\ | 692 | printf (_("and generates an alert if free space is less than one of the threshold values")); |
693 | and generates an alert if free space is less than one of the threshold values.\n\n")); | 693 | |
694 | 694 | printf ("\n\n"); | |
695 | print_usage (); | 695 | |
696 | 696 | print_usage (); | |
697 | printf (_(UT_HELP_VRSN)); | 697 | |
698 | 698 | printf (_(UT_HELP_VRSN)); | |
699 | printf (_("\ | 699 | |
700 | -w, --warning=INTEGER\n\ | 700 | printf (" -w, --warning=INTEGER"); |
701 | Exit with WARNING status if less than INTEGER --units of disk are free\n\ | 701 | |
702 | -w, --warning=PERCENT%%\n\ | 702 | printf ("\n"); |
703 | Exit with WARNING status if less than PERCENT of disk space is free\n\ | 703 | |
704 | -W, --iwarning=PERCENT%%\n\ | 704 | printf (_("exit with WARNING status if less than INTEGER units of disk are free")); |
705 | Exit with WARNING status if less than PERCENT of inode space is free\n\ | 705 | |
706 | -K, --icritical=PERCENT%%\n\ | 706 | printf (" -w, --warning=PERCENT%%"); |
707 | Exit with CRITICAL status if less than PERCENT of inode space is free\n\ | 707 | |
708 | -c, --critical=INTEGER\n\ | 708 | printf ("\n"); |
709 | Exit with CRITICAL status if less than INTEGER --units of disk are free\n\ | 709 | |
710 | -c, --critical=PERCENT%%\n\ | 710 | printf (_("exit with WARNING status if less than PERCENT of disk space is free")); |
711 | Exit with CRITCAL status if less than PERCENT of disk space is free\n\ | 711 | |
712 | -C, --clear\n\ | 712 | printf ("\n"); |
713 | Clear thresholds\n")); | 713 | |
714 | 714 | printf (" -W, --iwarning=PERCENT%%"); | |
715 | printf (_("\ | 715 | |
716 | -u, --units=STRING\n\ | 716 | printf ("\n"); |
717 | Choose bytes, kB, MB, GB, TB (default: MB)\n\ | 717 | |
718 | -k, --kilobytes\n\ | 718 | printf (_("exit with WARNING status if less than PERCENT of inode space is free")); |
719 | Same as '--units kB'\n\ | 719 | |
720 | -m, --megabytes\n\ | 720 | printf ("\n"); |
721 | Same as '--units MB'\n")); | 721 | |
722 | 722 | printf (" -K, --icritical=PERCENT%%"); | |
723 | printf (_("\ | 723 | |
724 | -l, --local\n\ | 724 | printf ("\n"); |
725 | Only check local filesystems\n\ | 725 | |
726 | -p, --path=PATH, --partition=PARTITION\n\ | 726 | printf (_("exit with CRITICAL status if less than PERCENT of inode space is free")); |
727 | Path or partition (may be repeated)\n\ | 727 | |
728 | -x, --exclude_device=PATH <STRING>\n\ | 728 | printf ("\n"); |
729 | Ignore device (only works if -p unspecified)\n\ | 729 | |
730 | -X, --exclude-type=TYPE <STRING>\n\ | 730 | printf (" -c, --critical=INTEGER"); |
731 | Ignore all filesystems of indicated type (may be repeated)\n\ | 731 | |
732 | -M, --mountpoint\n\ | 732 | printf ("\n"); |
733 | Display the mountpoint instead of the partition\n\ | 733 | |
734 | -e, --errors-only\n\ | 734 | printf (_("exit with CRITICAL status if less than INTEGER --units of disk are free")); |
735 | Display only devices/mountpoints with errors\n")); | 735 | |
736 | 736 | printf ("\n"); | |
737 | printf (_(UT_WARN_CRIT)); | 737 | |
738 | 738 | printf (" -c, --critical=PERCENT%%"); | |
739 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | 739 | |
740 | 740 | printf ("\n"); | |
741 | printf (_(UT_VERBOSE)); | 741 | |
742 | 742 | printf (_("exit with CRITCAL status if less than PERCENT of disk space is free")); | |
743 | printf ("%s", _("Examples:\n\ | 743 | |
744 | check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /\n\ | 744 | printf ("\n"); |
745 | Checks /tmp and /var at 10%,5% and / at 100MB, 50MB\n")); | 745 | |
746 | 746 | printf (" -C, --clear"); | |
747 | printf (_(UT_SUPPORT)); | 747 | |
748 | printf ("\n"); | ||
749 | |||
750 | printf (_("clear thresholds")); | ||
751 | |||
752 | printf ("\n"); | ||
753 | |||
754 | printf (" -u, --units=STRING"); | ||
755 | |||
756 | printf ("\n"); | ||
757 | |||
758 | printf (_("choose bytes, kB, MB, GB, TB (default: MB)")); | ||
759 | |||
760 | printf ("\n"); | ||
761 | |||
762 | printf (" -k, --kilobytes"); | ||
763 | |||
764 | printf ("\n"); | ||
765 | |||
766 | printf (_("same as '--units kB'")); | ||
767 | |||
768 | printf ("\n"); | ||
769 | |||
770 | printf (" -m, --megabytes"); | ||
771 | |||
772 | printf ("\n"); | ||
773 | |||
774 | printf (_("same as '--units MB'\n")); | ||
775 | |||
776 | printf (" -l, --local"); | ||
777 | |||
778 | printf ("\n"); | ||
779 | |||
780 | printf (_("only check local filesystems")); | ||
781 | |||
782 | printf ("\n"); | ||
783 | |||
784 | printf (" -p, --path=PATH, --partition=PARTITION"); | ||
785 | |||
786 | printf ("\n"); | ||
787 | |||
788 | printf (_("path or partition (may be repeated)")); | ||
789 | |||
790 | printf ("\n"); | ||
791 | |||
792 | printf (" -x, --exclude_device=PATH <STRING>"); | ||
793 | |||
794 | printf ("\n"); | ||
795 | |||
796 | printf (_("ignore device (only works if -p unspecified)")); | ||
797 | |||
798 | printf ("\n"); | ||
799 | |||
800 | printf (" -X, --exclude-type=TYPE <STRING>"); | ||
801 | |||
802 | printf ("\n"); | ||
803 | |||
804 | printf (_("ignore all filesystems of indicated type (may be repeated)")); | ||
805 | |||
806 | printf ("\n"); | ||
807 | |||
808 | printf ("-m, --mountpoint"); | ||
809 | |||
810 | printf ("\n"); | ||
811 | |||
812 | printf (_("display the mountpoint instead of the partition")); | ||
813 | |||
814 | printf ("\n"); | ||
815 | |||
816 | printf ("-e, --errors-only"); | ||
817 | |||
818 | printf ("\n"); | ||
819 | |||
820 | printf (_("display only devices/mountpoints with errors")); | ||
821 | |||
822 | printf ("\n"); | ||
823 | |||
824 | printf (_(UT_WARN_CRIT)); | ||
825 | |||
826 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
827 | |||
828 | printf (_(UT_VERBOSE)); | ||
829 | |||
830 | printf (_("examples:")); | ||
831 | |||
832 | printf ("\n"); | ||
833 | |||
834 | printf ("check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /"); | ||
835 | |||
836 | printf ("\n"); | ||
837 | |||
838 | printf (_("checks /tmp and /var at 10% and 5% and / at 100MB, 50MB")); | ||
839 | |||
840 | printf ("\n"); | ||
841 | |||
842 | printf (_(UT_SUPPORT)); | ||
748 | } | 843 | } |
749 | 844 | ||
750 | 845 | ||
@@ -752,7 +847,7 @@ and generates an alert if free space is less than one of the threshold values.\n | |||
752 | void | 847 | void |
753 | print_usage (void) | 848 | print_usage (void) |
754 | { | 849 | { |
755 | printf ("\ | 850 | printf (_("Usage:")); |
756 | Usage: %s -w limit -c limit [-p path | -x device] [-t timeout] [-m] [-e] [-W limit] [-K limit]\n\ | 851 | printf (" %s -w limit -c limit [-p path | -x device] [-t timeout]", progname); |
757 | [-v] [-q]\n", progname); | 852 | printf ("[-m] [-e] [-W limit] [-K limit] [-v] [-q]\n"); |
758 | } | 853 | } |
diff --git a/plugins/check_dns.c b/plugins/check_dns.c index d6e8ca29..faa1e150 100644 --- a/plugins/check_dns.c +++ b/plugins/check_dns.c | |||
@@ -23,7 +23,7 @@ | |||
23 | 23 | ||
24 | const char *progname = "check_dns"; | 24 | const char *progname = "check_dns"; |
25 | const char *revision = "$Revision$"; | 25 | const char *revision = "$Revision$"; |
26 | const char *copyright = "2000-2004"; | 26 | const char *copyright = "2000-2005"; |
27 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 27 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
28 | 28 | ||
29 | #include "common.h" | 29 | #include "common.h" |
@@ -49,156 +49,156 @@ int expect_authority = FALSE; | |||
49 | int | 49 | int |
50 | main (int argc, char **argv) | 50 | main (int argc, char **argv) |
51 | { | 51 | { |
52 | char *command_line = NULL; | 52 | char *command_line = NULL; |
53 | char input_buffer[MAX_INPUT_BUFFER]; | 53 | char input_buffer[MAX_INPUT_BUFFER]; |
54 | char *address = NULL; | 54 | char *address = NULL; |
55 | char *msg = NULL; | 55 | char *msg = NULL; |
56 | char *temp_buffer = NULL; | 56 | char *temp_buffer = NULL; |
57 | int non_authoritative = FALSE; | 57 | int non_authoritative = FALSE; |
58 | int result = STATE_UNKNOWN; | 58 | int result = STATE_UNKNOWN; |
59 | double elapsed_time; | 59 | double elapsed_time; |
60 | long microsec; | 60 | long microsec; |
61 | struct timeval tv; | 61 | struct timeval tv; |
62 | int multi_address; | 62 | int multi_address; |
63 | int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ | 63 | int parse_address = FALSE; /* This flag scans for Address: but only after Name: */ |
64 | output chld_out, chld_err; | 64 | output chld_out, chld_err; |
65 | size_t i; | 65 | size_t i; |
66 | 66 | ||
67 | setlocale (LC_ALL, ""); | 67 | setlocale (LC_ALL, ""); |
68 | bindtextdomain (PACKAGE, LOCALEDIR); | 68 | bindtextdomain (PACKAGE, LOCALEDIR); |
69 | textdomain (PACKAGE); | 69 | textdomain (PACKAGE); |
70 | 70 | ||
71 | /* Set signal handling and alarm */ | 71 | /* Set signal handling and alarm */ |
72 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { | 72 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { |
73 | usage_va(_("Cannot catch SIGALRM")); | 73 | usage_va(_("Cannot catch SIGALRM")); |
74 | } | 74 | } |
75 | 75 | ||
76 | if (process_arguments (argc, argv) == ERROR) { | 76 | if (process_arguments (argc, argv) == ERROR) { |
77 | usage_va(_("Could not parse arguments")); | 77 | usage_va(_("Could not parse arguments")); |
78 | } | 78 | } |
79 | 79 | ||
80 | /* get the command to run */ | 80 | /* get the command to run */ |
81 | asprintf (&command_line, "%s %s %s", NSLOOKUP_COMMAND, query_address, dns_server); | 81 | asprintf (&command_line, "%s %s %s", NSLOOKUP_COMMAND, query_address, dns_server); |
82 | 82 | ||
83 | alarm (timeout_interval); | 83 | alarm (timeout_interval); |
84 | gettimeofday (&tv, NULL); | 84 | gettimeofday (&tv, NULL); |
85 | 85 | ||
86 | if (verbose) | 86 | if (verbose) |
87 | printf ("%s\n", command_line); | 87 | printf ("%s\n", command_line); |
88 | 88 | ||
89 | /* run the command */ | 89 | /* run the command */ |
90 | if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { | 90 | if((np_runcmd(command_line, &chld_out, &chld_err, 0)) != 0) { |
91 | msg = (char *)_("nslookup returned error status"); | 91 | msg = (char *)_("nslookup returned an error status"); |
92 | result = STATE_WARNING; | 92 | result = STATE_WARNING; |
93 | } | 93 | } |
94 | 94 | ||
95 | /* scan stdout */ | 95 | /* scan stdout */ |
96 | for(i = 0; i < chld_out.lines; i++) { | 96 | for(i = 0; i < chld_out.lines; i++) { |
97 | if (verbose) | 97 | if (verbose) |
98 | puts(chld_out.line[i]); | 98 | puts(chld_out.line[i]); |
99 | 99 | ||
100 | if (strstr (chld_out.line[i], ".in-addr.arpa")) { | 100 | if (strstr (chld_out.line[i], ".in-addr.arpa")) { |
101 | if ((temp_buffer = strstr (chld_out.line[i], "name = "))) | 101 | if ((temp_buffer = strstr (chld_out.line[i], "name = "))) |
102 | address = strdup (temp_buffer + 7); | 102 | address = strdup (temp_buffer + 7); |
103 | else { | 103 | else { |
104 | msg = (char *)_("Warning plugin error"); | 104 | msg = (char *)_("Warning plugin error"); |
105 | result = STATE_WARNING; | 105 | result = STATE_WARNING; |
106 | } | 106 | } |
107 | } | 107 | } |
108 | 108 | ||
109 | /* the server is responding, we just got the host name... */ | 109 | /* the server is responding, we just got the host name... */ |
110 | if (strstr (chld_out.line[i], "Name:")) | 110 | if (strstr (chld_out.line[i], "Name:")) |
111 | parse_address = TRUE; | 111 | parse_address = TRUE; |
112 | else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || | 112 | else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || |
113 | strstr (chld_out.line[i], "Addresses:"))) { | 113 | strstr (chld_out.line[i], "Addresses:"))) { |
114 | temp_buffer = index (chld_out.line[i], ':'); | 114 | temp_buffer = index (chld_out.line[i], ':'); |
115 | temp_buffer++; | 115 | temp_buffer++; |
116 | 116 | ||
117 | /* Strip leading spaces */ | 117 | /* Strip leading spaces */ |
118 | for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) | 118 | for (; *temp_buffer != '\0' && *temp_buffer == ' '; temp_buffer++) |
119 | /* NOOP */; | 119 | /* NOOP */; |
120 | 120 | ||
121 | strip(temp_buffer); | 121 | strip(temp_buffer); |
122 | if (temp_buffer==NULL || strlen(temp_buffer)==0) { | 122 | if (temp_buffer==NULL || strlen(temp_buffer)==0) { |
123 | die (STATE_CRITICAL, | 123 | die (STATE_CRITICAL, |
124 | _("DNS CRITICAL - '%s' returned empty host name string\n"), | 124 | _("DNS CRITICAL - '%s' returned empty host name string\n"), |
125 | NSLOOKUP_COMMAND); | 125 | NSLOOKUP_COMMAND); |
126 | } | 126 | } |
127 | 127 | ||
128 | if (address == NULL) | 128 | if (address == NULL) |
129 | address = strdup (temp_buffer); | 129 | address = strdup (temp_buffer); |
130 | else | 130 | else |
131 | asprintf(&address, "%s,%s", address, temp_buffer); | 131 | asprintf(&address, "%s,%s", address, temp_buffer); |
132 | } | 132 | } |
133 | 133 | ||
134 | else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { | 134 | else if (strstr (chld_out.line[i], _("Non-authoritative answer:"))) { |
135 | non_authoritative = TRUE; | 135 | non_authoritative = TRUE; |
136 | } | 136 | } |
137 | 137 | ||
138 | result = error_scan (chld_out.line[i]); | 138 | result = error_scan (chld_out.line[i]); |
139 | if (result != STATE_OK) { | 139 | if (result != STATE_OK) { |
140 | msg = strchr (chld_out.line[i], ':'); | 140 | msg = strchr (chld_out.line[i], ':'); |
141 | if(msg) msg++; | 141 | if(msg) msg++; |
142 | break; | 142 | break; |
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | /* scan stderr */ | 146 | /* scan stderr */ |
147 | for(i = 0; i < chld_err.lines; i++) { | 147 | for(i = 0; i < chld_err.lines; i++) { |
148 | if (verbose) | 148 | if (verbose) |
149 | puts(chld_err.line[i]); | 149 | puts(chld_err.line[i]); |
150 | 150 | ||
151 | if (error_scan (chld_err.line[i]) != STATE_OK) { | 151 | if (error_scan (chld_err.line[i]) != STATE_OK) { |
152 | result = max_state (result, error_scan (chld_err.line[i])); | 152 | result = max_state (result, error_scan (chld_err.line[i])); |
153 | msg = strchr(input_buffer, ':'); | 153 | msg = strchr(input_buffer, ':'); |
154 | if(msg) msg++; | 154 | if(msg) msg++; |
155 | } | 155 | } |
156 | } | 156 | } |
157 | 157 | ||
158 | /* If we got here, we should have an address string, | 158 | /* If we got here, we should have an address string, |
159 | * and we can segfault if we do not */ | 159 | * and we can segfault if we do not */ |
160 | if (address==NULL || strlen(address)==0) | 160 | if (address==NULL || strlen(address)==0) |
161 | die (STATE_CRITICAL, | 161 | die (STATE_CRITICAL, |
162 | _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), | 162 | _("DNS CRITICAL - '%s' msg parsing exited with no address\n"), |
163 | NSLOOKUP_COMMAND); | 163 | NSLOOKUP_COMMAND); |
164 | 164 | ||
165 | /* compare to expected address */ | 165 | /* compare to expected address */ |
166 | if (result == STATE_OK && match_expected_address && strcmp(address, expected_address)) { | 166 | if (result == STATE_OK && match_expected_address && strcmp(address, expected_address)) { |
167 | result = STATE_CRITICAL; | 167 | result = STATE_CRITICAL; |
168 | asprintf(&msg, _("expected %s but got %s"), expected_address, address); | 168 | asprintf(&msg, _("expected %s but got %s"), expected_address, address); |
169 | } | 169 | } |
170 | 170 | ||
171 | /* check if authoritative */ | 171 | /* check if authoritative */ |
172 | if (result == STATE_OK && expect_authority && non_authoritative) { | 172 | if (result == STATE_OK && expect_authority && non_authoritative) { |
173 | result = STATE_CRITICAL; | 173 | result = STATE_CRITICAL; |
174 | asprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); | 174 | asprintf(&msg, _("server %s is not authoritative for %s"), dns_server, query_address); |
175 | } | 175 | } |
176 | 176 | ||
177 | microsec = deltime (tv); | 177 | microsec = deltime (tv); |
178 | elapsed_time = (double)microsec / 1.0e6; | 178 | elapsed_time = (double)microsec / 1.0e6; |
179 | 179 | ||
180 | if (result == STATE_OK) { | 180 | if (result == STATE_OK) { |
181 | if (strchr (address, ',') == NULL) | 181 | if (strchr (address, ',') == NULL) |
182 | multi_address = FALSE; | 182 | multi_address = FALSE; |
183 | else | 183 | else |
184 | multi_address = TRUE; | 184 | multi_address = TRUE; |
185 | 185 | ||
186 | printf ("DNS %s: ", _("OK")); | 186 | printf ("DNS %s: ", _("OK")); |
187 | printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); | 187 | printf (ngettext("%.3f second response time", "%.3f seconds response time", elapsed_time), elapsed_time); |
188 | printf (_(". %s returns %s"), query_address, address); | 188 | printf (_(". %s returns %s"), query_address, address); |
189 | printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); | 189 | printf ("|%s\n", fperfdata ("time", elapsed_time, "s", FALSE, 0, FALSE, 0, TRUE, 0, FALSE, 0)); |
190 | } | 190 | } |
191 | else if (result == STATE_WARNING) | 191 | else if (result == STATE_WARNING) |
192 | printf (_("DNS WARNING - %s\n"), | 192 | printf (_("DNS WARNING - %s\n"), |
193 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); | 193 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); |
194 | else if (result == STATE_CRITICAL) | 194 | else if (result == STATE_CRITICAL) |
195 | printf (_("DNS CRITICAL - %s\n"), | 195 | printf (_("DNS CRITICAL - %s\n"), |
196 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); | 196 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); |
197 | else | 197 | else |
198 | printf (_("DNS UNKNOW - %s\n"), | 198 | printf (_("DNS UNKNOW - %s\n"), |
199 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); | 199 | !strcmp (msg, "") ? _(" Probably a non-existent host/domain") : msg); |
200 | 200 | ||
201 | return result; | 201 | return result; |
202 | } | 202 | } |
203 | 203 | ||
204 | 204 | ||
@@ -207,56 +207,56 @@ int | |||
207 | error_scan (char *input_buffer) | 207 | error_scan (char *input_buffer) |
208 | { | 208 | { |
209 | 209 | ||
210 | /* the DNS lookup timed out */ | 210 | /* the DNS lookup timed out */ |
211 | if (strstr (input_buffer, _("Note: nslookup is deprecated and may be removed from future releases.")) || | 211 | if (strstr (input_buffer, _("Note: nslookup is deprecated and may be removed from future releases.")) || |
212 | strstr (input_buffer, _("Consider using the `dig' or `host' programs instead. Run nslookup with")) || | 212 | strstr (input_buffer, _("Consider using the `dig' or `host' programs instead. Run nslookup with")) || |
213 | strstr (input_buffer, _("the `-sil[ent]' option to prevent this message from appearing."))) | 213 | strstr (input_buffer, _("the `-sil[ent]' option to prevent this message from appearing."))) |
214 | return STATE_OK; | 214 | return STATE_OK; |
215 | 215 | ||
216 | /* DNS server is not running... */ | 216 | /* DNS server is not running... */ |
217 | else if (strstr (input_buffer, "No response from server")) | 217 | else if (strstr (input_buffer, "No response from server")) |
218 | die (STATE_CRITICAL, _("No response from DNS %s\n"), dns_server); | 218 | die (STATE_CRITICAL, _("No response from DNS %s\n"), dns_server); |
219 | 219 | ||
220 | /* Host name is valid, but server doesn't have records... */ | 220 | /* Host name is valid, but server doesn't have records... */ |
221 | else if (strstr (input_buffer, "No records")) | 221 | else if (strstr (input_buffer, "No records")) |
222 | die (STATE_CRITICAL, _("DNS %s has no records\n"), dns_server); | 222 | die (STATE_CRITICAL, _("DNS %s has no records\n"), dns_server); |
223 | 223 | ||
224 | /* Connection was refused */ | 224 | /* Connection was refused */ |
225 | else if (strstr (input_buffer, "Connection refused") || | 225 | else if (strstr (input_buffer, "Connection refused") || |
226 | strstr (input_buffer, "Couldn't find server") || | 226 | strstr (input_buffer, "Couldn't find server") || |
227 | strstr (input_buffer, "Refused") || | 227 | strstr (input_buffer, "Refused") || |
228 | (strstr (input_buffer, "** server can't find") && | 228 | (strstr (input_buffer, "** server can't find") && |
229 | strstr (input_buffer, ": REFUSED"))) | 229 | strstr (input_buffer, ": REFUSED"))) |
230 | die (STATE_CRITICAL, _("Connection to DNS %s was refused\n"), dns_server); | 230 | die (STATE_CRITICAL, _("Connection to DNS %s was refused\n"), dns_server); |
231 | 231 | ||
232 | /* Query refused (usually by an ACL in the namserver) */ | 232 | /* Query refused (usually by an ACL in the namserver) */ |
233 | else if (strstr (input_buffer, "Query refused")) | 233 | else if (strstr (input_buffer, "Query refused")) |
234 | die (STATE_CRITICAL, _("Query was refused by DNS server at %s\n"), dns_server); | 234 | die (STATE_CRITICAL, _("Query was refused by DNS server at %s\n"), dns_server); |
235 | 235 | ||
236 | /* No information (e.g. nameserver IP has two PTR records) */ | 236 | /* No information (e.g. nameserver IP has two PTR records) */ |
237 | else if (strstr (input_buffer, "No information")) | 237 | else if (strstr (input_buffer, "No information")) |
238 | die (STATE_CRITICAL, _("No information returned by DNS server at %s\n"), dns_server); | 238 | die (STATE_CRITICAL, _("No information returned by DNS server at %s\n"), dns_server); |
239 | 239 | ||
240 | /* Host or domain name does not exist */ | 240 | /* Host or domain name does not exist */ |
241 | else if (strstr (input_buffer, "Non-existent") || | 241 | else if (strstr (input_buffer, "Non-existent") || |
242 | strstr (input_buffer, "** server can't find") || | 242 | strstr (input_buffer, "** server can't find") || |
243 | strstr (input_buffer,"NXDOMAIN")) | 243 | strstr (input_buffer,"NXDOMAIN")) |
244 | die (STATE_CRITICAL, _("Domain %s was not found by the server\n"), query_address); | 244 | die (STATE_CRITICAL, _("Domain %s was not found by the server\n"), query_address); |
245 | 245 | ||
246 | /* Network is unreachable */ | 246 | /* Network is unreachable */ |
247 | else if (strstr (input_buffer, "Network is unreachable")) | 247 | else if (strstr (input_buffer, "Network is unreachable")) |
248 | die (STATE_CRITICAL, _("Network is unreachable\n")); | 248 | die (STATE_CRITICAL, _("Network is unreachable\n")); |
249 | 249 | ||
250 | /* Internal server failure */ | 250 | /* Internal server failure */ |
251 | else if (strstr (input_buffer, "Server failure")) | 251 | else if (strstr (input_buffer, "Server failure")) |
252 | die (STATE_CRITICAL, _("DNS failure for %s\n"), dns_server); | 252 | die (STATE_CRITICAL, _("DNS failure for %s\n"), dns_server); |
253 | 253 | ||
254 | /* Request error or the DNS lookup timed out */ | 254 | /* Request error or the DNS lookup timed out */ |
255 | else if (strstr (input_buffer, "Format error") || | 255 | else if (strstr (input_buffer, "Format error") || |
256 | strstr (input_buffer, "Timed out")) | 256 | strstr (input_buffer, "Timed out")) |
257 | return STATE_WARNING; | 257 | return STATE_WARNING; |
258 | 258 | ||
259 | return STATE_OK; | 259 | return STATE_OK; |
260 | 260 | ||
261 | } | 261 | } |
262 | 262 | ||
@@ -265,148 +265,177 @@ error_scan (char *input_buffer) | |||
265 | int | 265 | int |
266 | process_arguments (int argc, char **argv) | 266 | process_arguments (int argc, char **argv) |
267 | { | 267 | { |
268 | int c; | 268 | int c; |
269 | 269 | ||
270 | int opt_index = 0; | 270 | int opt_index = 0; |
271 | static struct option long_opts[] = { | 271 | static struct option long_opts[] = { |
272 | {"help", no_argument, 0, 'h'}, | 272 | {"help", no_argument, 0, 'h'}, |
273 | {"version", no_argument, 0, 'V'}, | 273 | {"version", no_argument, 0, 'V'}, |
274 | {"verbose", no_argument, 0, 'v'}, | 274 | {"verbose", no_argument, 0, 'v'}, |
275 | {"timeout", required_argument, 0, 't'}, | 275 | {"timeout", required_argument, 0, 't'}, |
276 | {"hostname", required_argument, 0, 'H'}, | 276 | {"hostname", required_argument, 0, 'H'}, |
277 | {"server", required_argument, 0, 's'}, | 277 | {"server", required_argument, 0, 's'}, |
278 | {"reverse-server", required_argument, 0, 'r'}, | 278 | {"reverse-server", required_argument, 0, 'r'}, |
279 | {"expected-address", required_argument, 0, 'a'}, | 279 | {"expected-address", required_argument, 0, 'a'}, |
280 | {"expect-authority", no_argument, 0, 'A'}, | 280 | {"expect-authority", no_argument, 0, 'A'}, |
281 | {0, 0, 0, 0} | 281 | {0, 0, 0, 0} |
282 | }; | 282 | }; |
283 | 283 | ||
284 | if (argc < 2) | 284 | if (argc < 2) |
285 | return ERROR; | 285 | return ERROR; |
286 | 286 | ||
287 | for (c = 1; c < argc; c++) | 287 | for (c = 1; c < argc; c++) |
288 | if (strcmp ("-to", argv[c]) == 0) | 288 | if (strcmp ("-to", argv[c]) == 0) |
289 | strcpy (argv[c], "-t"); | 289 | strcpy (argv[c], "-t"); |
290 | 290 | ||
291 | while (1) { | 291 | while (1) { |
292 | c = getopt_long (argc, argv, "hVvAt:H:s:r:a:", long_opts, &opt_index); | 292 | c = getopt_long (argc, argv, "hVvAt:H:s:r:a:", long_opts, &opt_index); |
293 | 293 | ||
294 | if (c == -1 || c == EOF) | 294 | if (c == -1 || c == EOF) |
295 | break; | 295 | break; |
296 | 296 | ||
297 | switch (c) { | 297 | switch (c) { |
298 | case 'h': /* help */ | 298 | case 'h': /* help */ |
299 | print_help (); | 299 | print_help (); |
300 | exit (STATE_OK); | 300 | exit (STATE_OK); |
301 | case 'V': /* version */ | 301 | case 'V': /* version */ |
302 | print_revision (progname, revision); | 302 | print_revision (progname, revision); |
303 | exit (STATE_OK); | 303 | exit (STATE_OK); |
304 | case 'v': /* version */ | 304 | case 'v': /* version */ |
305 | verbose = TRUE; | 305 | verbose = TRUE; |
306 | break; | 306 | break; |
307 | case 't': /* timeout period */ | 307 | case 't': /* timeout period */ |
308 | timeout_interval = atoi (optarg); | 308 | timeout_interval = atoi (optarg); |
309 | break; | 309 | break; |
310 | case 'H': /* hostname */ | 310 | case 'H': /* hostname */ |
311 | if (strlen (optarg) >= ADDRESS_LENGTH) | 311 | if (strlen (optarg) >= ADDRESS_LENGTH) |
312 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 312 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
313 | strcpy (query_address, optarg); | 313 | strcpy (query_address, optarg); |
314 | break; | 314 | break; |
315 | case 's': /* server name */ | 315 | case 's': /* server name */ |
316 | /* TODO: this host_or_die check is probably unnecessary. | 316 | /* TODO: this host_or_die check is probably unnecessary. |
317 | * Better to confirm nslookup response matches */ | 317 | * Better to confirm nslookup response matches */ |
318 | host_or_die(optarg); | 318 | host_or_die(optarg); |
319 | if (strlen (optarg) >= ADDRESS_LENGTH) | 319 | if (strlen (optarg) >= ADDRESS_LENGTH) |
320 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 320 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
321 | strcpy (dns_server, optarg); | 321 | strcpy (dns_server, optarg); |
322 | break; | 322 | break; |
323 | case 'r': /* reverse server name */ | 323 | case 'r': /* reverse server name */ |
324 | /* TODO: Is this host_or_die necessary? */ | 324 | /* TODO: Is this host_or_die necessary? */ |
325 | host_or_die(optarg); | 325 | host_or_die(optarg); |
326 | if (strlen (optarg) >= ADDRESS_LENGTH) | 326 | if (strlen (optarg) >= ADDRESS_LENGTH) |
327 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 327 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
328 | strcpy (ptr_server, optarg); | 328 | strcpy (ptr_server, optarg); |
329 | break; | 329 | break; |
330 | case 'a': /* expected address */ | 330 | case 'a': /* expected address */ |
331 | if (strlen (optarg) >= ADDRESS_LENGTH) | 331 | if (strlen (optarg) >= ADDRESS_LENGTH) |
332 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 332 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
333 | strcpy (expected_address, optarg); | 333 | strcpy (expected_address, optarg); |
334 | match_expected_address = TRUE; | 334 | match_expected_address = TRUE; |
335 | break; | 335 | break; |
336 | case 'A': /* expect authority */ | 336 | case 'A': /* expect authority */ |
337 | expect_authority = TRUE; | 337 | expect_authority = TRUE; |
338 | break; | 338 | break; |
339 | default: /* args not parsable */ | 339 | default: /* args not parsable */ |
340 | usage_va(_("Unknown argument - %s"), optarg); | 340 | usage_va(_("Unknown argument - %s"), optarg); |
341 | } | 341 | } |
342 | } | 342 | } |
343 | 343 | ||
344 | c = optind; | 344 | c = optind; |
345 | if (strlen(query_address)==0 && c<argc) { | 345 | if (strlen(query_address)==0 && c<argc) { |
346 | if (strlen(argv[c])>=ADDRESS_LENGTH) | 346 | if (strlen(argv[c])>=ADDRESS_LENGTH) |
347 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 347 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
348 | strcpy (query_address, argv[c++]); | 348 | strcpy (query_address, argv[c++]); |
349 | } | 349 | } |
350 | 350 | ||
351 | if (strlen(dns_server)==0 && c<argc) { | 351 | if (strlen(dns_server)==0 && c<argc) { |
352 | /* TODO: See -s option */ | 352 | /* TODO: See -s option */ |
353 | host_or_die(argv[c]); | 353 | host_or_die(argv[c]); |
354 | if (strlen(argv[c]) >= ADDRESS_LENGTH) | 354 | if (strlen(argv[c]) >= ADDRESS_LENGTH) |
355 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 355 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
356 | strcpy (dns_server, argv[c++]); | 356 | strcpy (dns_server, argv[c++]); |
357 | } | 357 | } |
358 | 358 | ||
359 | return validate_arguments (); | 359 | return validate_arguments (); |
360 | } | 360 | } |
361 | 361 | ||
362 | 362 | ||
363 | int | 363 | int |
364 | validate_arguments () | 364 | validate_arguments () |
365 | { | 365 | { |
366 | if (query_address[0] == 0) | 366 | if (query_address[0] == 0) |
367 | return ERROR; | 367 | return ERROR; |
368 | 368 | ||
369 | return OK; | 369 | return OK; |
370 | } | 370 | } |
371 | 371 | ||
372 | 372 | ||
373 | void | 373 | void |
374 | print_help (void) | 374 | print_help (void) |
375 | { | 375 | { |
376 | print_revision (progname, revision); | 376 | print_revision (progname, revision); |
377 | 377 | ||
378 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); | 378 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); |
379 | printf (COPYRIGHT, copyright, email); | 379 | printf (COPYRIGHT, copyright, email); |
380 | 380 | ||
381 | printf (_("\ | 381 | printf (_("This plugin uses the nslookup program to obtain the IP address for the given host/domain query.")); |
382 | This plugin uses the nslookup program to obtain the IP address\n\ | 382 | |
383 | for the given host/domain query. A optional DNS server to use may\n\ | 383 | printf ("\n"); |
384 | be specified. If no DNS server is specified, the default server(s)\n\ | 384 | |
385 | specified in /etc/resolv.conf will be used.\n\n")); | 385 | printf (_("An optional DNS server to use may be specified.")); |
386 | |||
387 | printf ("\n"); | ||
386 | 388 | ||
387 | print_usage (); | 389 | printf (_("If no DNS server is specified, the default server(s)specified in /etc/resolv.conf will be used.")); |
388 | 390 | ||
389 | printf (_(UT_HELP_VRSN)); | 391 | printf ("\n\n"); |
390 | 392 | ||
391 | printf (_("\ | 393 | print_usage (); |
392 | -H, --hostname=HOST\n\ | ||
393 | The name or address you want to query\n\ | ||
394 | -s, --server=HOST\n\ | ||
395 | Optional DNS server you want to use for the lookup\n\ | ||
396 | -a, --expected-address=IP-ADDRESS\n\ | ||
397 | Optional IP address you expect the DNS server to return\n\ | ||
398 | -A, --expect-authority\n\ | ||
399 | Optionally expect the DNS server to be authoritative for the lookup\n")); | ||
400 | 394 | ||
401 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | 395 | printf (_(UT_HELP_VRSN)); |
402 | 396 | ||
403 | printf (_(UT_SUPPORT)); | 397 | printf (" -H, --hostname=HOST"); |
398 | |||
399 | printf ("\n"); | ||
400 | |||
401 | printf (_("the name or address you want to query")); | ||
402 | |||
403 | printf ("\n"); | ||
404 | |||
405 | printf (" -s, --server=HOST"); | ||
406 | |||
407 | printf ("\n"); | ||
408 | |||
409 | printf (_("optional DNS server you want to use for the lookup")); | ||
410 | |||
411 | printf ("\n"); | ||
412 | |||
413 | printf (" -a, --expected-address=IP-ADDRESS"); | ||
414 | |||
415 | printf ("\n"); | ||
416 | |||
417 | printf (_("optional IP address you expect the DNS server to return")); | ||
418 | |||
419 | printf ("\n"); | ||
420 | |||
421 | printf (" -A, --expect-authority"); | ||
422 | |||
423 | printf ("\n"); | ||
424 | |||
425 | printf (_("optionally expect the DNS server to be authoritative for the lookup")); | ||
426 | |||
427 | printf ("\n"); | ||
428 | |||
429 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
430 | |||
431 | printf (_(UT_SUPPORT)); | ||
404 | } | 432 | } |
405 | 433 | ||
406 | 434 | ||
407 | void | 435 | void |
408 | print_usage (void) | 436 | print_usage (void) |
409 | { | 437 | { |
410 | printf ("\ | 438 | printf (_("Usage:")); |
411 | Usage: %s -H host [-s server] [-a expected-address] [-A] [-t timeout]\n", progname); | 439 | |
440 | printf ("%s -H host [-s server] [-a expected-address] [-A] [-t timeout]\n", progname); | ||
412 | } | 441 | } |
diff --git a/plugins/check_dummy.c b/plugins/check_dummy.c index 08926115..0a7f472c 100644 --- a/plugins/check_dummy.c +++ b/plugins/check_dummy.c | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | const char *progname = "check_dummy"; | 21 | const char *progname = "check_dummy"; |
22 | const char *revision = "$Revision$"; | 22 | const char *revision = "$Revision$"; |
23 | const char *copyright = "1999-2004"; | 23 | const char *copyright = "1999-2005"; |
24 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 24 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
25 | 25 | ||
26 | #include "common.h" | 26 | #include "common.h" |
@@ -33,51 +33,51 @@ void print_usage (void); | |||
33 | int | 33 | int |
34 | main (int argc, char **argv) | 34 | main (int argc, char **argv) |
35 | { | 35 | { |
36 | int result = STATE_UNKNOWN; | 36 | int result = STATE_UNKNOWN; |
37 | 37 | ||
38 | setlocale (LC_ALL, ""); | 38 | setlocale (LC_ALL, ""); |
39 | bindtextdomain (PACKAGE, LOCALEDIR); | 39 | bindtextdomain (PACKAGE, LOCALEDIR); |
40 | textdomain (PACKAGE); | 40 | textdomain (PACKAGE); |
41 | 41 | ||
42 | if (argc < 2) | 42 | if (argc < 2) |
43 | usage4 (_("Could not parse arguments")); | 43 | usage4 (_("Could not parse arguments")); |
44 | else if (strcmp (argv[1], "-V") == 0 || strcmp (argv[1], "--version") == 0) { | 44 | else if (strcmp (argv[1], "-V") == 0 || strcmp (argv[1], "--version") == 0) { |
45 | print_revision (progname, revision); | 45 | print_revision (progname, revision); |
46 | exit (STATE_OK); | 46 | exit (STATE_OK); |
47 | } | 47 | } |
48 | else if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0) { | 48 | else if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0) { |
49 | print_help (); | 49 | print_help (); |
50 | exit (STATE_OK); | 50 | exit (STATE_OK); |
51 | } | 51 | } |
52 | else if (!is_integer (argv[1])) | 52 | else if (!is_integer (argv[1])) |
53 | usage4 (_("Arguments to check_dummy must be an integer")); | 53 | usage4 (_("Arguments to check_dummy must be an integer")); |
54 | else | 54 | else |
55 | result = atoi (argv[1]); | 55 | result = atoi (argv[1]); |
56 | 56 | ||
57 | switch (result) { | 57 | switch (result) { |
58 | case STATE_OK: | 58 | case STATE_OK: |
59 | printf (_("OK")); | 59 | printf (_("OK")); |
60 | break; | 60 | break; |
61 | case STATE_WARNING: | 61 | case STATE_WARNING: |
62 | printf (_("WARNING")); | 62 | printf (_("WARNING")); |
63 | break; | 63 | break; |
64 | case STATE_CRITICAL: | 64 | case STATE_CRITICAL: |
65 | printf (_("CRITICAL")); | 65 | printf (_("CRITICAL")); |
66 | break; | 66 | break; |
67 | case STATE_UNKNOWN: | 67 | case STATE_UNKNOWN: |
68 | printf (_("UNKNOWN")); | 68 | printf (_("UNKNOWN")); |
69 | break; | 69 | break; |
70 | default: | 70 | default: |
71 | printf (_("Status %d is not a supported error state\n"), result); | 71 | printf (_("Status %d is not a supported error state\n"), result); |
72 | break; | 72 | break; |
73 | } | 73 | } |
74 | 74 | ||
75 | if (argc >= 3) | 75 | if (argc >= 3) |
76 | printf (": %s", argv[2]); | 76 | printf (": %s", argv[2]); |
77 | 77 | ||
78 | printf("\n"); | 78 | printf("\n"); |
79 | 79 | ||
80 | return result; | 80 | return result; |
81 | } | 81 | } |
82 | 82 | ||
83 | 83 | ||
@@ -85,20 +85,24 @@ main (int argc, char **argv) | |||
85 | void | 85 | void |
86 | print_help (void) | 86 | print_help (void) |
87 | { | 87 | { |
88 | print_revision (progname, revision); | 88 | print_revision (progname, revision); |
89 | 89 | ||
90 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); | 90 | printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); |
91 | printf (COPYRIGHT, copyright, email); | 91 | printf (COPYRIGHT, copyright, email); |
92 | 92 | ||
93 | printf (_("\ | 93 | printf (_("This plugin will simply return the state corresponding to the numeric value")); |
94 | This plugin will simply return the state corresponding to the numeric value\n\ | 94 | |
95 | of the <state> argument with optional text.\n\n")); | 95 | printf ("\n"); |
96 | |||
97 | printf (_("of the <state> argument with optional text")); | ||
96 | 98 | ||
97 | print_usage (); | 99 | printf ("\n\n"); |
100 | |||
101 | print_usage (); | ||
98 | 102 | ||
99 | printf (_(UT_HELP_VRSN)); | 103 | printf (_(UT_HELP_VRSN)); |
100 | 104 | ||
101 | printf (_(UT_SUPPORT)); | 105 | printf (_(UT_SUPPORT)); |
102 | } | 106 | } |
103 | 107 | ||
104 | 108 | ||
@@ -106,5 +110,6 @@ of the <state> argument with optional text.\n\n")); | |||
106 | void | 110 | void |
107 | print_usage (void) | 111 | print_usage (void) |
108 | { | 112 | { |
109 | printf ("Usage: %s <integer state> [optional text]\n", progname); | 113 | printf (_("Usage:")); |
114 | printf (" %s <integer state> [optional text]\n", progname); | ||
110 | } | 115 | } |
diff --git a/plugins/check_fping.c b/plugins/check_fping.c index 5ffcd16e..49615d13 100644 --- a/plugins/check_fping.c +++ b/plugins/check_fping.c | |||
@@ -29,10 +29,10 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
29 | #include "utils.h" | 29 | #include "utils.h" |
30 | 30 | ||
31 | enum { | 31 | enum { |
32 | PACKET_COUNT = 1, | 32 | PACKET_COUNT = 1, |
33 | PACKET_SIZE = 56, | 33 | PACKET_SIZE = 56, |
34 | PL = 0, | 34 | PL = 0, |
35 | RTA = 1 | 35 | RTA = 1 |
36 | }; | 36 | }; |
37 | 37 | ||
38 | int textscan (char *buf); | 38 | int textscan (char *buf); |
@@ -57,65 +57,65 @@ int wrta_p = FALSE; | |||
57 | int | 57 | int |
58 | main (int argc, char **argv) | 58 | main (int argc, char **argv) |
59 | { | 59 | { |
60 | /* normaly should be int result = STATE_UNKNOWN; */ | 60 | /* normaly should be int result = STATE_UNKNOWN; */ |
61 | 61 | ||
62 | int status = STATE_UNKNOWN; | 62 | int status = STATE_UNKNOWN; |
63 | char *server = NULL; | 63 | char *server = NULL; |
64 | char *command_line = NULL; | 64 | char *command_line = NULL; |
65 | char *input_buffer = NULL; | 65 | char *input_buffer = NULL; |
66 | input_buffer = malloc (MAX_INPUT_BUFFER); | 66 | input_buffer = malloc (MAX_INPUT_BUFFER); |
67 | 67 | ||
68 | setlocale (LC_ALL, ""); | 68 | setlocale (LC_ALL, ""); |
69 | bindtextdomain (PACKAGE, LOCALEDIR); | 69 | bindtextdomain (PACKAGE, LOCALEDIR); |
70 | textdomain (PACKAGE); | 70 | textdomain (PACKAGE); |
71 | 71 | ||
72 | if (process_arguments (argc, argv) == ERROR) | 72 | if (process_arguments (argc, argv) == ERROR) |
73 | usage4 (_("Could not parse arguments")); | 73 | usage4 (_("Could not parse arguments")); |
74 | 74 | ||
75 | server = strscpy (server, server_name); | 75 | server = strscpy (server, server_name); |
76 | 76 | ||
77 | /* compose the command */ | 77 | /* compose the command */ |
78 | asprintf (&command_line, "%s -b %d -c %d %s", PATH_TO_FPING, | 78 | asprintf (&command_line, "%s -b %d -c %d %s", PATH_TO_FPING, |
79 | packet_size, packet_count, server); | 79 | packet_size, packet_count, server); |
80 | 80 | ||
81 | if (verbose) | 81 | if (verbose) |
82 | printf ("%s\n", command_line); | 82 | printf ("%s\n", command_line); |
83 | 83 | ||
84 | /* run the command */ | 84 | /* run the command */ |
85 | child_process = spopen (command_line); | 85 | child_process = spopen (command_line); |
86 | if (child_process == NULL) { | 86 | if (child_process == NULL) { |
87 | printf (_("Could not open pipe: %s\n"), command_line); | 87 | printf (_("Could not open pipe: %s\n"), command_line); |
88 | return STATE_UNKNOWN; | 88 | return STATE_UNKNOWN; |
89 | } | 89 | } |
90 | 90 | ||
91 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 91 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); |
92 | if (child_stderr == NULL) { | 92 | if (child_stderr == NULL) { |
93 | printf (_("Could not open stderr for %s\n"), command_line); | 93 | printf (_("Could not open stderr for %s\n"), command_line); |
94 | } | 94 | } |
95 | 95 | ||
96 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 96 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { |
97 | if (verbose) | 97 | if (verbose) |
98 | printf ("%s", input_buffer); | 98 | printf ("%s", input_buffer); |
99 | status = max_state (status, textscan (input_buffer)); | 99 | status = max_state (status, textscan (input_buffer)); |
100 | } | 100 | } |
101 | 101 | ||
102 | /* If we get anything on STDERR, at least set warning */ | 102 | /* If we get anything on STDERR, at least set warning */ |
103 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { | 103 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { |
104 | status = max_state (status, STATE_WARNING); | 104 | status = max_state (status, STATE_WARNING); |
105 | if (verbose) | 105 | if (verbose) |
106 | printf ("%s", input_buffer); | 106 | printf ("%s", input_buffer); |
107 | status = max_state (status, textscan (input_buffer)); | 107 | status = max_state (status, textscan (input_buffer)); |
108 | } | 108 | } |
109 | (void) fclose (child_stderr); | 109 | (void) fclose (child_stderr); |
110 | 110 | ||
111 | /* close the pipe */ | 111 | /* close the pipe */ |
112 | if (spclose (child_process)) | 112 | if (spclose (child_process)) |
113 | /* need to use max_state not max */ | 113 | /* need to use max_state not max */ |
114 | status = max_state (status, STATE_WARNING); | 114 | status = max_state (status, STATE_WARNING); |
115 | 115 | ||
116 | printf ("FPING %s - %s\n", state_text (status), server_name); | 116 | printf ("FPING %s - %s\n", state_text (status), server_name); |
117 | 117 | ||
118 | return status; | 118 | return status; |
119 | } | 119 | } |
120 | 120 | ||
121 | 121 | ||
@@ -123,80 +123,80 @@ main (int argc, char **argv) | |||
123 | int | 123 | int |
124 | textscan (char *buf) | 124 | textscan (char *buf) |
125 | { | 125 | { |
126 | char *rtastr = NULL; | 126 | char *rtastr = NULL; |
127 | char *losstr = NULL; | 127 | char *losstr = NULL; |
128 | double loss; | 128 | double loss; |
129 | double rta; | 129 | double rta; |
130 | int status = STATE_UNKNOWN; | 130 | int status = STATE_UNKNOWN; |
131 | 131 | ||
132 | if (strstr (buf, "not found")) { | 132 | if (strstr (buf, "not found")) { |
133 | die (STATE_CRITICAL, _("FPING UNKNOW - %s not found\n"), server_name); | 133 | die (STATE_CRITICAL, _("FPING UNKNOW - %s not found\n"), server_name); |
134 | 134 | ||
135 | } | 135 | } |
136 | else if (strstr (buf, "is unreachable") || strstr (buf, "Unreachable")) { | 136 | else if (strstr (buf, "is unreachable") || strstr (buf, "Unreachable")) { |
137 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is unreachable\n"), | 137 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is unreachable\n"), |
138 | "host"); | 138 | "host"); |
139 | 139 | ||
140 | } | 140 | } |
141 | else if (strstr (buf, "is down")) { | 141 | else if (strstr (buf, "is down")) { |
142 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); | 142 | die (STATE_CRITICAL, _("FPING CRITICAL - %s is down\n"), server_name); |
143 | 143 | ||
144 | } | 144 | } |
145 | else if (strstr (buf, "is alive")) { | 145 | else if (strstr (buf, "is alive")) { |
146 | status = STATE_OK; | 146 | status = STATE_OK; |
147 | 147 | ||
148 | } | 148 | } |
149 | else if (strstr (buf, "xmt/rcv/%loss") && strstr (buf, "min/avg/max")) { | 149 | else if (strstr (buf, "xmt/rcv/%loss") && strstr (buf, "min/avg/max")) { |
150 | losstr = strstr (buf, "="); | 150 | losstr = strstr (buf, "="); |
151 | losstr = 1 + strstr (losstr, "/"); | 151 | losstr = 1 + strstr (losstr, "/"); |
152 | losstr = 1 + strstr (losstr, "/"); | 152 | losstr = 1 + strstr (losstr, "/"); |
153 | rtastr = strstr (buf, "min/avg/max"); | 153 | rtastr = strstr (buf, "min/avg/max"); |
154 | rtastr = strstr (rtastr, "="); | 154 | rtastr = strstr (rtastr, "="); |
155 | rtastr = 1 + index (rtastr, '/'); | 155 | rtastr = 1 + index (rtastr, '/'); |
156 | loss = strtod (losstr, NULL); | 156 | loss = strtod (losstr, NULL); |
157 | rta = strtod (rtastr, NULL); | 157 | rta = strtod (rtastr, NULL); |
158 | if (cpl_p == TRUE && loss > cpl) | 158 | if (cpl_p == TRUE && loss > cpl) |
159 | status = STATE_CRITICAL; | 159 | status = STATE_CRITICAL; |
160 | else if (crta_p == TRUE && rta > crta) | 160 | else if (crta_p == TRUE && rta > crta) |
161 | status = STATE_CRITICAL; | 161 | status = STATE_CRITICAL; |
162 | else if (wpl_p == TRUE && loss > wpl) | 162 | else if (wpl_p == TRUE && loss > wpl) |
163 | status = STATE_WARNING; | 163 | status = STATE_WARNING; |
164 | else if (wrta_p == TRUE && rta > wrta) | 164 | else if (wrta_p == TRUE && rta > wrta) |
165 | status = STATE_WARNING; | 165 | status = STATE_WARNING; |
166 | else | 166 | else |
167 | status = STATE_OK; | 167 | status = STATE_OK; |
168 | die (status, | 168 | die (status, |
169 | _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), | 169 | _("FPING %s - %s (loss=%.0f%%, rta=%f ms)|%s %s\n"), |
170 | state_text (status), server_name, loss, rta, | 170 | state_text (status), server_name, loss, rta, |
171 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100), | 171 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100), |
172 | fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, TRUE, 0, FALSE, 0)); | 172 | fperfdata ("rta", rta/1.0e3, "s", wrta_p, wrta/1.0e3, crta_p, crta/1.0e3, TRUE, 0, FALSE, 0)); |
173 | 173 | ||
174 | } | 174 | } |
175 | else if(strstr (buf, "xmt/rcv/%loss") ) { | 175 | else if(strstr (buf, "xmt/rcv/%loss") ) { |
176 | /* no min/max/avg if host was unreachable in fping v2.2.b1 */ | 176 | /* no min/max/avg if host was unreachable in fping v2.2.b1 */ |
177 | losstr = strstr (buf, "="); | 177 | losstr = strstr (buf, "="); |
178 | losstr = 1 + strstr (losstr, "/"); | 178 | losstr = 1 + strstr (losstr, "/"); |
179 | losstr = 1 + strstr (losstr, "/"); | 179 | losstr = 1 + strstr (losstr, "/"); |
180 | loss = strtod (losstr, NULL); | 180 | loss = strtod (losstr, NULL); |
181 | if (atoi(losstr) == 100) | 181 | if (atoi(losstr) == 100) |
182 | status = STATE_CRITICAL; | 182 | status = STATE_CRITICAL; |
183 | else if (cpl_p == TRUE && loss > cpl) | 183 | else if (cpl_p == TRUE && loss > cpl) |
184 | status = STATE_CRITICAL; | 184 | status = STATE_CRITICAL; |
185 | else if (wpl_p == TRUE && loss > wpl) | 185 | else if (wpl_p == TRUE && loss > wpl) |
186 | status = STATE_WARNING; | 186 | status = STATE_WARNING; |
187 | else | 187 | else |
188 | status = STATE_OK; | 188 | status = STATE_OK; |
189 | /* loss=%.0f%%;%d;%d;0;100 */ | 189 | /* loss=%.0f%%;%d;%d;0;100 */ |
190 | die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), | 190 | die (status, _("FPING %s - %s (loss=%.0f%% )|%s\n"), |
191 | state_text (status), server_name, loss , | 191 | state_text (status), server_name, loss , |
192 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100)); | 192 | perfdata ("loss", (long int)loss, "%", wpl_p, wpl, cpl_p, cpl, TRUE, 0, TRUE, 100)); |
193 | 193 | ||
194 | } | 194 | } |
195 | else { | 195 | else { |
196 | status = max_state (status, STATE_WARNING); | 196 | status = max_state (status, STATE_WARNING); |
197 | } | 197 | } |
198 | 198 | ||
199 | return status; | 199 | return status; |
200 | } | 200 | } |
201 | 201 | ||
202 | 202 | ||
@@ -205,145 +205,145 @@ textscan (char *buf) | |||
205 | int | 205 | int |
206 | process_arguments (int argc, char **argv) | 206 | process_arguments (int argc, char **argv) |
207 | { | 207 | { |
208 | int c; | 208 | int c; |
209 | char *rv[2]; | 209 | char *rv[2]; |
210 | 210 | ||
211 | int option = 0; | 211 | int option = 0; |
212 | static struct option longopts[] = { | 212 | static struct option longopts[] = { |
213 | {"hostname", required_argument, 0, 'H'}, | 213 | {"hostname", required_argument, 0, 'H'}, |
214 | {"critical", required_argument, 0, 'c'}, | 214 | {"critical", required_argument, 0, 'c'}, |
215 | {"warning", required_argument, 0, 'w'}, | 215 | {"warning", required_argument, 0, 'w'}, |
216 | {"bytes", required_argument, 0, 'b'}, | 216 | {"bytes", required_argument, 0, 'b'}, |
217 | {"number", required_argument, 0, 'n'}, | 217 | {"number", required_argument, 0, 'n'}, |
218 | {"verbose", no_argument, 0, 'v'}, | 218 | {"verbose", no_argument, 0, 'v'}, |
219 | {"version", no_argument, 0, 'V'}, | 219 | {"version", no_argument, 0, 'V'}, |
220 | {"help", no_argument, 0, 'h'}, | 220 | {"help", no_argument, 0, 'h'}, |
221 | {0, 0, 0, 0} | 221 | {0, 0, 0, 0} |
222 | }; | 222 | }; |
223 | 223 | ||
224 | rv[PL] = NULL; | 224 | rv[PL] = NULL; |
225 | rv[RTA] = NULL; | 225 | rv[RTA] = NULL; |
226 | 226 | ||
227 | if (argc < 2) | 227 | if (argc < 2) |
228 | return ERROR; | 228 | return ERROR; |
229 | 229 | ||
230 | if (!is_option (argv[1])) { | 230 | if (!is_option (argv[1])) { |
231 | server_name = argv[1]; | 231 | server_name = argv[1]; |
232 | argv[1] = argv[0]; | 232 | argv[1] = argv[0]; |
233 | argv = &argv[1]; | 233 | argv = &argv[1]; |
234 | argc--; | 234 | argc--; |
235 | } | 235 | } |
236 | 236 | ||
237 | while (1) { | 237 | while (1) { |
238 | c = getopt_long (argc, argv, "+hVvH:c:w:b:n:", longopts, &option); | 238 | c = getopt_long (argc, argv, "+hVvH:c:w:b:n:", longopts, &option); |
239 | 239 | ||
240 | if (c == -1 || c == EOF || c == 1) | 240 | if (c == -1 || c == EOF || c == 1) |
241 | break; | 241 | break; |
242 | 242 | ||
243 | switch (c) { | 243 | switch (c) { |
244 | case '?': /* print short usage statement if args not parsable */ | 244 | case '?': /* print short usage statement if args not parsable */ |
245 | usage2 (_("Unknown argument"), optarg); | 245 | usage2 (_("Unknown argument"), optarg); |
246 | case 'h': /* help */ | 246 | case 'h': /* help */ |
247 | print_help (); | 247 | print_help (); |
248 | exit (STATE_OK); | 248 | exit (STATE_OK); |
249 | case 'V': /* version */ | 249 | case 'V': /* version */ |
250 | print_revision (progname, revision); | 250 | print_revision (progname, revision); |
251 | exit (STATE_OK); | 251 | exit (STATE_OK); |
252 | case 'v': /* verbose mode */ | 252 | case 'v': /* verbose mode */ |
253 | verbose = TRUE; | 253 | verbose = TRUE; |
254 | break; | 254 | break; |
255 | case 'H': /* hostname */ | 255 | case 'H': /* hostname */ |
256 | if (is_host (optarg) == FALSE) { | 256 | if (is_host (optarg) == FALSE) { |
257 | usage2 (_("Invalid hostname/address"), optarg); | 257 | usage2 (_("Invalid hostname/address"), optarg); |
258 | } | 258 | } |
259 | server_name = strscpy (server_name, optarg); | 259 | server_name = strscpy (server_name, optarg); |
260 | break; | 260 | break; |
261 | case 'c': | 261 | case 'c': |
262 | get_threshold (optarg, rv); | 262 | get_threshold (optarg, rv); |
263 | if (rv[RTA]) { | 263 | if (rv[RTA]) { |
264 | crta = strtod (rv[RTA], NULL); | 264 | crta = strtod (rv[RTA], NULL); |
265 | crta_p = TRUE; | 265 | crta_p = TRUE; |
266 | rv[RTA] = NULL; | 266 | rv[RTA] = NULL; |
267 | } | 267 | } |
268 | if (rv[PL]) { | 268 | if (rv[PL]) { |
269 | cpl = atoi (rv[PL]); | 269 | cpl = atoi (rv[PL]); |
270 | cpl_p = TRUE; | 270 | cpl_p = TRUE; |
271 | rv[PL] = NULL; | 271 | rv[PL] = NULL; |
272 | } | 272 | } |
273 | break; | 273 | break; |
274 | case 'w': | 274 | case 'w': |
275 | get_threshold (optarg, rv); | 275 | get_threshold (optarg, rv); |
276 | if (rv[RTA]) { | 276 | if (rv[RTA]) { |
277 | wrta = strtod (rv[RTA], NULL); | 277 | wrta = strtod (rv[RTA], NULL); |
278 | wrta_p = TRUE; | 278 | wrta_p = TRUE; |
279 | rv[RTA] = NULL; | 279 | rv[RTA] = NULL; |
280 | } | 280 | } |
281 | if (rv[PL]) { | 281 | if (rv[PL]) { |
282 | wpl = atoi (rv[PL]); | 282 | wpl = atoi (rv[PL]); |
283 | wpl_p = TRUE; | 283 | wpl_p = TRUE; |
284 | rv[PL] = NULL; | 284 | rv[PL] = NULL; |
285 | } | 285 | } |
286 | break; | 286 | break; |
287 | case 'b': /* bytes per packet */ | 287 | case 'b': /* bytes per packet */ |
288 | if (is_intpos (optarg)) | 288 | if (is_intpos (optarg)) |
289 | packet_size = atoi (optarg); | 289 | packet_size = atoi (optarg); |
290 | else | 290 | else |
291 | usage (_("Packet size must be a positive integer")); | 291 | usage (_("Packet size must be a positive integer")); |
292 | break; | 292 | break; |
293 | case 'n': /* number of packets */ | 293 | case 'n': /* number of packets */ |
294 | if (is_intpos (optarg)) | 294 | if (is_intpos (optarg)) |
295 | packet_count = atoi (optarg); | 295 | packet_count = atoi (optarg); |
296 | else | 296 | else |
297 | usage (_("Packet count must be a positive integer")); | 297 | usage (_("Packet count must be a positive integer")); |
298 | break; | 298 | break; |
299 | } | 299 | } |
300 | } | 300 | } |
301 | 301 | ||
302 | if (server_name == NULL) | 302 | if (server_name == NULL) |
303 | usage4 (_("Hostname was not supplied")); | 303 | usage4 (_("Hostname was not supplied")); |
304 | 304 | ||
305 | return OK; | 305 | return OK; |
306 | } | 306 | } |
307 | 307 | ||
308 | 308 | ||
309 | int | 309 | int |
310 | get_threshold (char *arg, char *rv[2]) | 310 | get_threshold (char *arg, char *rv[2]) |
311 | { | 311 | { |
312 | char *arg1 = NULL; | 312 | char *arg1 = NULL; |
313 | char *arg2 = NULL; | 313 | char *arg2 = NULL; |
314 | 314 | ||
315 | arg1 = strscpy (arg1, arg); | 315 | arg1 = strscpy (arg1, arg); |
316 | if (strpbrk (arg1, ",:")) | 316 | if (strpbrk (arg1, ",:")) |
317 | arg2 = 1 + strpbrk (arg1, ",:"); | 317 | arg2 = 1 + strpbrk (arg1, ",:"); |
318 | 318 | ||
319 | if (arg2) { | 319 | if (arg2) { |
320 | arg1[strcspn (arg1, ",:")] = 0; | 320 | arg1[strcspn (arg1, ",:")] = 0; |
321 | if (strstr (arg1, "%") && strstr (arg2, "%")) | 321 | if (strstr (arg1, "%") && strstr (arg2, "%")) |
322 | die (STATE_UNKNOWN, | 322 | die (STATE_UNKNOWN, |
323 | _("%s: Only one threshold may be packet loss (%s)\n"), progname, | 323 | _("%s: Only one threshold may be packet loss (%s)\n"), progname, |
324 | arg); | 324 | arg); |
325 | if (!strstr (arg1, "%") && !strstr (arg2, "%")) | 325 | if (!strstr (arg1, "%") && !strstr (arg2, "%")) |
326 | die (STATE_UNKNOWN, | 326 | die (STATE_UNKNOWN, |
327 | _("%s: Only one threshold must be packet loss (%s)\n"), | 327 | _("%s: Only one threshold must be packet loss (%s)\n"), |
328 | progname, arg); | 328 | progname, arg); |
329 | } | 329 | } |
330 | 330 | ||
331 | if (arg2 && strstr (arg2, "%")) { | 331 | if (arg2 && strstr (arg2, "%")) { |
332 | rv[PL] = arg2; | 332 | rv[PL] = arg2; |
333 | rv[RTA] = arg1; | 333 | rv[RTA] = arg1; |
334 | } | 334 | } |
335 | else if (arg2) { | 335 | else if (arg2) { |
336 | rv[PL] = arg1; | 336 | rv[PL] = arg1; |
337 | rv[RTA] = arg2; | 337 | rv[RTA] = arg2; |
338 | } | 338 | } |
339 | else if (strstr (arg1, "%")) { | 339 | else if (strstr (arg1, "%")) { |
340 | rv[PL] = arg1; | 340 | rv[PL] = arg1; |
341 | } | 341 | } |
342 | else { | 342 | else { |
343 | rv[RTA] = arg1; | 343 | rv[RTA] = arg1; |
344 | } | 344 | } |
345 | 345 | ||
346 | return OK; | 346 | return OK; |
347 | } | 347 | } |
348 | 348 | ||
349 | 349 | ||
@@ -351,47 +351,82 @@ void | |||
351 | print_help (void) | 351 | print_help (void) |
352 | { | 352 | { |
353 | 353 | ||
354 | print_revision (progname, revision); | 354 | print_revision (progname, revision); |
355 | 355 | ||
356 | printf ("Copyright (c) 1999 Didi Rieder <adrieder@sbox.tu-graz.ac.at>\n"); | 356 | printf ("Copyright (c) 1999 Didi Rieder <adrieder@sbox.tu-graz.ac.at>\n"); |
357 | printf (COPYRIGHT, copyright, email); | 357 | printf (COPYRIGHT, copyright, email); |
358 | 358 | ||
359 | printf (_("\ | 359 | printf (_("This plugin will use the fping command to ping the specified host for a fast check")); |
360 | This plugin will use the /bin/fping command to ping the specified host\n\ | 360 | |
361 | for a fast check if the host is alive.\n\ | 361 | printf ("\n"); |
362 | Note that it is necessary to set the suid flag on fping.\n\n")); | 362 | |
363 | printf (_("Note that it is necessary to set the suid flag on fping.")); | ||
363 | 364 | ||
364 | print_usage (); | 365 | printf ("\n\n"); |
366 | |||
367 | print_usage (); | ||
365 | 368 | ||
366 | printf (_(UT_HELP_VRSN)); | 369 | printf (_(UT_HELP_VRSN)); |
367 | 370 | ||
368 | printf (_("\ | 371 | printf (" -H, --hostname=HOST"); |
369 | -H, --hostname=HOST\n\ | 372 | |
370 | Name or IP Address of host to ping (IP Address bypasses name lookup,\n\ | 373 | printf (_("name or IP Address of host to ping (IP Address bypasses name lookup, reducing system load)")); |
371 | reducing system load)\n\ | 374 | |
372 | -w, --warning=THRESHOLD\n\ | 375 | printf ("\n"); |
373 | warning threshold pair\n\ | 376 | |
374 | -c, --critical=THRESHOLD\n\ | 377 | printf ("-w, --warning=THRESHOLD"); |
375 | critical threshold pair\n\ | 378 | |
376 | -b, --bytes=INTEGER\n\ | 379 | printf ("\n"); |
377 | Size of ICMP packet (default: %d)\n\ | 380 | |
378 | -n, --number=INTEGER\n\ | 381 | printf (_("warning threshold pair")); |
379 | Number of ICMP packets to send (default: %d)\n"), | 382 | |
380 | PACKET_SIZE, PACKET_COUNT); | 383 | printf ("\n"); |
381 | 384 | ||
382 | printf (_(UT_VERBOSE)); | 385 | printf (" -c, --critical=THRESHOLD"); |
386 | |||
387 | printf ("\n"); | ||
383 | 388 | ||
384 | printf (_("\n\ | 389 | printf (_("critical threshold pair")); |
385 | THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel\n\ | 390 | |
386 | time (ms) which triggers a WARNING or CRITICAL state, and <pl> is the\n\ | 391 | printf ("\n"); |
387 | percentage of packet loss to trigger an alarm state.\n")); | ||
388 | 392 | ||
389 | printf (_(UT_SUPPORT)); | 393 | printf (" -b, --bytes=INTEGER"); |
394 | |||
395 | printf (_("size of ICMP packet (default: %d)"),PACKET_SIZE); | ||
396 | |||
397 | printf ("\n"); | ||
398 | |||
399 | printf (" -n, --number=INTEGER"); | ||
400 | |||
401 | printf ("\n"); | ||
402 | |||
403 | printf (_("number of ICMP packets to send (default: %d)"),PACKET_COUNT); | ||
404 | |||
405 | printf ("\n"); | ||
406 | |||
407 | printf (_(UT_VERBOSE)); | ||
408 | |||
409 | printf ("\n"); | ||
410 | |||
411 | printf (_("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)")); | ||
412 | |||
413 | printf ("\n"); | ||
414 | |||
415 | printf (_("which triggers a WARNING or CRITICAL state, and <pl> is the percentage of")); | ||
416 | |||
417 | printf ("\n"); | ||
418 | |||
419 | printf (_("packet loss to trigger an alarm state.")); | ||
420 | |||
421 | printf ("\n"); | ||
422 | |||
423 | printf (_(UT_SUPPORT)); | ||
390 | } | 424 | } |
391 | 425 | ||
392 | 426 | ||
393 | void | 427 | void |
394 | print_usage (void) | 428 | print_usage (void) |
395 | { | 429 | { |
396 | printf ("Usage: %s <host_address>\n", progname); | 430 | printf (_("Usage:")); |
431 | printf (" %s <host_address>\n", progname); | ||
397 | } | 432 | } |
diff --git a/plugins/check_game.c b/plugins/check_game.c index 8548bbdb..9f9ff7d8 100644 --- a/plugins/check_game.c +++ b/plugins/check_game.c | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | const char *progname = "check_game"; | 20 | const char *progname = "check_game"; |
21 | const char *revision = "$Revision$"; | 21 | const char *revision = "$Revision$"; |
22 | const char *copyright = "2002-2004"; | 22 | const char *copyright = "2002-2005"; |
23 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 23 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
24 | 24 | ||
25 | #include "common.h" | 25 | #include "common.h" |
@@ -31,12 +31,12 @@ int validate_arguments (void); | |||
31 | void print_help (void); | 31 | void print_help (void); |
32 | void print_usage (void); | 32 | void print_usage (void); |
33 | 33 | ||
34 | #define QSTAT_DATA_DELIMITER "," | 34 | #define QSTAT_DATA_DELIMITER "," |
35 | 35 | ||
36 | #define QSTAT_HOST_ERROR "ERROR" | 36 | #define QSTAT_HOST_ERROR "ERROR" |
37 | #define QSTAT_HOST_DOWN "DOWN" | 37 | #define QSTAT_HOST_DOWN "DOWN" |
38 | #define QSTAT_HOST_TIMEOUT "TIMEOUT" | 38 | #define QSTAT_HOST_TIMEOUT "TIMEOUT" |
39 | #define QSTAT_MAX_RETURN_ARGS 12 | 39 | #define QSTAT_MAX_RETURN_ARGS 12 |
40 | 40 | ||
41 | char *server_ip; | 41 | char *server_ip; |
42 | char *game_type; | 42 | char *game_type; |
@@ -54,239 +54,241 @@ int qstat_ping_field = -1; | |||
54 | int | 54 | int |
55 | main (int argc, char **argv) | 55 | main (int argc, char **argv) |
56 | { | 56 | { |
57 | char *command_line; | 57 | char *command_line; |
58 | int result = STATE_UNKNOWN; | 58 | int result = STATE_UNKNOWN; |
59 | char *p, *ret[QSTAT_MAX_RETURN_ARGS]; | 59 | char *p, *ret[QSTAT_MAX_RETURN_ARGS]; |
60 | size_t i = 0; | 60 | size_t i = 0; |
61 | output chld_out; | 61 | output chld_out; |
62 | 62 | ||
63 | setlocale (LC_ALL, ""); | 63 | setlocale (LC_ALL, ""); |
64 | bindtextdomain (PACKAGE, LOCALEDIR); | 64 | bindtextdomain (PACKAGE, LOCALEDIR); |
65 | textdomain (PACKAGE); | 65 | textdomain (PACKAGE); |
66 | 66 | ||
67 | if (process_arguments (argc, argv) == ERROR) | 67 | if (process_arguments (argc, argv) == ERROR) |
68 | usage_va(_("Could not parse arguments")); | 68 | usage_va(_("Could not parse arguments")); |
69 | 69 | ||
70 | result = STATE_OK; | 70 | result = STATE_OK; |
71 | 71 | ||
72 | /* create the command line to execute */ | 72 | /* create the command line to execute */ |
73 | asprintf (&command_line, "%s -raw %s -%s %s", | 73 | asprintf (&command_line, "%s -raw %s -%s %s", |
74 | PATH_TO_QSTAT, QSTAT_DATA_DELIMITER, game_type, server_ip); | 74 | PATH_TO_QSTAT, QSTAT_DATA_DELIMITER, game_type, server_ip); |
75 | 75 | ||
76 | if (port) | 76 | if (port) |
77 | asprintf (&command_line, "%s:%-d", command_line, port); | 77 | asprintf (&command_line, "%s:%-d", command_line, port); |
78 | 78 | ||
79 | if (verbose > 0) | 79 | if (verbose > 0) |
80 | printf ("%s\n", command_line); | 80 | printf ("%s\n", command_line); |
81 | 81 | ||
82 | /* run the command. historically, this plugin ignores output on stderr, | 82 | /* run the command. historically, this plugin ignores output on stderr, |
83 | * as well as return status of the qstat program */ | 83 | * as well as return status of the qstat program */ |
84 | (void)np_runcmd(command_line, &chld_out, NULL, 0); | 84 | (void)np_runcmd(command_line, &chld_out, NULL, 0); |
85 | 85 | ||
86 | /* sanity check */ | 86 | /* sanity check */ |
87 | /* was thinking about running qstat without any options, capturing the | 87 | /* was thinking about running qstat without any options, capturing the |
88 | -default line, parsing it & making an array of all know server types | 88 | -default line, parsing it & making an array of all know server types |
89 | but thought this would be too much hassle considering this is a tool | 89 | but thought this would be too much hassle considering this is a tool |
90 | for intelligent sysadmins (ha). Could put a static array of known | 90 | for intelligent sysadmins (ha). Could put a static array of known |
91 | server types in a header file but then we'd be limiting ourselves | 91 | server types in a header file but then we'd be limiting ourselves |
92 | 92 | ||
93 | In the end, I figured I'd simply let an error occur & then trap it | 93 | In the end, I figured I'd simply let an error occur & then trap it |
94 | */ | 94 | */ |
95 | 95 | ||
96 | if (!strncmp (chld_out.line[0], "unknown option", 14)) { | 96 | if (!strncmp (chld_out.line[0], "unknown option", 14)) { |
97 | printf (_("CRITICAL - Host type parameter incorrect!\n")); | 97 | printf (_("CRITICAL - Host type parameter incorrect!\n")); |
98 | result = STATE_CRITICAL; | 98 | result = STATE_CRITICAL; |
99 | return result; | 99 | return result; |
100 | } | 100 | } |
101 | 101 | ||
102 | p = (char *) strtok (chld_out.line[0], QSTAT_DATA_DELIMITER); | 102 | p = (char *) strtok (chld_out.line[0], QSTAT_DATA_DELIMITER); |
103 | while (p != NULL) { | 103 | while (p != NULL) { |
104 | ret[i] = p; | 104 | ret[i] = p; |
105 | p = (char *) strtok (NULL, QSTAT_DATA_DELIMITER); | 105 | p = (char *) strtok (NULL, QSTAT_DATA_DELIMITER); |
106 | i++; | 106 | i++; |
107 | if (i >= QSTAT_MAX_RETURN_ARGS) | 107 | if (i >= QSTAT_MAX_RETURN_ARGS) |
108 | break; | 108 | break; |
109 | } | 109 | } |
110 | 110 | ||
111 | if (strstr (ret[2], QSTAT_HOST_ERROR)) { | 111 | if (strstr (ret[2], QSTAT_HOST_ERROR)) { |
112 | printf (_("CRITICAL - Host not found\n")); | 112 | printf (_("CRITICAL - Host not found\n")); |
113 | result = STATE_CRITICAL; | 113 | result = STATE_CRITICAL; |
114 | } | 114 | } |
115 | else if (strstr (ret[2], QSTAT_HOST_DOWN)) { | 115 | else if (strstr (ret[2], QSTAT_HOST_DOWN)) { |
116 | printf (_("CRITICAL - Game server down or unavailable\n")); | 116 | printf (_("CRITICAL - Game server down or unavailable\n")); |
117 | result = STATE_CRITICAL; | 117 | result = STATE_CRITICAL; |
118 | } | 118 | } |
119 | else if (strstr (ret[2], QSTAT_HOST_TIMEOUT)) { | 119 | else if (strstr (ret[2], QSTAT_HOST_TIMEOUT)) { |
120 | printf (_("CRITICAL - Game server timeout\n")); | 120 | printf (_("CRITICAL - Game server timeout\n")); |
121 | result = STATE_CRITICAL; | 121 | result = STATE_CRITICAL; |
122 | } | 122 | } |
123 | else { | 123 | else { |
124 | printf ("OK: %s/%s %s (%s), Ping: %s ms|%s %s\n", | 124 | printf ("OK: %s/%s %s (%s), Ping: %s ms|%s %s\n", |
125 | ret[qstat_game_players], | 125 | ret[qstat_game_players], |
126 | ret[qstat_game_players_max], | 126 | ret[qstat_game_players_max], |
127 | ret[qstat_game_field], | 127 | ret[qstat_game_field], |
128 | ret[qstat_map_field], | 128 | ret[qstat_map_field], |
129 | ret[qstat_ping_field], | 129 | ret[qstat_ping_field], |
130 | perfdata ("players", atol(ret[qstat_game_players]), "", | 130 | perfdata ("players", atol(ret[qstat_game_players]), "", |
131 | FALSE, 0, FALSE, 0, | 131 | FALSE, 0, FALSE, 0, |
132 | TRUE, 0, TRUE, atol(ret[qstat_game_players_max])), | 132 | TRUE, 0, TRUE, atol(ret[qstat_game_players_max])), |
133 | fperfdata ("ping", strtod(ret[qstat_ping_field], NULL), "", | 133 | fperfdata ("ping", strtod(ret[qstat_ping_field], NULL), "", |
134 | FALSE, 0, FALSE, 0, | 134 | FALSE, 0, FALSE, 0, |
135 | TRUE, 0, FALSE, 0)); | 135 | TRUE, 0, FALSE, 0)); |
136 | } | 136 | } |
137 | 137 | ||
138 | return result; | 138 | return result; |
139 | } | 139 | } |
140 | 140 | ||
141 | 141 | ||
142 | int | 142 | int |
143 | process_arguments (int argc, char **argv) | 143 | process_arguments (int argc, char **argv) |
144 | { | 144 | { |
145 | int c; | 145 | int c; |
146 | 146 | ||
147 | int opt_index = 0; | 147 | int opt_index = 0; |
148 | static struct option long_opts[] = { | 148 | static struct option long_opts[] = { |
149 | {"help", no_argument, 0, 'h'}, | 149 | {"help", no_argument, 0, 'h'}, |
150 | {"version", no_argument, 0, 'V'}, | 150 | {"version", no_argument, 0, 'V'}, |
151 | {"verbose", no_argument, 0, 'v'}, | 151 | {"verbose", no_argument, 0, 'v'}, |
152 | {"timeout", required_argument, 0, 't'}, | 152 | {"timeout", required_argument, 0, 't'}, |
153 | {"hostname", required_argument, 0, 'H'}, | 153 | {"hostname", required_argument, 0, 'H'}, |
154 | {"port", required_argument, 0, 'P'}, | 154 | {"port", required_argument, 0, 'P'}, |
155 | {"game-type", required_argument, 0, 'G'}, | 155 | {"game-type", required_argument, 0, 'G'}, |
156 | {"map-field", required_argument, 0, 'm'}, | 156 | {"map-field", required_argument, 0, 'm'}, |
157 | {"ping-field", required_argument, 0, 'p'}, | 157 | {"ping-field", required_argument, 0, 'p'}, |
158 | {"game-field", required_argument, 0, 'g'}, | 158 | {"game-field", required_argument, 0, 'g'}, |
159 | {"players-field", required_argument, 0, 129}, | 159 | {"players-field", required_argument, 0, 129}, |
160 | {"max-players-field", required_argument, 0, 130}, | 160 | {"max-players-field", required_argument, 0, 130}, |
161 | {0, 0, 0, 0} | 161 | {0, 0, 0, 0} |
162 | }; | 162 | }; |
163 | 163 | ||
164 | if (argc < 2) | 164 | if (argc < 2) |
165 | return ERROR; | 165 | return ERROR; |
166 | 166 | ||
167 | for (c = 1; c < argc; c++) { | 167 | for (c = 1; c < argc; c++) { |
168 | if (strcmp ("-mf", argv[c]) == 0) | 168 | if (strcmp ("-mf", argv[c]) == 0) |
169 | strcpy (argv[c], "-m"); | 169 | strcpy (argv[c], "-m"); |
170 | else if (strcmp ("-pf", argv[c]) == 0) | 170 | else if (strcmp ("-pf", argv[c]) == 0) |
171 | strcpy (argv[c], "-p"); | 171 | strcpy (argv[c], "-p"); |
172 | else if (strcmp ("-gf", argv[c]) == 0) | 172 | else if (strcmp ("-gf", argv[c]) == 0) |
173 | strcpy (argv[c], "-g"); | 173 | strcpy (argv[c], "-g"); |
174 | } | 174 | } |
175 | 175 | ||
176 | while (1) { | 176 | while (1) { |
177 | c = getopt_long (argc, argv, "hVvt:H:P:G:g:p:m:", long_opts, &opt_index); | 177 | c = getopt_long (argc, argv, "hVvt:H:P:G:g:p:m:", long_opts, &opt_index); |
178 | 178 | ||
179 | if (c == -1 || c == EOF) | 179 | if (c == -1 || c == EOF) |
180 | break; | 180 | break; |
181 | 181 | ||
182 | switch (c) { | 182 | switch (c) { |
183 | case 'h': /* help */ | 183 | case 'h': /* help */ |
184 | print_help (); | 184 | print_help (); |
185 | exit (STATE_OK); | 185 | exit (STATE_OK); |
186 | case 'V': /* version */ | 186 | case 'V': /* version */ |
187 | print_revision (progname, revision); | 187 | print_revision (progname, revision); |
188 | exit (STATE_OK); | 188 | exit (STATE_OK); |
189 | case 'v': /* version */ | 189 | case 'v': /* version */ |
190 | verbose = TRUE; | 190 | verbose = TRUE; |
191 | break; | 191 | break; |
192 | case 't': /* timeout period */ | 192 | case 't': /* timeout period */ |
193 | timeout_interval = atoi (optarg); | 193 | timeout_interval = atoi (optarg); |
194 | break; | 194 | break; |
195 | case 'H': /* hostname */ | 195 | case 'H': /* hostname */ |
196 | if (strlen (optarg) >= MAX_HOST_ADDRESS_LENGTH) | 196 | if (strlen (optarg) >= MAX_HOST_ADDRESS_LENGTH) |
197 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 197 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
198 | server_ip = optarg; | 198 | server_ip = optarg; |
199 | break; | 199 | break; |
200 | case 'P': /* port */ | 200 | case 'P': /* port */ |
201 | port = atoi (optarg); | 201 | port = atoi (optarg); |
202 | break; | 202 | break; |
203 | case 'G': /* hostname */ | 203 | case 'G': /* hostname */ |
204 | if (strlen (optarg) >= MAX_INPUT_BUFFER) | 204 | if (strlen (optarg) >= MAX_INPUT_BUFFER) |
205 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); | 205 | die (STATE_UNKNOWN, _("Input buffer overflow\n")); |
206 | game_type = optarg; | 206 | game_type = optarg; |
207 | break; | 207 | break; |
208 | case 'p': /* index of ping field */ | 208 | case 'p': /* index of ping field */ |
209 | qstat_ping_field = atoi (optarg); | 209 | qstat_ping_field = atoi (optarg); |
210 | if (qstat_ping_field < 0 || qstat_ping_field > QSTAT_MAX_RETURN_ARGS) | 210 | if (qstat_ping_field < 0 || qstat_ping_field > QSTAT_MAX_RETURN_ARGS) |
211 | return ERROR; | 211 | return ERROR; |
212 | break; | 212 | break; |
213 | case 'm': /* index on map field */ | 213 | case 'm': /* index on map field */ |
214 | qstat_map_field = atoi (optarg); | 214 | qstat_map_field = atoi (optarg); |
215 | if (qstat_map_field < 0 || qstat_map_field > QSTAT_MAX_RETURN_ARGS) | 215 | if (qstat_map_field < 0 || qstat_map_field > QSTAT_MAX_RETURN_ARGS) |
216 | return ERROR; | 216 | return ERROR; |
217 | break; | 217 | break; |
218 | case 'g': /* index of game field */ | 218 | case 'g': /* index of game field */ |
219 | qstat_game_field = atoi (optarg); | 219 | qstat_game_field = atoi (optarg); |
220 | if (qstat_game_field < 0 || qstat_game_field > QSTAT_MAX_RETURN_ARGS) | 220 | if (qstat_game_field < 0 || qstat_game_field > QSTAT_MAX_RETURN_ARGS) |
221 | return ERROR; | 221 | return ERROR; |
222 | break; | 222 | break; |
223 | case 129: /* index of player count field */ | 223 | case 129: /* index of player count field */ |
224 | qstat_game_players = atoi (optarg); | 224 | qstat_game_players = atoi (optarg); |
225 | if (qstat_game_players_max == 0) | 225 | if (qstat_game_players_max == 0) |
226 | qstat_game_players_max = qstat_game_players - 1; | 226 | qstat_game_players_max = qstat_game_players - 1; |
227 | if (qstat_game_players < 0 || qstat_game_players > QSTAT_MAX_RETURN_ARGS) | 227 | if (qstat_game_players < 0 || qstat_game_players > QSTAT_MAX_RETURN_ARGS) |
228 | return ERROR; | 228 | return ERROR; |
229 | break; | 229 | break; |
230 | case 130: /* index of max players field */ | 230 | case 130: /* index of max players field */ |
231 | qstat_game_players_max = atoi (optarg); | 231 | qstat_game_players_max = atoi (optarg); |
232 | if (qstat_game_players_max < 0 || qstat_game_players_max > QSTAT_MAX_RETURN_ARGS) | 232 | if (qstat_game_players_max < 0 || qstat_game_players_max > QSTAT_MAX_RETURN_ARGS) |
233 | return ERROR; | 233 | return ERROR; |
234 | break; | 234 | break; |
235 | default: /* args not parsable */ | 235 | default: /* args not parsable */ |
236 | usage_va(_("Unknown argument - %s"), optarg); | 236 | usage_va(_("Unknown argument - %s"), optarg); |
237 | } | 237 | } |
238 | } | 238 | } |
239 | 239 | ||
240 | c = optind; | 240 | c = optind; |
241 | /* first option is the game type */ | 241 | /* first option is the game type */ |
242 | if (!game_type && c<argc) | 242 | if (!game_type && c<argc) |
243 | game_type = strdup (argv[c++]); | 243 | game_type = strdup (argv[c++]); |
244 | 244 | ||
245 | /* Second option is the server name */ | 245 | /* Second option is the server name */ |
246 | if (!server_ip && c<argc) | 246 | if (!server_ip && c<argc) |
247 | server_ip = strdup (argv[c++]); | 247 | server_ip = strdup (argv[c++]); |
248 | 248 | ||
249 | return validate_arguments (); | 249 | return validate_arguments (); |
250 | } | 250 | } |
251 | 251 | ||
252 | 252 | ||
253 | int | 253 | int |
254 | validate_arguments (void) | 254 | validate_arguments (void) |
255 | { | 255 | { |
256 | if (qstat_game_players_max < 0) | 256 | if (qstat_game_players_max < 0) |
257 | qstat_game_players_max = 4; | 257 | qstat_game_players_max = 4; |
258 | 258 | ||
259 | if (qstat_game_players < 0) | 259 | if (qstat_game_players < 0) |
260 | qstat_game_players = 5; | 260 | qstat_game_players = 5; |
261 | 261 | ||
262 | if (qstat_game_field < 0) | 262 | if (qstat_game_field < 0) |
263 | qstat_game_field = 2; | 263 | qstat_game_field = 2; |
264 | 264 | ||
265 | if (qstat_map_field < 0) | 265 | if (qstat_map_field < 0) |
266 | qstat_map_field = 3; | 266 | qstat_map_field = 3; |
267 | 267 | ||
268 | if (qstat_ping_field < 0) | 268 | if (qstat_ping_field < 0) |
269 | qstat_ping_field = 5; | 269 | qstat_ping_field = 5; |
270 | 270 | ||
271 | return OK; | 271 | return OK; |
272 | } | 272 | } |
273 | 273 | ||
274 | 274 | ||
275 | void | 275 | void |
276 | print_help (void) | 276 | print_help (void) |
277 | { | 277 | { |
278 | print_revision (progname, revision); | 278 | print_revision (progname, revision); |
279 | 279 | ||
280 | printf ("Copyright (c) 1999 Ian Cass, Knowledge Matters Limited\n"); | 280 | printf ("Copyright (c) 1999 Ian Cass, Knowledge Matters Limited\n"); |
281 | printf (COPYRIGHT, copyright, email); | 281 | printf (COPYRIGHT, copyright, email); |
282 | 282 | ||
283 | printf (_("This plugin tests game server connections with the specified host.")); | 283 | printf (_("This plugin tests game server connections with the specified host.")); |
284 | 284 | ||
285 | print_usage (); | 285 | printf ("\n\n"); |
286 | |||
287 | print_usage (); | ||
286 | 288 | ||
287 | printf (_(UT_HELP_VRSN)); | 289 | printf (_(UT_HELP_VRSN)); |
288 | 290 | ||
289 | printf (_("\ | 291 | printf (_("\ |
290 | <game> = Game type that is recognised by qstat (without the leading dash)\n\ | 292 | <game> = Game type that is recognised by qstat (without the leading dash)\n\ |
291 | <ip_address> = The IP address of the device you wish to query\n\ | 293 | <ip_address> = The IP address of the device you wish to query\n\ |
292 | [port] = Optional port of which to connect\n\ | 294 | [port] = Optional port of which to connect\n\ |
@@ -294,15 +296,25 @@ print_help (void) | |||
294 | [map_field] = Field number in raw qstat output that contains map name\n\ | 296 | [map_field] = Field number in raw qstat output that contains map name\n\ |
295 | [ping_field] = Field number in raw qstat output that contains ping time\n")); | 297 | [ping_field] = Field number in raw qstat output that contains ping time\n")); |
296 | 298 | ||
297 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | 299 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); |
298 | 300 | ||
299 | printf (_("\n\ | 301 | printf (_("Notes:")); |
300 | Notes:\n\ | 302 | |
301 | - This plugin uses the 'qstat' command, the popular game server status query tool .\n\ | 303 | printf ("\n"); |
302 | If you don't have the package installed, you will need to download it from\n\ | ||
303 | http://www.activesw.com/people/steve/qstat.html before you can use this plugin.\n")); | ||
304 | 304 | ||
305 | printf (_(UT_SUPPORT)); | 305 | printf (_("This plugin uses the 'qstat' command, the popular game server status query tool .")); |
306 | |||
307 | printf ("\n"); | ||
308 | |||
309 | printf (_("If you don't have the package installed, you will need to download it from")); | ||
310 | |||
311 | printf ("\n"); | ||
312 | |||
313 | printf (_("http://www.activesw.com/people/steve/qstat.html before you can use this plugin.")); | ||
314 | |||
315 | printf ("\n"); | ||
316 | |||
317 | printf (_(UT_SUPPORT)); | ||
306 | } | 318 | } |
307 | 319 | ||
308 | 320 | ||
@@ -310,9 +322,8 @@ Notes:\n\ | |||
310 | void | 322 | void |
311 | print_usage (void) | 323 | print_usage (void) |
312 | { | 324 | { |
313 | printf ("\ | 325 | printf (_("Usage:")); |
314 | Usage: %s <game> <ip_address> [-p port] [-gf game_field] [-mf map_field]\n\ | 326 | printf (" %s <game> <ip_address> [-p port] [-gf game_field] [-mf map_field] [-pf ping_field]\n", progname); |
315 | [-pf ping_field]\n", progname); | ||
316 | } | 327 | } |
317 | 328 | ||
318 | /****************************************************************************** | 329 | /****************************************************************************** |