Files
fluffy-pancake/scripts/notify-bootc-user.sh
T

82 lines
3.3 KiB
Bash
Raw Normal View History

#!/bin/bash
2026-05-16 09:31:45 +02:00
set -euo pipefail
2026-05-13 20:24:30 +02:00
BOOTC="/usr/bin/bootc"
FLATPAK="/usr/bin/flatpak"
2026-05-13 20:24:30 +02:00
LOGGER="/usr/bin/logger"
LOGINCTL="/usr/bin/loginctl"
NOTIFY="/usr/bin/notify-send"
SYSTEMCTL="/usr/bin/systemctl"
TAG="bootc-timer"
# =============================================================================
# Flatpaks im Hintergrund aktualisieren
# =============================================================================
$LOGGER -t "$TAG" "Suche nach Flatpak-Updates..."
$FLATPAK update -y --noninteractive || $LOGGER -t "$TAG" "Flatpak-Update fehlgeschlagen oder keine Updates vorhanden."
# =============================================================================
# 1. Bootc Upgrade ausfuehren
# =============================================================================
$LOGGER -t "$TAG" "Suche nach System-Updates (bootc)..."
$BOOTC upgrade || true
# =============================================================================
# 2. Pruefen ob ein gestagtes Deployment vorhanden ist
# =============================================================================
2026-07-05 13:39:26 +00:00
# Liest exakt den Wert von 'staged' aus dem JSON als Text aus
STAGED_STATUS=$(bootc status --json | jq -c '.status.staged')
# Wenn der Wert exakt "null" ist (oder leer, falls der Befehl fehlschlägt), brich ab
if [ "$STAGED_STATUS" == "null" ] || [ -z "$STAGED_STATUS" ]; then
exit 0
fi
$LOGGER -t "$TAG" "Update gestaged. Suche aktiven Desktop-User..."
# =============================================================================
# 3. Aktiven Desktop-User auf seat0 ermitteln
# =============================================================================
2026-06-27 12:02:02 +00:00
# Wir filtern direkt aus der Session-Liste den Eintrag, der auf 'seat0' laeuft
# und die Klasse 'user' (echter Desktop-Nutzer, kein Login-Screen) hat.
USER_ID=$($LOGINCTL list-sessions --no-legend 2>/dev/null | awk '$4 == "seat0" && $6 == "user" {print $2; exit}' || echo "")
if [[ -z "$USER_ID" ]]; then
2026-06-27 11:28:36 +00:00
$LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User (Klasse: user) auf seat0 gefunden."
exit 0
fi
$LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID"
# =============================================================================
# 4. Benachrichtigung senden
# =============================================================================
2026-06-27 11:28:36 +00:00
# systemd-run uebergibt den Befehl sauber an den User-Manager des Nutzers.
# --quiet unterdrueckt Systemd-Eigenausgaben (damit $ACTION sauber bleibt).
# --pipe reicht stdout durch, --wait blockiert bis zur Interaktion.
ACTION=$(systemd-run \
--quiet \
--user \
--machine="${USER_ID}@.host" \
--pipe \
--wait \
$NOTIFY \
"System-Update bereit" \
"Ein neues Image wurde heruntergeladen. Jetzt neu starten?" \
--app-name="System-Update" \
--icon=software-update-available \
--urgency=critical \
--action="reboot=Jetzt neu starten" \
--wait \
2>/dev/null || echo "closed" )
# =============================================================================
# 5. Auswertung
# =============================================================================
if [[ "$ACTION" == "reboot" ]]; then
$LOGGER -t "$TAG" "User hat Reboot gewaehlt. Starte System neu..."
$SYSTEMCTL reboot
else
2026-06-27 11:28:36 +00:00
$LOGGER -t "$TAG" "Benachrichtigung geschlossen oder ignoriert (kein Reboot, Antwort war: $ACTION)."
fi