Revision: 2201
http://nagiosplug.svn.sourceforge.net/nagiosplug/?rev=2201&view=rev
Author: dermoth
Date: 2009-05-26 08:32:17 +0000 (Tue, 26 May 2009)
Log Message:
-----------
Fix check_by_ssh interpretation of quotes in -C parameter (#1985246, #2268675)
From: Thomas Guyot-Sionnest <[email protected]>
Modified Paths:
--------------
nagiosplug/trunk/NEWS
nagiosplug/trunk/THANKS.in
nagiosplug/trunk/plugins/Makefile.am
nagiosplug/trunk/plugins/check_by_ssh.c
Modified: nagiosplug/trunk/NEWS
===================================================================
--- nagiosplug/trunk/NEWS 2009-05-22 22:00:13 UTC (rev 2200)
+++ nagiosplug/trunk/NEWS 2009-05-26 08:32:17 UTC (rev 2201)
@@ -36,6 +36,7 @@
Fixed awk subst.in/subst script path error (#2722832 - Martin Foster)
check_http: Add SSL/TLS hostname extension support (SNI) - (#1939022 - Joe Presbrey)
Fixed wrong perfdata label for output traffic in check_mrtgtraf (#2654308 - Gavin Williams)
+ Fixed check_by_ssh interpretation of quotes in -C parameter (#1985246, #2268675)
1.4.13 25th Sept 2008
Fix Debian bug #460097: check_http --max-age broken (Hilko Bengen)
Modified: nagiosplug/trunk/THANKS.in
===================================================================
--- nagiosplug/trunk/THANKS.in 2009-05-22 22:00:13 UTC (rev 2200)
+++ nagiosplug/trunk/THANKS.in 2009-05-26 08:32:17 UTC (rev 2201)
@@ -253,3 +253,4 @@
Ben Timby
Martin Foster
Joe Presbrey
+Will Preston
Modified: nagiosplug/trunk/plugins/Makefile.am
===================================================================
--- nagiosplug/trunk/plugins/Makefile.am 2009-05-22 22:00:13 UTC (rev 2200)
+++ nagiosplug/trunk/plugins/Makefile.am 2009-05-26 08:32:17 UTC (rev 2201)
@@ -102,7 +102,7 @@
check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
check_ups_LDADD = $(NETLIBS)
check_users_LDADD = $(BASEOBJS) popen.o
-check_by_ssh_LDADD = $(NETLIBS) runcmd.o
+check_by_ssh_LDADD = $(NETLIBS)
check_ide_smart_LDADD = $(BASEOBJS)
negate_LDADD = $(BASEOBJS)
urlize_LDADD = $(BASEOBJS) popen.o
@@ -144,7 +144,7 @@
check_ntp_time_DEPENDENCIES = check_ntp_time.c $(NETOBJS) $(DEPLIBS)
check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
-check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) runcmd.o $(DEPLIBS)
+check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) $(DEPLIBS)
negate_DEPENDENCIES = negate.c $(BASEOBJS) $(DEPLIBS)
urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS)
Modified: nagiosplug/trunk/plugins/check_by_ssh.c
===================================================================
--- nagiosplug/trunk/plugins/check_by_ssh.c 2009-05-22 22:00:13 UTC (rev 2200)
+++ nagiosplug/trunk/plugins/check_by_ssh.c 2009-05-26 08:32:17 UTC (rev 2201)
@@ -31,12 +31,17 @@
const char *email = "[email protected]";
#include "common.h"
+#include "utils.h"
#include "netutils.h"
-#include "utils.h"
-#include "runcmd.h"
+#include "utils_cmd.h"
+#ifndef NP_MAXARGS
+#define NP_MAXARGS 1024
+#endif
+
int process_arguments (int, char **);
int validate_arguments (void);
+void comm_append (const char *);
void print_help (void);
void print_usage (void);
@@ -45,7 +50,8 @@
int skip_stdout = 0;
int skip_stderr = 0;
char *remotecmd = NULL;
-char *comm = NULL;
+char **commargv = NULL;
+int commargc = 0;
char *hostname = NULL;
char *outputfile = NULL;
char *host_shortname = NULL;
@@ -63,10 +69,10 @@
int i;
time_t local_time;
FILE *fp = NULL;
- struct output chld_out, chld_err;
+ output chld_out, chld_err;
remotecmd = "";
- comm = strdup (SSH_COMMAND);
+ comm_append(SSH_COMMAND);
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
@@ -80,16 +86,19 @@
usage_va(_("Could not parse arguments"));
/* Set signal handling and alarm timeout */
- if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
+ if (signal (SIGALRM, timeout_alarm_handler) == SIG_ERR) {
usage_va(_("Cannot catch SIGALRM"));
}
alarm (timeout_interval);
/* run the command */
- if (verbose)
- printf ("%s\n", comm);
+ if (verbose) {
+ printf ("Command: %s\n", commargv[0]);
+ for (i=1; i<commargc; i++)
+ printf ("Argument %i: %s\n", i, commargv[i]);
+ }
- result = np_runcmd(comm, &chld_out, &chld_err, 0);
+ result = cmd_run_array (commargv, &chld_out, &chld_err, 0);
if (skip_stdout == -1) /* --skip-stdout specified without argument */
skip_stdout = chld_out.lines;
@@ -218,7 +227,8 @@
case 'p': /* port number */
if (!is_integer (optarg))
usage_va(_("Port must be a positive integer"));
- asprintf (&comm,"%s -p %s", comm, optarg);
+ comm_append("-p");
+ comm_append(optarg);
break;
case 'O': /* output file */
outputfile = optarg;
@@ -240,18 +250,32 @@
break;
case 'u':
- c = 'l';
+ comm_append("-l");
+ comm_append(optarg);
+ break;
case 'l': /* login name */
+ comm_append("-l");
+ comm_append(optarg);
+ break;
case 'i': /* identity */
- asprintf (&comm, "%s -%c %s", comm, c, optarg);
+ comm_append("-i");
+ comm_append(optarg);
break;
case '1': /* Pass these switches directly to ssh */
+ comm_append("-1");
+ break;
case '2': /* 1 to force version 1, 2 to force version 2 */
+ comm_append("-2");
+ break;
case '4': /* -4 for IPv4 */
+ comm_append("-4");
+ break;
case '6': /* -6 for IPv6 */
+ comm_append("-6");
+ break;
case 'f': /* fork to background */
- asprintf (&comm, "%s -%c", comm, c);
+ comm_append("-f");
break;
case 'C': /* Command for remote machine */
commands++;
@@ -276,10 +300,11 @@
skip_stderr = atoi (optarg);
break;
case 'o': /* Extra options for the ssh command */
- asprintf (&comm, "%s -%c '%s'", comm, c, optarg);
+ comm_append("-o");
+ comm_append(optarg);
break;
case 'q': /* Tell the ssh command to be quiet */
- asprintf (&comm, "%s -%c", comm, c);
+ comm_append("-q");
break;
default: /* help */
usage5();
@@ -309,13 +334,28 @@
if (remotecmd == NULL || strlen (remotecmd) <= 1)
usage_va(_("No remotecmd"));
- asprintf (&comm, "%s %s '%s'", comm, hostname, remotecmd);
+ comm_append(hostname);
+ comm_append(remotecmd);
return validate_arguments ();
}
+void
+comm_append (const char *str)
+{
+ if (++commargc > NP_MAXARGS)
+ die(STATE_UNKNOWN, _("%s: Argument limit of %d exceeded\n"), progname, NP_MAXARGS);
+
+ if ((commargv = (char **)realloc(commargv, (commargc+1) * sizeof(char *))) == NULL)
+ die(STATE_UNKNOWN, _("Can not (re)allocate 'commargv' buffer\n"));
+
+ commargv[commargc-1] = strdup(str);
+ commargv[commargc] = NULL;
+
+}
+
int
validate_arguments (void)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, &
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.