local-data:
ttl: 60m
nodata: false
+ root-fallback-addresses:
+ j.root-servers.net.: ["2001:503:c27::2:30", "192.58.128.30"]
+ l.root-servers.net.: '199.7.83.42'
+ m.root-servers.net.: '202.12.27.33'
+ # root-fallback-addresses-files: root.custom
+ addresses:
+ foo.bar: 127.0.0.1
+ # addresses-files: hosts.custom
records: |
example.net. TXT "foo bar"
A 192.168.2.3
from typing_extensions import Literal
-from knot_resolver_manager.datamodel.types import DomainName, IDPattern, IPAddress, TimeUnit
-from knot_resolver_manager.datamodel.types.files import FilePath, UncheckedPath
+from knot_resolver_manager.datamodel.types import DomainName, IDPattern, IPAddress, ListOrItem, TimeUnit
+from knot_resolver_manager.datamodel.types.files import FilePath
from knot_resolver_manager.utils.modeling import ConfigSchema
nodata: bool = True
addresses: Optional[List[IPAddress]] = None
roots: Optional[List[DomainName]] = None
- roots_file: Optional[UncheckedPath] = None
+ roots_file: Optional[FilePath] = None
roots_url: Optional[str] = None
refresh: Optional[TimeUnit] = None
---
ttl: Default TTL value used for added local data/records.
nodata: Use NODATA synthesis. NODATA will be synthesised for matching name, but mismatching type(e.g. AAAA query when only A exists).
+ root_fallback_addresses: Direct replace of root hints.
+ root_fallback_addresses_files: Direct replace of root hints from a zonefile.
addresses: Direct addition of hostname and IP addresses pairs.
addresses_files: Direct addition of hostname and IP addresses pairs from files in '/etc/hosts' like format.
records: Direct addition of records in DNS zone file format.
ttl: Optional[TimeUnit] = None
nodata: bool = True
- addresses: Optional[Dict[DomainName, List[IPAddress]]] = None
- addresses_files: Optional[List[UncheckedPath]] = None
+ root_fallback_addresses: Optional[Dict[DomainName, ListOrItem[IPAddress]]] = None
+ root_fallback_addresses_files: Optional[ListOrItem[FilePath]] = None
+ addresses: Optional[Dict[DomainName, IPAddress]] = None
+ addresses_files: Optional[ListOrItem[FilePath]] = None
records: Optional[str] = None
subtrees: Optional[List[SubtreeSchema]] = None
rpz: Optional[List[RPZSchema]] = None
-{% from 'macros/local_data_macros.lua.j2' import local_data_subtree_root, local_data_records %}
+{% from 'macros/local_data_macros.lua.j2' import local_data_subtree_root, local_data_records, local_data_root_fallback_addresses, local_data_root_fallback_addresses_files, local_data_addresses, local_data_addresses_files %}
-{# TODO: implemented all other options/features from local_data_schema #}
+
+modules = { 'hints > iterate' }
+
+{# root-fallback-addresses #}
+{% if cfg.local_data.root_fallback_addresses -%}
+{{ local_data_root_fallback_addresses(cfg.local_data.root_fallback_addresses) }}
+{%- endif %}
+
+{# root-fallback-addresses-files #}
+{% if cfg.local_data.root_fallback_addresses_files -%}
+{{ local_data_root_fallback_addresses_files(cfg.local_data.root_fallback_addresses_files) }}
+{%- endif %}
+
+{# addresses #}
+{% if cfg.local_data.addresses -%}
+{{ local_data_addresses(cfg.local_data.addresses) }}
+{%- endif %}
+
+{# addresses-files #}
+{% if cfg.local_data.addresses_files -%}
+{{ local_data_addresses_files(cfg.local_data.addresses_files) }}
+{%- endif %}
{# records #}
{% if cfg.local_data.records -%}
{% from 'macros/common_macros.lua.j2' import string_table, boolean %}
{% from 'macros/policy_macros.lua.j2' import policy_get_tagset, policy_todname %}
+
+{% macro local_data_root_fallback_addresses(pairs) -%}
+hints.root({
+{% for name, addresses in pairs.items() %}
+ ['{{ name }}']={{ string_table(addresses) }},
+{% endfor %}
+})
+{%- endmacro %}
+
+
+{% macro local_data_root_fallback_addresses_files(files) -%}
+{% for file in files %}
+hints.root_file('{{ file }}')
+{% endfor %}
+{%- endmacro %}
+
+
+{% macro local_data_addresses(pairs) -%}
+{% for name, address in pairs.items() %}
+hints['{{ name }}'] = '{{ address }}'
+{% endfor %}
+{%- endmacro %}
+
+
+{% macro local_data_addresses_files(files) -%}
+{% for file in files %}
+hints.add_hosts('{{ file }}')
+{% endfor %}
+{%- endmacro %}
+
+
{% macro local_data_records(input_str, is_rpz, ttl, nodata, tags=none, id='rrs') -%}
{{ id }} = ffi.new('struct kr_rule_zonefile_config')
{% if ttl %}
[
{"type": "empty", "roots": ["sub2.example.org"]},
{"type": "empty", "roots-url": "https://example.org/blocklist.txt", "refresh": "1d"},
- {"type": "nxdomain", "roots-file": "/path/to/file.txt"},
+ {"type": "nxdomain", "roots-file": "/etc/hosts"}, # must be an existing file or validation will fail
{"type": "redirect", "roots": ["sub4.example.org"], "addresses": ["127.0.0.1", "::1"]},
],
)