]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: kresctl: 'reload' cmd added
authorAleš Mrázek <ales.mrazek@nic.cz>
Wed, 2 Nov 2022 11:36:59 +0000 (12:36 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Tue, 10 Jan 2023 18:57:14 +0000 (19:57 +0100)
manager/knot_resolver_manager/cli/cmd/reload.py [new file with mode: 0644]
manager/knot_resolver_manager/server.py
manager/knot_resolver_manager/utils/requests.py

diff --git a/manager/knot_resolver_manager/cli/cmd/reload.py b/manager/knot_resolver_manager/cli/cmd/reload.py
new file mode 100644 (file)
index 0000000..f5b02ea
--- /dev/null
@@ -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)
index f0b8af5979cb5e0158e25dab6a613a2ae4ad496e..851d83c1c2565136323f2c718c8806a5166851f4 100644 (file)
@@ -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),
index 18b72b132c20267a0490d1ba48028ebc766e12e0..9eadfa79ef59f0f02caf9a63fcd09063f2be4d8c 100644 (file)
@@ -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