From: Aleš Mrázek Date: Mon, 22 Jan 2024 20:41:31 +0000 (+0100) Subject: api: cache-clear: validate data, render lua and send cmd X-Git-Tag: v6.0.7~23^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0d07f9470607e5e67241c99c97ab11a9eef5e6b;p=thirdparty%2Fknot-resolver.git api: cache-clear: validate data, render lua and send cmd --- diff --git a/manager/knot_resolver_manager/kresd_controller/registered_workers.py b/manager/knot_resolver_manager/kresd_controller/registered_workers.py index af3471353..2478fdaef 100644 --- a/manager/knot_resolver_manager/kresd_controller/registered_workers.py +++ b/manager/knot_resolver_manager/kresd_controller/registered_workers.py @@ -2,6 +2,8 @@ import asyncio import logging from typing import TYPE_CHECKING, Dict, List, Tuple +from knot_resolver_manager.exceptions import SubprocessControllerException + if TYPE_CHECKING: from knot_resolver_manager.kresd_controller.interface import KresID, Subprocess diff --git a/manager/knot_resolver_manager/server.py b/manager/knot_resolver_manager/server.py index 266a2f060..47a11d6d0 100644 --- a/manager/knot_resolver_manager/server.py +++ b/manager/knot_resolver_manager/server.py @@ -23,6 +23,7 @@ from knot_resolver_manager import log, statistics from knot_resolver_manager.compat import asyncio as asyncio_compat from knot_resolver_manager.config_store import ConfigStore from knot_resolver_manager.constants import DEFAULT_MANAGER_CONFIG_FILE, PID_FILE_NAME, init_user_constants +from knot_resolver_manager.datamodel.cache_schema import CacheClearRPCSchema from knot_resolver_manager.datamodel.config_schema import KresConfig, get_rundir_without_validation from knot_resolver_manager.datamodel.globals import ( Context, @@ -31,11 +32,16 @@ from knot_resolver_manager.datamodel.globals import ( from knot_resolver_manager.datamodel.management_schema import ManagementSchema from knot_resolver_manager.exceptions import CancelStartupExecInsteadException, KresManagerException from knot_resolver_manager.kresd_controller import get_best_controller_implementation +from knot_resolver_manager.kresd_controller.registered_workers import command_single_registered_worker from knot_resolver_manager.utils import ignore_exceptions_optional from knot_resolver_manager.utils.async_utils import readfile from knot_resolver_manager.utils.etag import structural_etag from knot_resolver_manager.utils.functional import Result -from knot_resolver_manager.utils.modeling.exceptions import DataParsingError, DataValidationError +from knot_resolver_manager.utils.modeling.exceptions import ( + AggregateDataValidationError, + DataParsingError, + DataValidationError, +) from knot_resolver_manager.utils.modeling.parsing import DataFormat, try_to_parse from knot_resolver_manager.utils.modeling.query import query from knot_resolver_manager.utils.modeling.types import NoneType @@ -243,9 +249,22 @@ class Server: ) async def _handler_cache_clear(self, request: web.Request) -> web.Response: + data = parse_from_mime_type(await request.text(), request.content_type) + + try: + config = CacheClearRPCSchema(data) + except (AggregateDataValidationError, DataValidationError) as e: + return web.Response( + body=e, + status=HTTPStatus.BAD_REQUEST, + content_type="text/plain", + charset="utf8", + ) + + _, result = await command_single_registered_worker(config.render_lua()) return web.Response( - body="test", - content_type="text/plain", + body=result, + content_type="application/json", charset="utf8", )