r5123 - in trunk/varnish-cache/bin: varnishadm varnishd

phk at varnish-cache.org phk at varnish-cache.org
Wed Aug 25 10:49:27 CEST 2010


Author: phk
Date: 2010-08-25 10:49:27 +0200 (Wed, 25 Aug 2010)
New Revision: 5123

Modified:
   trunk/varnish-cache/bin/varnishadm/varnishadm.c
   trunk/varnish-cache/bin/varnishd/mgt_cli.c
Log:
The -T argument can be specified as :0 which will just find one or
two (IPv4/6) available sockets.  In this case, writing the :0 into
the VSM will not tell varnishadm where to look.

Write the actual socket addresses, one per line instead, and have
varnishadm try them all.

Make -n mutually exclusive with -S and -T on varnishadm.



Modified: trunk/varnish-cache/bin/varnishadm/varnishadm.c
===================================================================
--- trunk/varnish-cache/bin/varnishadm/varnishadm.c	2010-08-25 08:42:45 UTC (rev 5122)
+++ trunk/varnish-cache/bin/varnishadm/varnishadm.c	2010-08-25 08:49:27 UTC (rev 5123)
@@ -79,21 +79,23 @@
 
 	sock = VSS_open(T_arg, timeout);
 	if (sock < 0) {
-		fprintf(stderr, "Connection failed\n");
-		exit(1);
+		fprintf(stderr, "Connection failed (%s)\n", T_arg);
+		return (-1);
 	}
 
 	(void)cli_readres(sock, &status, &answer, timeout);
 	if (status == CLIS_AUTH) {
 		if (S_arg == NULL) {
 			fprintf(stderr, "Authentication required\n");
-			exit(1);
+			AZ(close(sock));
+			return(-1);
 		}
 		fd = open(S_arg, O_RDONLY);
 		if (fd < 0) {
 			fprintf(stderr, "Cannot open \"%s\": %s\n",
 			    S_arg, strerror(errno));
-			exit (1);
+			AZ(close(sock));
+			return (-1);
 		}
 		CLI_response(fd, answer, buf);
 		AZ(close(fd));
@@ -106,7 +108,8 @@
 	}
 	if (status != CLIS_OK) {
 		fprintf(stderr, "Rejected %u\n%s\n", status, answer);
-		exit(1);
+		AZ(close(sock));
+		return (-1);
 	}
 	free(answer);
 
@@ -114,10 +117,12 @@
 	(void)cli_readres(sock, &status, &answer, timeout);
 	if (status != CLIS_OK || strstr(answer, "PONG") == NULL) {
 		fprintf(stderr, "No pong received from server\n");
-		exit(1);
+		AZ(close(sock));
+		return(-1);
 	}
 	free(answer);
 
+	fprintf(stderr, "CLI connected to %s\n", T_arg);
 	return (sock);
 }
 
@@ -205,19 +210,61 @@
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: varnishadm [-t timeout] [-S secretfile] "
+	    "usage: varnishadm [-n ident] [-t timeout] [-S secretfile] "
 	    "-T [address]:port command [...]\n");
+	fprintf(stderr, "\t-n is mutually exlusive with -S and -T\n");
 	exit(1);
 }
 
+static int
+n_arg_sock(const char *n_arg)
+{
+	char *T_arg = NULL;
+	char *S_arg = NULL;
+	struct VSM_data *vsd;
+	char *p;
+	int sock;
+
+	vsd = VSM_New();
+	assert(VSL_Arg(vsd, 'n', n_arg));
+	if (VSM_Open(vsd, 1)) {
+		fprintf(stderr, "Could not open shared memory\n");
+		return (-1);
+	}
+	if (T_arg == NULL) {
+		p = VSM_Find_Chunk(vsd, "Arg", "-T", "", NULL);
+		if (p == NULL)  {
+			fprintf(stderr, "No -T arg in shared memory\n");
+			return (-1);
+		}
+		T_arg = strdup(p);
+	}
+	if (S_arg == NULL) {
+		p = VSM_Find_Chunk(vsd, "Arg", "-S", "", NULL);
+		if (p != NULL) 
+			S_arg = strdup(p);
+	}
+	sock = -1;
+	while (*T_arg) {
+		p = strchr(T_arg, '\n');
+		AN(p);
+		*p = '\0';
+		sock = cli_sock(T_arg, S_arg);
+		if (sock >= 0) 
+			break;
+		T_arg = p + 1;
+	}
+	free(T_arg);
+	free(S_arg);
+	return (sock);
+}
+
 int
 main(int argc, char * const *argv)
 {
 	const char *T_arg = NULL;
 	const char *S_arg = NULL;
 	const char *n_arg = NULL;
-	struct VSM_data *vsd;
-	char *p;
 	int opt, sock;
 
 	while ((opt = getopt(argc, argv, "n:S:T:t:")) != -1) {
@@ -243,30 +290,19 @@
 	argv += optind;
 
 	if (n_arg != NULL) {
-		vsd = VSM_New();
-		assert(VSL_Arg(vsd, 'n', n_arg));
-		if (!VSM_Open(vsd, 1)) {
-			if (T_arg == NULL) {
-				p = VSM_Find_Chunk(vsd, "Arg", "-T", "", NULL);
-				if (p != NULL) {
-					T_arg = strdup(p);
-				}
-			}
-			if (S_arg == NULL) {
-				p = VSM_Find_Chunk(vsd, "Arg", "-S", "", NULL);
-				if (p != NULL) {
-					S_arg = strdup(p);
-				}
-			}
+		if (T_arg != NULL || S_arg != NULL) {
+			usage();
 		}
+		sock = n_arg_sock(n_arg);
+		if (sock < 0)
+			exit(2);
+	} else if (T_arg == NULL) {
+		usage();
+	} else {
+		assert(T_arg != NULL);
+		sock = cli_sock(T_arg, S_arg);
 	}
 
-	if (T_arg == NULL)
-		usage();
-
-	assert(T_arg != NULL);
-	sock = cli_sock(T_arg, S_arg);
-
 	if (argc > 0)
 		do_args(sock, argc, argv);
 	else

Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c	2010-08-25 08:42:45 UTC (rev 5122)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c	2010-08-25 08:49:27 UTC (rev 5123)
@@ -545,23 +545,24 @@
 	int i, n, sock, good;
 	struct telnet *tn;
 	char *p;
+	struct vsb *vsb;
+	char abuf[TCP_ADDRBUFSIZE];
+	char pbuf[TCP_PORTBUFSIZE];
 
-	/* Save in shmem */
-	i = strlen(T_arg);
-	p = VSM_Alloc(i + 1, "Arg", "-T", "");
-	AN(p);
-	strcpy(p, T_arg);
-
 	n = VSS_resolve(T_arg, NULL, &ta);
 	if (n == 0) {
-		fprintf(stderr, "Could not open management port\n");
+		REPORT(LOG_ERR, "-T %s Could not be resolved\n", T_arg);
 		exit(2);
 	}
 	good = 0;
+	vsb = vsb_newauto();
+	XXXAN(vsb);
 	for (i = 0; i < n; ++i) {
 		sock = VSS_listen(ta[i], 10);
 		if (sock < 0)
 			continue;
+		TCP_myname(sock, abuf, sizeof abuf, pbuf, sizeof pbuf);
+		vsb_printf(vsb, "%s %s\n", abuf, pbuf);
 		good++;
 		tn = telnet_new(sock);
 		tn->ev = vev_new();
@@ -578,6 +579,13 @@
 		REPORT(LOG_ERR, "-T %s could not be listened on.", T_arg);
 		exit(2);
 	}
+	vsb_finish(vsb);
+	AZ(vsb_overflowed(vsb));
+	/* Save in shmem */
+	p = VSM_Alloc(vsb_len(vsb) + 1, "Arg", "-T", "");
+	AN(p);
+	strcpy(p, vsb_data(vsb));
+	vsb_delete(vsb);
 }
 
 /* Reverse CLI ("Master") connections --------------------------------*/




More information about the varnish-commit mailing list