#!/bin/bash set -euo pipefail # Pfade BOOTC="/usr/bin/bootc" LOGGER="/usr/bin/logger" LOGINCTL="/usr/bin/loginctl" NOTIFY="/usr/bin/notify-send" SUDO="/usr/bin/sudo" SYSTEMCTL="/usr/bin/systemctl" TAG="bootc-timer" # 1. Upgrade ausführen $BOOTC upgrade # 2. Status-Check mit jq if $BOOTC status --json | jq -e '.status.staged == null' >/dev/null; then # KEIN Update gefunden $LOGGER -t "$TAG" "System aktuell (keine Updates vorhanden)." else $LOGGER -t "$TAG" "Update gefunden und gestaged. Suche aktiven Desktop-User..." # 3. Robust den User der AKTIVEN grafischen Sitzung (seat0) ermitteln USER_ID=$( $LOGINCTL list-sessions --no-legend | while read -r sid rest; do if [[ "$( $LOGINCTL show-session "$sid" -p Seat --value )" == "seat0" ]] && \ [[ "$( $LOGINCTL show-session "$sid" -p State --value )" == "active" ]]; then $LOGINCTL show-session "$sid" -p UID --value break fi done ) if [[ -z "$USER_ID" ]]; then $LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User auf seat0 gefunden." exit 0 fi $LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID" # 4. Benachrichtigung senden (mit "|| echo 'closed'" um den set -e Crash zu verhindern) ACTION=$( $SUDO -u "#$USER_ID" env \ DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus \ XDG_RUNTIME_DIR=/run/user/$USER_ID \ $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 || echo "closed" ) # 5. Auswertung if [[ "$ACTION" == "reboot" ]]; then $LOGGER -t "$TAG" "User hat Reboot gewählt. Starte System neu..." $SYSTEMCTL reboot else $LOGGER -t "$TAG" "Benachrichtigung wurde geschlossen oder ignoriert ($ACTION)." fi fi