From: Aleš Mrázek Date: Wed, 2 Nov 2022 11:36:59 +0000 (+0100) Subject: manager: kresctl: 'reload' cmd added X-Git-Tag: v6.0.0a1~12^2~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fff2afa9553c123bea8f5710a07c061c73715279;p=thirdparty%2Fknot-resolver.git manager: kresctl: 'reload' cmd added --- diff --git a/manager/knot_resolver_manager/cli/cmd/reload.py b/manager/knot_resolver_manager/cli/cmd/reload.py new file mode 100644 index 000000000..f5b02ea31 --- /dev/null +++ b/manager/knot_resolver_manager/cli/cmd/reload.py @@ -0,0 +1,28 @@ +import argparse +from typing import Dict, List, Optional, Tuple, Type + +from knot_resolver_manager.cli.command import Command, CommandArgs, register_command +from knot_resolver_manager.utils.requests import request + + +@register_command +class ReloadCommand(Command): + def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None: + super().__init__(namespace, unknown_args) + + @staticmethod + def register_args_subparser( + subparser: "argparse._SubParsersAction[argparse.ArgumentParser]", + ) -> Tuple[argparse.ArgumentParser, "Type[Command]"]: + reload = subparser.add_parser("reload", help="reload configuration file") + + return reload, ReloadCommand + + @staticmethod + def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]: + return {} + + def run(self, args: CommandArgs) -> None: + url = f"{args.socket}/reload" + response = request("POST", url) + print(response) diff --git a/manager/knot_resolver_manager/server.py b/manager/knot_resolver_manager/server.py index f0b8af597..851d83c1c 100644 --- a/manager/knot_resolver_manager/server.py +++ b/manager/knot_resolver_manager/server.py @@ -92,17 +92,7 @@ class Server: ) return Result.ok(None) - async def sigint_handler(self) -> None: - logger.info("Received SIGINT, triggering graceful shutdown") - self.trigger_shutdown(0) - - async def sigterm_handler(self) -> None: - logger.info("Received SIGTERM, triggering graceful shutdown") - self.trigger_shutdown(0) - - async def sighup_handler(self) -> None: - logger.info("Received SIGHUP, reloading configuration file") - systemd_notify(RELOADING="1") + async def _reload_config(self) -> None: if self._config_path is None: logger.warning("The manager was started with inlined configuration - can't reload") @@ -125,6 +115,18 @@ class Server: logger.error(f"Reloading of the configuration file failed: {e}") logger.error("Configuration have NOT been changed.") + async def sigint_handler(self) -> None: + logger.info("Received SIGINT, triggering graceful shutdown") + self.trigger_shutdown(0) + + async def sigterm_handler(self) -> None: + logger.info("Received SIGTERM, triggering graceful shutdown") + self.trigger_shutdown(0) + + async def sighup_handler(self) -> None: + logger.info("Received SIGHUP, reloading configuration file") + systemd_notify(RELOADING="1") + await self._reload_config() systemd_notify(READY="1") @staticmethod @@ -263,6 +265,15 @@ class Server: logger.info("Shutdown event triggered...") return web.Response(text="Shutting down...") + async def _handler_reload(self, _request: web.Request) -> web.Response: + """ + Route handler for reloading the server + """ + + logger.info("Reloading event triggered...") + await self._reload_config() + return web.Response(text="Reloading...") + def _setup_routes(self) -> None: self.app.add_routes( [ @@ -272,6 +283,7 @@ class Server: web.delete(r"/v1/config{path:.*}", self._handler_config_query), web.patch(r"/v1/config{path:.*}", self._handler_config_query), web.post("/stop", self._handler_stop), + web.post("/reload", self._handler_reload), web.get("/schema", self._handler_schema), web.get("/schema/ui", self._handle_view_schema), web.get("/metrics", self._handler_metrics), diff --git a/manager/knot_resolver_manager/utils/requests.py b/manager/knot_resolver_manager/utils/requests.py index 18b72b132..9eadfa79e 100644 --- a/manager/knot_resolver_manager/utils/requests.py +++ b/manager/knot_resolver_manager/utils/requests.py @@ -34,7 +34,7 @@ def request( with urlopen(req) as response: return Response(response.status, response.read().decode("utf8")) except HTTPError as err: - return Response(err.code, response.read().decode("utf8")) + return Response(err.code, err.read().decode("utf8")) # Code heavily inspired by requests-unixsocket