From: Aleš Mrázek Date: Wed, 14 Jun 2023 14:42:48 +0000 (+0200) Subject: manager: datamodel: local-data: missing config options added X-Git-Tag: v6.0.1~5^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c859edbe9a1352680293006aaa850ecd830f18d9;p=thirdparty%2Fknot-resolver.git manager: datamodel: local-data: missing config options added --- diff --git a/manager/etc/knot-resolver/config.dev.yml b/manager/etc/knot-resolver/config.dev.yml index c6b55c180..859de8f51 100644 --- a/manager/etc/knot-resolver/config.dev.yml +++ b/manager/etc/knot-resolver/config.dev.yml @@ -24,6 +24,14 @@ views: 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 diff --git a/manager/knot_resolver_manager/datamodel/local_data_schema.py b/manager/knot_resolver_manager/datamodel/local_data_schema.py index 9461362fa..69810aea3 100644 --- a/manager/knot_resolver_manager/datamodel/local_data_schema.py +++ b/manager/knot_resolver_manager/datamodel/local_data_schema.py @@ -2,8 +2,8 @@ from typing import Dict, List, Optional 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 @@ -29,7 +29,7 @@ class SubtreeSchema(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 @@ -63,6 +63,8 @@ class LocalDataSchema(ConfigSchema): --- 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. @@ -72,8 +74,10 @@ class LocalDataSchema(ConfigSchema): 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 diff --git a/manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2 index d7e2110ff..4764041f1 100644 --- a/manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2 +++ b/manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2 @@ -1,6 +1,27 @@ -{% 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 -%} diff --git a/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 index dde204e30..27064d736 100644 --- a/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 +++ b/manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2 @@ -1,6 +1,37 @@ {% 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 %} diff --git a/manager/tests/unit/datamodel/test_local_data.py b/manager/tests/unit/datamodel/test_local_data.py index 198bccd2c..fe529777a 100644 --- a/manager/tests/unit/datamodel/test_local_data.py +++ b/manager/tests/unit/datamodel/test_local_data.py @@ -12,7 +12,7 @@ from knot_resolver_manager.utils.modeling.exceptions import DataValidationError [ {"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"]}, ], )