]> 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>
Wed, 23 Sep 2020 14:08:29 +0000 (16:08 +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.

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 72c00d2b5d12edda9c9b5b119da604ef405e550c..28ba813ab3d78c37689b515f240af95c58464c03 100644 (file)
@@ -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;
index 94646863cf109548ea49696cd2c9dc967526f20b..0bf246c8e3bd20e9be9d39fc95a82a676f84007d 100644 (file)
@@ -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\
index d26f4cb2ae8136dc8d5bbf1d09d91cc168a35fd3..84c58a8311e2f6c7e40b6cf71bc8edbcf061ba4a 100644 (file)
@@ -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
index 59f03abe6861d0b3e042e49790c490c2d9a9fbbd..2b821109fc010ab075ebaed3421ca6e47b96c075 100644 (file)
@@ -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
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) {