From: Aleš Date: Wed, 29 Sep 2021 20:08:10 +0000 (+0200) Subject: datamodel: cache section added X-Git-Tag: v6.0.0a1~120 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3c8ff64fe9ccc899dbab94f94b4869841a597ec;p=thirdparty%2Fknot-resolver.git datamodel: cache section added --- diff --git a/manager/etc/knot-resolver/config.yml b/manager/etc/knot-resolver/config.yml index a030389eb..2296938ae 100644 --- a/manager/etc/knot-resolver/config.yml +++ b/manager/etc/knot-resolver/config.yml @@ -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 index 000000000..111bea136 --- /dev/null +++ b/manager/knot_resolver_manager/datamodel/cache_schema.py @@ -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'") diff --git a/manager/knot_resolver_manager/datamodel/config_schema.py b/manager/knot_resolver_manager/datamodel/config_schema.py index a7249206c..ea5752898 100644 --- a/manager/knot_resolver_manager/datamodel/config_schema.py +++ b/manager/knot_resolver_manager/datamodel/config_schema.py @@ -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 diff --git a/manager/knot_resolver_manager/datamodel/lua_template.j2 b/manager/knot_resolver_manager/datamodel/lua_template.j2 index 939555be6..57cbfda08 100644 --- a/manager/knot_resolver_manager/datamodel/lua_template.j2 +++ b/manager/knot_resolver_manager/datamodel/lua_template.j2 @@ -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('.')