#!/bin/bash set -euo pipefail BOOTC="/usr/bin/bootc" FLATPAK="/usr/bin/flatpak" 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 # ============================================================================= # 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 # ============================================================================= # 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 $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 # ============================================================================= # 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 $LOGGER -t "$TAG" "Benachrichtigung geschlossen oder ignoriert (kein Reboot, Antwort war: $ACTION)." fi