From 4e83bc016cd399a123fe6cf68e21b72c2b65ad78 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 18 Apr 2007 19:31:29 +0000 Subject: Revert my previous change to "-S/--skip" in favour of the two options "-E/--skip-stderr" and "-S/--skip-stdout". Both of them support omitting the number of lines to skip, in which case all output on the respective file descriptor is skipped. "--skip" is kept as an alias for "--skip-stdout" for backwards compatibility with recent releases. Also, print a message if no (non-skipped) stdout/stderr output is available. This fixes a segfault if the remote command prints no output. git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1692 f882894a-f735-0410-b71e-b25c423dba1c --- plugins/check_by_ssh.c | 65 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 20 deletions(-) (limited to 'plugins') diff --git a/plugins/check_by_ssh.c b/plugins/check_by_ssh.c index 65eee3c5..6855ebc0 100644 --- a/plugins/check_by_ssh.c +++ b/plugins/check_by_ssh.c @@ -48,7 +48,8 @@ void print_usage (void); unsigned int commands = 0; unsigned int services = 0; -unsigned int skip = 0; +int skip_stdout = 0; +int skip_stderr = 0; char *remotecmd = NULL; char *comm = NULL; char *hostname = NULL; @@ -92,18 +93,27 @@ main (int argc, char **argv) printf ("%s\n", comm); result = np_runcmd(comm, &chld_out, &chld_err, 0); + + if (skip_stdout == -1) /* --skip-stdout specified without argument */ + skip_stdout = chld_out.lines; + if (skip_stderr == -1) /* --skip-stderr specified without argument */ + skip_stderr = chld_err.lines; + /* UNKNOWN if (non-skipped) output found on stderr */ - if((signed)chld_err.lines - (signed)skip > 0) { - printf(_("Remote command execution failed: %s\n"), - skip < chld_err.lines ? chld_err.line[skip] : chld_err.buf); + if(chld_err.lines > skip_stderr) { + printf (_("Remote command execution failed: %s\n"), + chld_err.line[skip_stderr]); return STATE_UNKNOWN; } - skip -= chld_err.lines; /* this is simple if we're not supposed to be passive. * Wrap up quickly and keep the tricks below */ if(!passive) { - printf ("%s\n", skip < chld_out.lines ? chld_out.line[skip] : chld_out.buf); + if (chld_out.lines > skip_stdout) + puts (chld_out.line[skip_stdout]); + else + printf (_("%s - check_by_ssh: Remote command '%s' returned status %d\n"), + state_text(result), remotecmd, result); return result; /* return error status from remote command */ } @@ -120,7 +130,7 @@ main (int argc, char **argv) local_time = time (NULL); commands = 0; - for(i = skip; chld_out.line[i]; i++) { + for(i = skip_stdout; i < chld_out.lines; i++) { status_text = strstr (chld_out.line[i], "STATUS CODE: "); if (status_text == NULL) { printf ("%s", chld_out.line[i]); @@ -162,7 +172,9 @@ process_arguments (int argc, char **argv) {"user", required_argument, 0, 'u'}, {"logname", required_argument, 0, 'l'}, {"command", required_argument, 0, 'C'}, - {"skip", required_argument, 0, 'S'}, + {"skip", optional_argument, 0, 'S'}, /* backwards compatibility */ + {"skip-stdout", optional_argument, 0, 'S'}, + {"skip-stderr", optional_argument, 0, 'E'}, {"proto1", no_argument, 0, '1'}, {"proto2", no_argument, 0, '2'}, {"use-ipv4", no_argument, 0, '4'}, @@ -180,7 +192,7 @@ process_arguments (int argc, char **argv) strcpy (argv[c], "-t"); while (1) { - c = getopt_long (argc, argv, "Vvh1246fqt:H:O:p:i:u:l:C:S:n:s:o:", longopts, + c = getopt_long (argc, argv, "Vvh1246fqt:H:O:p:i:u:l:C:S::E::n:s:o:", longopts, &option); if (c == -1 || c == EOF) @@ -250,11 +262,21 @@ process_arguments (int argc, char **argv) asprintf (&remotecmd, "%s;echo STATUS CODE: $?;", remotecmd); asprintf (&remotecmd, "%s%s", remotecmd, optarg); break; - case 'S': /* Skip n lines in the output to ignore system banner */ - if (!is_integer (optarg)) - usage_va(_("skip lines must be an integer")); + case 'S': /* skip n (or all) lines on stdout */ + if (optarg == NULL) + skip_stdout = -1; /* skip all output on stdout */ + else if (!is_integer (optarg)) + usage_va(_("skip-stdout argument must be an integer")); + else + skip_stdout = atoi (optarg); + break; + case 'E': /* skip n (or all) lines on stderr */ + if (optarg == NULL) + skip_stderr = -1; /* skip all output on stderr */ + else if (!is_integer (optarg)) + usage_va(_("skip-stderr argument must be an integer")); else - skip = atoi (optarg); + skip_stderr = atoi (optarg); break; case 'o': /* Extra options for the ssh command */ asprintf (&comm, "%s -%c '%s'", comm, c, optarg); @@ -334,13 +356,15 @@ print_help (void) printf (_(UT_IPv46)); printf (" %s\n", "-1, --proto1"); - printf (" %s\n", _("tell ssh to use Protocol 1")); + printf (" %s\n", _("tell ssh to use Protocol 1 [optional]")); printf (" %s\n", "-2, --proto2"); - printf (" %s\n", _("tell ssh to use Protocol 2")); - printf (" %s\n", "-S, --skip=n"); - printf (" %s\n", _("Ignore first n lines on STDERR (to suppress a logon banner)")); + printf (" %s\n", _("tell ssh to use Protocol 2 [optional]")); + printf (" %s\n", "-S, --skip-stdout[=n]"); + printf (" %s\n", _("Ignore all or (if specified) first n lines on STDOUT [optional]")); + 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")); + printf (" %s\n", _("tells ssh to fork rather than create a tty [optional]")); printf (" %s\n","-C, --command='COMMAND STRING'"); printf (" %s\n", _("command to execute on the remote machine")); printf (" %s\n","-l, --logname=USERNAME"); @@ -385,7 +409,8 @@ print_usage (void) { printf (_("Usage:")); printf (" %s -H -C [-fq] [-1|-2] [-4|-6]\n" - " [-S lines] [-t timeout] [-i identity] [-l user] [-n name]\n" - " [-s servicelist] [-O outputfile] [-p port] [-o ssh-option]\n", + " [-S [lines]] [-E [lines]] [-t timeout] [-i identity]\n" + " [-l user] [-n name] [-s servicelist] [-O outputfile]\n" + " [-p port] [-o ssh-option]\n", progname); } -- cgit v1.2.3-74-g34f1