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