]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
datamodel: cache section added
authorAleš <ales.mrazek@nic.cz>
Wed, 29 Sep 2021 20:08:10 +0000 (22:08 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:53 +0000 (16:17 +0200)
manager/etc/knot-resolver/config.yml
manager/knot_resolver_manager/datamodel/cache_schema.py [new file with mode: 0644]
manager/knot_resolver_manager/datamodel/config_schema.py
manager/knot_resolver_manager/datamodel/lua_template.j2

index a030389eb6027f9e5ba1d7e684f88e829d4e0c25..2296938aeb875b433429ed442a02ce5f9dcb99b2 100644 (file)
@@ -1,7 +1,9 @@
+server:
+    workers: 1
 network:
     interfaces:
       - listen:
             ip: 127.0.0.1
             port: 5353
-server:
-    workers: 1
+cache:
+    storage: etc/knot-resolver/cache
diff --git a/manager/knot_resolver_manager/datamodel/cache_schema.py b/manager/knot_resolver_manager/datamodel/cache_schema.py
new file mode 100644 (file)
index 0000000..111bea1
--- /dev/null
@@ -0,0 +1,24 @@
+from typing import List, Optional
+
+from knot_resolver_manager.datamodel.types import AnyPath, SizeUnit, TimeUnit
+from knot_resolver_manager.utils import SchemaNode
+
+
+class PrefillSchema(SchemaNode):
+    domain: str
+    url: str
+    refresh_interval: TimeUnit = TimeUnit("1d")
+    ca_file: Optional[AnyPath] = None
+
+
+class CacheSchema(SchemaNode):
+    storage: AnyPath = AnyPath("/var/cache/knot-resolver")
+    size_max: SizeUnit = SizeUnit("100M")
+    ttl_min: TimeUnit = TimeUnit("5s")
+    ttl_max: TimeUnit = TimeUnit("6d")
+    ns_timeout: TimeUnit = TimeUnit("1000ms")
+    prefill: Optional[List[PrefillSchema]] = None
+
+    def _validate(self):
+        if self.ttl_min.seconds() >= self.ttl_max.seconds():
+            raise ValueError("'ttl-max' must be larger then 'ttl-min'")
index a7249206c0b4bc1a78206bcab3572e6dd092b116..ea57528988ca85a85e6be1dcf53a9666633ea36f 100644 (file)
@@ -4,6 +4,7 @@ from typing import Text, Union
 from jinja2 import Environment, Template
 from typing_extensions import Literal
 
+from knot_resolver_manager.datamodel.cache_schema import CacheSchema
 from knot_resolver_manager.datamodel.dns64_schema import Dns64Schema
 from knot_resolver_manager.datamodel.dnssec_schema import DnssecSchema
 from knot_resolver_manager.datamodel.lua_schema import LuaSchema
@@ -29,6 +30,7 @@ class KresConfig(SchemaNode):
         server: ServerSchema = ServerSchema()
         options: OptionsSchema = OptionsSchema()
         network: NetworkSchema = NetworkSchema()
+        cache: CacheSchema = CacheSchema()
         dnssec: Union[bool, DnssecSchema] = True
         dns64: Union[bool, Dns64Schema] = False
         lua: LuaSchema = LuaSchema()
@@ -38,6 +40,7 @@ class KresConfig(SchemaNode):
     server: ServerSchema
     options: OptionsSchema
     network: NetworkSchema
+    cache: CacheSchema
     dnssec: Union[Literal[False], DnssecSchema]
     dns64: Union[Literal[False], Dns64Schema]
     lua: LuaSchema
index 939555be63c7a8b0e83d36316b665ccc6e99e61d..57cbfda08123619e88ca9508d1b630e42359a405 100644 (file)
@@ -57,6 +57,26 @@ option('NO_0X20', {{ 'false' if cfg.options.query_case_randomization else 'true'
 {{ "modules.unload('detect_time_jump')" if not cfg.options.time_jump_detection }}
 {{ "modules.unload('refuse_nord')" if not cfg.options.refuse_no_rd }}
 
+-- CACHE section
+cache.open({{ cfg.cache.size_max.bytes() }}, 'lmdb://{{ cfg.cache.storage }}')
+cache.min_ttl({{ cfg.cache.ttl_min.seconds() }})
+cache.max_ttl({{ cfg.cache.ttl_max.seconds() }})
+cache.ns_tout({{ cfg.cache.ns_timeout.millis() }})
+
+-- cache.prefill
+{% if cfg.cache.prefill %}
+modules.load('prefill')
+prefill.config({
+{% for item in cfg.cache.prefill %}
+    ['{{ item.domain }}'] = {
+        url = '{{ item.url }}',
+        interval = {{ item.refresh_interval.seconds() }}
+        {{ "ca_file = '"+item.ca_file+"'," if item.ca_file }}
+    }
+{% endfor %}
+})
+{% endif %}
+
 -- DNSSEC section
 {% if not cfg.dnssec %}
 trust_anchors.remove('.')