rndc stats patch for outputting stdout.

Takuro KUBOTA takuro at bonz.squares.net
Mon Jan 9 15:19:31 UTC 2006


Umm. 
#i had patch attachment mime encode.

> Hi,
> Getting statistics on DNS servers under load balancer, "rndc stats" is an inexpedience.
> "rndc stats" output stats file on localfile running named server. so I make a patch
> outputting stats on STDOUT running rndc command server.
> How to use, "rndc rstats".
> 
> How about this idea. 

diff -ru bind-9.3.2-org/bin/named/control.c bind-9.3.2/bin/named/control.c
--- bind-9.3.2-org/bin/named/control.c	2005-04-29 10:04:47.000000000 +0900
+++ bind-9.3.2/bin/named/control.c	2006-01-09 03:28:38.000000000 +0900
@@ -138,7 +138,9 @@
 		isc_app_shutdown();
 		result = ISC_R_SUCCESS;
 	} else if (command_compare(command, NS_COMMAND_DUMPSTATS)) {
-		result = ns_server_dumpstats(ns_g_server);
+		result = ns_server_rdumpstats(ns_g_server, text, NS_DUMPSTATS_LOCAL);
+	} else if (command_compare(command, NS_COMMAND_RDUMPSTATS)) {
+		result = ns_server_rdumpstats(ns_g_server, text, NS_DUMPSTATS_REMOTE);
 	} else if (command_compare(command, NS_COMMAND_QUERYLOG)) {
 		result = ns_server_togglequerylog(ns_g_server);
 	} else if (command_compare(command, NS_COMMAND_DUMPDB)) {
diff -ru bind-9.3.2-org/bin/named/include/named/control.h bind-9.3.2/bin/named/include/named/control.h
--- bind-9.3.2-org/bin/named/include/named/control.h	2004-09-03 12:43:32.000000000 +0900
+++ bind-9.3.2/bin/named/include/named/control.h	2006-01-09 03:27:44.000000000 +0900
@@ -38,6 +38,7 @@
 #define NS_COMMAND_REFRESH	"refresh"
 #define NS_COMMAND_RETRANSFER	"retransfer"
 #define NS_COMMAND_DUMPSTATS	"stats"
+#define NS_COMMAND_RDUMPSTATS	"rstats"
 #define NS_COMMAND_QUERYLOG	"querylog"
 #define NS_COMMAND_DUMPDB	"dumpdb"
 #define NS_COMMAND_TRACE	"trace"
@@ -51,6 +52,9 @@
 #define NS_COMMAND_RECURSING	"recursing"
 #define NS_COMMAND_NULL		"null"
 
+#define NS_DUMPSTATS_LOCAL	0
+#define NS_DUMPSTATS_REMOTE	1
+
 isc_result_t
 ns_controls_create(ns_server_t *server, ns_controls_t **ctrlsp);
 /*
diff -ru bind-9.3.2-org/bin/named/include/named/server.h bind-9.3.2/bin/named/include/named/server.h
--- bind-9.3.2-org/bin/named/include/named/server.h	2004-03-08 13:04:21.000000000 +0900
+++ bind-9.3.2/bin/named/include/named/server.h	2006-01-09 03:25:59.000000000 +0900
@@ -157,10 +157,10 @@
  */
 
 /*
- * Dump the current statistics to the statistics file.
+ * Dump the current statistics to rndc.
  */
 isc_result_t
-ns_server_dumpstats(ns_server_t *server);
+ns_server_rdumpstats(ns_server_t *server, isc_buffer_t *text, int flow);
 
 /*
  * Dump the current cache to the dump file.
diff -ru bind-9.3.2-org/bin/named/server.c bind-9.3.2/bin/named/server.c
--- bind-9.3.2-org/bin/named/server.c	2005-07-27 11:53:15.000000000 +0900
+++ bind-9.3.2/bin/named/server.c	2006-01-09 03:29:12.000000000 +0900
@@ -3569,27 +3569,52 @@
 }
 
 isc_result_t
-ns_server_dumpstats(ns_server_t *server) {
+ns_server_rdumpstats(ns_server_t *server, isc_buffer_t *text, int flow) {
 	isc_result_t result;
 	dns_zone_t *zone, *next;
 	isc_stdtime_t now;
 	FILE *fp = NULL;
 	int i;
 	int ncounters;
+	unsigned int n;
+	isc_buffer_t text_tmp;
+	char textarray_tmp[1024];
 
+	isc_buffer_init(&text_tmp, textarray_tmp, sizeof(textarray_tmp));
 	isc_stdtime_get(&now);
 
-	CHECKMF(isc_stdio_open(server->statsfile, "a", &fp),
-		"could not open statistics dump file", server->statsfile);
-	
 	ncounters = DNS_STATS_NCOUNTERS;
-	fprintf(fp, "+++ Statistics Dump +++ (%lu)\n", (unsigned long)now);
-	
-	for (i = 0; i < ncounters; i++)
-		fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT "u\n",
-			dns_statscounter_names[i],
-			server->querystats[i]);
+
+	n = snprintf((char *)isc_buffer_used(&text_tmp),
+		     isc_buffer_availablelength(&text_tmp),
+		     "+++ Statistics Dump +++ (%lu)\n", (unsigned long)now);
+	if (n >= isc_buffer_availablelength(&text_tmp))
+	  return (ISC_R_NOSPACE);
+	n = snprintf((char *)isc_buffer_used(text),
+		     isc_buffer_availablelength(text),
+		     "%s", 
+		     (char *)isc_buffer_used(&text_tmp));
+	if (n >= isc_buffer_availablelength(text))
+	  return (ISC_R_NOSPACE);
 	
+	for (i = 0; i < ncounters; i++){
+	  n = snprintf((char *)isc_buffer_used(&text_tmp),
+		       isc_buffer_availablelength(&text_tmp),
+		       "%s" 
+		       "%s %" ISC_PRINT_QUADFORMAT "u\n",
+		       (char *)isc_buffer_used(text),
+		       dns_statscounter_names[i],
+		       server->querystats[i]);
+	  if (n >= isc_buffer_availablelength(&text_tmp))
+	    return (ISC_R_NOSPACE);
+	  n = snprintf((char *)isc_buffer_used(text),
+		       isc_buffer_availablelength(text),
+		       "%s", 
+		       (char *)isc_buffer_used(&text_tmp));
+	  if (n >= isc_buffer_availablelength(text))
+	    return (ISC_R_NOSPACE);
+	}
+
 	zone = NULL;
 	for (result = dns_zone_first(server->zonemgr, &zone);
 	     result == ISC_R_SUCCESS;
@@ -3600,32 +3625,96 @@
 			char zonename[DNS_NAME_FORMATSIZE];
 			dns_view_t *view;
 			char *viewname;
-			
+
 			dns_name_format(dns_zone_getorigin(zone),
 					zonename, sizeof(zonename));
 			view = dns_zone_getview(zone);
 			viewname = view->name;
 			for (i = 0; i < ncounters; i++) {
-				fprintf(fp, "%s %" ISC_PRINT_QUADFORMAT
-					"u %s",
-					dns_statscounter_names[i],
-					zonestats[i],
-					zonename);
-				if (strcmp(viewname, "_default") != 0)
-					fprintf(fp, " %s", viewname);
-				fprintf(fp, "\n");
+			  n = snprintf((char *)isc_buffer_used(&text_tmp),
+				       isc_buffer_availablelength(&text_tmp),
+				       "%s" 
+				       "%s %" ISC_PRINT_QUADFORMAT
+				       "u %s",
+				       (char *)isc_buffer_used(text),
+				       dns_statscounter_names[i],
+				       zonestats[i],
+				       zonename);
+			  if (n >= isc_buffer_availablelength(&text_tmp))
+			    return (ISC_R_NOSPACE);
+			  n = snprintf((char *)isc_buffer_used(text),
+				       isc_buffer_availablelength(text),
+				       "%s", 
+				       (char *)isc_buffer_used(&text_tmp));
+			  if (n >= isc_buffer_availablelength(text))
+			    return (ISC_R_NOSPACE);
+
+			  if (strcmp(viewname, "_default") != 0){
+			    n = snprintf((char *)isc_buffer_used(&text_tmp),
+					 isc_buffer_availablelength(&text_tmp),
+					 "%s" 
+					 " %s",
+					 (char *)isc_buffer_used(text),
+					 viewname);
+			    if (n >= isc_buffer_availablelength(&text_tmp))
+			      return (ISC_R_NOSPACE);
+			    n = snprintf((char *)isc_buffer_used(text),
+					 isc_buffer_availablelength(text),
+					 "%s", 
+					 (char *)isc_buffer_used(&text_tmp));
+			    if (n >= isc_buffer_availablelength(text))
+			      return (ISC_R_NOSPACE);
+			  }			  
+			  n = snprintf((char *)isc_buffer_used(&text_tmp),
+				       isc_buffer_availablelength(&text_tmp),
+				       "%s" 
+				       "\n",
+				       (char *)isc_buffer_used(text));
+			  if (n >= isc_buffer_availablelength(&text_tmp))
+			    return (ISC_R_NOSPACE);
+			  n = snprintf((char *)isc_buffer_used(text),
+				       isc_buffer_availablelength(text),
+				       "%s", 
+				       (char *)isc_buffer_used(&text_tmp));
+			  if (n >= isc_buffer_availablelength(text))
+			    return (ISC_R_NOSPACE);
 			}
 		}
 	}
 	if (result == ISC_R_NOMORE)
 		result = ISC_R_SUCCESS;
 	CHECK(result);
-	
-	fprintf(fp, "--- Statistics Dump --- (%lu)\n", (unsigned long)now);
+
+	n = snprintf((char *)isc_buffer_used(&text_tmp),
+		     isc_buffer_availablelength(&text_tmp),
+		     "%s" 
+		     "--- Statistics Dump --- (%lu)",
+		     (char *)isc_buffer_used(text),
+		     (unsigned long)now);
+	if (n >= isc_buffer_availablelength(&text_tmp))
+	  return (ISC_R_NOSPACE);
+	n = snprintf((char *)isc_buffer_used(text),
+		     isc_buffer_availablelength(text),
+		     "%s", 
+		     (char *)isc_buffer_used(&text_tmp));
+	if (n >= isc_buffer_availablelength(text))
+	  return (ISC_R_NOSPACE);
+
+	if( flow == NS_DUMPSTATS_LOCAL){
+		CHECKMF(isc_stdio_open(server->statsfile, "a", &fp),
+			"could not open statistics dump file", server->statsfile);
+		fprintf(fp, "%s\n", (char *)isc_buffer_used(&text_tmp));
+		n = 0;
+	}
+
 
  cleanup:
 	if (fp != NULL)
 		(void)isc_stdio_close(fp);
+	if (n >= isc_buffer_availablelength(text))
+	  return (ISC_R_NOSPACE);
+	isc_buffer_add(text, n);
+
 	return (result);
 }
 
        
/*
   Takuro KUBOTA    takuro at bonz.squares.net
*/



More information about the bind-users mailing list