2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

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.
This commit is contained in:
Matthijs Mekking
2020-08-13 07:42:36 +02:00
parent c7156d2116
commit 8beda7d2ea
7 changed files with 54 additions and 6 deletions

View 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)
{
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;

View 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\

View 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

View 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

View 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.

View 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:

View 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) {