]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
named-checkconf -e prints effective config
authorColin Vidal <colin@isc.org>
Tue, 21 Oct 2025 09:53:33 +0000 (11:53 +0200)
committerColin Vidal <colin@isc.org>
Wed, 29 Oct 2025 22:49:25 +0000 (23:49 +0100)
New command line switch `-e` introduced to `named-checkconf`. It acts
like `-p` but instead it print the effective configuration rather than
the user configuration.

bin/check/named-checkconf.c
bin/check/named-checkconf.rst

index 169fd66ef75ca1db0dca3fbc1ad954979bf89153..0949b7c0f39f5607c320631be631a80de36ce54f 100644 (file)
@@ -13,6 +13,7 @@
 
 /*! \file */
 
+#include <defaultconfig.h>
 #include <errno.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -57,7 +58,7 @@ usage(void);
 static void
 usage(void) {
        fprintf(stderr,
-               "usage: %s [-achijklvz] [-p [-x]] [-t directory] "
+               "usage: %s [-achijklvz] [-pe [-x]] [-t directory] "
                "[named.conf]\n",
                isc_commandline_progname);
        exit(EXIT_SUCCESS);
@@ -554,6 +555,7 @@ main(int argc, char **argv) {
        bool load_zones = false;
        bool list_zones = false;
        bool print = false;
+       bool effective = false;
        unsigned int flags = 0;
        unsigned int parserflags = 0;
        unsigned int checkflags = BIND_CHECK_PLUGINS | BIND_CHECK_ALGORITHMS;
@@ -565,7 +567,7 @@ main(int argc, char **argv) {
        /*
         * Process memory debugging argument first.
         */
-#define CMDLINE_FLAGS "acdhijklm:nt:pvxz"
+#define CMDLINE_FLAGS "acdehijklm:nt:pvxz"
        while ((c = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
                switch (c) {
                case 'm':
@@ -638,6 +640,11 @@ main(int argc, char **argv) {
                        print = true;
                        break;
 
+               case 'e':
+                       print = true;
+                       effective = true;
+                       break;
+
                case 'v':
                        printf("%s\n", PACKAGE_VERSION);
                        result = ISC_R_SUCCESS;
@@ -701,6 +708,27 @@ main(int argc, char **argv) {
                CHECK(load_zones_fromconfig(config, list_zones));
        }
 
+       if (effective) {
+               cfg_obj_t *effectiveconf = NULL;
+               cfg_obj_t *defaultconfig = NULL;
+               isc_buffer_t b;
+
+               isc_buffer_constinit(&b, common_named_defaultconf,
+                                    sizeof(common_named_defaultconf) - 1);
+               isc_buffer_add(&b, sizeof(common_named_defaultconf) - 1);
+
+               CHECK(cfg_parse_buffer(
+                       isc_g_mctx, &b, __FILE__, 0, &cfg_type_namedconf,
+                       CFG_PCTX_NODEPRECATED | CFG_PCTX_NOOBSOLETE |
+                               CFG_PCTX_NOEXPERIMENTAL | CFG_PCTX_BUILTIN,
+                       &defaultconfig));
+               effectiveconf = cfg_effective_config(config, defaultconfig);
+
+               cfg_obj_detach(&defaultconfig);
+               cfg_obj_detach(&config);
+               config = effectiveconf;
+       }
+
        if (print) {
                cfg_printx(config, flags, output, &result);
        }
index 516756e9a6d1b033c80b9fca91671e5a10add91f..bfe2385fe71d5ef56892c005e49df9fd80be28c1 100644 (file)
@@ -21,7 +21,7 @@ named-checkconf - named configuration file syntax checking tool
 Synopsis
 ~~~~~~~~
 
-:program:`named-checkconf` [**-achjklnvz**] [**-p** [**-x** ]] [**-t** directory] {filename}
+:program:`named-checkconf` [**-achjklnvz**] [**-pe** [**-x** ]] [**-t** directory] {filename}
 
 Description
 ~~~~~~~~~~~
@@ -48,6 +48,19 @@ Options
    a `named.conf` intended to be run on another machine with possibly a
    different set of supported DNSSEC key algorithms.
 
+.. option:: -e
+
+   This option prints the effective server configuration that would
+   result from :iscman:`named.conf` and its included files, if no errors
+   were detected, in canonical form.
+
+   The effective configuration is the result of loading a configuration
+   file and applying it on top of the default settings for :iscman:`named`.
+   All configurable settings are included.
+
+   See also the :option:`-x` and :option:`-p` options.
+
+
 .. option:: -h
 
    This option prints the usage summary and exits.
@@ -85,8 +98,9 @@ Options
 
 .. option:: -p
 
-   This option prints out the :iscman:`named.conf` and included files in canonical form if
-   no errors were detected. See also the :option:`-x` option.
+   This option prints the contents of :iscman:`named.conf` and all
+   included files in canonical form, if no errors were detected. See also
+   the :option:`-x` and :option:`-e` options.
 
 .. option:: -t directory