Refactor bootc user notification script

This commit is contained in:
humocs-man
2026-05-13 20:24:30 +02:00
committed by GitHub
parent db4dc53d5a
commit 7bd39aed32
+45 -33
View File
@@ -1,53 +1,65 @@
#!/bin/bash #!/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 # 1. Upgrade ausführen
# --apply=false stellt sicher, dass bootc nicht selbstständig rebootet (falls konfiguriert) OUTPUT=$($BOOTC upgrade 2>&1)
OUTPUT=$(/usr/bin/bootc upgrade 2>&1)
EXIT_STATUS=$? EXIT_STATUS=$?
# 2. Check: Erfolg + "Queued" oder "Staged" if [[ $EXIT_STATUS -ne 0 ]]; then
# Wir suchen nach Mustern, die ein bereitliegendes Image bestätigen $LOGGER -t "$TAG" "Fehler beim Upgrade. Code: $EXIT_STATUS. Output: $OUTPUT"
if [[ $EXIT_STATUS -eq 0 ]] && echo "$OUTPUT" | grep -Ei -q "Queued|staged|Preparing"; then exit 1
fi
logger -t "$TAG" "Update erfolgreich heruntergeladen." # 2. Status-Check via JSON
if $BOOTC status --json | grep -q '"staged":{'; then
# 3. User finden (Präziser für Fedora 44) $LOGGER -t "$TAG" "Neues Image erfolgreich gestaged."
# 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 # 3. Den aktiven User finden
if [[ "$(loginctl show-session "$id" -p Type --value)" =~ ^(x11|wayland)$ ]] && \ TARGET_USER=$($LOGINCTL list-sessions --no-legend | while read -r id user rest; do
[[ "$(loginctl show-session "$id" -p State --value)" == "active" ]]; then 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" echo "$user"
break break
fi fi
done) done)
if [ -z "$TARGET_USER" ]; then if [[ -n "$TARGET_USER" ]]; then
logger -t "$TAG" "Kein aktiver Desktop-User gefunden. Benachrichtigung abgebrochen." USER_ID=$($ID_BIN -u "$TARGET_USER")
exit 0
fi
USER_ID=$(id -u "$TARGET_USER") # Wichtig: XDG_RUNTIME_DIR hinzufügen
ACTION=$($SUDO -u "$TARGET_USER" \
# 4. Benachrichtigung senden via systemd-run DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus \
# Wir nutzen --machine=$TARGET_USER@.host, um in die User-Session zu springen XDG_RUNTIME_DIR=/run/user/$USER_ID \
RESPONSE=$(systemd-run --machine="$TARGET_USER@.host" \ $NOTIFY "System-Update bereit" \
--user \ "Ein neues Image wurde heruntergeladen. Jetzt neu starten?" \
--pipe \ --icon=software-update-available \
--wait \
notify-send -a "System-Update" \
"Ein neues System-Update ist bereit." \
"Der Neustart aktiviert die Änderungen." \
--icon=system-reboot-symbolic \
--urgency=critical \ --urgency=critical \
--action="reboot=Jetzt neu starten" \ --action="reboot=Jetzt neu starten" \
--wait) --wait)
# 5. Auswertung $LOGGER -t "$TAG" "Benachrichtigung gesendet. Antwort: $ACTION"
if [[ "$RESPONSE" == "reboot" ]]; then
logger -t "$TAG" "User wählte Neustart über Benachrichtigungs-Button." # 5. Auswertung der Schaltfläche
systemctl reboot 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
else else
logger -t "$TAG" "Benachrichtigung wurde geschlossen oder 'reboot' nicht geklickt." $LOGGER -t "$TAG" "System ist bereits aktuell."
fi fi