Browse Source

add option to ignore a specified number of lines on stderr
(to suppress a login banner)


git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@823 f882894a-f735-0410-b71e-b25c423dba1c

Karl DeBisschop 22 years ago
parent
commit
b8c407e0f5
1 changed files with 23 additions and 7 deletions
  1. 23 7
      plugins/check_by_ssh.c

+ 23 - 7
plugins/check_by_ssh.c

@@ -33,6 +33,7 @@ void print_usage (void);
 
 int commands = 0;
 int services = 0;
+int skip_lines = 0;
 char *remotecmd = NULL;
 char *comm = NULL;
 char *hostname = NULL;
@@ -101,15 +102,20 @@ main (int argc, char **argv)
 	while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process))
 		asprintf (&result_text, "%s%s", result_text, input_buffer);
 
-
 	/* WARNING if output found on stderr */
-	if (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) {
-		printf ("%s\n", input_buffer);
-		while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process))
-			printf ("%s\n", input_buffer);
-		return STATE_WARNING;
+	while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) {
+		if (skip_lines > 0) {
+			if (input_buffer[strlen(input_buffer)-1] == '\n') {
+				skip_lines--;
+			}
+		} else {
+			printf ("%s", input_buffer);
+			result = STATE_WARNING;
+		}
 	}
 	(void) fclose (child_stderr);
+	if (result == STATE_WARNING)
+		return result;
 
 
 	/* close the pipe */
@@ -189,6 +195,7 @@ 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'},
 		{"proto1", no_argument, 0, '1'},
 		{"proto2", no_argument, 0, '2'},
 		{"use-ipv4", no_argument, 0, '4'},
@@ -204,7 +211,7 @@ process_arguments (int argc, char **argv)
 			strcpy (argv[c], "-t");
 
 	while (1) {
-		c = getopt_long (argc, argv, "Vvh1246ft:H:O:p:i:u:l:C:n:s:", longopts,
+		c = getopt_long (argc, argv, "Vvh1246ft:H:O:p:i:u:l:C:S:n:s:", longopts,
 									 &option);
 
 		if (c == -1 || c == EOF)
@@ -275,6 +282,13 @@ process_arguments (int argc, char **argv)
 			if (commands > 1)
 				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))
+				usage2 (_("skip lines must be an integer"), optarg);
+			else
+				skip_lines = atoi (optarg);
+			break;
 		}
 	}
 
@@ -353,6 +367,8 @@ print_help (void)
     tell ssh to use Protocol 1\n\
  -2, --proto2\n\
     tell ssh to use Protocol 2\n\
+ -S, --skiplines=n\n\
+    Ignore first n lines on STDERR (to suppress a logon banner)\n\
  -f\n\
     tells ssh to fork rather than create a tty\n"));