Files
omarchy/bin/omarchy-migrate-notify
T
Ryan Hughes 286b8c2b1c Run notification click actions as safe argv (backport of #7926)
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.
2026-08-23 19:56:59 -04:00

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