summaryrefslogtreecommitdiffstats
path: root/plugins/check_by_ssh.c
diff options
context:
space:
mode:
authorHolger Weiss <hweiss@users.sourceforge.net>2007-04-18 19:31:29 (GMT)
committerHolger Weiss <hweiss@users.sourceforge.net>2007-04-18 19:31:29 (GMT)
commit4e83bc016cd399a123fe6cf68e21b72c2b65ad78 (patch)
tree890b1f4388fb671ed06b9f80b731b8f5595afaed /plugins/check_by_ssh.c
parent9524f9e6251bb906df3cc0174c5e92a9842ab062 (diff)
downloadmonitoring-plugins-4e83bc016cd399a123fe6cf68e21b72c2b65ad78.tar.gz
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
Diffstat (limited to 'plugins/check_by_ssh.c')
-rw-r--r--plugins/check_by_ssh.c65
1 files changed, 45 insertions, 20 deletions
diff --git a/plugins/check_by_ssh.c b/plugins/check_by_ssh.c
index 65eee3c..6855ebc 100644
--- a/plugins/check_by_ssh.c
+++ b/plugins/check_by_ssh.c
@@ -48,7 +48,8 @@ void print_usage (void);
48 48
49unsigned int commands = 0; 49unsigned int commands = 0;
50unsigned int services = 0; 50unsigned int services = 0;
51unsigned int skip = 0; 51int skip_stdout = 0;
52int skip_stderr = 0;
52char *remotecmd = NULL; 53char *remotecmd = NULL;
53char *comm = NULL; 54char *comm = NULL;
54char *hostname = NULL; 55char *hostname = NULL;
@@ -92,18 +93,27 @@ main (int argc, char **argv)
92 printf ("%s\n", comm); 93 printf ("%s\n", comm);
93 94
94 result = np_runcmd(comm, &chld_out, &chld_err, 0); 95 result = np_runcmd(comm, &chld_out, &chld_err, 0);
96
97 if (skip_stdout == -1) /* --skip-stdout specified without argument */
98 skip_stdout = chld_out.lines;
99 if (skip_stderr == -1) /* --skip-stderr specified without argument */
100 skip_stderr = chld_err.lines;
101
95 /* UNKNOWN if (non-skipped) output found on stderr */ 102 /* UNKNOWN if (non-skipped) output found on stderr */
96 if((signed)chld_err.lines - (signed)skip > 0) { 103 if(chld_err.lines > skip_stderr) {
97 printf(_("Remote command execution failed: %s\n"), 104 printf (_("Remote command execution failed: %s\n"),
98 skip < chld_err.lines ? chld_err.line[skip] : chld_err.buf); 105 chld_err.line[skip_stderr]);
99 return STATE_UNKNOWN; 106 return STATE_UNKNOWN;
100 } 107 }
101 skip -= chld_err.lines;
102 108
103 /* this is simple if we're not supposed to be passive. 109 /* this is simple if we're not supposed to be passive.
104 * Wrap up quickly and keep the tricks below */ 110 * Wrap up quickly and keep the tricks below */
105 if(!passive) { 111 if(!passive) {
106 printf ("%s\n", skip < chld_out.lines ? chld_out.line[skip] : chld_out.buf); 112 if (chld_out.lines > skip_stdout)
113 puts (chld_out.line[skip_stdout]);
114 else
115 printf (_("%s - check_by_ssh: Remote command '%s' returned status %d\n"),
116 state_text(result), remotecmd, result);
107 return result; /* return error status from remote command */ 117 return result; /* return error status from remote command */
108 } 118 }
109 119
@@ -120,7 +130,7 @@ main (int argc, char **argv)
120 130
121 local_time = time (NULL); 131 local_time = time (NULL);
122 commands = 0; 132 commands = 0;
123 for(i = skip; chld_out.line[i]; i++) { 133 for(i = skip_stdout; i < chld_out.lines; i++) {
124 status_text = strstr (chld_out.line[i], "STATUS CODE: "); 134 status_text = strstr (chld_out.line[i], "STATUS CODE: ");
125 if (status_text == NULL) { 135 if (status_text == NULL) {
126 printf ("%s", chld_out.line[i]); 136 printf ("%s", chld_out.line[i]);
@@ -162,7 +172,9 @@ process_arguments (int argc, char **argv)
162 {"user", required_argument, 0, 'u'}, 172 {"user", required_argument, 0, 'u'},
163 {"logname", required_argument, 0, 'l'}, 173 {"logname", required_argument, 0, 'l'},
164 {"command", required_argument, 0, 'C'}, 174 {"command", required_argument, 0, 'C'},
165 {"skip", required_argument, 0, 'S'}, 175 {"skip", optional_argument, 0, 'S'}, /* backwards compatibility */
176 {"skip-stdout", optional_argument, 0, 'S'},
177 {"skip-stderr", optional_argument, 0, 'E'},
166 {"proto1", no_argument, 0, '1'}, 178 {"proto1", no_argument, 0, '1'},
167 {"proto2", no_argument, 0, '2'}, 179 {"proto2", no_argument, 0, '2'},
168 {"use-ipv4", no_argument, 0, '4'}, 180 {"use-ipv4", no_argument, 0, '4'},
@@ -180,7 +192,7 @@ process_arguments (int argc, char **argv)
180 strcpy (argv[c], "-t"); 192 strcpy (argv[c], "-t");
181 193
182 while (1) { 194 while (1) {
183 c = getopt_long (argc, argv, "Vvh1246fqt:H:O:p:i:u:l:C:S:n:s:o:", longopts, 195 c = getopt_long (argc, argv, "Vvh1246fqt:H:O:p:i:u:l:C:S::E::n:s:o:", longopts,
184 &option); 196 &option);
185 197
186 if (c == -1 || c == EOF) 198 if (c == -1 || c == EOF)
@@ -250,11 +262,21 @@ process_arguments (int argc, char **argv)
250 asprintf (&remotecmd, "%s;echo STATUS CODE: $?;", remotecmd); 262 asprintf (&remotecmd, "%s;echo STATUS CODE: $?;", remotecmd);
251 asprintf (&remotecmd, "%s%s", remotecmd, optarg); 263 asprintf (&remotecmd, "%s%s", remotecmd, optarg);
252 break; 264 break;
253 case 'S': /* Skip n lines in the output to ignore system banner */ 265 case 'S': /* skip n (or all) lines on stdout */
254 if (!is_integer (optarg)) 266 if (optarg == NULL)
255 usage_va(_("skip lines must be an integer")); 267 skip_stdout = -1; /* skip all output on stdout */
268 else if (!is_integer (optarg))
269 usage_va(_("skip-stdout argument must be an integer"));
270 else
271 skip_stdout = atoi (optarg);
272 break;
273 case 'E': /* skip n (or all) lines on stderr */
274 if (optarg == NULL)
275 skip_stderr = -1; /* skip all output on stderr */
276 else if (!is_integer (optarg))
277 usage_va(_("skip-stderr argument must be an integer"));
256 else 278 else
257 skip = atoi (optarg); 279 skip_stderr = atoi (optarg);
258 break; 280 break;
259 case 'o': /* Extra options for the ssh command */ 281 case 'o': /* Extra options for the ssh command */
260 asprintf (&comm, "%s -%c '%s'", comm, c, optarg); 282 asprintf (&comm, "%s -%c '%s'", comm, c, optarg);
@@ -334,13 +356,15 @@ print_help (void)
334 printf (_(UT_IPv46)); 356 printf (_(UT_IPv46));
335 357
336 printf (" %s\n", "-1, --proto1"); 358 printf (" %s\n", "-1, --proto1");
337 printf (" %s\n", _("tell ssh to use Protocol 1")); 359 printf (" %s\n", _("tell ssh to use Protocol 1 [optional]"));
338 printf (" %s\n", "-2, --proto2"); 360 printf (" %s\n", "-2, --proto2");
339 printf (" %s\n", _("tell ssh to use Protocol 2")); 361 printf (" %s\n", _("tell ssh to use Protocol 2 [optional]"));
340 printf (" %s\n", "-S, --skip=n"); 362 printf (" %s\n", "-S, --skip-stdout[=n]");
341 printf (" %s\n", _("Ignore first n lines on STDERR (to suppress a logon banner)")); 363 printf (" %s\n", _("Ignore all or (if specified) first n lines on STDOUT [optional]"));
364 printf (" %s\n", "-E, --skip-stderr[=n]");
365 printf (" %s\n", _("Ignore all or (if specified) first n lines on STDERR [optional]"));
342 printf (" %s\n", "-f"); 366 printf (" %s\n", "-f");
343 printf (" %s\n", _("tells ssh to fork rather than create a tty")); 367 printf (" %s\n", _("tells ssh to fork rather than create a tty [optional]"));
344 printf (" %s\n","-C, --command='COMMAND STRING'"); 368 printf (" %s\n","-C, --command='COMMAND STRING'");
345 printf (" %s\n", _("command to execute on the remote machine")); 369 printf (" %s\n", _("command to execute on the remote machine"));
346 printf (" %s\n","-l, --logname=USERNAME"); 370 printf (" %s\n","-l, --logname=USERNAME");
@@ -385,7 +409,8 @@ print_usage (void)
385{ 409{
386 printf (_("Usage:")); 410 printf (_("Usage:"));
387 printf (" %s -H <host> -C <command> [-fq] [-1|-2] [-4|-6]\n" 411 printf (" %s -H <host> -C <command> [-fq] [-1|-2] [-4|-6]\n"
388 " [-S lines] [-t timeout] [-i identity] [-l user] [-n name]\n" 412 " [-S [lines]] [-E [lines]] [-t timeout] [-i identity]\n"
389 " [-s servicelist] [-O outputfile] [-p port] [-o ssh-option]\n", 413 " [-l user] [-n name] [-s servicelist] [-O outputfile]\n"
414 " [-p port] [-o ssh-option]\n",
390 progname); 415 progname);
391} 416}