]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add -expired flag to rndc dumpdb command
authorMatthijs Mekking <matthijs@isc.org>
Thu, 13 Aug 2020 05:42:36 +0000 (07:42 +0200)
committerMatthijs Mekking <matthijs@isc.org>
Fri, 25 Sep 2020 06:20:02 +0000 (08:20 +0200)
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.

(cherry picked from commit 8beda7d2ea1b37361eecd35830e4745df1d42d53)

bin/named/server.c
bin/rndc/rndc.c
bin/rndc/rndc.rst
doc/man/rndc.8in
lib/dns/include/dns/masterdump.h
lib/dns/include/dns/rdataset.h
lib/dns/masterdump.c

index 5b859784c91eb58b668f5971495048a1a1215a13..e6db74adbdde5b745cd9fac7835ded323fe08602 100644 (file)
@@ -242,6 +242,7 @@ struct dumpcontext {
        bool dumpzones;
        bool dumpadb;
        bool dumpbad;
+       bool dumpexpired;
        bool dumpfail;
        FILE *fp;
        ISC_LIST(struct viewlistentry) viewlist;
@@ -11067,7 +11068,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);
@@ -11201,6 +11206,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;
@@ -11231,6 +11237,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;
index 36c9cbebf3ff8949cf7c9440e72aae09a152500b..1b2e0d4d1a5d268ed7786f821d3ca9268e45c6a1 100644 (file)
@@ -117,7 +117,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\
index 5d902834b7d5a32aec45dfd7ba6bf44f6f792556..9d0727617863ec5761a8abff3491de31d1d52d85 100644 (file)
@@ -187,7 +187,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 ...*]
    Dump 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
index f71cd9927d094b1e4e5251ad85e65f21372e84ab..3eeb5f1cef3aefd62e72bd925e9f236ae8d94628 100644 (file)
@@ -187,7 +187,7 @@ output file has ".0" appended to its name; the previous most recent
 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.
 .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]
 Dump 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
index 3c960a014dc3141cf4bf043082b564cf9525148d..fcfc2e2e741e20405c577548a73f89eaa6802825 100644 (file)
@@ -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.
index a98efec93c2da4efe972745e38173be66eae4ebd..72d1445649458be4d0131bd8b6e57aa048893391 100644 (file)
@@ -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:
index 6d779f1df89fb4519e681915bd4990427d5a1d59..27da0d5cb67d32423b664843541c7bf5773fae57 100644 (file)
@@ -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) {