]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager's packaging fixes & better systemd integration
authorVasek Sraier <git@vakabus.cz>
Mon, 11 Apr 2022 18:00:39 +0000 (20:00 +0200)
committerVasek Sraier <git@vakabus.cz>
Mon, 11 Apr 2022 18:00:39 +0000 (20:00 +0200)
- implemented sd_notify and changed manager service type to "notify"
- fixed release configuration
- renamed knot-resolver-manager.service to knot-resolver.service

distro/pkg/deb/python3-knot-resolver-manager.install
distro/pkg/deb/rules
distro/pkg/rpm/knot-resolver.spec
manager/etc/knot-resolver/config.yml
manager/knot-resolver.service [moved from manager/knot-resolver-manager.service with 96% similarity]
manager/knot_resolver_manager/cli/__init__.py [new file with mode: 0644]
manager/knot_resolver_manager/cli/__main__.py
manager/knot_resolver_manager/server.py
manager/knot_resolver_manager/utils/systemd_notify.py [new file with mode: 0644]
manager/scripts/make-package.sh
manager/tests/packaging/systemd_service.sh

index fde65df13024d8668b6f4dd5dde0b67eab04d9a2..449b4632e91c3a233edaec6c92a343da0964e59e 100644 (file)
@@ -1,2 +1,2 @@
 etc/knot-resolver/config.yml
-lib/systemd/system/knot-resolver-manager.service
+lib/systemd/system/knot-resolver.service
index 0a15fc01f85113c3ccd96826cece5f7adb924352..0b441871d4c2cdaff1a32d3691606e36782c960b 100755 (executable)
@@ -45,7 +45,7 @@ override_dh_auto_install:
        DESTDIR="${PWD}/debian/tmp" ninja -v -C build_deb install
        dh_auto_install --buildsystem=pybuild --sourcedirectory manager
        install -m 644 -D $(CURDIR)/manager/etc/knot-resolver/config.yml $(CURDIR)/debian/tmp/etc/knot-resolver/config.yml
-       install -m 644 -D $(CURDIR)/manager/knot-resolver-manager.service $(CURDIR)/debian/tmp/lib/systemd/system/knot-resolver-manager.service
+       install -m 644 -D $(CURDIR)/manager/knot-resolver.service $(CURDIR)/debian/tmp/lib/systemd/system/knot-resolver.service
 
 override_dh_auto_test:
        meson test -C build_deb
index e4e5bfe78b6834cfd7c621c3e2f2a753221b2883..9e21045d055edde772a0e046f3e055e25ea2f3eb 100644 (file)
@@ -242,7 +242,7 @@ mv %{buildroot}/%{_datadir}/doc/%{name}/* %{buildroot}/%{_pkgdocdir}/
 pushd manager
 %py3_install
 install -m 644 -D etc/knot-resolver/config.yml %{buildroot}%{_sysconfdir}/knot-resolver/config.yml
-install -m 644 -D knot-resolver-manager.service %{buildroot}%{_unitdir}/knot-resolver-manager.service
+install -m 644 -D knot-resolver.service %{buildroot}%{_unitdir}/knot-resolver.service
 popd
 
 %pre
@@ -401,7 +401,7 @@ fi
 %files -n python3-knot-resolver-manager
 %{python3_sitelib}/knot_resolver_manager*
 %{_sysconfdir}/knot-resolver/config.yml
-%{_unitdir}/knot-resolver-manager.service
+%{_unitdir}/knot-resolver.service
 
 %changelog
 * {{ now }} Jakub Ružička <jakub.ruzicka@nic.cz> - {{ version }}-{{ release }}
index 32f140d3242c08c3ba72fdb85e6ed82621684bb1..72058b2588c8be2da816cb7f4d8cdad403592217 100644 (file)
@@ -3,13 +3,11 @@ cache:
 logging:
   level: info
 network:
-  interfaces:
-    - listen:
-        ip: 127.0.0.1
-        port: 53
+  listen:
+    - interface: 127.0.0.1@53
 server:
-  workers: 1
+  id: distro
+  workers: 2
+  rundir: /run/knot-resolver
   management:
-    listen:
-      unix-socket: /run/knot-resolver/manager.sock
-    rundir: /run/knot-resolver
+    unix-socket: /run/knot-resolver/manager.sock
similarity index 96%
rename from manager/knot-resolver-manager.service
rename to manager/knot-resolver.service
index 277998c26442e2f2b0baa473190e127996663ba3..14d43f65fb29e06cdb366a4c373737d3874e6110 100644 (file)
@@ -4,6 +4,7 @@ Requires=dbus.service
 After=dbus.service
 
 [Service]
+Type=notify
 ExecStart=python3 -m knot_resolver_manager --config=/etc/knot-resolver/config.yml
 KillSignal=SIGINT
 # See systemd.service(5) for explanation, why we should replace this with a blocking request
diff --git a/manager/knot_resolver_manager/cli/__init__.py b/manager/knot_resolver_manager/cli/__init__.py
new file mode 100644 (file)
index 0000000..881ab37
--- /dev/null
@@ -0,0 +1,3 @@
+def main():
+    print("Knot Resolver CLI successfully running...")
+    print("... unfortunatelly, it does nothing at the moment")
index 7fc4b4629a6f2bb6bbc05d8d4655243aecffb770..56d61c984fd658dd8ff9b305a26b15e31240b211 100644 (file)
@@ -1,7 +1,4 @@
-def main():
-    print("Knot Resolver CLI successfully running...")
-    print("... unfortunatelly, it does nothing at the moment")
-
+from knot_resolver_manager.cli import main
 
 if __name__ == "__main__":
     main()
index 9b2a08e8d78ef8052e2fcd8ac61197dc0cf21ea2..15cd6b60de3ddce32016a8b0c7aa6ccc0751b14a 100644 (file)
@@ -25,6 +25,7 @@ from knot_resolver_manager.datamodel.server_schema import ManagementSchema
 from knot_resolver_manager.exceptions import DataException, KresManagerException, SchemaException
 from knot_resolver_manager.kresd_controller import get_controller_by_name
 from knot_resolver_manager.kresd_controller.interface import SubprocessController
+from knot_resolver_manager.utils import systemd_notify
 from knot_resolver_manager.utils.async_utils import readfile
 from knot_resolver_manager.utils.functional import Result
 from knot_resolver_manager.utils.parsing import ParsedTree, parse, parse_yaml
@@ -96,6 +97,8 @@ class Server:
 
     async def sighup_handler(self) -> None:
         logger.info("Received SIGHUP, reloading configuration file")
+        systemd_notify.systemd_notify(RELOADING="1")
+
         if self._config_path is None:
             logger.warning("The manager was started with inlined configuration - can't reload")
         else:
@@ -117,6 +120,8 @@ class Server:
                 logger.error(f"Reloading of the configuration file failed: {e}")
                 logger.error("Configuration have NOT been changed.")
 
+        systemd_notify.systemd_notify(READY="1")
+
     @staticmethod
     def all_handled_signals() -> Set[signal.Signals]:
         return {signal.SIGHUP, signal.SIGINT, signal.SIGTERM}
@@ -468,8 +473,14 @@ async def start_server(config: Union[Path, ParsedTree] = DEFAULT_MANAGER_CONFIG_
 
     logger.info(f"Manager fully initialized and running in {round(time() - start_time, 3)} seconds")
 
+    # notify systemd about that we are ready
+    systemd_notify.systemd_notify(READY="1")
+
     await server.wait_for_shutdown()
 
+    # notify systemd that we are shutting down
+    systemd_notify.systemd_notify(STOPPING="1")
+
     # Ok, now we are tearing everything down.
 
     # First of all, let's block all unwanted interruptions. We don't want to be reconfiguring kresd's while
diff --git a/manager/knot_resolver_manager/utils/systemd_notify.py b/manager/knot_resolver_manager/utils/systemd_notify.py
new file mode 100644 (file)
index 0000000..9000cd9
--- /dev/null
@@ -0,0 +1,55 @@
+import enum
+import logging
+import os
+import socket
+
+
+logger = logging.getLogger(__name__)
+
+
+class _Status(enum.Enum):
+    NOT_INITIALIZED = 1
+    FUNCTIONAL = 2
+    FAILED = 3
+
+
+_status = _Status.NOT_INITIALIZED
+_socket = None
+
+
+def systemd_notify(**values: str) -> None:
+    global _status
+    global _socket
+
+    if _status is _Status.NOT_INITIALIZED:
+        socket_addr = os.getenv("NOTIFY_SOCKET")
+        os.unsetenv("NOTIFY_SOCKET")
+        if socket_addr is None:
+            _status = _Status.FAILED
+            return
+        if socket_addr.startswith("@"):
+            socket_addr = socket_addr.replace("@", "\0", 1)
+
+        try:
+            _socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
+            _socket.connect(socket_addr)
+            _status = _Status.FUNCTIONAL
+        except Exception:
+            _socket = None
+            _status = _Status.FAILED
+            logger.warning(f"Failed to connect to $NOTIFY_SOCKET at '{socket_addr}'", exc_info=True)
+            return
+
+    elif _status is _Status.FAILED:
+        return
+
+    if _status is _Status.FUNCTIONAL:
+        assert _socket is not None
+        payload = "\n".join((f"{key}={value}" for key, value in values.items()))
+        try:
+            _socket.send(payload.encode("utf8"))
+        except Exception:
+            logger.warning("Failed to send notification to systemd", exc_info=True)
+            _status = _Status.FAILED
+            _socket.close()
+            _socket = None
index 3b56c1f8184e821d4eb8813e380ed171a1c66da6..60cf2fad755805d36e09b673ed2ead2ae1c9347a 100644 (file)
@@ -44,8 +44,8 @@ PATH="$PATH:/root/.local/bin"  # hack to make binaries installed with pipx work
 python3 -m pipx install apkg
 
 # prepare the repo
-git clone https://gitlab.nic.cz/knot/knot-resolver
-cd knot-resolver
+#git clone https://gitlab.nic.cz/knot/knot-resolver
+cd /repo
 git config --global user.email "automated-script"
 git config --global user.name "Automated Script"
 git checkout manager-integration-without-submodule
index bee7b8b1b0a77ce9c81701df9a775499539e5861..2afb5f8327ebdbfc061a856289d182a3ae091e73 100644 (file)
@@ -12,8 +12,5 @@ fi
 
 systemctl start knot-resolver.service
 
-# FIXME remove after implementing sd_notify in manager
-sleep 10
-
 # check that the resolvers are actually running
 kdig @127.0.0.1 nic.cz
\ No newline at end of file