diff --git a/scripts/notify-bootc-user.sh b/scripts/notify-bootc-user.sh index 9b80e37..834d500 100755 --- a/scripts/notify-bootc-user.sh +++ b/scripts/notify-bootc-user.sh @@ -37,20 +37,22 @@ $LOGGER -t "$TAG" "Update gestaged. Suche aktiven Desktop-User..." # 3. Aktiven Desktop-User auf seat0 ermitteln # ============================================================================= USER_ID="" -while read -r sid _rest; do - if [[ -n "$sid" ]]; then - SEAT=$($LOGINCTL show-session "$sid" -p Seat --value 2>/dev/null || echo "") - STATE=$($LOGINCTL show-session "$sid" -p State --value 2>/dev/null || echo "") - if [[ "$SEAT" == "seat0" ]] && [[ "$STATE" == "active" ]]; then - USER_ID=$($LOGINCTL show-session "$sid" -p UID --value 2>/dev/null || echo "") - break - fi +# Holt direkt die ID der aktuell aktiven Session auf seat0 (ohne Schleife) +ACTIVE_SESSION=$($LOGINCTL show-seat seat0 -p ActiveSession --value 2>/dev/null || echo "") + +if [[ -n "$ACTIVE_SESSION" && "$ACTIVE_SESSION" != "none" ]]; then + # Sicherheitsprüfung: Ist es ein echter Benutzer (user) und kein Login-Bildschirm (greeter)? + CLASS=$($LOGINCTL show-session "$ACTIVE_SESSION" -p Class --value 2>/dev/null || echo "") + STATE=$($LOGINCTL show-session "$ACTIVE_SESSION" -p State --value 2>/dev/null || echo "") + + if [[ "$CLASS" == "user" ]] && [[ "$STATE" == "active" ]]; then + USER_ID=$($LOGINCTL show-session "$ACTIVE_SESSION" -p UID --value 2>/dev/null || echo "") fi -done < <($LOGINCTL list-sessions --no-legend) +fi if [[ -z "$USER_ID" ]]; then - $LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User auf seat0 gefunden." + $LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User (Klasse: user) auf seat0 gefunden." exit 0 fi @@ -59,14 +61,15 @@ $LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID" # ============================================================================= # 4. Benachrichtigung senden # ============================================================================= -# Die D-Bus-Umgebungsvariablen muessen explizit gesetzt werden, da der -# Systemd-Service als root laeuft und keine User-Session erbt. -# notify-send --wait blockiert, bis der User die Benachrichtigung schliesst -# oder einen Action-Button klickt. -ACTION=$( sudo -u "#$USER_ID" \ - env \ - DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${USER_ID}/bus" \ - XDG_RUNTIME_DIR="/run/user/${USER_ID}" \ +# 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?" \ @@ -84,5 +87,5 @@ 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)." -fi + $LOGGER -t "$TAG" "Benachrichtigung geschlossen oder ignoriert (kein Reboot, Antwort war: $ACTION)." +fi \ No newline at end of file