diff options
author | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2009-05-26 08:17:07 (GMT) |
---|---|---|
committer | Thomas Guyot-Sionnest <dermoth@aei.ca> | 2009-05-26 08:28:41 (GMT) |
commit | fcc4db5aaadad9784d4a940aea239db46f1b0fe9 (patch) | |
tree | 1a6b31bc38ff60b8ca86ac512916a2b9b04e541b | |
parent | 221cb4920606552d670fdd264757dffe5d884015 (diff) | |
download | monitoring-plugins-fcc4db5aaadad9784d4a940aea239db46f1b0fe9.tar.gz |
Fix check_by_ssh interpretation of quotes in -C parameter (#1985246, #2268675)
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | THANKS.in | 1 | ||||
-rw-r--r-- | plugins/Makefile.am | 4 | ||||
-rw-r--r-- | plugins/check_by_ssh.c | 72 |
4 files changed, 60 insertions, 18 deletions
@@ -36,6 +36,7 @@ This file documents the major additions and syntax changes between releases. | |||
36 | Fixed awk subst.in/subst script path error (#2722832 - Martin Foster) | 36 | Fixed awk subst.in/subst script path error (#2722832 - Martin Foster) |
37 | check_http: Add SSL/TLS hostname extension support (SNI) - (#1939022 - Joe Presbrey) | 37 | check_http: Add SSL/TLS hostname extension support (SNI) - (#1939022 - Joe Presbrey) |
38 | Fixed wrong perfdata label for output traffic in check_mrtgtraf (#2654308 - Gavin Williams) | 38 | Fixed wrong perfdata label for output traffic in check_mrtgtraf (#2654308 - Gavin Williams) |
39 | Fixed check_by_ssh interpretation of quotes in -C parameter (#1985246, #2268675) | ||
39 | 40 | ||
40 | 1.4.13 25th Sept 2008 | 41 | 1.4.13 25th Sept 2008 |
41 | Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen) | 42 | Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen) |
@@ -253,3 +253,4 @@ Chris Pepper | |||
253 | Ben Timby | 253 | Ben Timby |
254 | Martin Foster | 254 | Martin Foster |
255 | Joe Presbrey | 255 | Joe Presbrey |
256 | Will Preston | ||
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 4e1f210..37de753 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am | |||
@@ -102,7 +102,7 @@ check_time_LDADD = $(NETLIBS) | |||
102 | check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) | 102 | check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS) |
103 | check_ups_LDADD = $(NETLIBS) | 103 | check_ups_LDADD = $(NETLIBS) |
104 | check_users_LDADD = $(BASEOBJS) popen.o | 104 | check_users_LDADD = $(BASEOBJS) popen.o |
105 | check_by_ssh_LDADD = $(NETLIBS) runcmd.o | 105 | check_by_ssh_LDADD = $(NETLIBS) |
106 | check_ide_smart_LDADD = $(BASEOBJS) | 106 | check_ide_smart_LDADD = $(BASEOBJS) |
107 | negate_LDADD = $(BASEOBJS) | 107 | negate_LDADD = $(BASEOBJS) |
108 | urlize_LDADD = $(BASEOBJS) popen.o | 108 | urlize_LDADD = $(BASEOBJS) popen.o |
@@ -144,7 +144,7 @@ check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS) | |||
144 | check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS) | 144 | check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS) |
145 | check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS) | 145 | check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS) |
146 | check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS) | 146 | check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS) |
147 | check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) runcmd.o $(DEPLIBS) | 147 | check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) $(DEPLIBS) |
148 | negate_DEPENDENCIES = negate.c $(BASEOBJS) $(DEPLIBS) | 148 | negate_DEPENDENCIES = negate.c $(BASEOBJS) $(DEPLIBS) |
149 | urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS) | 149 | urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS) |
150 | 150 | ||
diff --git a/plugins/check_by_ssh.c b/plugins/check_by_ssh.c index d0dbf34..793c03d 100644 --- a/plugins/check_by_ssh.c +++ b/plugins/check_by_ssh.c | |||
@@ -31,12 +31,17 @@ const char *copyright = "2000-2008"; | |||
31 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 31 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
32 | 32 | ||
33 | #include "common.h" | 33 | #include "common.h" |
34 | #include "netutils.h" | ||
35 | #include "utils.h" | 34 | #include "utils.h" |
36 | #include "runcmd.h" | 35 | #include "netutils.h" |
36 | #include "utils_cmd.h" | ||
37 | |||
38 | #ifndef NP_MAXARGS | ||
39 | #define NP_MAXARGS 1024 | ||
40 | #endif | ||
37 | 41 | ||
38 | int process_arguments (int, char **); | 42 | int process_arguments (int, char **); |
39 | int validate_arguments (void); | 43 | int validate_arguments (void); |
44 | void comm_append (const char *); | ||
40 | void print_help (void); | 45 | void print_help (void); |
41 | void print_usage (void); | 46 | void print_usage (void); |
42 | 47 | ||
@@ -45,7 +50,8 @@ unsigned int services = 0; | |||
45 | int skip_stdout = 0; | 50 | int skip_stdout = 0; |
46 | int skip_stderr = 0; | 51 | int skip_stderr = 0; |
47 | char *remotecmd = NULL; | 52 | char *remotecmd = NULL; |
48 | char *comm = NULL; | 53 | char **commargv = NULL; |
54 | int commargc = 0; | ||
49 | char *hostname = NULL; | 55 | char *hostname = NULL; |
50 | char *outputfile = NULL; | 56 | char *outputfile = NULL; |
51 | char *host_shortname = NULL; | 57 | char *host_shortname = NULL; |
@@ -63,10 +69,10 @@ main (int argc, char **argv) | |||
63 | int i; | 69 | int i; |
64 | time_t local_time; | 70 | time_t local_time; |
65 | FILE *fp = NULL; | 71 | FILE *fp = NULL; |
66 | struct output chld_out, chld_err; | 72 | output chld_out, chld_err; |
67 | 73 | ||
68 | remotecmd = ""; | 74 | remotecmd = ""; |
69 | comm = strdup (SSH_COMMAND); | 75 | comm_append(SSH_COMMAND); |
70 | 76 | ||
71 | setlocale (LC_ALL, ""); | 77 | setlocale (LC_ALL, ""); |
72 | bindtextdomain (PACKAGE, LOCALEDIR); | 78 | bindtextdomain (PACKAGE, LOCALEDIR); |
@@ -80,16 +86,19 @@ main (int argc, char **argv) | |||
80 | usage_va(_("Could not parse arguments")); | 86 | usage_va(_("Could not parse arguments")); |
81 | 87 | ||
82 | /* Set signal handling and alarm timeout */ | 88 | /* Set signal handling and alarm timeout */ |
83 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { | 89 | if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) { |
84 | usage_va(_("Cannot catch SIGALRM")); | 90 | usage_va(_("Cannot catch SIGALRM")); |
85 | } | 91 | } |
86 | alarm (timeout_interval); | 92 | alarm (timeout_interval); |
87 | 93 | ||
88 | /* run the command */ | 94 | /* run the command */ |
89 | if (verbose) | 95 | if (verbose) { |
90 | printf ("%s\n", comm); | 96 | printf ("Command: %s\n", commargv[0]); |
97 | for (i=1; i<commargc; i++) | ||
98 | printf ("Argument %i: %s\n", i, commargv[i]); | ||
99 | } | ||
91 | 100 | ||
92 | result = np_runcmd(comm, &chld_out, &chld_err, 0); | 101 | result = cmd_run_array (commargv, &chld_out, &chld_err, 0); |
93 | 102 | ||
94 | if (skip_stdout == -1) /* --skip-stdout specified without argument */ | 103 | if (skip_stdout == -1) /* --skip-stdout specified without argument */ |
95 | skip_stdout = chld_out.lines; | 104 | skip_stdout = chld_out.lines; |
@@ -218,7 +227,8 @@ process_arguments (int argc, char **argv) | |||
218 | case 'p': /* port number */ | 227 | case 'p': /* port number */ |
219 | if (!is_integer (optarg)) | 228 | if (!is_integer (optarg)) |
220 | usage_va(_("Port must be a positive integer")); | 229 | usage_va(_("Port must be a positive integer")); |
221 | asprintf (&comm,"%s -p %s", comm, optarg); | 230 | comm_append("-p"); |
231 | comm_append(optarg); | ||
222 | break; | 232 | break; |
223 | case 'O': /* output file */ | 233 | case 'O': /* output file */ |
224 | outputfile = optarg; | 234 | outputfile = optarg; |
@@ -240,18 +250,32 @@ process_arguments (int argc, char **argv) | |||
240 | break; | 250 | break; |
241 | 251 | ||
242 | case 'u': | 252 | case 'u': |
243 | c = 'l'; | 253 | comm_append("-l"); |
254 | comm_append(optarg); | ||
255 | break; | ||
244 | case 'l': /* login name */ | 256 | case 'l': /* login name */ |
257 | comm_append("-l"); | ||
258 | comm_append(optarg); | ||
259 | break; | ||
245 | case 'i': /* identity */ | 260 | case 'i': /* identity */ |
246 | asprintf (&comm, "%s -%c %s", comm, c, optarg); | 261 | comm_append("-i"); |
262 | comm_append(optarg); | ||
247 | break; | 263 | break; |
248 | 264 | ||
249 | case '1': /* Pass these switches directly to ssh */ | 265 | case '1': /* Pass these switches directly to ssh */ |
266 | comm_append("-1"); | ||
267 | break; | ||
250 | case '2': /* 1 to force version 1, 2 to force version 2 */ | 268 | case '2': /* 1 to force version 1, 2 to force version 2 */ |
269 | comm_append("-2"); | ||
270 | break; | ||
251 | case '4': /* -4 for IPv4 */ | 271 | case '4': /* -4 for IPv4 */ |
272 | comm_append("-4"); | ||
273 | break; | ||
252 | case '6': /* -6 for IPv6 */ | 274 | case '6': /* -6 for IPv6 */ |
275 | comm_append("-6"); | ||
276 | break; | ||
253 | case 'f': /* fork to background */ | 277 | case 'f': /* fork to background */ |
254 | asprintf (&comm, "%s -%c", comm, c); | 278 | comm_append("-f"); |
255 | break; | 279 | break; |
256 | case 'C': /* Command for remote machine */ | 280 | case 'C': /* Command for remote machine */ |
257 | commands++; | 281 | commands++; |
@@ -276,10 +300,11 @@ process_arguments (int argc, char **argv) | |||
276 | skip_stderr = atoi (optarg); | 300 | skip_stderr = atoi (optarg); |
277 | break; | 301 | break; |
278 | case 'o': /* Extra options for the ssh command */ | 302 | case 'o': /* Extra options for the ssh command */ |
279 | asprintf (&comm, "%s -%c '%s'", comm, c, optarg); | 303 | comm_append("-o"); |
304 | comm_append(optarg); | ||
280 | break; | 305 | break; |
281 | case 'q': /* Tell the ssh command to be quiet */ | 306 | case 'q': /* Tell the ssh command to be quiet */ |
282 | asprintf (&comm, "%s -%c", comm, c); | 307 | comm_append("-q"); |
283 | break; | 308 | break; |
284 | default: /* help */ | 309 | default: /* help */ |
285 | usage5(); | 310 | usage5(); |
@@ -309,12 +334,27 @@ process_arguments (int argc, char **argv) | |||
309 | if (remotecmd == NULL || strlen (remotecmd) <= 1) | 334 | if (remotecmd == NULL || strlen (remotecmd) <= 1) |
310 | usage_va(_("No remotecmd")); | 335 | usage_va(_("No remotecmd")); |
311 | 336 | ||
312 | asprintf (&comm, "%s %s '%s'", comm, hostname, remotecmd); | 337 | comm_append(hostname); |
338 | comm_append(remotecmd); | ||
313 | 339 | ||
314 | return validate_arguments (); | 340 | return validate_arguments (); |
315 | } | 341 | } |
316 | 342 | ||
317 | 343 | ||
344 | void | ||
345 | comm_append (const char *str) | ||
346 | { | ||
347 | |||
348 | if (++commargc > NP_MAXARGS) | ||
349 | die(STATE_UNKNOWN, _("%s: Argument limit of %d exceeded\n"), progname, NP_MAXARGS); | ||
350 | |||
351 | if ((commargv = (char **)realloc(commargv, (commargc+1) * sizeof(char *))) == NULL) | ||
352 | die(STATE_UNKNOWN, _("Can not (re)allocate 'commargv' buffer\n")); | ||
353 | |||
354 | commargv[commargc-1] = strdup(str); | ||
355 | commargv[commargc] = NULL; | ||
356 | |||
357 | } | ||
318 | 358 | ||
319 | int | 359 | int |
320 | validate_arguments (void) | 360 | validate_arguments (void) |