Files

80 lines
3.6 KiB
Bash

echo "Repair the pre-suspend lock monitor's graphical session environment"
# The old unit started before UWSM finished importing OMARCHY_PATH and
# WAYLAND_DISPLAY. A full unit retained from before Omarchy 4 also shadows the
# corrected package unit, so add the lifecycle constraints as a drop-in without
# discarding any user customizations.
user_config_home="${XDG_CONFIG_HOME:-$HOME/.config}"
sleep_lock_unit="$user_config_home/systemd/user/omarchy-sleep-lock.service"
sleep_lock_dropin_dir="$user_config_home/systemd/user/omarchy-sleep-lock.service.d"
sleep_lock_dropin="$sleep_lock_dropin_dir/90-omarchy-session-environment.conf"
if [[ -f $sleep_lock_unit ]]; then
mkdir -p "$sleep_lock_dropin_dir"
printf '%s\n' \
'[Unit]' \
'After=dbus.socket wayland-session-waitenv.service' \
'Requires=dbus.socket' \
'PartOf=graphical-session.target' \
'ConditionEnvironment=OMARCHY_PATH' \
'ConditionEnvironment=WAYLAND_DISPLAY' >"$sleep_lock_dropin"
fi
# With no live user manager there cannot be an inherited monitor to replace.
# The package unit (and compatibility drop-in, when needed) will be loaded by
# the fresh manager at the next login.
user_manager_socket="${XDG_RUNTIME_DIR:-/run/user/$UID}/systemd/private"
if ! error=$(systemctl --user show-environment 2>&1); then
if [[ -S $user_manager_socket ]]; then
echo "Could not reach the running user service manager: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
fi
exit 0
fi
if ! error=$(systemctl --user daemon-reload 2>&1); then
echo "Could not reload the user service manager: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
fi
if ! graphical_state=$(systemctl --user show --property=ActiveState --value graphical-session.target 2>&1); then
echo "Could not inspect graphical-session.target: $graphical_state"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
fi
if [[ $graphical_state == "active" ]]; then
if ! error=$(systemctl --user reset-failed omarchy-sleep-lock.service 2>&1); then
echo "Could not reset omarchy-sleep-lock.service: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
elif ! error=$(systemctl --user restart omarchy-sleep-lock.service 2>&1); then
echo "Could not restart omarchy-sleep-lock.service: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
elif ! sleep_lock_state=$(systemctl --user show --property=ActiveState --value omarchy-sleep-lock.service 2>&1); then
echo "Could not inspect omarchy-sleep-lock.service: $sleep_lock_state"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
elif [[ $sleep_lock_state != "active" ]]; then
echo "omarchy-sleep-lock.service did not stay active after restart."
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
fi
else
# A pre-fix monitor was not tied to graphical-session.target and can outlive
# logout under a lingering user manager. Stop it so the next target start
# creates a process with the next graphical session's environment.
if ! error=$(systemctl --user stop omarchy-sleep-lock.service 2>&1); then
echo "Could not stop stale omarchy-sleep-lock.service: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
elif ! error=$(systemctl --user reset-failed omarchy-sleep-lock.service 2>&1); then
echo "Could not reset omarchy-sleep-lock.service: $error"
echo "The pre-suspend lock repair will be retried by omarchy-migrate."
exit 1
fi
fi