summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-11-22 11:01:23 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-11-22 20:09:17 -0500
commitb7cf9ac00afb10b5a2f63446babcf8d97111a636 (patch)
tree022b19d30194c6cc8f1d7c77169b010415e884a2 /src/core
parent873e413323dfff4023604849c70944674ae5cd29 (diff)
Rework file trigger scripts to fire at the right time
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.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/triggers.systemd.in28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/core/triggers.systemd.in b/src/core/triggers.systemd.in
index 141f42dbcf..46e8a03e26 100644
--- a/src/core/triggers.systemd.in
+++ b/src/core/triggers.systemd.in
@@ -19,8 +19,34 @@
# 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