diff --git a/scripts/notify-bootc-user.sh b/scripts/notify-bootc-user.sh index 375dfea..0d1f36d 100755 --- a/scripts/notify-bootc-user.sh +++ b/scripts/notify-bootc-user.sh @@ -1,53 +1,65 @@ #!/bin/bash -TAG="bootc-notifier" +# Pfade zu den Binaries +BOOTC="/usr/bin/bootc" +LOGGER="/usr/bin/logger" +LOGINCTL="/usr/bin/loginctl" +NOTIFY="/usr/bin/notify-send" +ID_BIN="/usr/bin/id" +SUDO="/usr/bin/sudo" +SYSTEMCTL="/usr/bin/systemctl" + +TAG="bootc-timer" # 1. Upgrade ausführen -# --apply=false stellt sicher, dass bootc nicht selbstständig rebootet (falls konfiguriert) -OUTPUT=$(/usr/bin/bootc upgrade 2>&1) +OUTPUT=$($BOOTC upgrade 2>&1) EXIT_STATUS=$? -# 2. Check: Erfolg + "Queued" oder "Staged" -# Wir suchen nach Mustern, die ein bereitliegendes Image bestätigen -if [[ $EXIT_STATUS -eq 0 ]] && echo "$OUTPUT" | grep -Ei -q "Queued|staged|Preparing"; then - - logger -t "$TAG" "Update erfolgreich heruntergeladen." +if [[ $EXIT_STATUS -ne 0 ]]; then + $LOGGER -t "$TAG" "Fehler beim Upgrade. Code: $EXIT_STATUS. Output: $OUTPUT" + exit 1 +fi - # 3. User finden (Präziser für Fedora 44) - # Wir suchen den User der Session, die 'active' ist und einen grafischen Typ hat - TARGET_USER=$(loginctl list-sessions --no-legend | while read -r id user seat; do - if [[ "$(loginctl show-session "$id" -p Type --value)" =~ ^(x11|wayland)$ ]] && \ - [[ "$(loginctl show-session "$id" -p State --value)" == "active" ]]; then +# 2. Status-Check via JSON +if $BOOTC status --json | grep -q '"staged":{'; then + + $LOGGER -t "$TAG" "Neues Image erfolgreich gestaged." + + # 3. Den aktiven User finden + TARGET_USER=$($LOGINCTL list-sessions --no-legend | while read -r id user rest; do + S_TYPE=$($LOGINCTL show-session "$id" -p Type --value) + S_STATE=$($LOGINCTL show-session "$id" -p State --value) + + if [[ "$S_TYPE" =~ ^(x11|wayland)$ ]] && [[ "$S_STATE" == "active" ]]; then echo "$user" break fi done) - if [ -z "$TARGET_USER" ]; then - logger -t "$TAG" "Kein aktiver Desktop-User gefunden. Benachrichtigung abgebrochen." - exit 0 + if [[ -n "$TARGET_USER" ]]; then + USER_ID=$($ID_BIN -u "$TARGET_USER") + + # Wichtig: XDG_RUNTIME_DIR hinzufügen + ACTION=$($SUDO -u "$TARGET_USER" \ + 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?" \ + --icon=software-update-available \ + --urgency=critical \ + --action="reboot=Jetzt neu starten" \ + --wait) + + $LOGGER -t "$TAG" "Benachrichtigung gesendet. Antwort: $ACTION" + + # 5. Auswertung der Schaltfläche + if [[ "$ACTION" == "reboot" ]]; then + $LOGGER -t "$TAG" "User hat Neustart gewählt. Führe Reboot aus." + $SYSTEMCTL reboot + fi + else + $LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User gefunden." fi - - USER_ID=$(id -u "$TARGET_USER") - -# 4. Benachrichtigung senden via systemd-run -# Wir nutzen --machine=$TARGET_USER@.host, um in die User-Session zu springen -RESPONSE=$(systemd-run --machine="$TARGET_USER@.host" \ - --user \ - --pipe \ - --wait \ - notify-send -a "System-Update" \ - "Ein neues System-Update ist bereit." \ - "Der Neustart aktiviert die Änderungen." \ - --icon=system-reboot-symbolic \ - --urgency=critical \ - --action="reboot=Jetzt neu starten" \ - --wait) - -# 5. Auswertung -if [[ "$RESPONSE" == "reboot" ]]; then - logger -t "$TAG" "User wählte Neustart über Benachrichtigungs-Button." - systemctl reboot else - logger -t "$TAG" "Benachrichtigung wurde geschlossen oder 'reboot' nicht geklickt." + $LOGGER -t "$TAG" "System ist bereits aktuell." fi