]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: datamodel: local-data: missing config options added
authorAleš Mrázek <ales.mrazek@nic.cz>
Wed, 14 Jun 2023 14:42:48 +0000 (16:42 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Wed, 14 Jun 2023 14:51:53 +0000 (16:51 +0200)
manager/etc/knot-resolver/config.dev.yml
manager/knot_resolver_manager/datamodel/local_data_schema.py
manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2
manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2
manager/tests/unit/datamodel/test_local_data.py

index c6b55c180e1e47f0b09dc7b913ae37c79572a6c6..859de8f51cbfdb524400783180ddff62670fee75 100644 (file)
@@ -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
index 9461362fab4bb340b44223f564618626dafad0e1..69810aea3e6006df1be63e880db19aae03230825 100644 (file)
@@ -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
index d7e2110ffd0720bbbb11fb5d965dfb3397a3dde7..4764041f147a1677b8e4cc47326e95ae36c825a0 100644 (file)
@@ -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 -%}
index dde204e3085ded378d7bc4a05fb47c06b8b366e6..27064d736136259ffdecf1b2749b6fac73b483ff 100644 (file)
@@ -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 %}
index 198bccd2c0d3c758c259f3c39fb36b8ddcf3d2a4..fe529777a3e104ecd3b960b8e1e7076a37605eed 100644 (file)
@@ -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"]},
     ],
 )