From 51cc8aadd61f00d85649aadcfd335a229e51c55a Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 26 Feb 2010 15:40:46 +0000 Subject: [PATCH] unbound-control list_stubs and list_forwards. git-svn-id: file:///svn/unbound/trunk@1995 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/remote.c | 78 ++++++++++++++++++++++++++++++++++---- doc/Changelog | 1 + doc/unbound-control.8.in | 7 ++++ smallapp/unbound-control.c | 2 + 4 files changed, 80 insertions(+), 8 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 286968063..31f884941 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -64,6 +64,7 @@ #include "validator/val_kentry.h" #include "iterator/iterator.h" #include "iterator/iter_fwd.h" +#include "iterator/iter_hints.h" #include "iterator/iter_delegpt.h" #include "services/outbound_list.h" #include "services/outside_network.h" @@ -1226,20 +1227,24 @@ do_flush_name(SSL* ssl, struct worker* w, char* arg) send_ok(ssl); } -/** print root forwards */ +/** printout a delegation point info */ static int -print_root_fwds(SSL* ssl, struct iter_forwards* fwds, uint8_t* root) +ssl_print_name_dp(SSL* ssl, char* str, uint8_t* nm, uint16_t dclass, + struct delegpt* dp) { char buf[257]; - struct delegpt* dp; struct delegpt_ns* ns; struct delegpt_addr* a; int f = 0; - dp = forwards_lookup(fwds, root, LDNS_RR_CLASS_IN); - if(!dp) - return ssl_printf(ssl, "off (using root hints)\n"); - /* if dp is returned it must be the root */ - log_assert(query_dname_compare(dp->name, root)==0); + if(str) { /* print header for forward, stub */ + char* c = ldns_rr_class2str(dclass); + dname_str(nm, buf); + if(!ssl_printf(ssl, "%s %s %s: ", buf, c, str)) { + free(c); + return 0; + } + free(c); + } for(ns = dp->nslist; ns; ns = ns->next) { dname_str(ns->name, buf); if(!ssl_printf(ssl, "%s%s", (f?" ":""), buf)) @@ -1255,6 +1260,20 @@ print_root_fwds(SSL* ssl, struct iter_forwards* fwds, uint8_t* root) return ssl_printf(ssl, "\n"); } + +/** print root forwards */ +static int +print_root_fwds(SSL* ssl, struct iter_forwards* fwds, uint8_t* root) +{ + struct delegpt* dp; + dp = forwards_lookup(fwds, root, LDNS_RR_CLASS_IN); + if(!dp) + return ssl_printf(ssl, "off (using root hints)\n"); + /* if dp is returned it must be the root */ + log_assert(query_dname_compare(dp->name, root)==0); + return ssl_print_name_dp(ssl, NULL, root, LDNS_RR_CLASS_IN, dp); +} + /** parse args into delegpt */ static struct delegpt* parse_delegpt(SSL* ssl, struct regional* region, char* args, uint8_t* root) @@ -1502,6 +1521,43 @@ do_get_option(SSL* ssl, struct worker* worker, char* arg) } } +/** do the list_forwards command */ +static void +do_list_forwards(SSL* ssl, struct worker* worker) +{ + /* since its a per-worker structure no locks needed */ + struct iter_forwards* fwds = worker->env.fwds; + struct iter_forward_zone* z; + RBTREE_FOR(z, struct iter_forward_zone*, fwds->tree) { + if(!z->dp) continue; /* skip empty marker for stub */ + if(!ssl_print_name_dp(ssl, "forward", z->name, z->dclass, + z->dp)) + return; + } +} + +/** do the list_stubs command */ +static void +do_list_stubs(SSL* ssl, struct worker* worker) +{ + /* readonly structure */ + int m; + struct iter_hints_stub* z; + struct iter_env* ie; + m = modstack_find(&worker->env.mesh->mods, "iterator"); + if(m == -1) { + (void)ssl_printf(ssl, "error no iterator module\n"); + return; + } + ie = (struct iter_env*)worker->env.modinfo[m]; + RBTREE_FOR(z, struct iter_hints_stub*, &ie->hints->tree) { + if(!ssl_print_name_dp(ssl, + z->noprime?"stub noprime":"stub prime", z->node.name, + z->node.dclass, z->dp)) + return; + } +} + /** tell other processes to execute the command */ void distribute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd) @@ -1549,6 +1605,12 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd, } else if(strncmp(p, "load_cache", 10) == 0) { if(load_cache(ssl, worker)) send_ok(ssl); return; + } else if(strncmp(p, "list_forwards", 13) == 0) { + do_list_forwards(ssl, worker); + return; + } else if(strncmp(p, "list_stubs", 10) == 0) { + do_list_stubs(ssl, worker); + return; } else if(strncmp(p, "forward", 7) == 0) { /* must always distribute this cmd */ if(rc) distribute_cmd(rc, ssl, cmd); diff --git a/doc/Changelog b/doc/Changelog index 9fc0e454a..cb2219d2f 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,5 +1,6 @@ 26 February 2010: Wouter - Fixup prototype for lexer cleanup in daemon code. + - unbound-control list_stubs and list_forwards. 24 February 2010: Wouter - Fix scrubber bug that potentially let NS records through. Reported diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in index e07b76f07..14fe8c07f 100644 --- a/doc/unbound-control.8.in +++ b/doc/unbound-control.8.in @@ -155,6 +155,13 @@ connection closes. On error 'error ...' is printed (it gives a syntax error on unknown option). For some options a list of values, one on each line, is printed. Not all options are supported. .TP +.B list_stubs +List the stub zones in use. These are printed one by one to the output. +This includes the root hints in use. +.TP +.B list_forwards +List the forward zones in use. These are printed zone by zone to the output. +.TP .B forward \fR[\fIoff\fR | \fIaddr ...\fR ] Setup forwarding mode. Configures if the server should ask other upstream nameservers, should go to the internet root nameservers itself, or show diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c index 579485742..c0b7461c0 100644 --- a/smallapp/unbound-control.c +++ b/smallapp/unbound-control.c @@ -86,6 +86,8 @@ usage() printf(" dump_requestlist show what is worked on\n"); printf(" set_option opt: val set option to value, no reload\n"); printf(" get_option opt get option value\n"); + printf(" list_stubs list stub-zones used\n"); + printf(" list_forwards list forward-zones used\n"); printf(" forward [off | addr ...] without arg show forward setup\n"); printf(" or off to turn off root forwarding\n"); printf(" or give list of ip addresses\n"); -- 2.47.2