[DTrace-devel] [PATCH 1/2] dtprobed: use presets properly for daemon restarting
Nick Alcock
nick.alcock at oracle.com
Tue Nov 21 21:48:25 UTC 2023
It turns out that systemd supports per-package drop-ins for presets,
so we can use presets to enable the daemon and leave by-hand enabling/
disabling/restarting for the individual sysadmin (as might be the
intent in a world with presets: I'm not sure, this stuff is very
lightly documented).
As a bonus, doing it this way does not depend on the state of the old
package at all: the restarting is done by setting a property on the
requested service, then triggering a reload/restart of everything with that
property set (see /usr/lib/systemd/systemd-update-helper). So we can
switch to using %systemd_postun_with_restart in %postun, and everything
will just work (including from previous versions of this package, though
upgrades from .12 will always produce a harmless error message: nothing
we can do, the bug is in .12).
Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
---
GNUmakefile | 2 ++
dtprobed/50-dtprobed.preset | 1 +
dtprobed/Build | 4 +++-
dtrace.spec | 11 +++--------
4 files changed, 9 insertions(+), 9 deletions(-)
create mode 100644 dtprobed/50-dtprobed.preset
diff --git a/GNUmakefile b/GNUmakefile
index 2ffd4c497886..926d84c5f4e1 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -94,7 +94,9 @@ SBINDIR := $(prefix)/sbin
INSTSBINDIR := $(DESTDIR)$(SBINDIR)
UDEVDIR := $(prefix)/lib/udev/rules.d
INSTUDEVDIR := $(DESTDIR)$(UDEVDIR)
+SYSTEMDPRESETDIR := $(prefix)/lib/systemd/system-preset
SYSTEMDUNITDIR := $(prefix)/lib/systemd/system
+INSTSYSTEMDPRESETDIR := $(DESTDIR)$(SYSTEMDPRESETDIR)
INSTSYSTEMDUNITDIR := $(DESTDIR)$(SYSTEMDUNITDIR)
DOCDIR := $(prefix)/share/doc/dtrace-$(VERSION)
INSTDOCDIR := $(DESTDIR)$(DOCDIR)
diff --git a/dtprobed/50-dtprobed.preset b/dtprobed/50-dtprobed.preset
new file mode 100644
index 000000000000..84422b7e1d4c
--- /dev/null
+++ b/dtprobed/50-dtprobed.preset
@@ -0,0 +1 @@
+enable dtprobed.service
diff --git a/dtprobed/Build b/dtprobed/Build
index c44dd40ab3d2..610e13526f11 100644
--- a/dtprobed/Build
+++ b/dtprobed/Build
@@ -50,11 +50,13 @@ install::
$(call describe-install-target,$(INSTUDEVDIR),60-dtprobed.rules)
install -m 644 $(dtprobed_DIR)60-dtprobed.rules $(INSTUDEVDIR)
ifdef HAVE_LIBSYSTEMD
- mkdir -p $(INSTSYSTEMDUNITDIR)
+ mkdir -p $(INSTSYSTEMDUNITDIR) $(INSTSYSTEMDPRESETDIR)
$(call describe-install-target,$(INSTSYSTEMDUNITDIR),dtprobed.service)
install -m 644 $(dtprobed_DIR)dtprobed.service $(INSTSYSTEMDUNITDIR)
$(call describe-install-target,$(INSTSYSTEMDUNITDIR),dtrace-usdt.target)
install -m 644 $(dtprobed_DIR)dtrace-usdt.target $(INSTSYSTEMDUNITDIR)
+ $(call describe-install-target,$(INSTSYSTEMDPRESETDIR),50-dtprobed.preset)
+ install -m 644 $(dtprobed_DIR)50-dtprobed.preset $(INSTSYSTEMDPRESETDIR)
if [[ -z $RPM_BUILD_ROOT ]]; then \
systemctl enable dtprobed.service dtrace-usdt.target; \
fi
diff --git a/dtrace.spec b/dtrace.spec
index 777dd28ded84..ff1f380822ab 100644
--- a/dtrace.spec
+++ b/dtrace.spec
@@ -197,13 +197,7 @@ rm -rf $RPM_BUILD_DIR/%{name}-%{version}
%post
/sbin/ldconfig
%udev_rules_update
-%systemd_post dtprobed.service dtrace-usdt.target
-# Do this rather than systemd_postun_with_restart because this depends
-# only on the package being installed, rather than relying on the state of
-# the old package.
-systemctl try-restart dtprobed || :
-systemctl enable dtprobed.service dtrace-usdt.target
-systemctl start dtprobed.service
+%systemd_post dtprobed.service
# if sdt-systemtap.h doesn't exist then we can move the existing dtrace sdt.h
SYSINCDIR=/usr/include/sys
@@ -220,7 +214,7 @@ fi
%postun
/sbin/ldconfig
%udev_rules_update
-%systemd_postun dtprobed.service
+%systemd_postun_with_restart dtprobed.service
%files
%defattr(-,root,root,-)
@@ -235,6 +229,7 @@ fi
%doc %{_docdir}/dtrace-%{version}/*
%{_unitdir}/dtprobed.service
%{_unitdir}/dtrace-usdt.target
+%{_presetdir}/50-dtprobed.preset
%{_udevrulesdir}/60-dtprobed.rules
%files devel
--
2.42.0.271.g85384428f1
More information about the DTrace-devel
mailing list