]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Rework file trigger scripts to fire at the right time
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 22 Nov 2015 16:01:23 +0000 (11:01 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 23 Nov 2015 01:09:17 +0000 (20:09 -0500)
This turns out to be more complicated than it looked initially...
%transfiletriggerun is called early, while %transfiletriggerin is
called late, and neither satifisfies the requirement to call
daemon-reload after new unit files have been installed, but before
%postun scripts in packages get to fire.

It seems that the only solution is to use %filetriggerun (which
is called once per package) to do the reload, and keep state in
/var/lib/rpm-state/systemd/ to avoid calling the reload multiple
times.

https://fedoraproject.org/wiki/Packaging:ScriptletSnippets#Saving_state_between_scriptlets
says that /var/lib/rpm-state/systemd/ is the right dir.

src/core/triggers.systemd.in

index 141f42dbcfd0c818bd65894f1b29e4da8adc0632..46e8a03e260c593f779b1bcdba5d9d78bc0f6b55 100644 (file)
 
 # The contents of this are an example to be copied into systemd.spec.
 
+# This will run after any package is initially installed or
+# upgraded. We care about the case where a package is initially
+# installed, because other cases are covered by the scriptlets below,
+# so sometimes we will reload needlessly.
+
 %transfiletriggerin -- @systemunitdir@ /etc/systemd/system
 systemctl daemon-reload &>/dev/null || :
 
+# On removal, we need to run daemon-reload after any units have been
+# removed. %transfiletriggerpostun would be ideal, but it does not get
+# executed for some reason.
+# On upgrade, we need to run daemon-reload after any new unit files
+# have been installed, but before %postun scripts in packages get
+# executed. %transfiletriggerun gets the right list of files
+# but it is invoked too early (before changes happen).
+# %filetriggerpostun happens at the right time, but it fires for
+# every package.
+# To execute the reload at the right time, we create a state
+# file in %transfiletriggerun and execute the daemon-reload in
+# the first %filetriggerpostun.
+
 %transfiletriggerun -- @systemunitdir@ /etc/systemd/system
-systemctl daemon-reload &>/dev/null || :
+mkdir -p %{_localstatedir}/lib/rpm-state/systemd
+touch %{_localstatedir}/lib/rpm-state/systemd/needs-reload
+
+%filetriggerpostun -- @systemunitdir@ /etc/systemd/system
+if [ -e %{_localstatedir}/lib/rpm-state/systemd/needs-reload ]; then
+    rm %{_localstatedir}/lib/rpm-state/systemd/needs-reload || :
+    rmdir %{_localstatedir}/lib/rpm-state/systemd || :
+    systemctl daemon-reload || :
+fi