r4451 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Wed Jan 13 12:25:32 CET 2010


Author: phk
Date: 2010-01-13 12:25:32 +0100 (Wed, 13 Jan 2010)
New Revision: 4451

Modified:
   trunk/varnish-cache/bin/varnishd/mgt.h
   trunk/varnish-cache/bin/varnishd/mgt_cli.c
   trunk/varnish-cache/bin/varnishd/varnishd.c
Log:
Add -M addr:port argument, for connecting to a source of CLI commands,
such as the mythical "cluster-controller".



Modified: trunk/varnish-cache/bin/varnishd/mgt.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt.h	2010-01-13 11:08:00 UTC (rev 4450)
+++ trunk/varnish-cache/bin/varnishd/mgt.h	2010-01-13 11:25:32 UTC (rev 4451)
@@ -55,6 +55,7 @@
 void mgt_cli_start_child(int fdi, int fdo);
 void mgt_cli_stop_child(void);
 void mgt_cli_telnet(const char *T_arg);
+void mgt_cli_master(const char *M_arg);
 void mgt_cli_secret(const char *S_arg);
 void mgt_cli_close_all(void);
 

Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c	2010-01-13 11:08:00 UTC (rev 4450)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c	2010-01-13 11:25:32 UTC (rev 4451)
@@ -46,8 +46,6 @@
 #include <unistd.h>
 #include <sys/socket.h>
 
-#include "compat/vasprintf.h"
-
 #ifndef HAVE_SRANDOMDEV
 #include "compat/srandomdev.h"
 #endif
@@ -501,7 +499,7 @@
 
 	cp->name = strdup(ident);
 	XXXAN(cp->name);
-	syslog(LOG_NOTICE, "CLI %d open from %s", fdi, cp->name);
+	syslog(LOG_NOTICE, "CLI %d open %s", fdi, cp->name);
 	cp->magic = CLI_PORT_MAGIC;
 
 	cp->fdi = fdi;
@@ -541,6 +539,26 @@
 
 /*--------------------------------------------------------------------*/
 
+static struct vsb *
+sock_id(const char *pfx, int fd)
+{
+	struct vsb *vsb;
+
+	char abuf1[TCP_ADDRBUFSIZE], abuf2[TCP_ADDRBUFSIZE];
+	char pbuf1[TCP_PORTBUFSIZE], pbuf2[TCP_PORTBUFSIZE];
+
+	vsb = vsb_newauto();
+	AN(vsb);
+	TCP_myname(fd, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1);
+	TCP_hisname(fd, abuf2, sizeof abuf2, pbuf2, sizeof pbuf2);
+	vsb_printf(vsb, "%s %s:%s %s:%s", pfx, abuf2, pbuf2, abuf1, pbuf1);
+	vsb_finish(vsb);
+	AZ(vsb_overflowed(vsb));
+	return (vsb);
+}
+
+/*--------------------------------------------------------------------*/
+
 static void
 telnet_close(void *priv)
 {
@@ -565,13 +583,11 @@
 static int
 telnet_accept(const struct vev *ev, int what)
 {
+	struct vsb *vsb;
 	struct sockaddr_storage addr;
 	socklen_t addrlen;
 	struct telnet *tn;
 	int i;
-	char abuf1[TCP_ADDRBUFSIZE], abuf2[TCP_ADDRBUFSIZE];
-	char pbuf1[TCP_PORTBUFSIZE], pbuf2[TCP_PORTBUFSIZE];
-	char *p;
 
 	(void)what;
 	addrlen = sizeof addr;
@@ -581,16 +597,10 @@
 	if (i < 0)
 		return (0);
 
-	TCP_myname(ev->fd, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1);
-	TCP_name((void*)&addr, addrlen, abuf2, sizeof abuf2,
-	    pbuf2, sizeof pbuf2);
-	assert(asprintf(&p, "telnet %s:%s %s:%s", abuf2, pbuf2, abuf1, pbuf1) > 0);
-	XXXAN(p);
-
 	tn = telnet_new(i);
-
-	mgt_cli_setup(i, i, 0, p, telnet_close, tn);
-	free(p);
+	vsb = sock_id("telnet", ev->fd);
+	mgt_cli_setup(i, i, 0, vsb_data(vsb), telnet_close, tn);
+	vsb_delete(vsb);
 	return (0);
 }
 
@@ -658,3 +668,100 @@
 	free(addr);
 	free(port);
 }
+
+/* Reverse CLI ("Master") connections --------------------------------*/
+
+static int M_fd = -1;
+static struct vev *M_poker, *M_conn;
+static char *M_addr, *M_port;
+static struct vss_addr **M_ta;
+static int M_nta, M_nxt;
+static double M_poll = 0.1;
+
+static void
+Marg_closer(void *priv)
+{
+
+	(void)priv;
+	(void)close(M_fd);
+	M_fd = -1;
+}
+
+static int
+Marg_poker(const struct vev *e, int what)
+{
+	struct vsb *vsb;
+	int s, k;
+	socklen_t l;
+
+	(void)what;	/* XXX: ??? */
+
+	if (e == M_conn) {
+		/* Our connect(2) returned, check result */
+		l = sizeof k;
+		AZ(getsockopt(M_fd, SOL_SOCKET, SO_ERROR, &k, &l));
+		if (k) {
+			errno = k;
+			syslog(LOG_INFO, "Could not connect to CLI-master: %m");
+			(void)close(M_fd);
+			M_fd = -1;
+			/* Try next address */
+			if (++M_nxt >= M_nta) {
+				M_nxt = 0;
+				if (M_poll < 10)
+					M_poll *= 2;
+			}
+			return (1);
+		}
+		vsb = sock_id("master", M_fd);
+		mgt_cli_setup(M_fd, M_fd, 0, vsb_data(vsb), Marg_closer, NULL);
+		vsb_delete(vsb);
+		M_poll = 1;
+		return (1);
+	}
+
+	assert(e == M_poker);
+
+	M_poker->timeout = M_poll;	/* XXX nasty ? */
+	if (M_fd >= 0)
+		return (0);
+
+	/* Try to connect asynchronously */
+	s = VSS_connect(M_ta[M_nxt], 1);
+	if (s < 0)
+		return (0);
+
+	M_conn = vev_new();
+	AN(M_conn);
+	M_conn->callback = Marg_poker;
+	M_conn->name = "-M connector";	
+	M_conn->fd_flags = EV_WR;
+	M_conn->fd = s;
+	M_fd = s;
+	AZ(vev_add(mgt_evb, M_conn));
+	return (0);
+}
+
+void
+mgt_cli_master(const char *M_arg)
+{
+	(void)M_arg;
+
+	if (VSS_parse(M_arg, &M_addr, &M_port) || M_port == NULL) {
+		fprintf(stderr, "Could not parse -M argument\n");
+		exit (1);
+	}
+	M_nta = VSS_resolve(M_addr, M_port, &M_ta);
+	if (M_nta <= 0) {
+		fprintf(stderr, "Could resolve -M argument to address\n");
+		exit (1);
+	}
+	M_nxt = 0;
+	AZ(M_poker);
+	M_poker = vev_new();
+	AN(M_poker);
+	M_poker->timeout = M_poll;
+	M_poker->callback = Marg_poker;
+	M_poker->name = "-M poker";	
+	AZ(vev_add(mgt_evb, M_poker));
+}

Modified: trunk/varnish-cache/bin/varnishd/varnishd.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/varnishd.c	2010-01-13 11:08:00 UTC (rev 4450)
+++ trunk/varnish-cache/bin/varnishd/varnishd.c	2010-01-13 11:25:32 UTC (rev 4451)
@@ -192,6 +192,7 @@
 	fprintf(stderr, FMT, "", "  -h classic,<buckets>");
 	fprintf(stderr, FMT, "-i identity", "Identity of varnish instance");
 	fprintf(stderr, FMT, "-l bytesize", "Size of shared memory log");
+	fprintf(stderr, FMT, "-M address:port", "CLI-master to connect to.");
 	fprintf(stderr, FMT, "-n dir", "varnishd working directory");
 	fprintf(stderr, FMT, "-P file", "PID file");
 	fprintf(stderr, FMT, "-p param=value", "set parameter");
@@ -516,6 +517,7 @@
 	uintmax_t l_size;
 	const char *q;
 	const char *h_arg = "classic";
+	const char *M_arg = NULL;
 	const char *n_arg = NULL;
 	const char *P_arg = NULL;
 	const char *S_arg = NULL;
@@ -565,7 +567,7 @@
 	cli_check(cli);
 
 	while ((o = getopt(argc, argv,
-	    "a:b:Cdf:Fg:h:i:l:n:P:p:S:s:T:t:u:Vw:")) != -1)
+	    "a:b:Cdf:Fg:h:i:l:M:n:P:p:S:s:T:t:u:Vw:")) != -1)
 		switch (o) {
 		case 'a':
 			MCF_ParamSet(cli, "listen_address", optarg);
@@ -598,6 +600,9 @@
 		case 'l':
 			l_arg = optarg;
 			break;
+		case 'M':
+			M_arg = optarg;
+			break;
 		case 'n':
 			n_arg = optarg;
 			break;
@@ -755,6 +760,8 @@
 		mgt_cli_setup(0, 1, 1, "debug", cli_stdin_close, NULL);
 	if (S_arg != NULL)
 		mgt_cli_secret(S_arg);
+	if (M_arg != NULL)
+		mgt_cli_master(M_arg);
 	if (T_arg != NULL)
 		mgt_cli_telnet(T_arg);
 



More information about the varnish-commit mailing list