Code

Fix translations when extra-opts aren't enabled
[nagiosplug.git] / plugins / check_by_ssh.c
index 05c348487717fe0a1a3e734cff9536d8bc5c3a58..b688d4350ca3ae040e79d47c5645f270363f23c7 100644 (file)
@@ -5,8 +5,6 @@
 * License: GPL
 * Copyright (c) 2000-2008 Nagios Plugins Development Team
 * 
-* Last Modified: $Date$
-* 
 * Description:
 * 
 * This file contains the check_by_ssh plugin
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
-* $Id$
 * 
 *****************************************************************************/
 
 const char *progname = "check_by_ssh";
-const char *revision = "$Revision$";
 const char *copyright = "2000-2008";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 #include "common.h"
-#include "netutils.h"
 #include "utils.h"
-#include "runcmd.h"
+#include "netutils.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);
 
@@ -49,7 +50,8 @@ unsigned int services = 0;
 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;
@@ -67,10 +69,10 @@ main (int argc, char **argv)
        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);
@@ -84,16 +86,19 @@ main (int argc, char **argv)
                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;
@@ -201,7 +206,7 @@ process_arguments (int argc, char **argv)
 
                switch (c) {
                case 'V':                                                                       /* version */
-                       print_revision (progname, revision);
+                       print_revision (progname, NP_VERSION);
                        exit (STATE_OK);
                case 'h':                                                                       /* help */
                        print_help ();
@@ -222,7 +227,8 @@ process_arguments (int argc, char **argv)
                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;
@@ -244,18 +250,32 @@ process_arguments (int argc, char **argv)
                        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++;
@@ -280,10 +300,11 @@ process_arguments (int argc, char **argv)
                                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();
@@ -313,12 +334,27 @@ process_arguments (int argc, char **argv)
        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)
@@ -339,7 +375,7 @@ validate_arguments (void)
 void
 print_help (void)
 {
-       print_revision (progname, revision);
+       print_revision (progname, NP_VERSION);
 
        printf ("Copyright (c) 1999 Karl DeBisschop <kdebisschop@users.sourceforge.net>\n");
        printf (COPYRIGHT, copyright, email);
@@ -350,13 +386,13 @@ print_help (void)
 
        print_usage ();
 
-       printf (_(UT_HELP_VRSN));
+       printf (UT_HELP_VRSN);
 
-       printf (_(UT_EXTRA_OPTS));
+       printf (UT_EXTRA_OPTS);
 
-       printf (_(UT_HOST_PORT), 'p', "none");
+       printf (UT_HOST_PORT, 'p', "none");
 
-       printf (_(UT_IPv46));
+       printf (UT_IPv46);
 
   printf (" %s\n", "-1, --proto1");
   printf ("    %s\n", _("tell ssh to use Protocol 1 [optional]"));
@@ -367,7 +403,7 @@ print_help (void)
   printf (" %s\n", "-E, --skip-stderr[=n]");
   printf ("    %s\n", _("Ignore all or (if specified) first n lines on STDERR [optional]"));
   printf (" %s\n", "-f");
-  printf ("    %s\n", _("tells ssh to fork rather than create a tty [optional]"));
+  printf ("    %s\n", _("tells ssh to fork rather than create a tty [optional]. This will always return OK if ssh is executed"));
   printf (" %s\n","-C, --command='COMMAND STRING'");
   printf ("    %s\n", _("command to execute on the remote machine"));
   printf (" %s\n","-l, --logname=USERNAME");
@@ -384,9 +420,9 @@ print_help (void)
   printf ("    %s\n", _("Call ssh with '-o OPTION' (may be used multiple times) [optional]"));
   printf (" %s\n","-q, --quiet");
   printf ("    %s\n", _("Tell ssh to suppress warning and diagnostic messages [optional]"));
-       printf (_(UT_WARN_CRIT));
-       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
-       printf (_(UT_VERBOSE));
+       printf (UT_WARN_CRIT);
+       printf (UT_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
+       printf (UT_VERBOSE);
        printf("\n");
   printf (" %s\n", _("The most common mode of use is to refer to a local identity file with"));
   printf (" %s\n", _("the '-i' option. In this mode, the identity pair should have a null"));
@@ -409,10 +445,10 @@ print_help (void)
 #ifdef NP_EXTRA_OPTS
        printf("\n");
        printf("%s\n", _("Notes:"));
-       printf(_(UT_EXTRA_OPTS_NOTES));
+       printf(UT_EXTRA_OPTS_NOTES);
 #endif
 
-       printf(_(UT_SUPPORT));
+       printf(UT_SUPPORT);
 }