From fa97d2fcf64e0558054bee673f734f523373b146 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 31 Jan 2021 12:11:36 +0100 Subject: [PATCH] rpm: restart services in %posttrans MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This fixes a long-standing issue in packaging scriptlets: daemon-reload was moved to the end of the transaction, but restarting services was still straightaway after package installation. https://bugzilla.redhat.com/show_bug.cgi?id=1614751 Note that daemon-reload is called twice. This wouldn't be hardly noticable, except that now a bunch of units (at least in Fedora) generate very verbose warnings about deprecated features. So we get those warnings twice… reload-or-restart --needing-restart is also called twice, but the second call is usually a noop, because the first clears the flag for restarted units. The second call is necessary for the case where we only uninstall packages, and the %transfiletriggerpostun trigger fires, but not the %transfiletriggerin scriptlet. Also note that this assumes that units are marked only for restart if paths under @systemunitdir@ or /etc/systemd/system have been touched. I would prefer make the trigger that does 'restart --needing-restart' fire always, but it seems rpm doesn't have such functionality. (Except as a %transfiletrigger that would trigger on "/*" to catch all transactions, but that seems ineffiecient and ugly.) --- src/rpm/macros.systemd.in | 4 +++- src/rpm/triggers.systemd.in | 18 ++++++++++++++++++ src/rpm/triggers.systemd.sh.in | 7 +++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/rpm/macros.systemd.in b/src/rpm/macros.systemd.in index 1c40328db0f..24996de10ab 100644 --- a/src/rpm/macros.systemd.in +++ b/src/rpm/macros.systemd.in @@ -82,7 +82,9 @@ fi \ %{expand:%%{?__systemd_someargs_%#:%%__systemd_someargs_%# systemd_postun_with_restart}} \ if [ $1 -ge 1 ] && [ -x @bindir@/systemctl ]; then \ # Package upgrade, not uninstall \ - @bindir@/systemctl try-restart %{?*} || : \ + for unit in %{?*}; do \ + @bindir@/systemctl set-property $unit Markers=+needs-restart || : \ + done \ fi \ %{nil} diff --git a/src/rpm/triggers.systemd.in b/src/rpm/triggers.systemd.in index 37f62cb1b76..3a89f9169d7 100644 --- a/src/rpm/triggers.systemd.in +++ b/src/rpm/triggers.systemd.in @@ -20,6 +20,13 @@ if posix.access("/run/systemd/system") then elseif pid > 0 then posix.wait(pid) end + + pid = posix.fork() + if pid == 0 then + assert(posix.exec("%{_bindir}/systemctl", "reload-or-restart", "--marked")) + elseif pid > 0 then + posix.wait(pid) + end end %transfiletriggerpostun -P 1000100 -p -- @systemunitdir@ /etc/systemd/system @@ -37,6 +44,17 @@ if posix.access("/run/systemd/system") then end end +%transfiletriggerpostun -P 10000 -p -- @systemunitdir@ /etc/systemd/system +-- We restart remaining services that should be restarted here. +if posix.access("/run/systemd/system") then + pid = posix.fork() + if pid == 0 then + assert(posix.exec("%{_bindir}/systemctl", "reload-or-restart", "--marked")) + elseif pid > 0 then + posix.wait(pid) + end +end + %transfiletriggerin -P 100700 -p -- @sysusersdir@ -- This script will process files installed in @sysusersdir@ to create -- specified users automatically. The priority is set such that it diff --git a/src/rpm/triggers.systemd.sh.in b/src/rpm/triggers.systemd.sh.in index c1af5f43d3b..0080040de48 100644 --- a/src/rpm/triggers.systemd.sh.in +++ b/src/rpm/triggers.systemd.sh.in @@ -16,6 +16,7 @@ # so sometimes we will reload needlessly. if test -d "/run/systemd/system"; then %{_bindir}/systemctl daemon-reload || : + %{_bindir}/systemctl reload-or-restart --marked || : fi %transfiletriggerpostun -P 1000100 -- @systemunitdir@ /etc/systemd/system @@ -28,6 +29,12 @@ if test -d "/run/systemd/system"; then %{_bindir}/systemctl daemon-reload || : fi +%transfiletriggerpostun -P 10000 -- @systemunitdir@ /etc/systemd/system +# We restart remaining services that should be restarted here. +if test -d "/run/systemd/system"; then + %{_bindir}/systemctl reload-or-restart --marked || : +fi + %transfiletriggerin -P 1000700 -- @sysusersdir@ # This script will process files installed in @sysusersdir@ to create # specified users automatically. The priority is set such that it -- 2.47.3