From: Matthijs Mekking Date: Thu, 13 Aug 2020 05:42:36 +0000 (+0200) Subject: Add -expired flag to rndc dumpdb command X-Git-Tag: v9.17.6~35^2~6 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=8beda7d2ea1b37361eecd35830e4745df1d42d53;p=thirdparty%2Fbind9.git Add -expired flag to rndc dumpdb command This flag is the same as -cache, but will use a different style format that will also print expired entries (awaiting cleanup) from the cache. --- diff --git a/bin/named/server.c b/bin/named/server.c index 72c00d2b5d1..28ba813ab3d 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -243,6 +243,7 @@ struct dumpcontext { bool dumpzones; bool dumpadb; bool dumpbad; + bool dumpexpired; bool dumpfail; FILE *fp; ISC_LIST(struct viewlistentry) viewlist; @@ -11052,7 +11053,11 @@ resume: dns_cache_getname(dctx->view->view->cache)); } else if (dctx->zone == NULL && dctx->cache == NULL && dctx->dumpcache) { - style = &dns_master_style_cache; + if (dctx->dumpexpired) { + style = &dns_master_style_cache_with_expired; + } else { + style = &dns_master_style_cache; + } /* start cache dump */ if (dctx->view->view->cachedb != NULL) { dns_db_attach(dctx->view->view->cachedb, &dctx->cache); @@ -11186,6 +11191,7 @@ named_server_dumpdb(named_server_t *server, isc_lex_t *lex, dctx->dumpcache = true; dctx->dumpadb = true; dctx->dumpbad = true; + dctx->dumpexpired = false; dctx->dumpfail = true; dctx->dumpzones = false; dctx->fp = NULL; @@ -11216,6 +11222,10 @@ named_server_dumpdb(named_server_t *server, isc_lex_t *lex, } else if (ptr != NULL && strcmp(ptr, "-cache") == 0) { /* this is the default */ ptr = next_token(lex, NULL); + } else if (ptr != NULL && strcmp(ptr, "-expired") == 0) { + /* this is the same as -cache but includes expired data */ + dctx->dumpexpired = true; + ptr = next_token(lex, NULL); } else if (ptr != NULL && strcmp(ptr, "-zones") == 0) { /* only dump zones, suppress caches */ dctx->dumpadb = false; diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c index 94646863cf1..0bf246c8e3b 100644 --- a/bin/rndc/rndc.c +++ b/bin/rndc/rndc.c @@ -124,7 +124,7 @@ command is one of the following:\n\ Close, truncate and re-open the DNSTAP output file.\n\ dnstap -roll count\n\ Close, rename and re-open the DNSTAP output file(s).\n\ - dumpdb [-all|-cache|-zones|-adb|-bad|-fail] [view ...]\n\ + dumpdb [-all|-cache|-zones|-adb|-bad|-expired|-fail] [view ...]\n\ Dump cache(s) to the dump file (named_dump.db).\n\ flush Flushes all of the server's caches.\n\ flush [view] Flushes the server's cache for a view.\n\ diff --git a/bin/rndc/rndc.rst b/bin/rndc/rndc.rst index d26f4cb2ae8..84c58a8311e 100644 --- a/bin/rndc/rndc.rst +++ b/bin/rndc/rndc.rst @@ -186,7 +186,7 @@ Currently supported commands are: output file is moved to ".1", and so on. If ``number`` is specified, then the number of backup log files is limited to that number. -``dumpdb`` [**-all** | **-cache** | **-zones** | **-adb** | **-bad** | **-fail**] [*view ...*] +``dumpdb`` [**-all** | **-cache** | **-zones** | **-adb** | **-bad** | **-expired** | **-fail**] [*view ...*] This command dumps the server's caches (default) and/or zones to the dump file for the specified views. If no view is specified, all views are dumped. (See the ``dump-file`` option in the BIND 9 Administrator Reference diff --git a/doc/man/rndc.8in b/doc/man/rndc.8in index 59f03abe686..2b821109fc0 100644 --- a/doc/man/rndc.8in +++ b/doc/man/rndc.8in @@ -186,7 +186,7 @@ output file has ".0" appended to its name; the previous most recent output file is moved to ".1", and so on. If \fBnumber\fP is specified, then the number of backup log files is limited to that number. .TP -\fBdumpdb\fP [\fB\-all\fP | \fB\-cache\fP | \fB\-zones\fP | \fB\-adb\fP | \fB\-bad\fP | \fB\-fail\fP] [\fIview ...\fP] +\fBdumpdb\fP [\fB\-all\fP | \fB\-cache\fP | \fB\-zones\fP | \fB\-adb\fP | \fB\-bad\fP | \fB\-expired\fP | \fB\-fail\fP] [\fIview ...\fP] This command dumps the server\(aqs caches (default) and/or zones to the dump file for the specified views. If no view is specified, all views are dumped. (See the \fBdump\-file\fP option in the BIND 9 Administrator Reference diff --git a/lib/dns/include/dns/masterdump.h b/lib/dns/include/dns/masterdump.h index 3c960a014dc..fcfc2e2e741 100644 --- a/lib/dns/include/dns/masterdump.h +++ b/lib/dns/include/dns/masterdump.h @@ -110,6 +110,9 @@ typedef struct dns_master_style dns_master_style_t; /*% Print ECS cache entries as comments (reserved for future use). */ #define DNS_STYLEFLAG_ECSCACHE 0x100000000ULL +/*% Print expired cache entries. */ +#define DNS_STYLEFLAG_EXPIRED 0x200000000ULL + ISC_LANG_BEGINDECLS /*** @@ -145,6 +148,13 @@ LIBDNS_EXTERNAL_DATA extern const dns_master_style_t */ LIBDNS_EXTERNAL_DATA extern const dns_master_style_t dns_master_style_cache; +/*% + * A master style format designed for cache files. The same as above but + * this also prints expired entries. + */ +LIBDNS_EXTERNAL_DATA extern const dns_master_style_t + dns_master_style_cache_with_expired; + /*% * A master style that prints name, ttl, class, type, and value on * every line. Similar to explicitttl above, but more verbose. diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index a98efec93c2..72d14456494 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -188,6 +188,7 @@ struct dns_rdataset { #define DNS_RDATASETATTR_PREFETCH 0x00400000 #define DNS_RDATASETATTR_CYCLIC 0x00800000 /*%< Cyclic ordering. */ #define DNS_RDATASETATTR_STALE 0x01000000 +#define DNS_RDATASETATTR_ANCIENT 0x02000000 /*% * _OMITDNSSEC: diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c index 6d779f1df89..27da0d5cb67 100644 --- a/lib/dns/masterdump.c +++ b/lib/dns/masterdump.c @@ -85,6 +85,8 @@ struct dns_master_style { /*% Does the rdataset 'r' contain a stale answer? */ #define STALE(r) (((r)->attributes & DNS_RDATASETATTR_STALE) != 0) +/*% Does the rdataset 'r' contain an expired answer? */ +#define ANCIENT(r) (((r)->attributes & DNS_RDATASETATTR_ANCIENT) != 0) /*% * Context structure for a masterfile dump in progress. @@ -171,6 +173,21 @@ LIBDNS_EXTERNAL_DATA const dns_master_style_t dns_master_style_cache = { UINT_MAX }; +LIBDNS_EXTERNAL_DATA const dns_master_style_t + dns_master_style_cache_with_expired = { + DNS_STYLEFLAG_OMIT_OWNER | DNS_STYLEFLAG_OMIT_CLASS | + DNS_STYLEFLAG_MULTILINE | DNS_STYLEFLAG_RRCOMMENT | + DNS_STYLEFLAG_TRUST | DNS_STYLEFLAG_NCACHE | + DNS_STYLEFLAG_EXPIRED, + 24, + 32, + 32, + 40, + 80, + 8, + UINT_MAX + }; + LIBDNS_EXTERNAL_DATA const dns_master_style_t dns_master_style_simple = { 0, 24, 32, 32, 40, 80, 8, UINT_MAX }; @@ -1065,6 +1082,14 @@ again: for (i = 0; i < n; i++) { dns_rdataset_t *rds = sorted[i]; + + if (ANCIENT(rds) && + (ctx->style.flags & DNS_STYLEFLAG_EXPIRED) == 0) { + /* Omit expired entries */ + dns_rdataset_disassociate(rds); + continue; + } + if ((ctx->style.flags & DNS_STYLEFLAG_TRUST) != 0) { if ((ctx->style.flags & DNS_STYLEFLAG_INDENT) != 0 || (ctx->style.flags & DNS_STYLEFLAG_YAML) != 0) @@ -1084,10 +1109,12 @@ again: isc_result_t result; if (STALE(rds)) { fprintf(f, - "; stale (will be retained for " - "%u more seconds)\n", + "; stale (will be retained for %u more " + "seconds)\n", (rds->stale_ttl - ctx->serve_stale_ttl)); + } else if (ANCIENT(rds)) { + fprintf(f, "; expired (awaiting cleanup)\n"); } result = dump_rdataset(mctx, name, rds, ctx, buffer, f); if (result != ISC_R_SUCCESS) {