25 Commits

Author SHA1 Message Date
Daniel Akulenok
b5a9e97712 refactor: Update templates to use dynamic ordering and add deprecation warnings 2025-12-07 20:15:54 +01:00
Daniel Akulenok
26c6e7844d feat: Add remote-servers support for BIND 9.20 2025-12-07 20:15:41 +01:00
Daniel Akulenok
cfde49d95a Spacing 2024-05-15 12:21:17 +02:00
Daniel Akulenok
e538644617 Spacing 2024-05-15 11:04:46 +02:00
Daniel Akulenok
f535f1af20 Remove surplus comment 2024-05-14 14:40:41 +02:00
Daniel Akulenok
b6fa879b93 demacro zone and view 2024-05-14 14:36:54 +02:00
Daniel Akulenok
73d8632c49 trust anchors 2024-05-14 14:34:49 +02:00
Daniel Akulenok
807077f78c tls demacro 2024-05-14 14:30:18 +02:00
Daniel Akulenok
0809bc7e91 statistics_channels 2024-05-14 14:29:10 +02:00
Daniel Akulenok
4577a40db9 Demacro server 2024-05-14 14:26:36 +02:00
Daniel Akulenok
52d5fa2d3f Demacro 2024-05-14 14:12:19 +02:00
Daniel Akulenok
8077d8c05c podman 2024-05-14 14:02:06 +02:00
Daniel Akulenok
a06fa3d679 key demacro 2024-05-14 14:01:49 +02:00
Daniel Akulenok
dfd93ecfea Demacro item.http 2024-05-14 13:47:59 +02:00
Daniel Akulenok
87c276c55b Demacro http 2024-05-14 13:47:03 +02:00
Daniel Akulenok
128b947ea2 demacro dnssec_policy 2024-05-14 13:45:31 +02:00
Daniel Akulenok
31692dd78d Demacro dlz 2024-05-14 13:44:21 +02:00
Daniel Akulenok
f69f631b36 Demacro include 2024-05-14 13:42:02 +02:00
Daniel Akulenok
7a834ae40c De-macro controls 2024-05-14 13:39:56 +02:00
Daniel Akulenok
ef28c98fc8 Fix typo 2024-05-14 13:28:15 +02:00
Daniel Akulenok
cdecd8c05c Fix typo 2024-05-14 13:24:54 +02:00
Daniel Akulenok
da0f4d9189 Merge branch 'main' of ssh://git.valid.dk:2222/daniel/ansible-bind9-role 2024-05-14 10:31:38 +02:00
Daniel Akulenok
3c595f4879 Demacro some more 2024-05-14 10:31:16 +02:00
Daniel Akulenok
9ad0225582 Fix bug where a macro was used as a filter 2024-05-14 10:06:12 +02:00
Daniel Akulenok
84d140d40e Un-macro options 2024-05-14 10:04:31 +02:00
21 changed files with 300 additions and 615 deletions

View File

@@ -2,7 +2,7 @@
dependency:
name: galaxy
driver:
name: docker
name: podman
platforms:
- name: ubuntu-jammy
image: ubuntu:jammy

View File

@@ -1,7 +1,7 @@
{# ACL Macro. Very easy statement. It's just a list of address match elements. #}
{% macro acl(acls) %}
{% for acl in acls %}
{% for acl in item.acl %}
acl {{ acl.name }} {
{{ functions.simple_item_list(acl.addresses) -}}
};
{% endfor %}{% endmacro %}
{% endfor %}

View File

@@ -1,7 +1,7 @@
{% macro controls(controls) %}
controls {
{% filter indent(bind9_config_indent, true) %}
{% for control in controls %}
{% for control in item.controls %}
{% if control.type == "inet" %}
{{ ('inet ' + control.address) -}}
{{ (' port ' + control.port | string) if control.port is defined and control.port -}}
@@ -16,4 +16,3 @@ controls {
{{ (' read-only ' + control.read_only | string) if control.read_only is defined -}};
{% endfor %}};
{% endfilter %}
{% endmacro %}

View File

@@ -1,5 +1,5 @@
{% macro dlz(dlzs) %}
{% for dlz in dlzs if dlzs is iterable %}
{% for dlz in item.dlz if item.dlz is iterable %}
dlz "{{ dlz.name }}" {
{% filter indent(bind9_config_indent, true) %}
{{ ('database "' + simple_item_list(dlz.database) + '";') }}
@@ -7,4 +7,3 @@ dlz "{{ dlz.name }}" {
{% endfilter %}
};
{% endfor %}
{% endmacro %}

View File

@@ -1,5 +1,5 @@
{% macro dnssec_policy(policies) %}
{% for policy in policies if policies is iterable %}
{% for policy in item.dnssec_policy if item.dnssec_policy is iterable %}
dnssec-policy "{{ policy.name }}" {
{% filter indent(bind9_config_indent, true) %}
{% if policy.keys is defined and policy.keys %}
@@ -36,4 +36,3 @@ nsec3param
{% endfilter %}
};
{% endfor %}
{% endmacro %}

View File

@@ -1,8 +1,7 @@
{% macro dyndb(dyndbs) %}
{% for dyndb in dyndbs if dyndbs is iterable %}
{% for dyndb in item.dyndb if item.dyndb is iterable %}
dyndb {{ dyndb.name }} "{{ dyndb.driver }}" {
{% filter indent(bind9_config_indent, true) %}
{{ functions.simple_item_list(dyndb.parameters) -}}
{% endfilter %}};
{% endfor %}
{% endmacro %}

View File

@@ -1,79 +1,59 @@
{% import 'named.conf.functions.j2' as functions with context %}
{{ ansible_managed | comment }}
{% if item.options is defined and item.options %}
{% from 'named.conf.options.j2' import options with context %}
options {
{% filter indent(bind9_config_indent,true)%}
{{ options(item.options) -}}
{% endfilter %}
};
{% include 'named.conf.options.j2' %}
{% endif %}
{% if item.acl is defined and item.acl %}
{% from 'named.conf.acl.j2' import acl with context %}
{{ acl(item.acl) }}
{% include 'named.conf.acl.j2' %}
{% endif %}
{% if item.primaries is defined and item.primaries %}
{% from 'named.conf.primaries.j2' import primaries with context %}
{{ primaries(item.primaries) }}
{% include 'named.conf.primaries.j2' %}
{% endif %}
{% if item.controls is defined and item.controls %}
{% from 'named.conf.controls.j2' import controls with context %}
{{ controls(item.controls) }}
{% include 'named.conf.controls.j2' %}
{% endif %}
{% if item.include is defined and item.include %}
{% from 'named.conf.include.j2' import include with context %}
{{ include(item.include) }}
{% include 'named.conf.include.j2' %}
{% endif %}
{% if item.dlz is defined and item.dlz %}
{% from 'named.conf.dlz.j2' import dlz with context %}
{{ dlz(item.dlz) }}
{% include 'named.conf.dlz.j2' %}
{% endif %}
{% if item.dnssec_policy is defined and item.dnssec_policy %}
{% from 'named.conf.dnssec-policy.j2' import dnssec_policy with context %}
{{ dnssec_policy(item.dnssec_policy) }}
{% include 'named.conf.dnssec-policy.j2' %}
{% endif %}
{% if item.dyndb is defined and item.dyndb %}
{% from 'named.conf.dyndb.j2' import dyndb with context %}
{{ dyndb(item.dyndb) }}
{% include 'named.conf.dyndb.j2' %}
{% endif %}
{% if item.http is defined and item.http %}
{% from 'named.conf.http.j2' import http with context %}
{{ http(item.http) }}
{% include 'named.conf.http.j2' %}
{% endif %}
{% if item.keylist is defined and item.keylist %}
{% from 'named.conf.key.j2' import keylist with context %}
{{ keylist(item.keylist) }}
{% include 'named.conf.key.j2' %}
{% endif %}
{% if item.logging is defined and item.logging %}
{% from 'named.conf.logging.j2' import logging with context %}
{{ logging(item.logging) }}
{% include 'named.conf.logging.j2' %}
{% endif %}
{% if item.parental_agents is defined and item.parental_agents %}
{% from 'named.conf.parental-agents.j2' import parental_agents with context %}
{{ parental_agents(item.parental_agents) -}}
{% include 'named.conf.parental-agents.j2' %}
{% endif %}
{% if item.server is defined and item.server %}
{% from 'named.conf.server.j2' import server with context %}
{{ server(item.server) }}
{% include 'named.conf.server.j2' %}
{% endif %}
{% if item.statistics_channels is defined and item.statistics_channels %}
{% from 'named.conf.statistics-channels.j2' import statistics_channels with context %}
{{ statistics_channels(item.statistics_channels) }}
{% include 'named.conf.statistics-channels.j2' %}
{% endif %}
{% if item.tls is defined and item.tls %}
{% from 'named.conf.tls.j2' import tls with context %}
{{ tls(item.tls) }}
{% include 'named.conf.tls.j2' %}
{% endif %}
{% if item.trust_anchors is defined and item.trust_anchors %}
{% from 'named.conf.trust-anchors.j2' import trust_anchors with context %}
{{ trust_anchors(item.trust_anchors) }}
{% include 'named.conf.trust-anchors.j2' %}
{% endif %}
{% if item.zones is defined and item.zones %}
{% from 'named.conf.zone.j2' import zones with context %}
{{ zones(item.zones) }}
{% include 'named.conf.zone.j2' %}
{% endif %}
{% if item.view is defined and item.view %}
{% from 'named.conf.view.j2' import view with context %}
{{ view(item.view) }}
{% include 'named.conf.view.j2' %}
{% endif %}
{% if item.remote_servers is defined and item.remote_servers %}
{% include 'named.conf.remote-servers.j2' %}
{% endif %}

View File

@@ -1,5 +1,5 @@
{% macro http(seq) %}
{% for http in seq if seq is iterable %}
{% for http in item.http if item.http is iterable %}
http {{ http.name }} {
{% filter indent(bind9_config_indent, true) %}
{% if http.endpoints is defined and http.endpoints %}
@@ -14,4 +14,3 @@ endpoints {
{{ ('streams-per-connection ' + http.streams_per_connection | string + ';\n') if http.streams_per_connection is defined and http.streams_per_connection -}}
{% endfilter %}};
{% endfor %}
{% endmacro %}

View File

@@ -1,5 +1,4 @@
{% macro include(files) %}
{% for file in files %}
{% for file in item.include %}
include "{{ file }}";
{% endfor %}
{% endmacro %}

View File

@@ -1,9 +1,8 @@
{% macro keylist(keylists) %}
{% for keyname in keylists if keylists is iterable %}
{% for keyname in item.keylist if item.keylist is iterable %}
key {{ keyname.name }} {
{% filter indent(bind9_config_indent, true) %}
{{ ('algorithm ' + keyname.algorithm + ';\n') if keyname.algorithm is defined and keyname.algorithm -}}
{{ ('secret "' + keyname.secret + '";\n') if keyname.secret is defined and keyname.secret -}}
{% endfilter %}};
{% endfor %}
{% endmacro %}

View File

@@ -1,11 +1,11 @@
{% macro logging(logging) %}
logging {
{% filter indent(bind9_config_indent, true) %}
{% for category in logging.categories if logging.categories is defined and logging.categories %}
{% for category in item.logging.categories if item.logging.categories is defined and item.logging.categories %}
category {{ category.name }} {
{{ functions.simple_item_list(category.channels) }}};
{% endfor %}
{% for channel in logging.channels if logging.channels is defined and logging.channels %}
{% for channel in item.logging.channels if item.logging.channels is defined and item.logging.channels %}
channel {{ channel.name }} {
{% filter indent(bind9_config_indent, true) %}
{% if channel.file is defined and channel.file %}
@@ -26,4 +26,3 @@ file "{{ channel.file.name }}"
};
{% endfor %}
{% endfilter %}};
{% endmacro %}

View File

@@ -1,20 +1,28 @@
{% macro options(option) %}
{# Unicorn Options#}
{% if option.rrset_order is defined and option.rrset_order %}
{% import 'named.conf.functions.j2' as functions with context %}
options {
{% filter indent(bind9_config_indent,true)%}
{# Iterate over keys to preserve user order (Python 3.7+ / Ansible dicts are ordered) #}
{% for key, value in item.options.items() %}
{% set conf_key = key | replace('_', '-') %}
{# --- COMPLEX BLOCKS --- #}
{% if key == 'rrset_order' %}
rrset-order {
{% filter indent(bind9_config_indent, true) %}
{% for rrset in option.rrset_order %}
{% for rrset in value %}
{{ ('class ' + rrset.class | string + ' ') if rrset.class is defined and rrset.class -}}
{{ ('type ' + rrset.type | string + ' ') if rrset.type is defined and rrset.type -}}
{{ ('name "' + rrset.name | string + '" ') if rrset.name is defined and rrset.name -}}
{{ ('order ' + rrset.order | string) -}};
{% endfor %}
{% endfilter %}};
{% endif %}
{% if option.response_policy is defined and option.response_policy %}
{% elif key == 'response_policy' %}
response-policy {
{% filter indent(bind9_config_indent, true) %}
{% for zone in option.response_policy.zones %}
{% for zone in value.zones %}
{{- ('zone ' + zone.zone | string) -}}
{{- (' max-policy-ttl ' + zone.max_policy_ttl | string) if zone.max_policy_ttl is defined and zone.max_policy_ttl -}}
{{- (' min-update-interval ' + zone.min_update_interval | string) if zone.min_update_interval is defined and zone.min_update_interval -}}
@@ -26,108 +34,86 @@ response-policy {
{{- (' nsdname-enable ' + functions.named_boolean(zone.nsdname_enable)) if zone.nsdname_enable is defined }};
{% endfor %}
{% endfilter %}}
{{- (' max-policy-ttl ' + option.response_policy.max_policy_ttl | string) if option.response_policy.max_policy_ttl is defined and option.response_policy.max_policy_ttl -}}
{{- (' min-update-interval ' + option.response_policy.min_update_interval | string) if option.response_policy.min_update_interval is defined and option.response_policy.min_update_interval -}}
{{- (' min-ns-dots ' + option.response_policy.min_ns_dots | string) if option.response_policy.min_ns_dots is defined and option.response_policy.min_ns_dots -}}
{{- (' add-soa ' + functions.named_boolean(option.response_policy.add_soa)) if option.response_policy.add_soa is defined -}}
{{- (' break-dnssec ' + functions.named_boolean(option.response_policy.break_dnssec)) if option.response_policy.break_dnssec is defined -}}
{{- (' nsip-wait-recurse ' + functions.named_boolean(option.response_policy.nsip_wait_recurse)) if option.response_policy.nsip_wait_recurse is defined -}}
{{- (' nsdname-wait-recurse ' + functions.named_boolean(option.response_policy.nsdname_wait_recurse)) if option.response_policy.nsdname_wait_recurse is defined -}}
{{- (' qname-wait-recurse ' + functions.named_boolean(option.response_policy.qname_wait_recurse)) if option.response_policy.qname_wait_recurse is defined -}}
{{- (' recursive-only ' + functions.named_boolean(option.response_policy.recursive_only)) if option.response_policy.recursive_only is defined -}}
{{- (' nsip-enable ' + functions.named_boolean(option.response_policy.nsip_enable)) if option.response_policy.nsip_enable is defined -}}
{{- (' nsdname-enable ' + functions.named_boolean(option.response_policy.nsdname_enable)) if option.response_policy.nsdname_enable is defined -}}
{{- (' dnsrps-enable ' + functions.named_boolean(option.response_policy.dnsrps_enable)) if option.response_policy.dnsrps_enable is defined -}}
{{- (' dnsrps-options { ' + option.response_policy.dnsrps_options | join('; ') + '; }') if option.response_policy.dnsrps_options is defined and option.response_policy.dnsrps_options -}};
{% endif %}
{% if option.response_padding is defined and option.response_padding %}
{{- (' max-policy-ttl ' + value.max_policy_ttl | string) if value.max_policy_ttl is defined and value.max_policy_ttl -}}
{{- (' min-update-interval ' + value.min_update_interval | string) if value.min_update_interval is defined and value.min_update_interval -}}
{{- (' min-ns-dots ' + value.min_ns_dots | string) if value.min_ns_dots is defined and value.min_ns_dots -}}
{{- (' add-soa ' + functions.named_boolean(value.add_soa)) if value.add_soa is defined -}}
{{- (' break-dnssec ' + functions.named_boolean(value.break_dnssec)) if value.break_dnssec is defined -}}
{{- (' nsip-wait-recurse ' + functions.named_boolean(value.nsip_wait_recurse)) if value.nsip_wait_recurse is defined -}}
{{- (' nsdname-wait-recurse ' + functions.named_boolean(value.nsdname_wait_recurse)) if value.nsdname_wait_recurse is defined -}}
{{- (' qname-wait-recurse ' + functions.named_boolean(value.qname_wait_recurse)) if value.qname_wait_recurse is defined -}}
{{- (' recursive-only ' + functions.named_boolean(value.recursive_only)) if value.recursive_only is defined -}}
{{- (' nsip-enable ' + functions.named_boolean(value.nsip_enable)) if value.nsip_enable is defined -}}
{{- (' nsdname-enable ' + functions.named_boolean(value.nsdname_enable)) if value.nsdname_enable is defined -}}
{{- (' dnsrps-enable ' + functions.named_boolean(value.dnsrps_enable)) if value.dnsrps_enable is defined -}}
{{- (' dnsrps-options { ' + value.dnsrps_options | join('; ') + '; }') if value.dnsrps_options is defined and value.dnsrps_options -}};
{% elif key == 'response_padding' %}
response-padding {
{{ functions.simple_item_list(option.response_padding.addresses) }}}
{{- (' block-size ' + option.response_padding.block_size | string) }};
{% endif %}
{% if option.rate_limit is defined and option.rate_limit %}
{{ functions.simple_item_list(value.addresses) }}}
{{- (' block-size ' + value.block_size | string) }};
{% elif key == 'rate_limit' %}
rate-limit {
{% filter indent(bind9_config_indent, true) %}
{{ ('all-per-second ' + option.rate_limit.all_per_second | string + ';\n') if option.rate_limit.all_per_second is defined and option.rate_limit.all_per_second -}}
{{ ('errors-per-second ' + option.rate_limit.errors_per_second | string + ';\n') if option.rate_limit.errors_per_second is defined and option.rate_limit.errors_per_second -}}
{{ ('responses-per-second ' + option.rate_limit.responses_per_second | string + ';\n') if option.rate_limit.responses_per_second is defined and option.rate_limit.responses_per_second -}}
{{ ('referrals-per-second ' + option.rate_limit.referrals_per_second | string + ';\n') if option.rate_limit.referrals_per_second is defined and option.rate_limit.referrals_per_second -}}
{{ ('nodata-per-second ' + option.rate_limit.nodata_per_second | string + ';\n') if option.rate_limit.nodata_per_second is defined and option.rate_limit.nodata_per_second -}}
{{ ('nxdomains-per-second ' + option.rate_limit.nxdomains_per_second | string + ';\n') if option.rate_limit.nxdomains_per_second is defined and option.rate_limit.nxdomains_per_second -}}
{{ ('ipv4-prefix-length ' + option.rate_limit.ipv4_prefix_length | string + ';\n') if option.rate_limit.ipv4_prefix_length is defined and option.rate_limit.ipv4_prefix_length -}}
{{ ('ipv6-prefix-length ' + option.rate_limit.ipv6_prefix_length | string + ';\n') if option.rate_limit.ipv6_prefix_length is defined and option.rate_limit.ipv6_prefix_length -}}
{{ ('max-table-size ' + option.rate_limit.max_table_size | string + ';\n') if option.rate_limit.max_table_size is defined and option.rate_limit.max_table_size -}}
{{ ('min-table-size ' + option.rate_limit.min_table_size | string + ';\n') if option.rate_limit.min_table_size is defined and option.rate_limit.min_table_size -}}
{{ ('qps-scale ' + option.rate_limit.qps_scale | string + ';\n') if option.rate_limit.qps_scale is defined and option.rate_limit.qps_scale -}}
{{ ('window ' + option.rate_limit.window | string + ';\n') if option.rate_limit.window is defined and option.rate_limit.window -}}
{{ ('slip ' + option.rate_limit.slip | string + ';\n') if option.rate_limit.slip is defined and option.rate_limit.slip -}}
{{ ('log-only ' + functions.named_boolean(option.rate_limit.log_only) + ';\n') if option.rate_limit.log_only is defined -}}
{{ ('exempt-clients {\n' + functions.simple_item_list(option.rate_limit.exempt_clients) + '};\n') if option.rate_limit.exempt_clients is defined and option.rate_limit.exempt_clients -}}
{{ ('all-per-second ' + value.all_per_second | string + ';\n') if value.all_per_second is defined and value.all_per_second -}}
{{ ('errors-per-second ' + value.errors_per_second | string + ';\n') if value.errors_per_second is defined and value.errors_per_second -}}
{{ ('responses-per-second ' + value.responses_per_second | string + ';\n') if value.responses_per_second is defined and value.responses_per_second -}}
{{ ('referrals-per-second ' + value.referrals_per_second | string + ';\n') if value.referrals_per_second is defined and value.referrals_per_second -}}
{{ ('nodata-per-second ' + value.nodata_per_second | string + ';\n') if value.nodata_per_second is defined and value.nodata_per_second -}}
{{ ('nxdomains-per-second ' + value.nxdomains_per_second | string + ';\n') if value.nxdomains_per_second is defined and value.nxdomains_per_second -}}
{{ ('ipv4-prefix-length ' + value.ipv4_prefix_length | string + ';\n') if value.ipv4_prefix_length is defined and value.ipv4_prefix_length -}}
{{ ('ipv6-prefix-length ' + value.ipv6_prefix_length | string + ';\n') if value.ipv6_prefix_length is defined and value.ipv6_prefix_length -}}
{{ ('max-table-size ' + value.max_table_size | string + ';\n') if value.max_table_size is defined and value.max_table_size -}}
{{ ('min-table-size ' + value.min_table_size | string + ';\n') if value.min_table_size is defined and value.min_table_size -}}
{{ ('qps-scale ' + value.qps_scale | string + ';\n') if value.qps_scale is defined and value.qps_scale -}}
{{ ('window ' + value.window | string + ';\n') if value.window is defined and value.window -}}
{{ ('slip ' + value.slip | string + ';\n') if value.slip is defined and value.slip -}}
{{ ('log-only ' + functions.named_boolean(value.log_only) + ';\n') if value.log_only is defined -}}
{{ ('exempt-clients {\n' + functions.simple_item_list(value.exempt_clients) + '};\n') if value.exempt_clients is defined and value.exempt_clients -}}
{% endfilter %}};
{% endif %}
{% if option.listen_on_v6 is defined and option.listen_on_v6 %}
{% for listen in option.listen_on_v6 if option.listen_on_v6 is not mapping %}
listen-on-v6
{% elif key == 'listen_on_v6' or key == 'listen_on' %}
{% for listen in (value if value is not mapping else [value]) %}
{{ conf_key }}
{{- (' port ' + listen.port | string) if listen.port is defined and listen.port -}}
{{- (' dscp ' + listen.dscp | string) if listen.dscp is defined and listen.dscp -}}
{{- (' tls ' + listen.tls | string) if listen.tls is defined and listen.tls -}}
{{- (' http ' + listen.http | string) if listen.http is defined and listen.http }} {
{{ functions.simple_item_list(listen.addresses) }}};
{% else %}
listen-on-v6
{{- (' port ' + option.listen_on_v6.port | string) if option.listen_on_v6.port is defined and option.listen_on_v6.port -}}
{{- (' dscp ' + option.listen_on_v6.dscp | string) if option.listen_on_v6.dscp is defined and option.listen_on_v6.dscp -}}
{{- (' tls ' + option.listen_on_v6.tls | string) if option.listen_on_v6.tls is defined and option.listen_on_v6.tls -}}
{{- (' http ' + option.listen_on_v6.http | string) if option.listen_on_v6.http is defined and option.listen_on_v6.http }} {
{{ functions.simple_item_list(option.listen_on_v6.addresses) }}};
{% endfor %}
{% endif %}
{% if option.listen_on is defined and option.listen_on %}
{% for listen in option.listen_on if option.listen_on is not mapping %}
listen-on
{{- (' port ' + listen.port | string) if listen.port is defined and listen.port -}}
{{- (' dscp ' + listen.dscp | string) if listen.dscp is defined and listen.dscp -}}
{{- (' tls ' + listen.tls | string) if listen.tls is defined and listen.tls -}}
{{- (' http ' + listen.http | string) if listen.http is defined and listen.http }} {
{{ functions.simple_item_list(listen.addresses) }}};
{% else %}
listen-on
{{- (' port ' + option.listen_on.port | string) if option.listen_on.port is defined and option.listen_on.port -}}
{{- (' dscp ' + option.listen_on.dscp | string) if option.listen_on.dscp is defined and option.listen_on.dscp -}}
{{- (' tls ' + option.listen_on.tls | string) if option.listen_on.tls is defined and option.listen_on.tls -}}
{{- (' http ' + option.listen_on.http | string) if option.listen_on.http is defined and option.listen_on.http }} {
{{ functions.simple_item_list(option.listen_on.addresses) }}};
{% endfor %}
{% endif %}
{{ functions.parent_address_port_dscp("forwarders", option.forwarders) if option.forwarders is defined and option.forwarders -}}
{% if option.dual_stack_servers is defined and option.dual_stack_servers %}
{% elif key == 'forwarders' %}
{{ functions.parent_address_port_dscp("forwarders", value) -}}
{% elif key == 'dual_stack_servers' %}
dual-stack-servers
{{ (' port ' + option.dual_stack_servers.port | string) if option.dual_stack_servers.port is defined and option.dual_stack_servers }} {
{% for host in option.dual_stack_servers.addresses %}
{{ (' port ' + value.port | string) if value.port is defined and value }} {
{% for host in value.addresses %}
{% filter indent(bind9_config_indent, true) %}
{{ host.address | ansible.utils.ipaddr | ternary(host.address, '"' + host.address + '"') }}
{{- (' port ' + host.port | string) if host.port is defined and host.port -}}
{{- (' dscp ' + host.dscp | string) if host.dscp is defined and host.dscp -}};
{% endfilter %}
{% endfor %}};
{% endif %}
{% if option.dnstap_output is defined and option.dnstap_output %}
dnstap-output {{ option.dnstap_output.output_type -}}
{{- ' "' + option.dnstap_output.output_file + '"' -}}
{{- (' size ' + option.dnstap_output.size | string) if option.dnstap_output.size is defined and option.dnstap_output.size -}}
{{- (' versions ' + option.dnstap_output.versions | string) if option.dnstap_output.versions is defined and option.dnstap_output.versions -}}
{{- (' suffix ' + option.dnstap_output.suffix | string) if option.dnstap_output.suffix is defined and option.dnstap_output.suffix -}};
{% endif %}
{% if option.dnstap is defined and option.dnstap %}
{% elif key == 'dnstap_output' %}
dnstap-output {{ value.output_type -}}
{{- ' "' + value.output_file + '"' -}}
{{- (' size ' + value.size | string) if value.size is defined and value.size -}}
{{- (' versions ' + value.versions | string) if value.versions is defined and value.versions -}}
{{- (' suffix ' + value.suffix | string) if value.suffix is defined and value.suffix -}};
{% elif key == 'dnstap' %}
dnstap {
{% filter indent(bind9_config_indent, true) %}
{% for dnstap in option.dnstap %}
{% for dnstap in value %}
{{ dnstap.type }}{{ ' ' + dnstap.log if dnstap.log is defined and dnstap.log }};
{% endfor %}
{% endfilter %}};
{% endif %}
{% if option.dns64 is defined and option.dns64 %}
{% for dns64 in option.dns64 if option.dns64 is sequence %}
{% elif key == 'dns64' %}
{% for dns64 in (value if value is sequence else [value]) %}
dns64 {{ dns64.netprefix }} {
{% filter indent(bind9_config_indent, true) %}
{{ ('break-dnssec ' + functions.named_boolean(dns64.break_dnssec) + ';\n') if dns64.break_dnssec is defined and dns64.break_dnssec is boolean -}}
@@ -138,31 +124,31 @@ dns64 {{ dns64.netprefix }} {
{{ ("mapped {\n" + functions.simple_item_list(dns64.mapped) + "};\n") if dns64.mapped is defined and dns64.mapped -}}
{% endfilter %}};
{% endfor %}
{% endif %}
{% if option.deny_answer_aliases is defined and option.deny_answer_aliases %}
{% elif key == 'deny_answer_aliases' %}
deny-answer-aliases {
{{ functions.simple_item_list(option.deny_answer_aliases.names) }}}
{%- if option.deny_answer_aliases.except_from is defined and option.deny_answer_aliases.except_from %}
{{ functions.simple_item_list(value.names) }}}
{%- if value.except_from is defined and value.except_from %}
except-from {
{{ functions.simple_item_list(option.deny_answer_aliases.except_from, 4) }}}
{{ functions.simple_item_list(value.except_from, 4) }}}
{%- endif %};
{% endif %}
{% if option.deny_answer_addresses is defined and option.deny_answer_addresses %}
{% elif key == 'deny_answer_addresses' %}
deny-answer-addresses {
{{ functions.simple_item_list(option.deny_answer_addresses.addresses) }}}
{%- if option.deny_answer_addresses.except_from is defined and option.deny_answer_addresses.except_from %}
{{ functions.simple_item_list(value.addresses) }}}
{%- if value.except_from is defined and value.except_from %}
except-from {
{{ functions.simple_item_list(option.deny_answer_addresses.except_from, 4) }}}
{{ functions.simple_item_list(value.except_from, 4) }}}
{%- endif %};
{% endif %}
{% if option.check_names is defined and option.check_names %}
{% for policy in option.check_names %}
{% elif key == 'check_names' %}
{% for policy in value %}
check-names {{ policy.type }} {{ policy.action }};
{% endfor %}
{% endif %}
{% if option.catalog_zones is defined and option.catalog_zones %}
{% elif key == 'catalog_zones' %}
catalog-zones {
{% for catalog_zone in option.catalog_zones %}
{% for catalog_zone in value %}
zone {{ catalog_zone.zone }}
{% filter indent(bind9_config_indent, true) %}
{% if catalog_zone.default_primaries is defined and catalog_zone.default_primaries %}
@@ -176,289 +162,80 @@ default-primaries
{{ ('min-update-interval ' + catalog_zone.min_update_interval | string) if catalog_zone.min_update_interval is defined and catalog_zone.min_update_interval}};
{% endfilter %}
{% endfor %}};
{% endif %}
{{ functions.single_ip_port_dscp('transfer-source', option.transfer_source) if option.transfer_source is defined and option.transfer_source -}}
{{ functions.single_ip_port_dscp('transfer-source-v6', option.transfer_source_v6) if option.transfer_source_v6 is defined and option.transfer_source_v6 -}}
{{ functions.single_ip_port_dscp('alt-transfer-source', option.alt_transfer_source) if option.alt_transfer_source is defined and option.alt_transfer_source -}}
{{ functions.single_ip_port_dscp('alt-transfer-source-v6', option.alt_transfer_source_v6) if option.alt_transfer_source_v6 is defined and option.alt_transfer_source_v6 -}}
{{ functions.single_ip_port_dscp('query-source', option.query_source) if option.query_source is defined and option.query_source -}}
{{ functions.single_ip_port_dscp('query-source-v6', option.query_source_v6) if option.query_source_v6 is defined and option.query_source_v6 -}}
{{ functions.single_ip_port_dscp('parental-source', option.parental_source) if option.parental_source is defined and option.parental_source -}}
{{ functions.single_ip_port_dscp('parental-source-v6', option.parental_source_v6) if option.parental_source_v6 is defined and option.parental_source_v6 -}}
{{ functions.single_ip_port_dscp('notify-source', option.notify_source) if option.notify_source is defined and option.notify_source -}}
{{ functions.single_ip_port_dscp('notify-source-v6', option.notify_source_v6) if option.notify_source_v6 is defined and option.notify_source_v6 -}}
{% if option.also_notify is defined and option.also_notify is not string %}
{% elif key in ['transfer_source', 'transfer_source_v6', 'alt_transfer_source', 'alt_transfer_source_v6', 'query_source', 'query_source_v6', 'parental_source', 'parental_source_v6', 'notify_source', 'notify_source_v6'] %}
{{ functions.single_ip_port_dscp(conf_key, value) -}}
{% elif key == 'also_notify' and value is not string %}
also-notify
{{- (' port ' + option.also_notify.port | string) if option.also_notify.port is defined and option.also_notify.port -}}
{{- (' dscp ' + option.also_notify.dscp | string) if option.also_notify.dscp is defined and option.also_notify.dscp }} {
{{ functions.list_address_port_key_tls(option.also_notify.addresses) }}};
{% endif %}
{% if option.allow_transfer is defined and option.allow_transfer is not string %}
{{- (' port ' + value.port | string) if value.port is defined and value.port -}}
{{- (' dscp ' + value.dscp | string) if value.dscp is defined and value.dscp }} {
{{ functions.list_address_port_key_tls(value.addresses) }}};
{% elif key == 'allow_transfer' and value is not string %}
allow-transfer
{{- (' port ' + option.allow_transfer.port | string) if option.allow_transfer.port is defined and option.allow_transfer.port -}}
{{- (' transport ' + option.allow_transfer.transport) if option.allow_transfer.transport is defined and option.allow_transfer.transport }} {
{{ functions.simple_item_list(option.allow_transfer.addresses) }}};
{% endif %}
{# The rest #}
{% if option.disable_algorithms is defined and option.disable_algorithms %}
{% for item in option.disable_algorithms %}
{{- (' port ' + value.port | string) if value.port is defined and value.port -}}
{{- (' transport ' + value.transport) if value.transport is defined and value.transport }} {
{{ functions.simple_item_list(value.addresses) }}};
{% elif key == 'disable_algorithms' %}
{% for item in value %}
disable-algorithms {{ item.domain }} { "{{ item.algorithms | join('"; "') }}"; };
{% endfor %}
{% endif %}
{% if option.disable_ds_digests is defined and option.disable_ds_digests %}
{% for item in option.disable_ds_digests %}
{% elif key == 'disable_ds_digests' %}
{% for item in value %}
disable-ds-digests {{ item.domain }} { "{{ item.digests | join('"; "') }}"; };
{% endfor %}
{% endif %}
{# Oddball simple options #}
{% if option.fetch_quota_params is defined and option.fetch_quota_params is string %}
fetch-quota-params {{ option.fetch_quota_params }};
{% endif %}
{% if option.fetches_per_server is defined and option.fetches_per_server is string %}
fetches-per-server {{ option.fetches_per_server }};
{% endif %}
{% if option.fetches_per_zone is defined and option.fetches_per_zone is string %}
fetches-per-zone {{ option.fetches_per_zone }};
{% endif %}
{% if option.prefetch is defined and option.prefetch %}
prefetch {{ option.prefetch }};
{% endif %}
{% if option.root_delegation_only is defined and option.root_delegation_only %}
root-delegation-only{% if option.root_delegation_only.exclude is defined and option.root_delegation_only.exclude is sequence %} exclude {
{{ functions.simple_item_list(options.root_delegation_only.exclude) }}}
{% elif key == 'root_delegation_only' %}
root-delegation-only{% if value.exclude is defined and value.exclude is sequence %} exclude {
{{ functions.simple_item_list(value.exclude) }}}
{% endif %};
{% elif key == 'tkey_dhkey' %}
tkey-dhkey "{{ value.key_name }}" {{ value.key_tag }};
{# --- SPECIAL QUOTED STRINGS --- #}
{% elif key in ['dnstap_identity', 'server_id'] %}
{{ functions.reserved_or_quoted(conf_key, value, ['none', 'hostname']) -}}
{% elif key in ['dnstap_version', 'geoip_directory', 'hostname', 'lock_file', 'pid_file', 'random_device', 'session_keyfile', 'version'] %}
{{ functions.reserved_or_quoted(conf_key, value, ['none']) -}}
{# --- DEPRECATED/OBSOLETE --- #}
{% elif key == 'tkey_domain' %}
{# Obsolete in 9.20 #}
/* WARN: tkey-domain is obsolete in BIND 9.20 */
{{ functions.reserved_or_quoted(conf_key, value, ['none']) -}}
{% elif key == 'tkey_gssapi_credential' %}
{# Deprecated in 9.20 #}
/* WARN: tkey-gssapi-credential is deprecated in BIND 9.20; use tkey-gssapi-keytab */
{{ functions.reserved_or_quoted(conf_key, value, ['none']) -}}
{# --- SIMPLE LISTS --- #}
{% elif key in ['allow_notify', 'allow_query', 'allow_query_cache', 'allow_query_cache_on', 'allow_query_on', 'allow_recursion', 'allow_recursion_on', 'allow_update', 'allow_update_forwarding', 'blackhole', 'keep_response_order', 'no_case_compress', 'sortlist', 'avoid_v4_udp_ports', 'avoid_v6_udp_ports', 'use_v4_udp_ports', 'use_v6_udp_ports', 'validate_except'] %}
{{ conf_key }} {
{{ functions.simple_item_list(value) }}};
{# --- QUOTED STRINGS --- #}
{% elif key in ['bindkeys_file', 'directory', 'dump_file', 'key_directory', 'managed_keys_directory', 'memstatistics_file', 'new_zones_directory', 'recursing_file', 'secroots_file', 'statistics_file', 'tkey_gssapi_keytab'] %}
{{ conf_key }} "{{ value }}";
{# --- BOOLEANS --- #}
{% elif key in ['allow_new_zones', 'answer_cookie', 'auth_nxdomain', 'automatic_interface_scan', 'check_integrity', 'check_sibling', 'check_wildcard', 'dnsrps_enable', 'dnssec_accept_expired', 'dnssec_dnskey_kskonly', 'dnssec_secure_to_insecure', 'empty_zones_enable', 'flush_zones_on_shutdown', 'glue_cache', 'ipv4only_enable', 'match_mapped_addresses', 'memstatistics', 'message_compression', 'minimal_any', 'multi_master', 'notify_to_soa', 'provide_ixfr', 'querylog', 'recursion', 'request_expire', 'request_ixfr', 'request_nsid', 'require_server_cookie', 'reuseport', 'root_key_sentinel', 'send_cookie', 'stale_answer_enable', 'stale_cache_enable', 'synth_from_dnssec', 'trust_anchor_telemetry', 'try_tcp_refresh', 'update_check_ksk', 'use_alt_transfer_source', 'zero_no_soa_ttl', 'zero_no_soa_ttl_cache'] %}
{{ functions.boolean_option(conf_key, value) }}
{# --- BOOLEAN OR STRING --- #}
{% elif key in ['dialup', 'ixfr_from_differences', 'minimal_responses', 'notify', 'zone_statistics', 'dnssec_validation'] %}
{{ conf_key }} {{ functions.boolean_or_string(value) }};
{# --- FALLTHROUGH --- #}
{% else %}
{# Strict mode: Ignore unknown keys or warn if possible. For now, silence is safer than invalid config. #}
{% endif %}
{% if option.sig_validity_interval is defined and option.sig_validity_interval %}
sig-validity-interval {{ option.sig_validity_interval }};
{% endif %}
{% if option.tkey_dhkey is defined and option.tkey_dhkey is mapping %}
tkey-dhkey "{{ option.tkey_dhkey.key_name }}" {{ option.tkey_dhkey.key_tag }};
{% endif %}
{# special_quoted_string options with reserved keywords #}
{% if option.dnstap_identity is defined and option.dnstap_identity is string %}
{{ functions.reserved_or_quoted('dnstap-identity', option.dnstap_identity, ['none', 'hostname']) -}}
{% endif %}
{% if option.dnstap_version is defined and option.dnstap_version is string %}
{{ functions.reserved_or_quoted('dnstap-version', option.dnstap_version, ['none']) -}}
{% endif %}
{% if option.geoip_directory is defined and option.geoip_directory is string %}
{{ functions.reserved_or_quoted('geoip-directory', option.geoip_directory, ['none']) -}}
{% endif %}
{% if option.hostname is defined and option.hostname is string %}
{{ functions.reserved_or_quoted('hostname', option.hostname, ['none']) -}}
{% endif %}
{% if option.lock_file is defined and option.lock_file is string %}
{{ functions.reserved_or_quoted('lock-file', option.lock_file, ['none']) -}}
{% endif %}
{% if option.pid_file is defined and option.pid_file is string %}
{{ functions.reserved_or_quoted('pid-file', option.pid_file, ['none']) -}}
{% endif %}
{% if option.random_device is defined and option.random_device is string %}
{{ functions.reserved_or_quoted('random-device', option.random_device, ['none']) -}}
{% endif %}
{% if option.server_id is defined and option.server_id is string %}
{{ functions.reserved_or_quoted('server-id', option.server_id, ['none', 'hostname']) -}}
{% endif %}
{% if option.session_keyfile is defined and option.session_keyfile is string %}
{{ functions.reserved_or_quoted('session-keyfile', option.session_keyfile, ['none']) -}}
{% endif %}
{% if option.version is defined and option.version is string %}
{{ functions.reserved_or_quoted('version', option.version, ['none']) -}}
{% endif %}
{# simple list options #}
{{ ('avoid-v4-udp-ports {\n' + functions.simple_item_list(option.avoid_v4_udp_ports) + '};\n') if option.avoid_v4_udp_ports is defined and option.avoid_v4_udp_ports -}}
{{ ('avoid-v6-udp-ports {\n' + functions.simple_item_list(option.avoid_v6_udp_ports) + '};\n') if option.avoid_v6_udp_ports is defined and option.avoid_v6_udp_ports -}}
{{ ('use-v4-udp-ports {\n' + functions.simple_item_list(option.use_v4_udp_ports) + '};\n') if option.use_v4_udp_ports is defined and option.use_v4_udp_ports -}}
{{ ('use-v6-udp-ports {\n' + functions.simple_item_list(option.use_v6_udp_ports) + '};\n') if option.use_v6_udp_ports is defined and option.use_v6_udp_ports -}}
{{ ('validate-except {\n' + functions.simple_item_list(option.validate_except) + '};\n') if option.validate_except is defined and option.validate_except -}}
{# boolean_or_string options #}
{{ ('dialup ' + functions.boolean_or_string(option.dialup) + ';\n') if option.dialup is defined -}}
{{ ('ixfr-from-differences ' + functions.boolean_or_string(option.ixfr_from_differences) + ';\n') if option.ixfr_from_differences is defined -}}
{{ ('minimal-responses ' + functions.boolean_or_string(option.minimal_responses) + ';\n') if option.minimal_responses is defined -}}
{{ ('notify ' + functions.boolean_or_string(option.notify) + ';\n') if option.notify is defined -}}
{{ ('zone-statistics ' + functions.boolean_or_string(option.zone_statistics) + ';\n') if option.zone_statistics is defined -}}
{# duration_sizeval options #}
{{ ('fstrm-set-reopen-interval ' + option.fstrm_set_reopen_interval | string +';\n') if option.fstrm_set_reopen_interval is defined and option.fstrm_set_reopen_interval -}}
{{ ('interface-interval ' + option.interface_interval | string +';\n') if option.interface_interval is defined and option.interface_interval -}}
{{ ('lame-ttl ' + option.lame_ttl | string +';\n') if option.lame_ttl is defined and option.lame_ttl -}}
{{ ('lmdb-mapsize ' + option.lmdb_mapsize | string +';\n') if option.lmdb_mapsize is defined and option.lmdb_mapsize -}}
{{ ('max-cache-ttl ' + option.max_cache_ttl | string +';\n') if option.max_cache_ttl is defined and option.max_cache_ttl -}}
{{ ('max-ncache-ttl ' + option.max_ncache_ttl | string +';\n') if option.max_ncache_ttl is defined and option.max_ncache_ttl -}}
{{ ('max-stale-ttl ' + option.max_stale_ttl | string +';\n') if option.max_stale_ttl is defined and option.max_stale_ttl -}}
{{ ('min-cache-ttl ' + option.min_cache_ttl | string +';\n') if option.min_cache_ttl is defined and option.min_cache_ttl -}}
{{ ('min-ncache-ttl ' + option.min_ncache_ttl | string +';\n') if option.min_ncache_ttl is defined and option.min_ncache_ttl -}}
{{ ('nta-lifetime ' + option.nta_lifetime | string +';\n') if option.nta_lifetime is defined and option.nta_lifetime -}}
{{ ('nta-recheck ' + option.nta_recheck | string +';\n') if option.nta_recheck is defined and option.nta_recheck -}}
{{ ('servfail-ttl ' + option.servfail_ttl | string +';\n') if option.servfail_ttl is defined and option.servfail_ttl -}}
{{ ('stale-answer-ttl ' + option.stale_answer_ttl | string +';\n') if option.stale_answer_ttl is defined and option.stale_answer_ttl -}}
{{ ('stale-refresh-time ' + option.stale_refresh_time | string +';\n') if option.stale_refresh_time is defined and option.stale_refresh_time -}}
{# special options options #}
{{ ('auto-dnssec ' + option.auto_dnssec | string +';\n') if option.auto_dnssec is defined and option.auto_dnssec -}}
{{ ('check-dup-records ' + option.check_dup_records | string +';\n') if option.check_dup_records is defined and option.check_dup_records -}}
{{ ('check-mx ' + option.check_mx | string +';\n') if option.check_mx is defined and option.check_mx -}}
{{ ('check-mx-cname ' + option.check_mx_cname | string +';\n') if option.check_mx_cname is defined and option.check_mx_cname -}}
{{ ('check-spf ' + option.check_spf | string +';\n') if option.check_spf is defined and option.check_spf -}}
{{ ('check-srv-cname ' + option.check_srv_cname | string +';\n') if option.check_srv_cname is defined and option.check_srv_cname -}}
{{ ('cookie-algorithm ' + option.cookie_algorithm | string +';\n') if option.cookie_algorithm is defined and option.cookie_algorithm -}}
{{ ('coresize ' + option.coresize | string +';\n') if option.coresize is defined and option.coresize -}}
{{ ('datasize ' + option.datasize | string +';\n') if option.datasize is defined and option.datasize -}}
{{ ('dnssec-update-mode ' + option.dnssec_update_mode | string +';\n') if option.dnssec_update_mode is defined and option.dnssec_update_mode -}}
{{ ('dnssec-validation ' + functions.boolean_or_string(option.dnssec_validation) +';\n') if option.dnssec_validation is defined -}}
{{ ('files ' + option.files | string +';\n') if option.files is defined and option.files -}}
{{ ('forward ' + option.forward | string +';\n') if option.forward is defined and option.forward -}}
{{ ('fstrm-set-output-queue-model ' + option.fstrm_set_output_queue_model | string +';\n') if option.fstrm_set_output_queue_model is defined and option.fstrm_set_output_queue_model -}}
{{ ('masterfile-format ' + option.masterfile_format | string +';\n') if option.masterfile_format is defined and option.masterfile_format -}}
{{ ('masterfile-style ' + option.masterfile_style | string +';\n') if option.masterfile_style is defined and option.masterfile_style -}}
{{ ('max-cache-size ' + option.max_cache_size | string +';\n') if option.max_cache_size is defined and option.max_cache_size -}}
{{ ('max-ixfr-ratio ' + option.max_ixfr_ratio | string +';\n') if option.max_ixfr_ratio is defined and option.max_ixfr_ratio -}}
{{ ('max-journal-size ' + option.max_journal_size | string +';\n') if option.max_journal_size is defined and option.max_journal_size -}}
{{ ('max-zone-ttl ' + option.max_zone_ttl | string +';\n') if option.max_zone_ttl is defined and option.max_zone_ttl -}}
{{ ('qname-minimization ' + option.qname_minimization | string +';\n') if option.qname_minimization is defined and option.qname_minimization -}}
{{ ('serial-update-method ' + option.serial_update_method | string +';\n') if option.serial_update_method is defined and option.serial_update_method -}}
{{ ('stacksize ' + option.stacksize | string +';\n') if option.stacksize is defined and option.stacksize -}}
{{ ('stale-answer-client-timeout ' + option.stale_answer_client_timeout | string +';\n') if option.stale_answer_client_timeout is defined and option.stale_answer_client_timeout -}}
{{ ('transfer-format ' + option.transfer_format | string +';\n') if option.transfer_format is defined and option.transfer_format -}}
{# quoted_string options #}
{{ ('bindkeys-file "' + option.bindkeys_file | string +'";\n') if option.bindkeys_file is defined and option.bindkeys_file -}}
{{ ('directory "' + option.directory | string +'";\n') if option.directory is defined and option.directory -}}
{{ ('dump-file "' + option.dump_file | string +'";\n') if option.dump_file is defined and option.dump_file -}}
{{ ('key-directory "' + option.key_directory | string +'";\n') if option.key_directory is defined and option.key_directory -}}
{{ ('managed-keys-directory "' + option.managed_keys_directory | string +'";\n') if option.managed_keys_directory is defined and option.managed_keys_directory -}}
{{ ('memstatistics-file "' + option.memstatistics_file | string +'";\n') if option.memstatistics_file is defined and option.memstatistics_file -}}
{{ ('new-zones-directory "' + option.new_zones_directory | string +'";\n') if option.new_zones_directory is defined and option.new_zones_directory -}}
{{ ('recursing-file "' + option.recursing_file | string +'";\n') if option.recursing_file is defined and option.recursing_file -}}
{{ ('secroots-file "' + option.secroots_file | string +'";\n') if option.secroots_file is defined and option.secroots_file -}}
{{ ('statistics-file "' + option.statistics_file | string +'";\n') if option.statistics_file is defined and option.statistics_file -}}
{{ ('tkey-domain "' + option.tkey_domain | string +'";\n') if option.tkey_domain is defined and option.tkey_domain -}}
{{ ('tkey-gssapi-credential "' + option.tkey_gssapi_credential | string +'";\n') if option.tkey_gssapi_credential is defined and option.tkey_gssapi_credential -}}
{{ ('tkey-gssapi-keytab "' + option.tkey_gssapi_keytab | string +'";\n') if option.tkey_gssapi_keytab is defined and option.tkey_gssapi_keytab -}}
{# simple_item_list options #}
{{ ('allow-notify {\n' + functions.simple_item_list(option.allow_notify) + '};\n') if option.allow_notify is defined and option.allow_notify -}}
{{ ('allow-query {\n' + functions.simple_item_list(option.allow_query) + '};\n') if option.allow_query is defined and option.allow_query -}}
{{ ('allow-query-cache {\n' + functions.simple_item_list(option.allow_query_cache) + '};\n') if option.allow_query_cache is defined and option.allow_query_cache -}}
{{ ('allow-query-cache-on {\n' + functions.simple_item_list(option.allow_query_cache_on) + '};\n') if option.allow_query_cache_on is defined and option.allow_query_cache_on -}}
{{ ('allow-query-on {\n' + functions.simple_item_list(option.allow_query_on) + '};\n') if option.allow_query_on is defined and option.allow_query_on -}}
{{ ('allow-recursion {\n' + functions.simple_item_list(option.allow_recursion) + '};\n') if option.allow_recursion is defined and option.allow_recursion -}}
{{ ('allow-recursion-on {\n' + functions.simple_item_list(option.allow_recursion_on) + '};\n') if option.allow_recursion_on is defined and option.allow_recursion_on -}}
{{ ('allow-update {\n' + functions.simple_item_list(option.allow_update) + '};\n') if option.allow_update is defined and option.allow_update -}}
{{ ('allow-update-forwarding {\n' + functions.simple_item_list(option.allow_update_forwarding) + '};\n') if option.allow_update_forwarding is defined and option.allow_update_forwarding -}}
{{ ('blackhole {\n' + functions.simple_item_list(option.blackhole) + '};\n') if option.blackhole is defined and option.blackhole -}}
{{ ('keep-response-order {\n' + functions.simple_item_list(option.keep_response_order) + '};\n') if option.keep_response_order is defined and option.keep_response_order -}}
{{ ('no-case-compress {\n' + functions.simple_item_list(option.no_case_compress) + '};\n') if option.no_case_compress is defined and option.no_case_compress -}}
{{ ('sortlist {\n' + functions.simple_item_list(option.sortlist) + '};\n') if option.sortlist is defined and option.sortlist -}}
{# String options #}
{{ ('attach-cache ' + option.attach_cache | string +';\n') if option.attach_cache is defined and option.attach_cache -}}
{{ ('cookie-secret ' + option.cookie_secret | string +';\n') if option.cookie_secret is defined and option.cookie_secret -}}
{{ ('disable-empty-zone ' + option.disable_empty_zone | string +';\n') if option.disable_empty_zone is defined and option.disable_empty_zone -}}
{{ ('dns64-contact ' + option.dns64_contact | string +';\n') if option.dns64_contact is defined and option.dns64_contact -}}
{{ ('dns64-server ' + option.dns64_server | string +';\n') if option.dns64_server is defined and option.dns64_server -}}
{{ ('dnssec-policy ' + option.dnssec_policy | string +';\n') if option.dnssec_policy is defined and option.dnssec_policy -}}
{{ ('empty-contact ' + option.empty_contact | string +';\n') if option.empty_contact is defined and option.empty_contact -}}
{{ ('empty-server ' + option.empty_server | string +';\n') if option.empty_server is defined and option.empty_server -}}
{{ ('ipv4only-contact ' + option.ipv4only_contact | string +';\n') if option.ipv4only_contact is defined and option.ipv4only_contact -}}
{{ ('ipv4only-server ' + option.ipv4only_server | string +';\n') if option.ipv4only_server is defined and option.ipv4only_server -}}
{{ ('nxdomain-redirect ' + option.nxdomain_redirect | string +';\n') if option.nxdomain_redirect is defined and option.nxdomain_redirect -}}
{{ ('preferred-glue ' + option.preferred_glue | string +';\n') if option.preferred_glue is defined and option.preferred_glue -}}
{{ ('session-keyalg ' + option.session_keyalg | string +';\n') if option.session_keyalg is defined and option.session_keyalg -}}
{{ ('session-keyname ' + option.session_keyname | string +';\n') if option.session_keyname is defined and option.session_keyname -}}
{# Integer options #}
{{ ('clients-per-query ' + option.clients_per_query | string +';\n') if option.clients_per_query is defined and option.clients_per_query -}}
{{ ('dnskey-sig-validity ' + option.dnskey_sig_validity | string +';\n') if option.dnskey_sig_validity is defined and option.dnskey_sig_validity -}}
{{ ('dnssec-loadkeys-interval ' + option.dnssec_loadkeys_interval | string +';\n') if option.dnssec_loadkeys_interval is defined and option.dnssec_loadkeys_interval -}}
{{ ('dscp ' + option.dscp | string +';\n') if option.dscp is defined and option.dscp -}}
{{ ('edns-udp-size ' + option.edns_udp_size | string +';\n') if option.edns_udp_size is defined and option.edns_udp_size -}}
{{ ('fstrm-set-buffer-hint ' + option.fstrm_set_buffer_hint | string +';\n') if option.fstrm_set_buffer_hint is defined and option.fstrm_set_buffer_hint -}}
{{ ('fstrm-set-flush-timeout ' + option.fstrm_set_flush_timeout | string +';\n') if option.fstrm_set_flush_timeout is defined and option.fstrm_set_flush_timeout -}}
{{ ('fstrm-set-input-queue-size ' + option.fstrm_set_input_queue_size | string +';\n') if option.fstrm_set_input_queue_size is defined and option.fstrm_set_input_queue_size -}}
{{ ('fstrm-set-output-notify-threshold ' + option.fstrm_set_output_notify_threshold | string +';\n') if option.fstrm_set_output_notify_threshold is defined and option.fstrm_set_output_notify_threshold -}}
{{ ('fstrm-set-output-queue-size ' + option.fstrm_set_output_queue_size | string +';\n') if option.fstrm_set_output_queue_size is defined and option.fstrm_set_output_queue_size -}}
{{ ('heartbeat-interval ' + option.heartbeat_interval | string +';\n') if option.heartbeat_interval is defined and option.heartbeat_interval -}}
{{ ('http-listener-clients ' + option.http_listener_clients | string +';\n') if option.http_listener_clients is defined and option.http_listener_clients -}}
{{ ('http-port ' + option.http_port | string +';\n') if option.http_port is defined and option.http_port -}}
{{ ('http-streams-per-connection ' + option.http_streams_per_connection | string +';\n') if option.http_streams_per_connection is defined and option.http_streams_per_connection -}}
{{ ('https-port ' + option.https_port | string +';\n') if option.https_port is defined and option.https_port -}}
{{ ('max-clients-per-query ' + option.max_clients_per_query | string +';\n') if option.max_clients_per_query is defined and option.max_clients_per_query -}}
{{ ('max-records ' + option.max_records | string +';\n') if option.max_records is defined and option.max_records -}}
{{ ('max-recursion-depth ' + option.max_recursion_depth | string +';\n') if option.max_recursion_depth is defined and option.max_recursion_depth -}}
{{ ('max-recursion-queries ' + option.max_recursion_queries | string +';\n') if option.max_recursion_queries is defined and option.max_recursion_queries -}}
{{ ('max-refresh-time ' + option.max_refresh_time | string +';\n') if option.max_refresh_time is defined and option.max_refresh_time -}}
{{ ('max-retry-time ' + option.max_retry_time | string +';\n') if option.max_retry_time is defined and option.max_retry_time -}}
{{ ('max-rsa-exponent-size ' + option.max_rsa_exponent_size | string +';\n') if option.max_rsa_exponent_size is defined and option.max_rsa_exponent_size -}}
{{ ('max-transfer-idle-in ' + option.max_transfer_idle_in | string +';\n') if option.max_transfer_idle_in is defined and option.max_transfer_idle_in -}}
{{ ('max-transfer-idle-out ' + option.max_transfer_idle_out | string +';\n') if option.max_transfer_idle_out is defined and option.max_transfer_idle_out -}}
{{ ('max-transfer-time-in ' + option.max_transfer_time_in | string +';\n') if option.max_transfer_time_in is defined and option.max_transfer_time_in -}}
{{ ('max-transfer-time-out ' + option.max_transfer_time_out | string +';\n') if option.max_transfer_time_out is defined and option.max_transfer_time_out -}}
{{ ('max-udp-size ' + option.max_udp_size | string +';\n') if option.max_udp_size is defined and option.max_udp_size -}}
{{ ('min-refresh-time ' + option.min_refresh_time | string +';\n') if option.min_refresh_time is defined and option.min_refresh_time -}}
{{ ('min-retry-time ' + option.min_retry_time | string +';\n') if option.min_retry_time is defined and option.min_retry_time -}}
{{ ('nocookie-udp-size ' + option.nocookie_udp_size | string +';\n') if option.nocookie_udp_size is defined and option.nocookie_udp_size -}}
{{ ('notify-delay ' + option.notify_delay | string +';\n') if option.notify_delay is defined and option.notify_delay -}}
{{ ('notify-rate ' + option.notify_rate | string +';\n') if option.notify_rate is defined and option.notify_rate -}}
{{ ('port ' + option.port | string +';\n') if option.port is defined and option.port -}}
{{ ('recursive-clients ' + option.recursive_clients | string +';\n') if option.recursive_clients is defined and option.recursive_clients -}}
{{ ('resolver-nonbackoff-tries ' + option.resolver_nonbackoff_tries | string +';\n') if option.resolver_nonbackoff_tries is defined and option.resolver_nonbackoff_tries -}}
{{ ('resolver-query-timeout ' + option.resolver_query_timeout | string +';\n') if option.resolver_query_timeout is defined and option.resolver_query_timeout -}}
{{ ('resolver-retry-interval ' + option.resolver_retry_interval | string +';\n') if option.resolver_retry_interval is defined and option.resolver_retry_interval -}}
{{ ('serial-query-rate ' + option.serial_query_rate | string +';\n') if option.serial_query_rate is defined and option.serial_query_rate -}}
{{ ('sig-signing-nodes ' + option.sig_signing_nodes | string +';\n') if option.sig_signing_nodes is defined and option.sig_signing_nodes -}}
{{ ('sig-signing-signatures ' + option.sig_signing_signatures | string +';\n') if option.sig_signing_signatures is defined and option.sig_signing_signatures -}}
{{ ('sig-signing-type ' + option.sig_signing_type | string +';\n') if option.sig_signing_type is defined and option.sig_signing_type -}}
{{ ('startup-notify-rate ' + option.startup_notify_rate | string +';\n') if option.startup_notify_rate is defined and option.startup_notify_rate -}}
{{ ('tcp-advertised-timeout ' + option.tcp_advertised_timeout | string +';\n') if option.tcp_advertised_timeout is defined and option.tcp_advertised_timeout -}}
{{ ('tcp-clients ' + option.tcp_clients | string +';\n') if option.tcp_clients is defined and option.tcp_clients -}}
{{ ('tcp-idle-timeout ' + option.tcp_idle_timeout | string +';\n') if option.tcp_idle_timeout is defined and option.tcp_idle_timeout -}}
{{ ('tcp-initial-timeout ' + option.tcp_initial_timeout | string +';\n') if option.tcp_initial_timeout is defined and option.tcp_initial_timeout -}}
{{ ('tcp-keepalive-timeout ' + option.tcp_keepalive_timeout | string +';\n') if option.tcp_keepalive_timeout is defined and option.tcp_keepalive_timeout -}}
{{ ('tcp-listen-queue ' + option.tcp_listen_queue | string +';\n') if option.tcp_listen_queue is defined and option.tcp_listen_queue -}}
{{ ('tcp-receive-buffer ' + option.tcp_receive_buffer | string +';\n') if option.tcp_receive_buffer is defined and option.tcp_receive_buffer -}}
{{ ('tcp-send-buffer ' + option.tcp_send_buffer | string +';\n') if option.tcp_send_buffer is defined and option.tcp_send_buffer -}}
{{ ('tls-port ' + option.tls_port | string +';\n') if option.tls_port is defined and option.tls_port -}}
{{ ('transfer-message-size ' + option.transfer_message_size | string +';\n') if option.transfer_message_size is defined and option.transfer_message_size -}}
{{ ('transfers-in ' + option.transfers_in | string +';\n') if option.transfers_in is defined and option.transfers_in -}}
{{ ('transfers-out ' + option.transfers_out | string +';\n') if option.transfers_out is defined and option.transfers_out -}}
{{ ('transfers-per-ns ' + option.transfers_per_ns | string +';\n') if option.transfers_per_ns is defined and option.transfers_per_ns -}}
{{ ('udp-receive-buffer ' + option.udp_receive_buffer | string +';\n') if option.udp_receive_buffer is defined and option.udp_receive_buffer -}}
{{ ('udp-send-buffer ' + option.udp_send_buffer | string +';\n') if option.udp_send_buffer is defined and option.udp_send_buffer -}}
{{ ('v6-bias ' + option.v6_bias | string +';\n') if option.v6_bias is defined and option.v6_bias -}}
{# Boolean options #}
{{ (functions.boolean_option('allow-new-zones', option.allow_new_zones) + '\n') if option.allow_new_zones is defined -}}
{{ (functions.boolean_option('answer-cookie', option.answer_cookie) + '\n') if option.answer_cookie is defined -}}
{{ (functions.boolean_option('auth-nxdomain', option.auth_nxdomain) + '\n') if option.auth_nxdomain is defined -}}
{{ (functions.boolean_option('automatic-interface-scan', option.automatic_interface_scan) + '\n') if option.automatic_interface_scan is defined -}}
{{ (functions.boolean_option('check-integrity', option.check_integrity) + '\n') if option.check_integrity is defined -}}
{{ (functions.boolean_option('check-sibling', option.check_sibling) + '\n') if option.check_sibling is defined -}}
{{ (functions.boolean_option('check-wildcard', option.check_wildcard) + '\n') if option.check_wildcard is defined -}}
{{ (functions.boolean_option('dnsrps-enable', option.dnsrps_enable) + '\n') if option.dnsrps_enable is defined -}}
{{ (functions.boolean_option('dnssec-accept-expired', option.dnssec_accept_expired) + '\n') if option.dnssec_accept_expired is defined -}}
{{ (functions.boolean_option('dnssec-dnskey-kskonly', option.dnssec_dnskey_kskonly) + '\n') if option.dnssec_dnskey_kskonly is defined -}}
{{ (functions.boolean_option('dnssec-secure-to-insecure', option.dnssec_secure_to_insecure) + '\n') if option.dnssec_secure_to_insecure is defined -}}
{{ (functions.boolean_option('empty-zones-enable', option.empty_zones_enable) + '\n') if option.empty_zones_enable is defined -}}
{{ (functions.boolean_option('flush-zones-on-shutdown', option.flush_zones_on_shutdown) + '\n') if option.flush_zones_on_shutdown is defined -}}
{{ (functions.boolean_option('glue-cache', option.glue_cache) + '\n') if option.glue_cache is defined -}}
{{ (functions.boolean_option('ipv4only-enable', option.ipv4only_enable) + '\n') if option.ipv4only_enable is defined -}}
{{ (functions.boolean_option('match-mapped-addresses', option.match_mapped_addresses) + '\n') if option.match_mapped_addresses is defined -}}
{{ (functions.boolean_option('memstatistics', option.memstatistics) + '\n') if option.memstatistics is defined -}}
{{ (functions.boolean_option('message-compression', option.message_compression) + '\n') if option.message_compression is defined -}}
{{ (functions.boolean_option('minimal-any', option.minimal_any) + '\n') if option.minimal_any is defined -}}
{{ (functions.boolean_option('multi-master', option.multi_master) + '\n') if option.multi_master is defined -}}
{{ (functions.boolean_option('notify-to-soa', option.notify_to_soa) + '\n') if option.notify_to_soa is defined -}}
{{ (functions.boolean_option('provide-ixfr', option.provide_ixfr) + '\n') if option.provide_ixfr is defined -}}
{{ (functions.boolean_option('querylog', option.querylog) + '\n') if option.querylog is defined -}}
{{ (functions.boolean_option('recursion', option.recursion) + '\n') if option.recursion is defined -}}
{{ (functions.boolean_option('request-expire', option.request_expire) + '\n') if option.request_expire is defined -}}
{{ (functions.boolean_option('request-ixfr', option.request_ixfr) + '\n') if option.request_ixfr is defined -}}
{{ (functions.boolean_option('request-nsid', option.request_nsid) + '\n') if option.request_nsid is defined -}}
{{ (functions.boolean_option('require-server-cookie', option.require_server_cookie) + '\n') if option.require_server_cookie is defined -}}
{{ (functions.boolean_option('reuseport', option.reuseport) + '\n') if option.reuseport is defined -}}
{{ (functions.boolean_option('root-key-sentinel', option.root_key_sentinel) + '\n') if option.root_key_sentinel is defined -}}
{{ (functions.boolean_option('send-cookie', option.send_cookie) + '\n') if option.send_cookie is defined -}}
{{ (functions.boolean_option('stale-answer-enable', option.stale_answer_enable) + '\n') if option.stale_answer_enable is defined -}}
{{ (functions.boolean_option('stale-cache-enable', option.stale_cache_enable) + '\n') if option.stale_cache_enable is defined -}}
{{ (functions.boolean_option('synth-from-dnssec', option.synth_from_dnssec) + '\n') if option.synth_from_dnssec is defined -}}
{{ (functions.boolean_option('trust-anchor-telemetry', option.trust_anchor_telemetry) + '\n') if option.trust_anchor_telemetry is defined -}}
{{ (functions.boolean_option('try-tcp-refresh', option.try_tcp_refresh) + '\n') if option.try_tcp_refresh is defined -}}
{{ (functions.boolean_option('update-check-ksk', option.update_check_ksk) + '\n') if option.update_check_ksk is defined -}}
{{ (functions.boolean_option('use-alt-transfer-source', option.use_alt_transfer_source) + '\n') if option.use_alt_transfer_source is defined -}}
{{ (functions.boolean_option('zero-no-soa-ttl', option.zero_no_soa_ttl) + '\n') if option.zero_no_soa_ttl is defined -}}
{{ (functions.boolean_option('zero-no-soa-ttl-cache', option.zero_no_soa_ttl_cache) + '\n') if option.zero_no_soa_ttl_cache is defined -}}
{% endmacro %}
{% endfor %}
{% endfilter %}
};

View File

@@ -1,9 +1,8 @@
{% macro parental_agents(parental_agents) %}
{% for agent in parental_agents if parental_agents is iterable %}
{% for agent in item.parental_agents if item.parental_agents is iterable %}
parental-agents {{ agent.name -}}
{{ (' port ' + agent.port | string) if agent.port is defined and agent.port -}}
{{ (' dscp ' + agent.dscp | string) if agent.dscp is defined and agent.dscp }} {
{{ functions.list_address_port_key_tls(agent.addresses) -}}};
{% endfor %}
{% endmacro %}

View File

@@ -1,8 +1,7 @@
{% macro primaries(primaries) %}
{% for primary in primaries if primaries is iterable %}
{% for primary in item.primaries if item.primaries is iterable %}
primaries {{ primary.name -}}
{{ (' port ' + primary.port | string) if primary.port is defined and primary.port -}}
{{ (' dscp ' + primary.dscp | string) if primary.dscp is defined and primary.dscp }} {
{{ functions.list_address_port_key_tls(primary.addresses) -}}};
{% endfor %}
{% endmacro %}

View File

@@ -0,0 +1,20 @@
{% for server in item.remote_servers %}
remote-servers "{{ server.name }}" {
{% filter indent(bind9_config_indent, true) %}
{% for key, value in server.items() %}
{% if key != 'name' %}
{# Handle known complex types if any, otherwise default to simple string/block #}
{% if value is iterable and value is not string and value is not mapping %}
{{ key }} {
{% for subitem in value %}
{{ subitem }};
{% endfor %}
};
{% else %}
{{ key }} {{ value }};
{% endif %}
{% endif %}
{% endfor %}
{% endfilter %}
};
{% endfor %}

View File

@@ -1,5 +1,5 @@
{% macro server(servers) %}
{% for server in servers if servers is iterable %}
{% for server in item.server if item.server is iterable %}
server {{ server.prefix }} {
{% filter indent(bind9_config_indent, true) %}
{% if server.transfer_source is defined and server.transfer_source is mapping %}
@@ -54,4 +54,3 @@ query-source
{{ (functions.boolean_option('send-cookie', server.send_cookie) + '\n') if server.send_cookie is defined -}}
{% endfilter %}};
{% endfor %}
{% endmacro %}

View File

@@ -1,10 +1,9 @@
{% macro statistics_channels(statistics_channels) %}
statistics-channels {
{% filter indent(bind9_config_indent, true) %}
{% for channel in statistics_channels if statistics_channels is iterable %}
{% for channel in item.statistics_channels if item.statistics_channels is iterable %}
inet {{ channel.address | string }}
{{- (' port ' + channel.port | string) if channel.port is defined and channel.port -}}
{{- (' allow {\n' + functions.simple_item_list(channel.allow) + '};\n') if channel.allow is defined and channel.allow -}}
{% endfor %}
{% endfilter %}};
{% endmacro %}

View File

@@ -1,5 +1,5 @@
{% macro tls(tlss) %}
{% for tls in tlss if tlss is iterable %}
{% for tls in item.tls if item.tls is iterable %}
tls {{ tls.name }} {
{% filter indent(bind9_config_indent, true) %}
{{ ('cert-file "' + tls.cert_file + '";\n') if tls.cert_file is defined and tls.cert_file -}}
@@ -13,4 +13,3 @@ tls {{ tls.name }} {
{{ (functions.boolean_option('session-tickets', tls.session_tickets) + '\n') if tls.session_tickets is defined -}}
{% endfilter %}};
{% endfor %}
{% endmacro %}

View File

@@ -1,7 +1,7 @@
{% macro trust_anchors(trust_anchors) %}
trust-anchors {
{% filter indent(bind9_config_indent, true) %}
{% for anchor in trust_anchors if trust_anchors is iterable %}
{% for anchor in item.trust_anchors if item.trust_anchors is iterable %}
{{ (anchor.name | string) -}}
{{ (' ' + anchor.type) -}}
{{ (' ' + anchor.flags | string) -}}
@@ -10,4 +10,3 @@ trust-anchors {
{{ (' "' + anchor.key + '"') -}};
{% endfor %}
{% endfilter %}};
{% endmacro %}

View File

@@ -1,5 +1,5 @@
{% macro view(views) %}
{% for view in views if views is iterable %}
{% for view in item.view if item.view is iterable %}
view {{ view.name }} {
{% filter indent(bind9_config_indent, true) %}
{{ ('match-recursive-only ' + functions.named_boolean(view.match_recursive_only) + ';\n') if view.match_recursive_only is defined -}}
@@ -75,4 +75,4 @@ view {{ view.name }} {
{{ trust_anchors(view.trust_anchors) -}}
{% endif %}
{% endfilter %}
};{% endfor %}{% endmacro %}
};{% endfor %}

View File

@@ -1,31 +1,21 @@
# Zones Macro
{% macro zones(zones) -%}
{% for zone in zones %}
{% for zone in item.zones %}
zone "{{ zone.name }}" {
{% filter indent(bind9_config_indent, true) %}
# Zone {{ zone.name }} type {{ zone.type }}
{# Most critical/defining statements first #}
{{ ('type ' + zone.type | string+';\n') if zone.type is defined and zone.type -}}
{{ ('file "' + zone.file | string+'";\n') if zone.file is defined and zone.file -}}
{{ ('forward ' + zone.forward | string+';\n') if zone.forward is defined and zone.forward -}}
{{ ('journal "' + zone.journal | string+'";\n') if zone.journal is defined and zone.journal -}}
{{ ('key-directory "' + zone.key_directory | string+'";\n') if zone.key_directory is defined and zone.key_directory -}}
{# boolean_or_string options #}
{{ ('dialup ' + functions.boolean_or_string(zone.dialup) + ';\n') if zone.dialup is defined -}}
{{ ('notify ' + functions.boolean_or_string(zone.notify) + ';\n') if zone.notify is defined -}}
{{ ('zone-statistics ' + functions.boolean_or_string(zone.zone_statistics) + ';\n') if zone.zone_statistics is defined -}}
{# upstream_servers options #}
{{ functions.parent_address_key_tls('also-notify', zone.also_notify) if zone.also_notify is defined and zone.also_notify -}}
{{ functions.parent_address_key_tls('primaries', zone.primaries) if zone.primaries is defined and zone.primaries -}}
{{ functions.parent_address_key_tls('parental-agents', zone.parental_agents) if zone.parental_agents is defined and zone.parental_agents -}}
{# Unicorn Options#}
{% if zone.update_policy is defined and zone.update_policy %}
{% if zone.update_policy == 'local' %}
{% for key, value in zone.items() %}
{% set conf_key = key | replace('_', '-') %}
{% if key == 'name' %}
{# Skip name as it is in the zone header #}
{# --- COMPLEX BLOCKS --- #}
{% elif key == 'update_policy' %}
{% if value == 'local' %}
update-policy local;
{% else %}
update-policy {
{% filter indent(bind9_config_indent, true) %}
{% for policy in zone.update_policy %}
{% for policy in value %}
{{ policy.permission -}}
{{ ' ' + policy.identity -}}
{{ ' ' + policy.ruletype -}}
@@ -34,129 +24,61 @@ update-policy {
{% endfor %}
{% endfilter %}};
{% endif %}
{% endif %}
{% if zone.sig_validity_interval is defined and zone.sig_validity_interval %}
{% elif key == 'sig_validity_interval' %}
sig-validity-interval
{{- (' ' + zone.sig_validity_interval.upper | string) }}
{{- (' ' + zone.sig_validity_interval.lower | string) if zone.sig_validity_interval.lower is defined and zone.sig_validity_interval.lower -}};
{% endif %}
{% if zone.server_names is defined and zone.server_names %}
server-names {
{{ functions.simple_item_list(zone.server_names) }}};
{% endif %}
{% if zone.server_addresses is defined and zone.server_addresses %}
server-addresses {
{{ functions.simple_item_list(zone.server_addresses) }}};
{% endif %}
{{ functions.parent_address_port_dscp('forwarders', zone.forwarders) if zone.forwarders is defined and zone.forwarders -}}
{% if zone.allow_transfer is defined and zone.allow_transfer is not string %}
{{- (' ' + value.upper | string) }}
{{- (' ' + value.lower | string) if value.lower is defined and value.lower -}};
{% elif key in ['server_names', 'server_addresses'] %}
{{ conf_key }} {
{{ functions.simple_item_list(value) }}};
{% elif key in ['also_notify', 'primaries', 'parental_agents'] %}
{{ functions.parent_address_key_tls(conf_key, value) -}}
{% elif key == 'forwarders' %}
{{ functions.parent_address_port_dscp('forwarders', value) -}}
{% elif key == 'allow_transfer' and value is not string and value is mapping %}
allow-transfer
{{- (' port ' + zone.allow_transfer.port | string) if zone.allow_transfer.port is defined and zone.allow_transfer.port -}}
{{- (' transport ' + zone.allow_transfer.transport) if zone.allow_transfer.transport is defined and zone.allow_transfer.transport }} {
{{ functions.simple_item_list(zone.allow_transfer.addresses) }}};
{{- (' port ' + value.port | string) if value.port is defined and value.port -}}
{{- (' transport ' + value.transport) if value.transport is defined and value.transport }} {
{{ functions.simple_item_list(value.addresses) }}};
{% elif key in ['transfer_source', 'transfer_source_v6', 'alt_transfer_source', 'alt_transfer_source_v6', 'notify_source', 'notify_source_v6', 'parental_source', 'parental_source_v6'] %}
{{ conf_key }} {{ value.address -}}
{{- (' port ' + value.port | string) if value.port is defined and value.port -}}
{{- (' dscp ' + value.dscp | string) if value.dscp is defined and value.dscp }};
{# --- SIMPLE LISTS --- #}
{% elif key in ['allow_notify', 'allow_query', 'allow_query_on', 'allow_update', 'allow_update_forwarding'] %}
{{ conf_key }} {
{{ functions.simple_item_list(value) }}};
{# --- BOOLEANS --- #}
{% elif key in ['check_integrity', 'check_sibling', 'check_wildcard', 'delegation_only', 'dnssec_dnskey_kskonly', 'dnssec_secure_to_insecure', 'inline_signing', 'ixfr_from_differences', 'multi_master', 'notify_to_soa', 'request_expire', 'request_ixfr', 'try_tcp_refresh', 'update_check_ksk', 'use_alt_transfer_source', 'zero_no_soa_ttl'] %}
{{ (functions.boolean_option(conf_key, value)) }}
{# --- BOOLEAN OR STRING --- #}
{% elif key in ['dialup', 'notify', 'zone_statistics'] %}
{{ conf_key }} {{ functions.boolean_or_string(value) }};
{# --- QUOTED STRINGS --- #}
{% elif key in ['file', 'journal', 'key_directory'] %}
{{ conf_key }} "{{ value }}";
{# --- DEPRECATED --- #}
{% elif key == 'auto_dnssec' %}
/* WARN: auto-dnssec is removed in BIND 9.20 */
{{ conf_key }} {{ value }};
{# --- FALLTHROUGH --- #}
{% else %}
{# Strict mode: Ignore unknown keys #}
{% endif %}
{# simple_list options #}
{{ ('allow-notify {\n' + functions.simple_item_list(zone.allow_notify) + '};\n') if zone.allow_notify is defined and zone.allow_notify -}}
{{ ('allow-query {\n' + functions.simple_item_list(zone.allow_query) + '};\n') if zone.allow_query is defined and zone.allow_query -}}
{{ ('allow-query-on {\n' + functions.simple_item_list(zone.allow_query_on) + '};\n') if zone.allow_query_on is defined and zone.allow_query_on -}}
{{ ('allow-update {\n' + functions.simple_item_list(zone.allow_update) + '};\n') if zone.allow_update is defined and zone.allow_update -}}
{{ ('allow-update-forwarding {\n' + functions.simple_item_list(zone.allow_update_forwarding) + '};\n') if zone.allow_update_forwarding is defined and zone.allow_update_forwarding -}}
{# ip_port_dscp options#}
{% if zone.transfer_source is defined and zone.transfer_source is mapping %}
transfer-source {{ zone.transfer_source.address -}}
{{- (' port ' + zone.transfer_source.port | string) if zone.transfer_source.port is defined and zone.transfer_source.port -}}
{{- (' dscp ' + zone.transfer_source.dscp | string) if zone.transfer_source.dscp is defined and zone.transfer_source.dscp }};
{% endif %}
{% if zone.transfer_source_v6 is defined and zone.transfer_source_v6 is mapping %}
transfer-source-v6 {{ zone.transfer_source_v6.address -}}
{{- (' port ' + zone.transfer_source_v6.port | string) if zone.transfer_source_v6.port is defined and zone.transfer_source_v6.port -}}
{{- (' dscp ' + zone.transfer_source_v6.dscp | string) if zone.transfer_source_v6.dscp is defined and zone.transfer_source_v6.dscp }};
{% endif %}
{% if zone.alt_transfer_source is defined and zone.alt_transfer_source is mapping %}
alt-transfer-source {{ zone.alt_transfer_source.address -}}
{{- (' port ' + zone.alt_transfer_source.port | string) if zone.alt_transfer_source.port is defined and zone.alt_transfer_source.port -}}
{{- (' dscp ' + zone.alt_transfer_source.dscp | string) if zone.alt_transfer_source.dscp is defined and zone.alt_transfer_source.dscp }};
{% endif %}
{% if zone.alt_transfer_source_v6 is defined and zone.alt_transfer_source_v6 is mapping %}
alt-transfer-source-v6 {{ zone.alt_transfer_source_v6.address -}}
{{- (' port ' + zone.alt_transfer_source_v6.port | string) if zone.alt_transfer_source_v6.port is defined and zone.alt_transfer_source_v6.port -}}
{{- (' dscp ' + zone.alt_transfer_source_v6.dscp | string) if zone.alt_transfer_source_v6.dscp is defined and zone.alt_transfer_source_v6.dscp }};
{% endif %}
{% if zone.notify_source is defined and zone.notify_source is mapping %}
notify-source {{ zone.notify_source.address -}}
{{- (' port ' + zone.notify_source.port | string) if zone.notify_source.port is defined and zone.notify_source.port -}}
{{- (' dscp ' + zone.notify_source.dscp | string) if zone.notify_source.dscp is defined and zone.notify_source.dscp }};
{% endif %}
{% if zone.notify_source_v6 is defined and zone.notify_source_v6 is mapping %}
notify-source-v6 {{ zone.notify_source_v6.address -}}
{{- (' port ' + zone.notify_source_v6.port | string) if zone.notify_source_v6.port is defined and zone.notify_source_v6.port -}}
{{- (' dscp ' + zone.notify_source_v6.dscp | string) if zone.notify_source_v6.dscp is defined and zone.notify_source_v6.dscp }};
{% endif %}
{% if zone.parental_source is defined and zone.parental_source is mapping %}
parental-source {{ zone.parental_source.address -}}
{{- (' port ' + zone.parental_source.port | string) if zone.parental_source.port is defined and zone.parental_source.port -}}
{{- (' dscp ' + zone.parental_source.dscp | string) if zone.parental_source.dscp is defined and zone.parental_source.dscp }};
{% endif %}
{% if zone.parental_source_v6 is defined and zone.parental_source_v6 is mapping %}
parental-source-v6 {{ zone.parental_source_v6.address -}}
{{- (' port ' + zone.parental_source_v6.port | string) if zone.parental_source_v6.port is defined and zone.parental_source_v6.port -}}
{{- (' dscp ' + zone.parental_source_v6.dscp | string) if zone.parental_source_v6.dscp is defined and zone.parental_source_v6.dscp }};
{% endif %}
{# integer options #}
{{ ('dnskey-sig-validity ' + zone.dnskey_sig_validity | string+';\n') if zone.dnskey_sig_validity is defined and zone.dnskey_sig_validity -}}
{{ ('dnssec-loadkeys-interval ' + zone.dnssec_loadkeys_interval | string+';\n') if zone.dnssec_loadkeys_interval is defined and zone.dnssec_loadkeys_interval -}}
{{ ('max-records ' + zone.max_records | string+';\n') if zone.max_records is defined and zone.max_records -}}
{{ ('max-refresh-time ' + zone.max_refresh_time | string+';\n') if zone.max_refresh_time is defined and zone.max_refresh_time -}}
{{ ('max-retry-time ' + zone.max_retry_time | string+';\n') if zone.max_retry_time is defined and zone.max_retry_time -}}
{{ ('max-transfer-idle-in ' + zone.max_transfer_idle_in | string+';\n') if zone.max_transfer_idle_in is defined and zone.max_transfer_idle_in -}}
{{ ('max-transfer-idle-out ' + zone.max_transfer_idle_out | string+';\n') if zone.max_transfer_idle_out is defined and zone.max_transfer_idle_out -}}
{{ ('max-transfer-time-in ' + zone.max_transfer_time_in | string+';\n') if zone.max_transfer_time_in is defined and zone.max_transfer_time_in -}}
{{ ('max-transfer-time-out ' + zone.max_transfer_time_out | string+';\n') if zone.max_transfer_time_out is defined and zone.max_transfer_time_out -}}
{{ ('min-refresh-time ' + zone.min_refresh_time | string+';\n') if zone.min_refresh_time is defined and zone.min_refresh_time -}}
{{ ('min-retry-time ' + zone.min_retry_time | string+';\n') if zone.min_retry_time is defined and zone.min_retry_time -}}
{{ ('notify-delay ' + zone.notify_delay | string+';\n') if zone.notify_delay is defined and zone.notify_delay -}}
{{ ('sig-signing-nodes ' + zone.sig_signing_nodes | string+';\n') if zone.sig_signing_nodes is defined and zone.sig_signing_nodes -}}
{{ ('sig-signing-signatures ' + zone.sig_signing_signatures | string+';\n') if zone.sig_signing_signatures is defined and zone.sig_signing_signatures -}}
{{ ('sig-signing-type ' + zone.sig_signing_type | string+';\n') if zone.sig_signing_type is defined and zone.sig_signing_type -}}
{# boolean options #}
{{ (functions.boolean_option('check-integrity', zone.check_integrity) + '\n') if zone.check_integrity is defined -}}
{{ (functions.boolean_option('check-sibling', zone.check_sibling) + '\n') if zone.check_sibling is defined -}}
{{ (functions.boolean_option('check-wildcard', zone.check_wildcard) + '\n') if zone.check_wildcard is defined -}}
{{ (functions.boolean_option('delegation-only', zone.delegation_only) + '\n') if zone.delegation_only is defined -}}
{{ (functions.boolean_option('dnssec-dnskey-kskonly', zone.dnssec_dnskey_kskonly) + '\n') if zone.dnssec_dnskey_kskonly is defined -}}
{{ (functions.boolean_option('dnssec-secure-to-insecure', zone.dnssec_secure_to_insecure) + '\n') if zone.dnssec_secure_to_insecure is defined -}}
{{ (functions.boolean_option('inline-signing', zone.inline_signing) + '\n') if zone.inline_signing is defined -}}
{{ (functions.boolean_option('ixfr-from-differences', zone.ixfr_from_differences) + '\n') if zone.ixfr_from_differences is defined -}}
{{ (functions.boolean_option('multi-master', zone.multi_master) + '\n') if zone.multi_master is defined -}}
{{ (functions.boolean_option('notify-to-soa', zone.notify_to_soa) + '\n') if zone.notify_to_soa is defined -}}
{{ (functions.boolean_option('request-expire', zone.request_expire) + '\n') if zone.request_expire is defined -}}
{{ (functions.boolean_option('request-ixfr', zone.request_ixfr) + '\n') if zone.request_ixfr is defined -}}
{{ (functions.boolean_option('try-tcp-refresh', zone.try_tcp_refresh) + '\n') if zone.try_tcp_refresh is defined -}}
{{ (functions.boolean_option('update-check-ksk', zone.update_check_ksk) + '\n') if zone.update_check_ksk is defined -}}
{{ (functions.boolean_option('use-alt-transfer-source', zone.use_alt_transfer_source) + '\n') if zone.use_alt_transfer_source is defined -}}
{{ (functions.boolean_option('zero-no-soa-ttl', zone.zero_no_soa_ttl) + '\n') if zone.zero_no_soa_ttl is defined -}}
{# multiple_choice options #}
{{ ('auto-dnssec ' + zone.auto_dnssec | string+';\n') if zone.auto_dnssec is defined and zone.auto_dnssec -}}
{{ ('check-dup-records ' + zone.check_dup_records | string+';\n') if zone.check_dup_records is defined and zone.check_dup_records -}}
{{ ('check-mx-cname ' + zone.check_mx_cname | string+';\n') if zone.check_mx_cname is defined and zone.check_mx_cname -}}
{{ ('check-mx ' + zone.check_mx | string+';\n') if zone.check_mx is defined and zone.check_mx -}}
{{ ('check-names ' + zone.check_names | string+';\n') if zone.check_names is defined and zone.check_names -}}
{{ ('check-spf ' + zone.check_spf | string+';\n') if zone.check_spf is defined and zone.check_spf -}}
{{ ('check-srv-cname ' + zone.check_srv_cname | string+';\n') if zone.check_srv_cname is defined and zone.check_srv_cname -}}
{{ ('dnssec-update-mode ' + zone.dnssec_update_mode | string+';\n') if zone.dnssec_update_mode is defined and zone.dnssec_update_mode -}}
{{ ('masterfile-format ' + zone.masterfile_format | string+';\n') if zone.masterfile_format is defined and zone.masterfile_format -}}
{{ ('masterfile-style ' + zone.masterfile_style | string+';\n') if zone.masterfile_style is defined and zone.masterfile_style -}}
{{ ('max-ixfr-ratio ' + zone.max_ixfr_ratio | string+';\n') if zone.max_ixfr_ratio is defined and zone.max_ixfr_ratio -}}
{{ ('max-journal-size ' + zone.max_journal_size | string+';\n') if zone.max_journal_size is defined and zone.max_journal_size -}}
{{ ('max-zone-ttl ' + zone.max_zone_ttl | string+';\n') if zone.max_zone_ttl is defined and zone.max_zone_ttl -}}
{{ ('serial-update-method ' + zone.serial_update_method | string+';\n') if zone.serial_update_method is defined and zone.serial_update_method -}}
{# string options #}
{{ ('database ' + zone.database | string+';\n') if zone.database is defined and zone.database -}}
{{ ('dlz ' + zone.dlz | string+';\n') if zone.dlz is defined and zone.dlz -}}
{{ ('dnssec-policy ' + zone.dnssec_policy | string+';\n') if zone.dnssec_policy is defined and zone.dnssec_policy -}}
{{ ('in-view ' + zone.in_view | string+';\n') if zone.in_view is defined and zone.in_view -}}
{% endfilter %}
};
{% endfor %}
{% endmacro %}
{% endfilter %}
};
{% endfor %}