Backport of the notification click-command hardening (PR #7926, merged to
quattro as 43bfe9b9) onto the v4-0-1 release branch. Click actions are argv
vectors run without a shell, omarchy-notification-send calls the Notify D-Bus
method directly via busctl instead of notify-send, and --exec takes the command
as rest-of-line words. Excludes docs/notifications.md, which does not exist on
v4-0-1.
61 lines
2.0 KiB
Bash
Executable File
61 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Notify the user when Omarchy has pending migrations
|
|
|
|
set -euo pipefail
|
|
|
|
update_in_progress() {
|
|
local lock="${XDG_RUNTIME_DIR:-}/omarchy-update.lock"
|
|
|
|
[[ -n ${XDG_RUNTIME_DIR:-} && -f $lock ]] || return 1
|
|
|
|
# flock -n only fails here when the lock is held, since the file is ours.
|
|
! flock -n "$lock" true 2>/dev/null
|
|
}
|
|
|
|
if update_in_progress; then
|
|
exit 0
|
|
fi
|
|
|
|
pending_migrations=$(omarchy-migrate --pending 2>/dev/null) || exit 0
|
|
pending_count=$(printf '%s\n' "$pending_migrations" | sed '/^[[:space:]]*$/d' | wc -l)
|
|
|
|
if (( pending_count == 1 )); then
|
|
message="Click to run 1 pending migration."
|
|
else
|
|
message="Click to run $pending_count pending migrations."
|
|
fi
|
|
|
|
# This runs from omarchy-migrate-notify.service after graphical-session.target,
|
|
# but the target can be reached before the shell has claimed
|
|
# org.freedesktop.Notifications. Without the wait the toast is sent into the
|
|
# void and the user never learns about their pending migrations.
|
|
omarchy-notification-wait || true
|
|
|
|
# That wait is long enough for an update to start underneath us, and the count
|
|
# above is already stale by then, so re-check before spending the toast.
|
|
if update_in_progress; then
|
|
exit 0
|
|
fi
|
|
|
|
# The shell keeps the click command with the toast, so this oneshot can hand the
|
|
# invitation over and exit instead of staying activated until it is answered.
|
|
omarchy-notification-send -u critical -g "Pending Omarchy Migrations" "$message" \
|
|
--exec omarchy-launch-floating-terminal-with-presentation omarchy-migrate && exit 0
|
|
|
|
# Reached when the notification could not be handed off, so fall back to telling
|
|
# the user in the terminal.
|
|
print_pending_migrations() {
|
|
echo "Omarchy has pending migrations. Run omarchy-migrate in a terminal to apply them:"
|
|
while IFS= read -r migration; do
|
|
[[ -n $migration ]] || continue
|
|
printf ' %s\n' "$migration"
|
|
done <<<"$pending_migrations"
|
|
}
|
|
|
|
if [[ -t 1 ]]; then
|
|
print_pending_migrations
|
|
else
|
|
print_pending_migrations >&2
|
|
fi
|