diff options
Diffstat (limited to 'doc/misc')
-rw-r--r-- | doc/misc/Makefile.am | 80 | ||||
-rw-r--r-- | doc/misc/Makefile.in | 921 | ||||
-rw-r--r-- | doc/misc/cfg_test.c | 195 | ||||
-rw-r--r-- | doc/misc/checkgrammar.py | 167 | ||||
-rw-r--r-- | doc/misc/delegation-only.zoneopt | 3 | ||||
-rw-r--r-- | doc/misc/forward.zoneopt | 6 | ||||
-rw-r--r-- | doc/misc/hint.zoneopt | 6 | ||||
-rw-r--r-- | doc/misc/in-view.zoneopt | 3 | ||||
-rw-r--r-- | doc/misc/mirror.zoneopt | 43 | ||||
-rw-r--r-- | doc/misc/options | 597 | ||||
-rw-r--r-- | doc/misc/parsegrammar.py | 194 | ||||
-rw-r--r-- | doc/misc/primary.zoneopt | 62 | ||||
-rw-r--r-- | doc/misc/redirect.zoneopt | 13 | ||||
-rw-r--r-- | doc/misc/rndc.grammar | 21 | ||||
-rw-r--r-- | doc/misc/secondary.zoneopt | 65 | ||||
-rw-r--r-- | doc/misc/sort-options.pl | 45 | ||||
-rw-r--r-- | doc/misc/static-stub.zoneopt | 11 | ||||
-rw-r--r-- | doc/misc/stub.zoneopt | 27 |
18 files changed, 2459 insertions, 0 deletions
diff --git a/doc/misc/Makefile.am b/doc/misc/Makefile.am new file mode 100644 index 0000000..8d7c80d --- /dev/null +++ b/doc/misc/Makefile.am @@ -0,0 +1,80 @@ +include $(top_srcdir)/Makefile.top +include $(top_srcdir)/Makefile.docs + +OPTIONS_FILES = \ + rndc.grammar \ + options \ + primary.zoneopt \ + secondary.zoneopt \ + mirror.zoneopt \ + forward.zoneopt \ + hint.zoneopt \ + stub.zoneopt \ + static-stub.zoneopt \ + redirect.zoneopt \ + delegation-only.zoneopt \ + in-view.zoneopt + +EXTRA_DIST = \ + $(OPTIONS_FILES) \ + checkgrammar.py \ + parsegrammar.py \ + sort-options.pl + +if MAINTAINER_MODE + +MAINTAINERCLEANFILES = $(OPTIONS_FILES) + +noinst_PROGRAMS = cfg_test + +cfg_test_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(LIBISC_CFLAGS) \ + $(LIBDNS_CFLAGS) \ + $(LIBISCCFG_CFLAGS) + +cfg_test_LDADD = \ + $(LIBISC_LIBS) \ + $(LIBDNS_LIBS) \ + $(LIBISCCFG_LIBS) + +BUILT_SOURCES = \ + $(OPTIONS_FILES) + +rndc.grammar: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --rndc --grammar | $(PERL) $(srcdir)/sort-options.pl > $@ + +options: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --named --grammar | $(PERL) $(srcdir)/sort-options.pl > $@ + +primary.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar primary > $@ + +secondary.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar secondary > $@ + +mirror.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar mirror > $@ + +forward.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar forward > $@ + +hint.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar hint > $@ + +stub.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar stub > $@ + +static-stub.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar static-stub > $@ + +redirect.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar redirect > $@ + +delegation-only.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar delegation-only > $@ + +in-view.zoneopt: cfg_test + $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar in-view > $@ + +endif diff --git a/doc/misc/Makefile.in b/doc/misc/Makefile.in new file mode 100644 index 0000000..da99f62 --- /dev/null +++ b/doc/misc/Makefile.in @@ -0,0 +1,921 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Hey Emacs, this is -*- makefile-automake -*- file! +# vim: filetype=automake + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@HOST_MACOS_TRUE@am__append_1 = \ +@HOST_MACOS_TRUE@ -Wl,-flat_namespace + +@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = cfg_test$(EXEEXT) +subdir = doc/misc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_link_flag.m4 \ + $(top_srcdir)/m4/ax_check_openssl.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_jemalloc.m4 \ + $(top_srcdir)/m4/ax_lib_lmdb.m4 \ + $(top_srcdir)/m4/ax_perl_module.m4 \ + $(top_srcdir)/m4/ax_posix_shell.m4 \ + $(top_srcdir)/m4/ax_prog_cc_for_build.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_python_module.m4 \ + $(top_srcdir)/m4/ax_restore_flags.m4 \ + $(top_srcdir)/m4/ax_save_flags.m4 $(top_srcdir)/m4/ax_tls.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +cfg_test_SOURCES = cfg_test.c +cfg_test_OBJECTS = cfg_test-cfg_test.$(OBJEXT) +@MAINTAINER_MODE_TRUE@cfg_test_DEPENDENCIES = $(LIBISC_LIBS) \ +@MAINTAINER_MODE_TRUE@ $(LIBDNS_LIBS) $(LIBISCCFG_LIBS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/cfg_test-cfg_test.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = cfg_test.c +DIST_SOURCES = cfg_test.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__extra_recursive_targets = test-recursive unit-recursive \ + doc-recursive +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/Makefile.docs \ + $(top_srcdir)/Makefile.top $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_EXEEXT = @BUILD_EXEEXT@ +BUILD_OBJEXT = @BUILD_OBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@ +CMOCKA_CFLAGS = @CMOCKA_CFLAGS@ +CMOCKA_LIBS = @CMOCKA_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@ +CPP_FOR_BUILD = @CPP_FOR_BUILD@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CURL = @CURL@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEVELOPER_MODE = @DEVELOPER_MODE@ +DLLTOOL = @DLLTOOL@ +DNSTAP_CFLAGS = @DNSTAP_CFLAGS@ +DNSTAP_LIBS = @DNSTAP_LIBS@ +DOXYGEN = @DOXYGEN@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +FSTRM_CAPTURE = @FSTRM_CAPTURE@ +FUZZ_LDFLAGS = @FUZZ_LDFLAGS@ +FUZZ_LOG_COMPILER = @FUZZ_LOG_COMPILER@ +GREP = @GREP@ +GSSAPI_CFLAGS = @GSSAPI_CFLAGS@ +GSSAPI_LIBS = @GSSAPI_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JEMALLOC_CFLAGS = @JEMALLOC_CFLAGS@ +JEMALLOC_LIBS = @JEMALLOC_LIBS@ +JSON_C_CFLAGS = @JSON_C_CFLAGS@ +JSON_C_LIBS = @JSON_C_LIBS@ +KRB5_CFLAGS = @KRB5_CFLAGS@ +KRB5_CONFIG = @KRB5_CONFIG@ +KRB5_LIBS = @KRB5_LIBS@ +LATEXMK = @LATEXMK@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ +LIBCAP_LIBS = @LIBCAP_LIBS@ +LIBIDN2_CFLAGS = @LIBIDN2_CFLAGS@ +LIBIDN2_LIBS = @LIBIDN2_LIBS@ +LIBNGHTTP2_CFLAGS = @LIBNGHTTP2_CFLAGS@ +LIBNGHTTP2_LIBS = @LIBNGHTTP2_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBUV_CFLAGS = @LIBUV_CFLAGS@ +LIBUV_LIBS = @LIBUV_LIBS@ +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ +LIBXML2_LIBS = @LIBXML2_LIBS@ +LIPO = @LIPO@ +LMDB_CFLAGS = @LMDB_CFLAGS@ +LMDB_LIBS = @LMDB_LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAXMINDDB_CFLAGS = @MAXMINDDB_CFLAGS@ +MAXMINDDB_LIBS = @MAXMINDDB_LIBS@ +MAXMINDDB_PREFIX = @MAXMINDDB_PREFIX@ +MKDIR_P = @MKDIR_P@ +NC = @NC@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ +OPENSSL_LDFLAGS = @OPENSSL_LDFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PROTOC_C = @PROTOC_C@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +PYTEST = @PYTEST@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +READLINE_CFLAGS = @READLINE_CFLAGS@ +READLINE_LIBS = @READLINE_LIBS@ +RELEASE_DATE = @RELEASE_DATE@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SPHINX_BUILD = @SPHINX_BUILD@ +STD_CFLAGS = @STD_CFLAGS@ +STD_CPPFLAGS = @STD_CPPFLAGS@ +STD_LDFLAGS = @STD_LDFLAGS@ +STRIP = @STRIP@ +TEST_CFLAGS = @TEST_CFLAGS@ +VERSION = @VERSION@ +XELATEX = @XELATEX@ +XSLTPROC = @XSLTPROC@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I $(top_srcdir)/m4 +AM_CFLAGS = \ + $(STD_CFLAGS) + +AM_CPPFLAGS = \ + $(STD_CPPFLAGS) \ + -include $(top_builddir)/config.h \ + -I$(srcdir)/include + +AM_LDFLAGS = $(STD_LDFLAGS) $(am__append_1) +LDADD = +LIBISC_CFLAGS = \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/lib/isc/include \ + -I$(top_builddir)/lib/isc/include + +LIBISC_LIBS = $(top_builddir)/lib/isc/libisc.la +LIBDNS_CFLAGS = \ + -I$(top_srcdir)/lib/dns/include \ + -I$(top_builddir)/lib/dns/include + +LIBDNS_LIBS = \ + $(top_builddir)/lib/dns/libdns.la + +LIBNS_CFLAGS = \ + -I$(top_srcdir)/lib/ns/include + +LIBNS_LIBS = \ + $(top_builddir)/lib/ns/libns.la + +LIBIRS_CFLAGS = \ + -I$(top_srcdir)/lib/irs/include + +LIBIRS_LIBS = \ + $(top_builddir)/lib/irs/libirs.la + +LIBISCCFG_CFLAGS = \ + -I$(top_srcdir)/lib/isccfg/include + +LIBISCCFG_LIBS = \ + $(top_builddir)/lib/isccfg/libisccfg.la + +LIBISCCC_CFLAGS = \ + -I$(top_srcdir)/lib/isccc/include/ + +LIBISCCC_LIBS = \ + $(top_builddir)/lib/isccc/libisccc.la + +LIBBIND9_CFLAGS = \ + -I$(top_srcdir)/lib/bind9/include + +LIBBIND9_LIBS = \ + $(top_builddir)/lib/bind9/libbind9.la + +SPHINX_V = $(SPHINX_V_@AM_V@) +SPHINX_V_ = $(SPHINX_V_@AM_DEFAULT_V@) +SPHINX_V_0 = -q +SPHINX_V_1 = -n +SPHINX_W = -W +AM_V_SPHINX = $(AM_V_SPHINX_@AM_V@) +AM_V_SPHINX_ = $(AM_V_SPHINX_@AM_DEFAULT_V@) +AM_V_SPHINX_0 = @echo " SPHINX $@"; +SPHINXBUILDDIR = $(builddir)/_build +LF = \n +RNDC_CONF = .. |rndc_conf| replace:: ``$(sysconfdir)/rndc.conf`` +RNDC_KEY = .. |rndc_key| replace:: ``$(sysconfdir)/rndc.key`` +NAMED_CONF = .. |named_conf| replace:: ``$(sysconfdir)/named.conf`` +BIND_KEYS = .. |bind_keys| replace:: ``$(sysconfdir)/bind.keys`` +NAMED_PID = .. |named_pid| replace:: ``$(runstatedir)/named.pid`` +SESSION_KEY = .. |session_key| replace:: ``$(runstatedir)/session.key`` +common_SPHINXOPTS = \ + $(SPHINX_W) \ + -c $(srcdir) \ + -a \ + $(SPHINX_V) + + +# The "today" variable set below is not directly used in the ARM, but its value +# is implicitly inserted on the title page of the PDF file produced by Sphinx. +ALLSPHINXOPTS = \ + $(common_SPHINXOPTS) \ + -D today="$(RELEASE_DATE)" \ + -D rst_epilog="$$(printf "$${RST_EPILOG}")" \ + $(SPHINXOPTS) \ + $(srcdir) + +_ = @ +man_RNDC_CONF = .. |rndc_conf| replace:: ``$(_)sysconfdir$(_)/rndc.conf`` +man_RNDC_KEY = .. |rndc_key| replace:: ``$(_)sysconfdir$(_)/rndc.key`` +man_NAMED_CONF = .. |named_conf| replace:: ``$(_)sysconfdir$(_)/named.conf`` +man_BIND_KEYS = .. |bind_keys| replace:: ``$(_)sysconfdir$(_)/bind.keys`` +man_NAMED_PID = .. |named_pid| replace:: ``$(_)runstatedir$(_)/named.pid`` +man_SESSION_KEY = .. |session_key| replace:: ``$(_)runstatedir$(_)/session.key`` +man_SPHINXOPTS = \ + $(common_SPHINXOPTS) \ + -D version="@""PACKAGE_VERSION@" \ + -D today="@""RELEASE_DATE@" \ + -D release="@""PACKAGE_VERSION@" \ + -D rst_epilog="$$(printf "$${man_RST_EPILOG}")" \ + $(SPHINXOPTS) \ + $(srcdir) + +AM_V_SED = $(AM_V_SED_@AM_V@) +AM_V_SED_ = $(AM_V_SED_@AM_DEFAULT_V@) +AM_V_SED_0 = @echo " SED $@"; +AM_V_CFG_TEST = $(AM_V_CFG_TEST_@AM_V@) +AM_V_CFG_TEST_ = $(AM_V_CFG_TEST_@AM_DEFAULT_V@) +AM_V_CFG_TEST_0 = @echo " CFG_GEN $@"; +OPTIONS_FILES = \ + rndc.grammar \ + options \ + primary.zoneopt \ + secondary.zoneopt \ + mirror.zoneopt \ + forward.zoneopt \ + hint.zoneopt \ + stub.zoneopt \ + static-stub.zoneopt \ + redirect.zoneopt \ + delegation-only.zoneopt \ + in-view.zoneopt + +EXTRA_DIST = \ + $(OPTIONS_FILES) \ + checkgrammar.py \ + parsegrammar.py \ + sort-options.pl + +@MAINTAINER_MODE_TRUE@MAINTAINERCLEANFILES = $(OPTIONS_FILES) +@MAINTAINER_MODE_TRUE@cfg_test_CPPFLAGS = \ +@MAINTAINER_MODE_TRUE@ $(AM_CPPFLAGS) \ +@MAINTAINER_MODE_TRUE@ $(LIBISC_CFLAGS) \ +@MAINTAINER_MODE_TRUE@ $(LIBDNS_CFLAGS) \ +@MAINTAINER_MODE_TRUE@ $(LIBISCCFG_CFLAGS) + +@MAINTAINER_MODE_TRUE@cfg_test_LDADD = \ +@MAINTAINER_MODE_TRUE@ $(LIBISC_LIBS) \ +@MAINTAINER_MODE_TRUE@ $(LIBDNS_LIBS) \ +@MAINTAINER_MODE_TRUE@ $(LIBISCCFG_LIBS) + +@MAINTAINER_MODE_TRUE@BUILT_SOURCES = \ +@MAINTAINER_MODE_TRUE@ $(OPTIONS_FILES) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.top $(top_srcdir)/Makefile.docs $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/misc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/misc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.top $(top_srcdir)/Makefile.docs $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +cfg_test$(EXEEXT): $(cfg_test_OBJECTS) $(cfg_test_DEPENDENCIES) $(EXTRA_cfg_test_DEPENDENCIES) + @rm -f cfg_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cfg_test_OBJECTS) $(cfg_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfg_test-cfg_test.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cfg_test-cfg_test.o: cfg_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cfg_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cfg_test-cfg_test.o -MD -MP -MF $(DEPDIR)/cfg_test-cfg_test.Tpo -c -o cfg_test-cfg_test.o `test -f 'cfg_test.c' || echo '$(srcdir)/'`cfg_test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cfg_test-cfg_test.Tpo $(DEPDIR)/cfg_test-cfg_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cfg_test.c' object='cfg_test-cfg_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cfg_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cfg_test-cfg_test.o `test -f 'cfg_test.c' || echo '$(srcdir)/'`cfg_test.c + +cfg_test-cfg_test.obj: cfg_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cfg_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cfg_test-cfg_test.obj -MD -MP -MF $(DEPDIR)/cfg_test-cfg_test.Tpo -c -o cfg_test-cfg_test.obj `if test -f 'cfg_test.c'; then $(CYGPATH_W) 'cfg_test.c'; else $(CYGPATH_W) '$(srcdir)/cfg_test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cfg_test-cfg_test.Tpo $(DEPDIR)/cfg_test-cfg_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cfg_test.c' object='cfg_test-cfg_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cfg_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cfg_test-cfg_test.obj `if test -f 'cfg_test.c'; then $(CYGPATH_W) 'cfg_test.c'; else $(CYGPATH_W) '$(srcdir)/cfg_test.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +test-local: +unit-local: +doc-local: + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/cfg_test-cfg_test.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +doc: doc-am + +doc-am: doc-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/cfg_test-cfg_test.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +test: test-am + +test-am: test-local + +uninstall-am: + +unit: unit-am + +unit-am: unit-local + +.MAKE: all check install install-am install-exec install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir doc-am doc-local dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am test-am test-local uninstall uninstall-am unit-am \ + unit-local + +.PRECIOUS: Makefile + + +export RST_EPILOG = $(RNDC_CONF)$(LF)$(RNDC_KEY)$(LF)$(NAMED_CONF)$(LF)$(BIND_KEYS)$(LF)$(NAMED_PID)$(LF)$(SESSION_KEY) + +export man_RST_EPILOG = $(man_RNDC_CONF)$(LF)$(man_RNDC_KEY)$(LF)$(man_NAMED_CONF)$(LF)$(man_BIND_KEYS)$(LF)$(man_NAMED_PID)$(LF)$(man_SESSION_KEY) + +@MAINTAINER_MODE_TRUE@rndc.grammar: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --rndc --grammar | $(PERL) $(srcdir)/sort-options.pl > $@ + +@MAINTAINER_MODE_TRUE@options: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --named --grammar | $(PERL) $(srcdir)/sort-options.pl > $@ + +@MAINTAINER_MODE_TRUE@primary.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar primary > $@ + +@MAINTAINER_MODE_TRUE@secondary.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar secondary > $@ + +@MAINTAINER_MODE_TRUE@mirror.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar mirror > $@ + +@MAINTAINER_MODE_TRUE@forward.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar forward > $@ + +@MAINTAINER_MODE_TRUE@hint.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar hint > $@ + +@MAINTAINER_MODE_TRUE@stub.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar stub > $@ + +@MAINTAINER_MODE_TRUE@static-stub.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar static-stub > $@ + +@MAINTAINER_MODE_TRUE@redirect.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar redirect > $@ + +@MAINTAINER_MODE_TRUE@delegation-only.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar delegation-only > $@ + +@MAINTAINER_MODE_TRUE@in-view.zoneopt: cfg_test +@MAINTAINER_MODE_TRUE@ $(AM_V_CFG_TEST)$(builddir)/cfg_test --zonegrammar in-view > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/misc/cfg_test.c b/doc/misc/cfg_test.c new file mode 100644 index 0000000..d5f3654 --- /dev/null +++ b/doc/misc/cfg_test.c @@ -0,0 +1,195 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +/*! \file */ + +#include <errno.h> +#include <stdbool.h> +#include <stdlib.h> + +#include <isc/mem.h> +#include <isc/print.h> +#include <isc/string.h> +#include <isc/util.h> + +#include <dns/log.h> + +#include <isccfg/grammar.h> +#include <isccfg/namedconf.h> + +static void +check_result(isc_result_t result, const char *format, ...) { + va_list args; + + if (result == ISC_R_SUCCESS) { + return; + } + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + fprintf(stderr, ": %s\n", isc_result_totext(result)); + exit(1); +} + +static void +output(void *closure, const char *text, int textlen) { + UNUSED(closure); + (void)fwrite(text, 1, textlen, stdout); +} + +static void +usage(void) { + fprintf(stderr, "usage: cfg_test --rndc|--named " + "[--grammar] [--zonegrammar] [--active] " + "[--memstats] conffile\n"); + exit(1); +} + +int +main(int argc, char **argv) { + isc_result_t result; + isc_mem_t *mctx = NULL; + isc_log_t *lctx = NULL; + isc_logconfig_t *lcfg = NULL; + isc_logdestination_t destination; + cfg_parser_t *pctx = NULL; + cfg_obj_t *cfg = NULL; + cfg_type_t *type = NULL; + bool grammar = false; + bool memstats = false; + char *filename = NULL; + unsigned int zonetype = 0; + unsigned int pflags = 0; + + isc_mem_create(&mctx); + + isc_log_create(mctx, &lctx, &lcfg); + isc_log_setcontext(lctx); + + /* + * Create and install the default channel. + */ + destination.file.stream = stderr; + destination.file.name = NULL; + destination.file.versions = ISC_LOG_ROLLNEVER; + destination.file.maximum_size = 0; + isc_log_createchannel(lcfg, "_default", ISC_LOG_TOFILEDESC, + ISC_LOG_DYNAMIC, &destination, ISC_LOG_PRINTTIME); + + result = isc_log_usechannel(lcfg, "_default", NULL, NULL); + check_result(result, "isc_log_usechannel()"); + + /* + * Set the initial debug level. + */ + isc_log_setdebuglevel(lctx, 2); + + if (argc < 3) { + usage(); + } + + while (argc > 1) { + if (strcmp(argv[1], "--active") == 0) { + pflags |= CFG_PRINTER_ACTIVEONLY; + } else if (strcmp(argv[1], "--grammar") == 0) { + grammar = true; + } else if (strcmp(argv[1], "--zonegrammar") == 0) { + argv++, argc--; + if (argc <= 1) { + usage(); + } + if (strcmp(argv[1], "master") == 0 || + strcmp(argv[1], "primary") == 0) + { + zonetype = CFG_ZONE_PRIMARY; + } else if (strcmp(argv[1], "slave") == 0 || + strcmp(argv[1], "secondary") == 0) + { + zonetype = CFG_ZONE_SECONDARY; + } else if (strcmp(argv[1], "mirror") == 0) { + zonetype = CFG_ZONE_MIRROR; + } else if (strcmp(argv[1], "stub") == 0) { + zonetype = CFG_ZONE_STUB; + } else if (strcmp(argv[1], "static-stub") == 0) { + zonetype = CFG_ZONE_STATICSTUB; + } else if (strcmp(argv[1], "hint") == 0) { + zonetype = CFG_ZONE_HINT; + } else if (strcmp(argv[1], "forward") == 0) { + zonetype = CFG_ZONE_FORWARD; + } else if (strcmp(argv[1], "redirect") == 0) { + zonetype = CFG_ZONE_REDIRECT; + } else if (strcmp(argv[1], "delegation-only") == 0) { + zonetype = CFG_ZONE_DELEGATION; + } else if (strcmp(argv[1], "in-view") == 0) { + zonetype = CFG_ZONE_INVIEW; + } else { + usage(); + } + } else if (strcmp(argv[1], "--memstats") == 0) { + memstats = true; + } else if (strcmp(argv[1], "--named") == 0) { + type = &cfg_type_namedconf; + } else if (strcmp(argv[1], "--rndc") == 0) { + type = &cfg_type_rndcconf; + } else if (argv[1][0] == '-') { + usage(); + } else { + filename = argv[1]; + } + argv++, argc--; + } + + if (grammar) { + if (type == NULL) { + usage(); + } + cfg_print_grammar(type, pflags, output, NULL); + } else if (zonetype != 0) { + cfg_print_zonegrammar(zonetype, pflags, output, NULL); + } else { + if (type == NULL || filename == NULL) { + usage(); + } + RUNTIME_CHECK(cfg_parser_create(mctx, lctx, &pctx) == + ISC_R_SUCCESS); + + result = cfg_parse_file(pctx, filename, type, &cfg); + + fprintf(stderr, "read config: %s\n", isc_result_totext(result)); + + if (result != ISC_R_SUCCESS) { + exit(1); + } + + cfg_print(cfg, output, NULL); + + cfg_obj_destroy(pctx, &cfg); + + cfg_parser_destroy(&pctx); + } + + isc_log_destroy(&lctx); + if (memstats) { + isc_mem_stats(mctx, stderr); + } + isc_mem_destroy(&mctx); + + fflush(stdout); + if (ferror(stdout)) { + fprintf(stderr, "write error\n"); + return (1); + } else { + return (0); + } +} diff --git a/doc/misc/checkgrammar.py b/doc/misc/checkgrammar.py new file mode 100644 index 0000000..09984ec --- /dev/null +++ b/doc/misc/checkgrammar.py @@ -0,0 +1,167 @@ +############################################################################ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. +############################################################################ + +""" +Utility to check ISC config grammar consistency. It detects statement names +which use different grammar depending on position in the configuration file. +E.g. "max-zone-ttl" in dnssec-policy uses '<duration>' +vs. '( unlimited | <duration> ) used in options. +""" + +from collections import namedtuple +from itertools import groupby +import fileinput + +import parsegrammar + + +def statement2block(grammar, path): + """Return mapping statement name to "path" where it is allowed. + _top is placeholder name for the namesless topmost context. + + E.g. { + 'options: [('_top',)], + 'server': [('_top', 'view'), ('_top',)], + 'rate-limit': [('_top', 'options'), ('_top', 'view')], + 'slip': [('_top', 'options', 'rate-limit'), ('_top', 'view', 'rate-limit')] + } + """ + key2place = {} + + for key in grammar: + assert not key.startswith("_") + key2place.setdefault(key, []).append(tuple(path)) + if "_mapbody" in grammar[key]: + nested2block = statement2block(grammar[key]["_mapbody"], path + [key]) + # merge to uppermost output dictionary + for nested_key, nested_path in nested2block.items(): + key2place.setdefault(nested_key, []).extend(nested_path) + return key2place + + +def get_statement_grammar(grammar, path, name): + """Descend into grammar dict using provided path + and return final dict found there. + + Intermediate steps into "_mapbody" subkeys are done automatically. + """ + assert path[0] == "_top" + path = list(path) + [name] + for step in path[1:]: + if "_mapbody" in grammar: + grammar = grammar["_mapbody"] + grammar = grammar[step] + return grammar + + +Statement = namedtuple("Statement", ["path", "name", "subgrammar"]) + + +def groupby_grammar(statements): + """ + Return groups of Statement tuples with identical grammars and flags. + See itertools.groupby. + """ + + def keyfunc(statement): + return sorted(statement.subgrammar.items()) + + groups = [] + statements = sorted(statements, key=keyfunc) + for _key, group in groupby(statements, keyfunc): + groups.append(list(group)) # Store group iterator as a list + return groups + + +def diff_statements(whole_grammar, places): + """ + Return map {statement name: [groups of [Statement]s with identical grammar]. + """ + out = {} + for statement_name, paths in places.items(): + grammars = [] + for path in paths: + statement_grammar = get_statement_grammar( + whole_grammar, path, statement_name + ) + grammars.append(Statement(path, statement_name, statement_grammar)) + groups = groupby_grammar(grammars) + out[statement_name] = groups + return out + + +def pformat_grammar(node, level=1): + """Pretty print a given grammar node in the same way as cfg_test would""" + + def sortkey(item): + """Treat 'type' specially and always put it first, for zone types""" + key, _ = item + if key == "type": + return "" + return key + + if "_grammar" in node: # no nesting + assert "_id" not in node + assert "_mapbody" not in node + out = node["_grammar"] + ";" + if "_flags" in node: + out += " // " + ", ".join(node["_flags"]) + return out + "\n" + + # a nested map + out = "" + indent = level * "\t" + if not node.get("_ignore_this_level"): + if "_id" in node: + out += node["_id"] + " " + out += "{\n" + + for key, subnode in sorted(node["_mapbody"].items(), key=sortkey): + if not subnode.get("_ignore_this_level"): + out += f"{indent}{subnode.get('_pprint_name', key)}" + inner_grammar = pformat_grammar(node["_mapbody"][key], level=level + 1) + else: # act as if we were not in a map + inner_grammar = pformat_grammar(node["_mapbody"][key], level=level) + if inner_grammar[0] != ";": # we _did_ find some arguments + out += " " + out += inner_grammar + + if not node.get("_ignore_this_level"): + out += indent[:-1] + "};" # unindent the closing bracket + if "_flags" in node: + out += " // " + ", ".join(node["_flags"]) + return out + "\n" + + +def main(): + """ + Ingest output from cfg_test --grammar and print out statements which use + different grammar in different contexts. + """ + with fileinput.input() as filein: + grammar = parsegrammar.parse_mapbody(filein) + places = statement2block(grammar, ["_top"]) + + for statementname, groups in diff_statements(grammar, places).items(): + if len(groups) > 1: + print(f'statement "{statementname}" is inconsistent across blocks') + for group in groups: + print( + "- path:", ", ".join(" -> ".join(variant.path) for variant in group) + ) + print(" ", pformat_grammar(group[0].subgrammar, level=1)) + print() + + +if __name__ == "__main__": + main() diff --git a/doc/misc/delegation-only.zoneopt b/doc/misc/delegation-only.zoneopt new file mode 100644 index 0000000..ab86327 --- /dev/null +++ b/doc/misc/delegation-only.zoneopt @@ -0,0 +1,3 @@ +zone <string> [ <class> ] { + type delegation-only; +}; diff --git a/doc/misc/forward.zoneopt b/doc/misc/forward.zoneopt new file mode 100644 index 0000000..069f2ce --- /dev/null +++ b/doc/misc/forward.zoneopt @@ -0,0 +1,6 @@ +zone <string> [ <class> ] { + type forward; + delegation-only <boolean>; // deprecated + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; +}; diff --git a/doc/misc/hint.zoneopt b/doc/misc/hint.zoneopt new file mode 100644 index 0000000..d14c3ef --- /dev/null +++ b/doc/misc/hint.zoneopt @@ -0,0 +1,6 @@ +zone <string> [ <class> ] { + type hint; + check-names ( fail | warn | ignore ); + delegation-only <boolean>; // deprecated + file <quoted_string>; +}; diff --git a/doc/misc/in-view.zoneopt b/doc/misc/in-view.zoneopt new file mode 100644 index 0000000..c63c427 --- /dev/null +++ b/doc/misc/in-view.zoneopt @@ -0,0 +1,3 @@ +zone <string> [ <class> ] { + in-view <string>; +}; diff --git a/doc/misc/mirror.zoneopt b/doc/misc/mirror.zoneopt new file mode 100644 index 0000000..ac371cd --- /dev/null +++ b/doc/misc/mirror.zoneopt @@ -0,0 +1,43 @@ +zone <string> [ <class> ] { + type mirror; + allow-notify { <address_match_element>; ... }; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + allow-transfer [ port <integer> ] [ transport <string> ] { <address_match_element>; ... }; + allow-update-forwarding { <address_match_element>; ... }; + also-notify [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + alt-transfer-source ( <ipv4_address> | * ) ; // deprecated + alt-transfer-source-v6 ( <ipv6_address> | * ) ; // deprecated + check-names ( fail | warn | ignore ); + database <string>; + file <quoted_string>; + ixfr-from-differences <boolean>; + journal <quoted_string>; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + max-ixfr-ratio ( unlimited | <percentage> ); + max-journal-size ( default | unlimited | <sizeval> ); + max-records <integer>; + max-refresh-time <integer>; + max-retry-time <integer>; + max-transfer-idle-in <integer>; + max-transfer-idle-out <integer>; + max-transfer-time-in <integer>; + max-transfer-time-out <integer>; + min-refresh-time <integer>; + min-retry-time <integer>; + multi-master <boolean>; + notify ( explicit | master-only | primary-only | <boolean> ); + notify-delay <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + request-expire <boolean>; + request-ixfr <boolean>; + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + try-tcp-refresh <boolean>; + use-alt-transfer-source <boolean>; // deprecated + zero-no-soa-ttl <boolean>; + zone-statistics ( full | terse | none | <boolean> ); +}; diff --git a/doc/misc/options b/doc/misc/options new file mode 100644 index 0000000..e19261f --- /dev/null +++ b/doc/misc/options @@ -0,0 +1,597 @@ +acl <string> { <address_match_element>; ... }; // may occur multiple times + +controls { + inet ( <ipv4_address> | <ipv6_address> | * ) [ port ( <integer> | * ) ] allow { <address_match_element>; ... } [ keys { <string>; ... } ] [ read-only <boolean> ]; // may occur multiple times + unix <quoted_string> perm <integer> owner <integer> group <integer> [ keys { <string>; ... } ] [ read-only <boolean> ]; // may occur multiple times +}; // may occur multiple times + +dlz <string> { + database <string>; + search <boolean>; +}; // may occur multiple times + +dnssec-policy <string> { + dnskey-ttl <duration>; + keys { ( csk | ksk | zsk ) [ ( key-directory ) ] lifetime <duration_or_unlimited> algorithm <string> [ <integer> ]; ... }; + max-zone-ttl <duration>; + nsec3param [ iterations <integer> ] [ optout <boolean> ] [ salt-length <integer> ]; + parent-ds-ttl <duration>; + parent-propagation-delay <duration>; + parent-registration-delay <duration>; // obsolete + publish-safety <duration>; + purge-keys <duration>; + retire-safety <duration>; + signatures-refresh <duration>; + signatures-validity <duration>; + signatures-validity-dnskey <duration>; + zone-propagation-delay <duration>; +}; // may occur multiple times + +dyndb <string> <quoted_string> { <unspecified-text> }; // may occur multiple times + +http <string> { + endpoints { <quoted_string>; ... }; + listener-clients <integer>; + streams-per-connection <integer>; +}; // may occur multiple times + +key <string> { + algorithm <string>; + secret <string>; +}; // may occur multiple times + +logging { + category <string> { <string>; ... }; // may occur multiple times + channel <string> { + buffered <boolean>; + file <quoted_string> [ versions ( unlimited | <integer> ) ] [ size <size> ] [ suffix ( increment | timestamp ) ]; + null; + print-category <boolean>; + print-severity <boolean>; + print-time ( iso8601 | iso8601-utc | local | <boolean> ); + severity <log_severity>; + stderr; + syslog [ <syslog_facility> ]; + }; // may occur multiple times +}; + +managed-keys { <string> ( static-key | initial-key | static-ds | initial-ds ) <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times, deprecated + +options { + allow-new-zones <boolean>; + allow-notify { <address_match_element>; ... }; + allow-query { <address_match_element>; ... }; + allow-query-cache { <address_match_element>; ... }; + allow-query-cache-on { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + allow-recursion { <address_match_element>; ... }; + allow-recursion-on { <address_match_element>; ... }; + allow-transfer [ port <integer> ] [ transport <string> ] { <address_match_element>; ... }; + allow-update { <address_match_element>; ... }; + allow-update-forwarding { <address_match_element>; ... }; + also-notify [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + alt-transfer-source ( <ipv4_address> | * ) ; // deprecated + alt-transfer-source-v6 ( <ipv6_address> | * ) ; // deprecated + answer-cookie <boolean>; + attach-cache <string>; + auth-nxdomain <boolean>; + auto-dnssec ( allow | maintain | off ); // deprecated + automatic-interface-scan <boolean>; + avoid-v4-udp-ports { <portrange>; ... }; // deprecated + avoid-v6-udp-ports { <portrange>; ... }; // deprecated + bindkeys-file <quoted_string>; + blackhole { <address_match_element>; ... }; + catalog-zones { zone <string> [ default-primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... } ] [ zone-directory <quoted_string> ] [ in-memory <boolean> ] [ min-update-interval <duration> ]; ... }; + check-dup-records ( fail | warn | ignore ); + check-integrity <boolean>; + check-mx ( fail | warn | ignore ); + check-mx-cname ( fail | warn | ignore ); + check-names ( primary | master | secondary | slave | response ) ( fail | warn | ignore ); // may occur multiple times + check-sibling <boolean>; + check-spf ( warn | ignore ); + check-srv-cname ( fail | warn | ignore ); + check-wildcard <boolean>; + clients-per-query <integer>; + cookie-algorithm ( aes | siphash24 ); + cookie-secret <string>; // may occur multiple times + coresize ( default | unlimited | <sizeval> ); // deprecated + datasize ( default | unlimited | <sizeval> ); // deprecated + deny-answer-addresses { <address_match_element>; ... } [ except-from { <string>; ... } ]; + deny-answer-aliases { <string>; ... } [ except-from { <string>; ... } ]; + dialup ( notify | notify-passive | passive | refresh | <boolean> ); // deprecated + directory <quoted_string>; + disable-algorithms <string> { <string>; ... }; // may occur multiple times + disable-ds-digests <string> { <string>; ... }; // may occur multiple times + disable-empty-zone <string>; // may occur multiple times + dns64 <netprefix> { + break-dnssec <boolean>; + clients { <address_match_element>; ... }; + exclude { <address_match_element>; ... }; + mapped { <address_match_element>; ... }; + recursive-only <boolean>; + suffix <ipv6_address>; + }; // may occur multiple times + dns64-contact <string>; + dns64-server <string>; + dnskey-sig-validity <integer>; + dnsrps-enable <boolean>; // not configured + dnsrps-options { <unspecified-text> }; // not configured + dnssec-accept-expired <boolean>; + dnssec-dnskey-kskonly <boolean>; + dnssec-loadkeys-interval <integer>; + dnssec-must-be-secure <string> <boolean>; // may occur multiple times, deprecated + dnssec-policy <string>; + dnssec-secure-to-insecure <boolean>; + dnssec-update-mode ( maintain | no-resign ); + dnssec-validation ( yes | no | auto ); + dnstap { ( all | auth | client | forwarder | resolver | update ) [ ( query | response ) ]; ... }; // not configured + dnstap-identity ( <quoted_string> | none | hostname ); // not configured + dnstap-output ( file | unix ) <quoted_string> [ size ( unlimited | <size> ) ] [ versions ( unlimited | <integer> ) ] [ suffix ( increment | timestamp ) ]; // not configured + dnstap-version ( <quoted_string> | none ); // not configured + dscp <integer>; // obsolete + dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port <integer> ] | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ); ... }; + dump-file <quoted_string>; + edns-udp-size <integer>; + empty-contact <string>; + empty-server <string>; + empty-zones-enable <boolean>; + fetch-quota-params <integer> <fixedpoint> <fixedpoint> <fixedpoint>; + fetches-per-server <integer> [ ( drop | fail ) ]; + fetches-per-zone <integer> [ ( drop | fail ) ]; + files ( default | unlimited | <sizeval> ); // deprecated + flush-zones-on-shutdown <boolean>; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + fstrm-set-buffer-hint <integer>; // not configured + fstrm-set-flush-timeout <integer>; // not configured + fstrm-set-input-queue-size <integer>; // not configured + fstrm-set-output-notify-threshold <integer>; // not configured + fstrm-set-output-queue-model ( mpsc | spsc ); // not configured + fstrm-set-output-queue-size <integer>; // not configured + fstrm-set-reopen-interval <duration>; // not configured + geoip-directory ( <quoted_string> | none ); + glue-cache <boolean>; // deprecated + heartbeat-interval <integer>; // deprecated + hostname ( <quoted_string> | none ); + http-listener-clients <integer>; + http-port <integer>; + http-streams-per-connection <integer>; + https-port <integer>; + interface-interval <duration>; + ipv4only-contact <string>; + ipv4only-enable <boolean>; + ipv4only-server <string>; + ixfr-from-differences ( primary | master | secondary | slave | <boolean> ); + keep-response-order { <address_match_element>; ... }; + key-directory <quoted_string>; + lame-ttl <duration>; + listen-on [ port <integer> ] [ tls <string> ] [ http <string> ] { <address_match_element>; ... }; // may occur multiple times + listen-on-v6 [ port <integer> ] [ tls <string> ] [ http <string> ] { <address_match_element>; ... }; // may occur multiple times + lmdb-mapsize <sizeval>; + lock-file ( <quoted_string> | none ); + managed-keys-directory <quoted_string>; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + match-mapped-addresses <boolean>; + max-cache-size ( default | unlimited | <sizeval> | <percentage> ); + max-cache-ttl <duration>; + max-clients-per-query <integer>; + max-ixfr-ratio ( unlimited | <percentage> ); + max-journal-size ( default | unlimited | <sizeval> ); + max-ncache-ttl <duration>; + max-records <integer>; + max-recursion-depth <integer>; + max-recursion-queries <integer>; + max-refresh-time <integer>; + max-retry-time <integer>; + max-rsa-exponent-size <integer>; + max-stale-ttl <duration>; + max-transfer-idle-in <integer>; + max-transfer-idle-out <integer>; + max-transfer-time-in <integer>; + max-transfer-time-out <integer>; + max-udp-size <integer>; + max-zone-ttl ( unlimited | <duration> ); + memstatistics <boolean>; + memstatistics-file <quoted_string>; + message-compression <boolean>; + min-cache-ttl <duration>; + min-ncache-ttl <duration>; + min-refresh-time <integer>; + min-retry-time <integer>; + minimal-any <boolean>; + minimal-responses ( no-auth | no-auth-recursive | <boolean> ); + multi-master <boolean>; + new-zones-directory <quoted_string>; + no-case-compress { <address_match_element>; ... }; + nocookie-udp-size <integer>; + notify ( explicit | master-only | primary-only | <boolean> ); + notify-delay <integer>; + notify-rate <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + notify-to-soa <boolean>; + nsec3-test-zone <boolean>; // test only + nta-lifetime <duration>; + nta-recheck <duration>; + nxdomain-redirect <string>; + parental-source ( <ipv4_address> | * ) ; + parental-source-v6 ( <ipv6_address> | * ) ; + pid-file ( <quoted_string> | none ); + port <integer>; + preferred-glue <string>; + prefetch <integer> [ <integer> ]; + provide-ixfr <boolean>; + qname-minimization ( strict | relaxed | disabled | off ); + query-source [ address ] ( <ipv4_address> | * ); + query-source-v6 [ address ] ( <ipv6_address> | * ); + querylog <boolean>; + random-device ( <quoted_string> | none ); // obsolete + rate-limit { + all-per-second <integer>; + errors-per-second <integer>; + exempt-clients { <address_match_element>; ... }; + ipv4-prefix-length <integer>; + ipv6-prefix-length <integer>; + log-only <boolean>; + max-table-size <integer>; + min-table-size <integer>; + nodata-per-second <integer>; + nxdomains-per-second <integer>; + qps-scale <integer>; + referrals-per-second <integer>; + responses-per-second <integer>; + slip <integer>; + window <integer>; + }; + recursing-file <quoted_string>; + recursion <boolean>; + recursive-clients <integer>; + request-expire <boolean>; + request-ixfr <boolean>; + request-nsid <boolean>; + require-server-cookie <boolean>; + reserved-sockets <integer>; // deprecated + resolver-nonbackoff-tries <integer>; + resolver-query-timeout <integer>; + resolver-retry-interval <integer>; + response-padding { <address_match_element>; ... } block-size <integer>; + response-policy { zone <string> [ add-soa <boolean> ] [ log <boolean> ] [ max-policy-ttl <duration> ] [ min-update-interval <duration> ] [ policy ( cname | disabled | drop | given | no-op | nodata | nxdomain | passthru | tcp-only <quoted_string> ) ] [ recursive-only <boolean> ] [ nsip-enable <boolean> ] [ nsdname-enable <boolean> ]; ... } [ add-soa <boolean> ] [ break-dnssec <boolean> ] [ max-policy-ttl <duration> ] [ min-update-interval <duration> ] [ min-ns-dots <integer> ] [ nsip-wait-recurse <boolean> ] [ nsdname-wait-recurse <boolean> ] [ qname-wait-recurse <boolean> ] [ recursive-only <boolean> ] [ nsip-enable <boolean> ] [ nsdname-enable <boolean> ] [ dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text> } ]; + reuseport <boolean>; + root-delegation-only [ exclude { <string>; ... } ]; // deprecated + root-key-sentinel <boolean>; + rrset-order { [ class <string> ] [ type <string> ] [ name <quoted_string> ] <string> <string>; ... }; + secroots-file <quoted_string>; + send-cookie <boolean>; + serial-query-rate <integer>; + serial-update-method ( date | increment | unixtime ); + server-id ( <quoted_string> | none | hostname ); + servfail-ttl <duration>; + session-keyalg <string>; + session-keyfile ( <quoted_string> | none ); + session-keyname <string>; + sig-signing-nodes <integer>; + sig-signing-signatures <integer>; + sig-signing-type <integer>; + sig-validity-interval <integer> [ <integer> ]; + sortlist { <address_match_element>; ... }; + stacksize ( default | unlimited | <sizeval> ); // deprecated + stale-answer-client-timeout ( disabled | off | <integer> ); + stale-answer-enable <boolean>; + stale-answer-ttl <duration>; + stale-cache-enable <boolean>; + stale-refresh-time <duration>; + startup-notify-rate <integer>; + statistics-file <quoted_string>; + suppress-initial-notify <boolean>; // obsolete + synth-from-dnssec <boolean>; + tcp-advertised-timeout <integer>; + tcp-clients <integer>; + tcp-idle-timeout <integer>; + tcp-initial-timeout <integer>; + tcp-keepalive-timeout <integer>; + tcp-listen-queue <integer>; + tcp-receive-buffer <integer>; + tcp-send-buffer <integer>; + tkey-dhkey <quoted_string> <integer>; // deprecated + tkey-domain <quoted_string>; + tkey-gssapi-credential <quoted_string>; + tkey-gssapi-keytab <quoted_string>; + tls-port <integer>; + transfer-format ( many-answers | one-answer ); + transfer-message-size <integer>; + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + transfers-in <integer>; + transfers-out <integer>; + transfers-per-ns <integer>; + trust-anchor-telemetry <boolean>; // experimental + try-tcp-refresh <boolean>; + udp-receive-buffer <integer>; + udp-send-buffer <integer>; + update-check-ksk <boolean>; + update-quota <integer>; + use-alt-transfer-source <boolean>; // deprecated + use-v4-udp-ports { <portrange>; ... }; // deprecated + use-v6-udp-ports { <portrange>; ... }; // deprecated + v6-bias <integer>; + validate-except { <string>; ... }; + version ( <quoted_string> | none ); + zero-no-soa-ttl <boolean>; + zero-no-soa-ttl-cache <boolean>; + zone-statistics ( full | terse | none | <boolean> ); +}; + +parental-agents <string> [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; // may occur multiple times + +plugin ( query ) <string> [ { <unspecified-text> } ]; // may occur multiple times + +primaries <string> [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; // may occur multiple times + +server <netprefix> { + bogus <boolean>; + edns <boolean>; + edns-udp-size <integer>; + edns-version <integer>; + keys <server_key>; + max-udp-size <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + padding <integer>; + provide-ixfr <boolean>; + query-source [ address ] ( <ipv4_address> | * ); + query-source-v6 [ address ] ( <ipv6_address> | * ); + request-expire <boolean>; + request-ixfr <boolean>; + request-nsid <boolean>; + send-cookie <boolean>; + tcp-keepalive <boolean>; + tcp-only <boolean>; + transfer-format ( many-answers | one-answer ); + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + transfers <integer>; +}; // may occur multiple times + +statistics-channels { + inet ( <ipv4_address> | <ipv6_address> | * ) [ port ( <integer> | * ) ] [ allow { <address_match_element>; ... } ]; // may occur multiple times +}; // may occur multiple times + +tls <string> { + ca-file <quoted_string>; + cert-file <quoted_string>; + ciphers <string>; + dhparam-file <quoted_string>; + key-file <quoted_string>; + prefer-server-ciphers <boolean>; + protocols { <string>; ... }; + remote-hostname <quoted_string>; + session-tickets <boolean>; +}; // may occur multiple times + +trust-anchors { <string> ( static-key | initial-key | static-ds | initial-ds ) <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times + +trusted-keys { <string> <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times, deprecated + +view <string> [ <class> ] { + allow-new-zones <boolean>; + allow-notify { <address_match_element>; ... }; + allow-query { <address_match_element>; ... }; + allow-query-cache { <address_match_element>; ... }; + allow-query-cache-on { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + allow-recursion { <address_match_element>; ... }; + allow-recursion-on { <address_match_element>; ... }; + allow-transfer [ port <integer> ] [ transport <string> ] { <address_match_element>; ... }; + allow-update { <address_match_element>; ... }; + allow-update-forwarding { <address_match_element>; ... }; + also-notify [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + alt-transfer-source ( <ipv4_address> | * ) ; // deprecated + alt-transfer-source-v6 ( <ipv6_address> | * ) ; // deprecated + attach-cache <string>; + auth-nxdomain <boolean>; + auto-dnssec ( allow | maintain | off ); // deprecated + catalog-zones { zone <string> [ default-primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... } ] [ zone-directory <quoted_string> ] [ in-memory <boolean> ] [ min-update-interval <duration> ]; ... }; + check-dup-records ( fail | warn | ignore ); + check-integrity <boolean>; + check-mx ( fail | warn | ignore ); + check-mx-cname ( fail | warn | ignore ); + check-names ( primary | master | secondary | slave | response ) ( fail | warn | ignore ); // may occur multiple times + check-sibling <boolean>; + check-spf ( warn | ignore ); + check-srv-cname ( fail | warn | ignore ); + check-wildcard <boolean>; + clients-per-query <integer>; + deny-answer-addresses { <address_match_element>; ... } [ except-from { <string>; ... } ]; + deny-answer-aliases { <string>; ... } [ except-from { <string>; ... } ]; + dialup ( notify | notify-passive | passive | refresh | <boolean> ); // deprecated + disable-algorithms <string> { <string>; ... }; // may occur multiple times + disable-ds-digests <string> { <string>; ... }; // may occur multiple times + disable-empty-zone <string>; // may occur multiple times + dlz <string> { + database <string>; + search <boolean>; + }; // may occur multiple times + dns64 <netprefix> { + break-dnssec <boolean>; + clients { <address_match_element>; ... }; + exclude { <address_match_element>; ... }; + mapped { <address_match_element>; ... }; + recursive-only <boolean>; + suffix <ipv6_address>; + }; // may occur multiple times + dns64-contact <string>; + dns64-server <string>; + dnskey-sig-validity <integer>; + dnsrps-enable <boolean>; // not configured + dnsrps-options { <unspecified-text> }; // not configured + dnssec-accept-expired <boolean>; + dnssec-dnskey-kskonly <boolean>; + dnssec-loadkeys-interval <integer>; + dnssec-must-be-secure <string> <boolean>; // may occur multiple times, deprecated + dnssec-policy <string>; + dnssec-secure-to-insecure <boolean>; + dnssec-update-mode ( maintain | no-resign ); + dnssec-validation ( yes | no | auto ); + dnstap { ( all | auth | client | forwarder | resolver | update ) [ ( query | response ) ]; ... }; // not configured + dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port <integer> ] | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ); ... }; + dyndb <string> <quoted_string> { <unspecified-text> }; // may occur multiple times + edns-udp-size <integer>; + empty-contact <string>; + empty-server <string>; + empty-zones-enable <boolean>; + fetch-quota-params <integer> <fixedpoint> <fixedpoint> <fixedpoint>; + fetches-per-server <integer> [ ( drop | fail ) ]; + fetches-per-zone <integer> [ ( drop | fail ) ]; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + glue-cache <boolean>; // deprecated + ipv4only-contact <string>; + ipv4only-enable <boolean>; + ipv4only-server <string>; + ixfr-from-differences ( primary | master | secondary | slave | <boolean> ); + key <string> { + algorithm <string>; + secret <string>; + }; // may occur multiple times + key-directory <quoted_string>; + lame-ttl <duration>; + lmdb-mapsize <sizeval>; + managed-keys { <string> ( static-key | initial-key | static-ds | initial-ds ) <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times, deprecated + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + match-clients { <address_match_element>; ... }; + match-destinations { <address_match_element>; ... }; + match-recursive-only <boolean>; + max-cache-size ( default | unlimited | <sizeval> | <percentage> ); + max-cache-ttl <duration>; + max-clients-per-query <integer>; + max-ixfr-ratio ( unlimited | <percentage> ); + max-journal-size ( default | unlimited | <sizeval> ); + max-ncache-ttl <duration>; + max-records <integer>; + max-recursion-depth <integer>; + max-recursion-queries <integer>; + max-refresh-time <integer>; + max-retry-time <integer>; + max-stale-ttl <duration>; + max-transfer-idle-in <integer>; + max-transfer-idle-out <integer>; + max-transfer-time-in <integer>; + max-transfer-time-out <integer>; + max-udp-size <integer>; + max-zone-ttl ( unlimited | <duration> ); + message-compression <boolean>; + min-cache-ttl <duration>; + min-ncache-ttl <duration>; + min-refresh-time <integer>; + min-retry-time <integer>; + minimal-any <boolean>; + minimal-responses ( no-auth | no-auth-recursive | <boolean> ); + multi-master <boolean>; + new-zones-directory <quoted_string>; + no-case-compress { <address_match_element>; ... }; + nocookie-udp-size <integer>; + notify ( explicit | master-only | primary-only | <boolean> ); + notify-delay <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + notify-to-soa <boolean>; + nsec3-test-zone <boolean>; // test only + nta-lifetime <duration>; + nta-recheck <duration>; + nxdomain-redirect <string>; + parental-source ( <ipv4_address> | * ) ; + parental-source-v6 ( <ipv6_address> | * ) ; + plugin ( query ) <string> [ { <unspecified-text> } ]; // may occur multiple times + preferred-glue <string>; + prefetch <integer> [ <integer> ]; + provide-ixfr <boolean>; + qname-minimization ( strict | relaxed | disabled | off ); + query-source [ address ] ( <ipv4_address> | * ); + query-source-v6 [ address ] ( <ipv6_address> | * ); + rate-limit { + all-per-second <integer>; + errors-per-second <integer>; + exempt-clients { <address_match_element>; ... }; + ipv4-prefix-length <integer>; + ipv6-prefix-length <integer>; + log-only <boolean>; + max-table-size <integer>; + min-table-size <integer>; + nodata-per-second <integer>; + nxdomains-per-second <integer>; + qps-scale <integer>; + referrals-per-second <integer>; + responses-per-second <integer>; + slip <integer>; + window <integer>; + }; + recursion <boolean>; + request-expire <boolean>; + request-ixfr <boolean>; + request-nsid <boolean>; + require-server-cookie <boolean>; + resolver-nonbackoff-tries <integer>; + resolver-query-timeout <integer>; + resolver-retry-interval <integer>; + response-padding { <address_match_element>; ... } block-size <integer>; + response-policy { zone <string> [ add-soa <boolean> ] [ log <boolean> ] [ max-policy-ttl <duration> ] [ min-update-interval <duration> ] [ policy ( cname | disabled | drop | given | no-op | nodata | nxdomain | passthru | tcp-only <quoted_string> ) ] [ recursive-only <boolean> ] [ nsip-enable <boolean> ] [ nsdname-enable <boolean> ]; ... } [ add-soa <boolean> ] [ break-dnssec <boolean> ] [ max-policy-ttl <duration> ] [ min-update-interval <duration> ] [ min-ns-dots <integer> ] [ nsip-wait-recurse <boolean> ] [ nsdname-wait-recurse <boolean> ] [ qname-wait-recurse <boolean> ] [ recursive-only <boolean> ] [ nsip-enable <boolean> ] [ nsdname-enable <boolean> ] [ dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text> } ]; + root-delegation-only [ exclude { <string>; ... } ]; // deprecated + root-key-sentinel <boolean>; + rrset-order { [ class <string> ] [ type <string> ] [ name <quoted_string> ] <string> <string>; ... }; + send-cookie <boolean>; + serial-update-method ( date | increment | unixtime ); + server <netprefix> { + bogus <boolean>; + edns <boolean>; + edns-udp-size <integer>; + edns-version <integer>; + keys <server_key>; + max-udp-size <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + padding <integer>; + provide-ixfr <boolean>; + query-source [ address ] ( <ipv4_address> | * ); + query-source-v6 [ address ] ( <ipv6_address> | * ); + request-expire <boolean>; + request-ixfr <boolean>; + request-nsid <boolean>; + send-cookie <boolean>; + tcp-keepalive <boolean>; + tcp-only <boolean>; + transfer-format ( many-answers | one-answer ); + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + transfers <integer>; + }; // may occur multiple times + servfail-ttl <duration>; + sig-signing-nodes <integer>; + sig-signing-signatures <integer>; + sig-signing-type <integer>; + sig-validity-interval <integer> [ <integer> ]; + sortlist { <address_match_element>; ... }; + stale-answer-client-timeout ( disabled | off | <integer> ); + stale-answer-enable <boolean>; + stale-answer-ttl <duration>; + stale-cache-enable <boolean>; + stale-refresh-time <duration>; + suppress-initial-notify <boolean>; // obsolete + synth-from-dnssec <boolean>; + transfer-format ( many-answers | one-answer ); + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + trust-anchor-telemetry <boolean>; // experimental + trust-anchors { <string> ( static-key | initial-key | static-ds | initial-ds ) <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times + trusted-keys { <string> <integer> <integer> <integer> <quoted_string>; ... }; // may occur multiple times, deprecated + try-tcp-refresh <boolean>; + update-check-ksk <boolean>; + use-alt-transfer-source <boolean>; // deprecated + v6-bias <integer>; + validate-except { <string>; ... }; + zero-no-soa-ttl <boolean>; + zero-no-soa-ttl-cache <boolean>; + zone-statistics ( full | terse | none | <boolean> ); +}; // may occur multiple times + diff --git a/doc/misc/parsegrammar.py b/doc/misc/parsegrammar.py new file mode 100644 index 0000000..b3fede0 --- /dev/null +++ b/doc/misc/parsegrammar.py @@ -0,0 +1,194 @@ +############################################################################ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. +############################################################################ + +""" +Read ISC config grammar description produced by "cfg_test --grammar", +transform it into JSON, and print it to stdout. + +Beware: This parser is pretty dumb and heavily depends on cfg_test output +format. See parse_mapbody() for more details. + +Maps are recursively parsed into sub-dicts, all other elements (lists etc.) +are left intact and returned as one string. + +Output example from named.conf grammar showing three variants follow. +Keys "_flags" and "_id" are present only if non-empty. Key "_grammar" denotes +end node, key "_mapbody" denotes a nested map. + +{ + "acl": { + "_flags": [ + "may occur multiple times" + ], + "_grammar": "<string> { <address_match_element>; ... }" + }, + "http": { + "_flags": [ + "may occur multiple times" + ], + "_id": "<string>", + "_mapbody": { + "endpoints": { + "_grammar": "{ <quoted_string>; ... }" + }, + "streams-per-connection": { + "_grammar": "<integer>" + } + } + }, + "options": { + "_mapbody": { + "rate-limit": { + "_mapbody": { + "all-per-second": { + "_grammar": "<integer>" + } + } + } + } + } +} +""" +import fileinput +import json +import re + +FLAGS = [ + "may occur multiple times", + "obsolete", + "deprecated", + "experimental", + "test only", +] + +KEY_REGEX = re.compile("[a-zA-Z0-9-]+") + + +def split_comments(line): + """Split line on comment boundary and strip right-side whitespace. + Supports only #, //, and /* comments which end at the end of line. + It does NOT handle: + - quoted strings + - /* comments which do not end at line boundary + - multiple /* comments on a single line + """ + assert '"' not in line, 'lines with " are not supported' + data_end_idx = len(line) + for delimiter in ["#", "//", "/*"]: + try: + data_end_idx = min(line.index(delimiter), data_end_idx) + except ValueError: + continue + if delimiter == "/*": + # sanity checks + if not line.rstrip().endswith("*/"): + raise NotImplementedError( + "unsupported /* comment, does not end at the end of line", line + ) + if "/*" in line[data_end_idx + 1 :]: + raise NotImplementedError( + "unsupported line with multiple /* comments", line + ) + + noncomment = line[:data_end_idx] + comment = line[data_end_idx:] + return noncomment, comment + + +def parse_line(filein): + """Consume single line from input, return non-comment and comment.""" + for line in filein: + line, comment = split_comments(line) + line = line.strip() + comment = comment.strip() + if not line: + continue + yield line, comment + + +def parse_flags(comments): + """Extract known flags from comments. Must match exact strings used by cfg_test.""" + out = [] + for flag in FLAGS: + if flag in comments: + out.append(flag) + return out + + +def parse_mapbody(filein): + """Parse body of a "map" in ISC config format. + + Input lines can be only: + - whitespace & comments only -> ignore + - <keyword> <anything>; -> store <anything> as "_grammar" for this keyword + - <keyword> <anything> { -> parse sub-map and store (optional) <anything> as "_id", + producing nested dict under "_mapbody" + Also store known strings found at the end of line in "_flags". + + Returns: + - tuple (map dict, map comment) when }; line is reached + - map dict when we run out of lines without the closing }; + """ + thismap = {} + for line, comment in parse_line(filein): + flags = parse_flags(comment) + if line == "};": # end of a nested map + return thismap, flags + + # first word - a map key name + # beware: some statements do not have parameters, e.g. "null;" + key = line.split()[0].rstrip(";") + # map key sanity check + if not KEY_REGEX.fullmatch(key): + raise NotImplementedError("suspicious keyword detected", line) + + # omit keyword from the grammar + grammar = line[len(key) :].strip() + # also skip final ; or { + grammar = grammar[:-1].strip() + + thismap[key] = {} + if line.endswith("{"): + # nested map, recurse, but keep "extra identifiers" if any + try: + subkeys, flags = parse_mapbody(filein) + except ValueError: + raise ValueError("unfinished nested map, missing }; detected") from None + if flags: + thismap[key]["_flags"] = flags + if grammar: + # for lines which look like "view <name> {" store "<name>" + thismap[key]["_id"] = grammar + thismap[key]["_mapbody"] = subkeys + else: + assert line.endswith(";") + if flags: + thismap[key]["_flags"] = flags + thismap[key]["_grammar"] = grammar + + # Ran out of lines: can happen only on the end of the top-level map-body! + # Intentionally do not return second parameter to cause ValueError + # if we reach this spot with a missing }; in a nested map. + assert len(thismap) + return thismap + + +def main(): + """Read stdin or filename provided on command line""" + with fileinput.input() as filein: + grammar = parse_mapbody(filein) + print(json.dumps(grammar, indent=4)) + + +if __name__ == "__main__": + main() diff --git a/doc/misc/primary.zoneopt b/doc/misc/primary.zoneopt new file mode 100644 index 0000000..8f646e3 --- /dev/null +++ b/doc/misc/primary.zoneopt @@ -0,0 +1,62 @@ +zone <string> [ <class> ] { + type primary; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + allow-transfer [ port <integer> ] [ transport <string> ] { <address_match_element>; ... }; + allow-update { <address_match_element>; ... }; + also-notify [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + alt-transfer-source ( <ipv4_address> | * ) ; // deprecated + alt-transfer-source-v6 ( <ipv6_address> | * ) ; // deprecated + auto-dnssec ( allow | maintain | off ); // deprecated + check-dup-records ( fail | warn | ignore ); + check-integrity <boolean>; + check-mx ( fail | warn | ignore ); + check-mx-cname ( fail | warn | ignore ); + check-names ( fail | warn | ignore ); + check-sibling <boolean>; + check-spf ( warn | ignore ); + check-srv-cname ( fail | warn | ignore ); + check-wildcard <boolean>; + database <string>; + dialup ( notify | notify-passive | passive | refresh | <boolean> ); // deprecated + dlz <string>; + dnskey-sig-validity <integer>; + dnssec-dnskey-kskonly <boolean>; + dnssec-loadkeys-interval <integer>; + dnssec-policy <string>; + dnssec-secure-to-insecure <boolean>; + dnssec-update-mode ( maintain | no-resign ); + file <quoted_string>; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + inline-signing <boolean>; + ixfr-from-differences <boolean>; + journal <quoted_string>; + key-directory <quoted_string>; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + max-ixfr-ratio ( unlimited | <percentage> ); + max-journal-size ( default | unlimited | <sizeval> ); + max-records <integer>; + max-transfer-idle-out <integer>; + max-transfer-time-out <integer>; + max-zone-ttl ( unlimited | <duration> ); + notify ( explicit | master-only | primary-only | <boolean> ); + notify-delay <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + notify-to-soa <boolean>; + nsec3-test-zone <boolean>; // test only + parental-agents [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + parental-source ( <ipv4_address> | * ) ; + parental-source-v6 ( <ipv6_address> | * ) ; + serial-update-method ( date | increment | unixtime ); + sig-signing-nodes <integer>; + sig-signing-signatures <integer>; + sig-signing-type <integer>; + sig-validity-interval <integer> [ <integer> ]; + update-check-ksk <boolean>; + update-policy ( local | { ( deny | grant ) <string> ( 6to4-self | external | krb5-self | krb5-selfsub | krb5-subdomain | krb5-subdomain-self-rhs | ms-self | ms-selfsub | ms-subdomain | ms-subdomain-self-rhs | name | self | selfsub | selfwild | subdomain | tcp-self | wildcard | zonesub ) [ <string> ] <rrtypelist>; ... } ); + zero-no-soa-ttl <boolean>; + zone-statistics ( full | terse | none | <boolean> ); +}; diff --git a/doc/misc/redirect.zoneopt b/doc/misc/redirect.zoneopt new file mode 100644 index 0000000..bcd9a57 --- /dev/null +++ b/doc/misc/redirect.zoneopt @@ -0,0 +1,13 @@ +zone <string> [ <class> ] { + type redirect; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + dlz <string>; + file <quoted_string>; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + max-records <integer>; + max-zone-ttl ( unlimited | <duration> ); + primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + zone-statistics ( full | terse | none | <boolean> ); +}; diff --git a/doc/misc/rndc.grammar b/doc/misc/rndc.grammar new file mode 100644 index 0000000..9d5604f --- /dev/null +++ b/doc/misc/rndc.grammar @@ -0,0 +1,21 @@ +key <string> { + algorithm <string>; + secret <string>; +}; // may occur multiple times + +options { + default-key <string>; + default-port <integer>; + default-server <string>; + default-source-address ( <ipv4_address> | * ); + default-source-address-v6 ( <ipv6_address> | * ); +}; + +server <string> { + addresses { ( <quoted_string> [ port <integer> ] | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ); ... }; + key <string>; + port <integer>; + source-address ( <ipv4_address> | * ); + source-address-v6 ( <ipv6_address> | * ); +}; // may occur multiple times + diff --git a/doc/misc/secondary.zoneopt b/doc/misc/secondary.zoneopt new file mode 100644 index 0000000..3237aab --- /dev/null +++ b/doc/misc/secondary.zoneopt @@ -0,0 +1,65 @@ +zone <string> [ <class> ] { + type secondary; + allow-notify { <address_match_element>; ... }; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + allow-transfer [ port <integer> ] [ transport <string> ] { <address_match_element>; ... }; + allow-update-forwarding { <address_match_element>; ... }; + also-notify [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + alt-transfer-source ( <ipv4_address> | * ) ; // deprecated + alt-transfer-source-v6 ( <ipv6_address> | * ) ; // deprecated + auto-dnssec ( allow | maintain | off ); // deprecated + check-names ( fail | warn | ignore ); + database <string>; + dialup ( notify | notify-passive | passive | refresh | <boolean> ); // deprecated + dlz <string>; + dnskey-sig-validity <integer>; + dnssec-dnskey-kskonly <boolean>; + dnssec-loadkeys-interval <integer>; + dnssec-policy <string>; + dnssec-update-mode ( maintain | no-resign ); + file <quoted_string>; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + inline-signing <boolean>; + ixfr-from-differences <boolean>; + journal <quoted_string>; + key-directory <quoted_string>; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + max-ixfr-ratio ( unlimited | <percentage> ); + max-journal-size ( default | unlimited | <sizeval> ); + max-records <integer>; + max-refresh-time <integer>; + max-retry-time <integer>; + max-transfer-idle-in <integer>; + max-transfer-idle-out <integer>; + max-transfer-time-in <integer>; + max-transfer-time-out <integer>; + min-refresh-time <integer>; + min-retry-time <integer>; + multi-master <boolean>; + notify ( explicit | master-only | primary-only | <boolean> ); + notify-delay <integer>; + notify-source ( <ipv4_address> | * ) ; + notify-source-v6 ( <ipv6_address> | * ) ; + notify-to-soa <boolean>; + nsec3-test-zone <boolean>; // test only + parental-agents [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + parental-source ( <ipv4_address> | * ) ; + parental-source-v6 ( <ipv6_address> | * ) ; + primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + request-expire <boolean>; + request-ixfr <boolean>; + sig-signing-nodes <integer>; + sig-signing-signatures <integer>; + sig-signing-type <integer>; + sig-validity-interval <integer> [ <integer> ]; + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + try-tcp-refresh <boolean>; + update-check-ksk <boolean>; + use-alt-transfer-source <boolean>; // deprecated + zero-no-soa-ttl <boolean>; + zone-statistics ( full | terse | none | <boolean> ); +}; diff --git a/doc/misc/sort-options.pl b/doc/misc/sort-options.pl new file mode 100644 index 0000000..f60b0b7 --- /dev/null +++ b/doc/misc/sort-options.pl @@ -0,0 +1,45 @@ +#!/bin/perl + +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +sub sortlevel() { + my @options = (); + my $fin = ""; + my $i = 0; + while (<>) { + if (/^\s*};$/ || /^\s*}; \/\/.*$/) { + $fin = $_; + # print 2, $_; + last; + } + next if (/^$/); + if (/{$/) { + # print 3, $_; + my $sec = $_; + push(@options, $sec . sortlevel()); + } else { + push(@options, $_); + # print 1, $_; + } + $i++; + } + my $result = ""; + foreach my $i (sort @options) { + $result = ${result}.${i}; + $result = $result."\n" if ($i =~ /^[a-z]/i); + # print 5, ${i}; + } + $result = ${result}.${fin}; + return ($result); +} + +print sortlevel(); diff --git a/doc/misc/static-stub.zoneopt b/doc/misc/static-stub.zoneopt new file mode 100644 index 0000000..5357528 --- /dev/null +++ b/doc/misc/static-stub.zoneopt @@ -0,0 +1,11 @@ +zone <string> [ <class> ] { + type static-stub; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + max-records <integer>; + server-addresses { ( <ipv4_address> | <ipv6_address> ); ... }; + server-names { <string>; ... }; + zone-statistics ( full | terse | none | <boolean> ); +}; diff --git a/doc/misc/stub.zoneopt b/doc/misc/stub.zoneopt new file mode 100644 index 0000000..29c1d56 --- /dev/null +++ b/doc/misc/stub.zoneopt @@ -0,0 +1,27 @@ +zone <string> [ <class> ] { + type stub; + allow-query { <address_match_element>; ... }; + allow-query-on { <address_match_element>; ... }; + check-names ( fail | warn | ignore ); + database <string>; + delegation-only <boolean>; // deprecated + dialup ( notify | notify-passive | passive | refresh | <boolean> ); // deprecated + file <quoted_string>; + forward ( first | only ); + forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; + masterfile-format ( raw | text ); + masterfile-style ( full | relative ); + max-records <integer>; + max-refresh-time <integer>; + max-retry-time <integer>; + max-transfer-idle-in <integer>; + max-transfer-time-in <integer>; + min-refresh-time <integer>; + min-retry-time <integer>; + multi-master <boolean>; + primaries [ port <integer> ] { ( <remote-servers> | <ipv4_address> [ port <integer> ] | <ipv6_address> [ port <integer> ] ) [ key <string> ] [ tls <string> ]; ... }; + transfer-source ( <ipv4_address> | * ) ; + transfer-source-v6 ( <ipv6_address> | * ) ; + use-alt-transfer-source <boolean>; // deprecated + zone-statistics ( full | terse | none | <boolean> ); +}; |