Просмотр исходного кода

check_tcp: don't ignore trailing options

"./check_tcp -6 -p 80 host" leads to an error:
TCP CRITICAL - Invalid hostname, address or socket: 127.0.0.1
because 127.0.0.1 is the fallback host, the tailing hostname
was ignored.
Sven Nierlein 13 лет назад
Родитель
Сommit
5fce5ceaeb
2 измененных файлов с 18 добавлено и 11 удалено
  1. 15 10
      plugins/check_tcp.c
  2. 3 1
      plugins/t/check_tcp.t

+ 15 - 10
plugins/check_tcp.c

@@ -1,30 +1,30 @@
 /*****************************************************************************
-* 
+*
 * Nagios check_tcp plugin
-* 
+*
 * License: GPL
 * Copyright (c) 1999-2008 Nagios Plugins Development Team
-* 
+*
 * Description:
-* 
+*
 * This file contains the check_tcp plugin
-* 
-* 
+*
+*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
-* 
+*
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
-* 
+*
 * 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$
-* 
+*
 *****************************************************************************/
 
 /* progname "check_tcp" changes depending on symlink called */
@@ -61,6 +61,7 @@ static int PORT = 0;
 
 static int server_port = 0;
 static char *server_address = NULL;
+static int host_specified = FALSE;
 static char *server_send = NULL;
 static char *server_quit = NULL;
 static char **server_expect;
@@ -462,6 +463,7 @@ process_arguments (int argc, char **argv)
 #endif
 			break;
 		case 'H':                 /* hostname */
+			host_specified = TRUE;
 			server_address = optarg;
 			break;
 		case 'c':                 /* critical */
@@ -588,6 +590,10 @@ process_arguments (int argc, char **argv)
 		}
 	}
 
+	c = optind;
+	if(host_specified == FALSE && c < argc)
+		server_address = strdup (argv[c++]);
+
 	if (server_address == NULL)
 		usage4 (_("You must provide a server address"));
 	else if (server_address[0] != '/' && is_host (server_address) == FALSE)
@@ -666,4 +672,3 @@ print_usage (void)
   printf ("[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]\n");
   printf ("[-D <warn days cert expire>[,<crit days cert expire>]] [-S <use SSL>] [-E]\n");
 }
-

+ 3 - 1
plugins/t/check_tcp.t

@@ -9,7 +9,7 @@ use Test;
 use NPTest;
 
 use vars qw($tests);
-BEGIN {$tests = 7; plan tests => $tests}
+BEGIN {$tests = 14; plan tests => $tests}
 
 my $host_tcp_http      = getTestParameter( "host_tcp_http",      "NP_HOST_TCP_HTTP",      "localhost",
 					   "A host providing the HTTP Service (a web server)" );
@@ -27,6 +27,7 @@ my $failedExpect = '/^TCP WARNING\s-\sUnexpected response from host/socket on po
 my $t;
 
 $t += checkCmd( "./check_tcp $host_tcp_http      -p 80 -wt 300 -ct 600",       0, $successOutput );
+$t += checkCmd( "./check_tcp $host_tcp_http      -p 80 -wt 300 -ct 600 -6 ",   0, $successOutput );
 $t += checkCmd( "./check_tcp $host_tcp_http      -p 81 -wt   0 -ct   0 -to 1", 2 ); # use invalid port for this test
 $t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt   0 -ct   0 -to 1", 2 );
 $t += checkCmd( "./check_tcp $hostname_invalid   -p 80 -wt   0 -ct   0 -to 1", 2 );
@@ -34,6 +35,7 @@ $t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443",              0
 $t += checkCmd( "./check_tcp -S -D 9000,1    -H www.verisign.com -p 443",      0 );
 $t += checkCmd( "./check_tcp -S -D 9000      -H www.verisign.com -p 443",      1 );
 $t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443",      2 );
+$t += checkCmd( "./check_tcp -6 -p 80 www.heise.de",                           0 );
 
 # Need the \r\n to make it more standards compliant with web servers. Need the various quotes
 # so that perl doesn't interpret the \r\n and is passed onto command line correctly