aboutsummaryrefslogtreecommitdiffstats
path: root/packaging/rpm/meshbay-node.spec
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/rpm/meshbay-node.spec')
-rw-r--r--packaging/rpm/meshbay-node.spec34
1 files changed, 34 insertions, 0 deletions
diff --git a/packaging/rpm/meshbay-node.spec b/packaging/rpm/meshbay-node.spec
index 1ba7f26..9b9c6bf 100644
--- a/packaging/rpm/meshbay-node.spec
+++ b/packaging/rpm/meshbay-node.spec
@@ -35,6 +35,40 @@ if [ -d /run/systemd/system ]; then
systemctl daemon-reload || true
fi
+# After the whole transaction, so that meshbay-common is in place too. A
+# marker left by %pre says whether this was an upgrade.
+%pre
+if [ "$1" -ge 2 ]; then
+ touch /run/meshbay-node-upgrade 2>/dev/null || true
+fi
+
+%posttrans
+# The node runs as a user service, in every signed-in user's own systemd
+# manager: the system-wide reload does not reach those, and each would keep
+# the old unit and the old code until restarted by hand. Every running user
+# manager reloads, and restarts the node where it was running.
+reload_user_managers() {
+ for bus in /run/user/*/systemd/private; do
+ [ -S "$bus" ] || continue
+ uid=$(basename "$(dirname "$(dirname "$bus")")")
+ user=$(id -nu "$uid" 2>/dev/null) || continue
+ systemctl --user -M "$user@" daemon-reload 2>/dev/null || true
+ [ -n "$upgraded" ] && systemctl --user -M "$user@" try-restart meshbay-node.service 2>/dev/null || true
+ done
+}
+upgraded=
+if [ -e /run/meshbay-node-upgrade ]; then
+ upgraded=1
+ rm -f /run/meshbay-node-upgrade
+fi
+if [ -d /run/systemd/system ]; then
+ systemctl daemon-reload || true
+ if [ -n "$upgraded" ]; then
+ systemctl try-restart 'meshbay-node@*.service' 2>/dev/null || true
+ fi
+ reload_user_managers
+fi
+
%preun
if [ -d /run/systemd/system ]; then
systemctl daemon-reload || true