]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: datamodel: local_data render to Lua
authorAleš Mrázek <ales.mrazek@nic.cz>
Wed, 12 Apr 2023 10:26:01 +0000 (12:26 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 9 Jun 2023 11:54:07 +0000 (11:54 +0000)
manager/etc/knot-resolver/config.policy.dev.yml
manager/knot_resolver_manager/datamodel/local_data_schema.py
manager/knot_resolver_manager/datamodel/templates/config.lua.j2
manager/knot_resolver_manager/datamodel/templates/local_data.lua.j2
manager/knot_resolver_manager/datamodel/templates/macros/local_data_macros.lua.j2
manager/knot_resolver_manager/datamodel/templates/macros/policy_macros.lua.j2

index 8fb7a691412dc554cb2aa53439fc29053913c7c1..5f5a7429d0214dfffee4ad215aaef59d152fb2ca 100644 (file)
@@ -23,7 +23,14 @@ views:
   - subnets: [10.0.10.0/24]
     answer: allow
 
-# local-data:
+local-data:
+  subtrees:
+    - type: empty
+      tags: [ t2 ]
+      roots: [ example1.org ]
+    - type: nxdomain
+      roots: [ sub4.example.org ]
+
 #   ttl: 1d
 #   nodata: true
 #   addresses:
@@ -36,18 +43,6 @@ views:
 #      A 192.168.2.3
 #      A 192.168.2.4
 #     local.example.org AAAA ::1
-#   subtrees:
-#     - type: empty
-#       roots: [ sub2.example.org ]
-#       tags: [ t2 ]
-#     - type: nxdomain
-#       roots-file: /path/to/file.txt
-#     - type: empty
-#       roots-url: https://example.org/blocklist.txt
-#       refresh: 1d
-#     - type: redirect
-#       roots: [ sub4.example.org ]
-#       addresses: [ 127.0.0.1, "::1" ]
 
 # forward:
 #   - subtree: '.'
index 8008e085d2dd9036f78fc23ad4a9e460dc931172..18e20007be2425b9c5ff0665fab8a2b47f449662 100644 (file)
@@ -1,4 +1,4 @@
-from typing import Dict, List, Optional, Union
+from typing import Dict, List, Optional
 
 from typing_extensions import Literal
 
@@ -14,6 +14,8 @@ class SubtreeSchema(ConfigSchema):
     ---
     type: Type of the subtree.
     tags: Tags to link with other policy rules.
+    ttl: Default TTL value used for added local subtree.
+    nodata: Use NODATA synthesis. NODATA will be synthesised for matching name, but mismatching type(e.g. AAAA query when only A exists).
     addresses: Subtree addresses.
     roots: Subtree roots.
     roots_file: Subtree roots from given file.
@@ -23,8 +25,10 @@ class SubtreeSchema(ConfigSchema):
 
     type: Literal["empty", "nxdomain", "redirect"]
     tags: Optional[List[IDPattern]] = None
-    addresses: Optional[Union[List[IPAddress], IPAddress]] = None
-    roots: Optional[Union[List[DomainName], DomainName]] = None
+    ttl: Optional[TimeUnit] = None
+    nodata: bool = True
+    addresses: Optional[List[IPAddress]] = None
+    roots: Optional[List[DomainName]] = None
     roots_file: Optional[UncheckedPath] = None
     roots_url: Optional[str] = None
     refresh: Optional[TimeUnit] = None
@@ -54,7 +58,7 @@ class LocalDataSchema(ConfigSchema):
 
     ttl: Optional[TimeUnit] = None
     nodata: bool = True
-    addresses: Optional[Dict[DomainName, Union[List[IPAddress], IPAddress]]] = None
-    addresses_files: Optional[Union[List[UncheckedPath], UncheckedPath]] = None
+    addresses: Optional[Dict[DomainName, List[IPAddress]]] = None
+    addresses_files: Optional[List[UncheckedPath]] = None
     records: Optional[str] = None
     subtrees: Optional[List[SubtreeSchema]] = None
index b741ed266ef2dd1c66c557bb9b5571c8585ef542..ee4a2ed68c366b40ab2f13c45358505a22f47916 100644 (file)
@@ -31,7 +31,7 @@ nsid.name('{{ cfg.nsid }}_' .. worker.id)
 {% include "views.lua.j2" %}
 
 -- LOCAL-DATA section -------------------------------
-{# {% include "local_data.lua.j2" %} #}
+{% include "local_data.lua.j2" %}
 
 -- SLICES section -----------------------------------
 {# {% include "slices.lua.j2" %} #}
index dbab321d78b6c333443ce70837f1801985151f1b..519671051993ca53e694d27d628621c6c6f9a2bf 100644 (file)
@@ -1,39 +1,18 @@
-{% from 'macros/common_macros.lua.j2' import string_table %}
-{% from 'macros/policy_macros.lua.j2' import policy_get_tagset, policy_todname %}
-{% from 'macros/local_data_macros.lua.j2' import local_data_emptyzone, local_data_nxdomain %}
-
-local C = require('ffi').C
-
+{% from 'macros/local_data_macros.lua.j2' import local_data_subtree_root %}
 
 {# TODO: implemented all other options/features from local_data_schema #}
+{% if cfg.local_data.subtrees -%}
+{% for subtree in cfg.local_data.subtrees %}
 
-
-{% for subtree in cfg.local_data.subnets %}
-
-{# IF subtree.roots is not None #}
 {% if subtree.roots -%}
-{%- for root in subtree.roots -%}
-
-
-{% if subtree.type == 'empty' -%}
-{{ local_data_emptyzone(policy_todname(root), policy_get_tagset(string_table(subtree.tags))) }}
-{%- elif subtree.type == 'nxdomain' -%}
-{{ view_insert_action(policy_todname(root), policy_get_tagset(string_table(subtree.tags))) }}
-{% else %}
-{# TODO: implement other possible types #}
-{%- endif %}
-
-{%- endfor -%}
-{%- endif %}
-
-{# IF subtree.roots_file is not None #}
-{% if subtree.roots_file -%}
+{% for root in subtree.roots %}
+{{ local_data_subtree_root(subtree.type, root, subtree.tags) }}
+{% endfor %}
+{%- elif subtree.roots_file -%}
 {# TODO: not implemented yet #}
-{%- endif %}
-
-{# IF subtree.roots_url is not None #}
-{% if subtree.roots_url -%}
+{%- elif subtree.roots_url -%}
 {# TODO: not implemented yet #}
 {%- endif %}
 
 {% endfor %}
+{%- endif %}
index cee9fcdc58fb14f9744fd7bf1f0111a3b41584ec..43f10f359d43b5629fdb21cfe0f2f08821f325b9 100644 (file)
@@ -1,3 +1,6 @@
+{% from 'macros/common_macros.lua.j2' import string_table %}
+{% from 'macros/policy_macros.lua.j2' import policy_get_tagset, policy_todname %}
+
 {% macro local_data_emptyzone(dname, tags) -%}
 assert(C.kr_rule_local_data_emptyzone({{ dname }},{{ tags }})==0)
 {%- endmacro %}
@@ -5,3 +8,18 @@ assert(C.kr_rule_local_data_emptyzone({{ dname }},{{ tags }})==0)
 {% macro local_data_nxdomain(dname, tags) -%}
 assert(C.kr_rule_local_data_nxdomain({{ dname }},{{ tags }})==0)
 {%- endmacro %}
+
+{% macro local_data_subtree_root(type, root, tags) -%}
+{%- if tags -%}
+{%- set get_tags = policy_get_tagset(tags) -%}
+{%- else -%}
+{%- set get_tags = '0' -%}
+{%- endif -%}
+{%- if type == 'empty' -%}
+{{ local_data_emptyzone(policy_todname(root), get_tags) }}
+{%- elif type == 'nxdomain' -%}
+{{ local_data_nxdomain(policy_todname(root), get_tags) }}
+{%- else -%}
+{# TODO: implement other possible types #}
+{%- endif -%}
+{%- endmacro %}
index ba5c1be1eea909597e51f71312dabbfc858e629e..36ce102f0bbbd25585a894e009f77ed2c47f801d 100644 (file)
@@ -258,7 +258,11 @@ policy.TLS_FORWARD({{ tls_servers_table(servers) }})
 
 {# Other #}
 
-{% macro policy_todname(names) -%}
+{% macro policy_todname(name) -%}
+todname('{{ name.punycode()|string }}')
+{%- endmacro %}
+
+{% macro policy_todnames(names) -%}
 policy.todnames({
 {%- if names is string -%}
 '{{ names.punycode()|string }}'