Enhance notify-bootc-user.sh with error handling

This commit is contained in:
humocs-man
2026-05-24 21:20:17 +02:00
committed by GitHub
parent 3d885ccf6a
commit 499ce76b9c
+42 -14
View File
@@ -16,26 +16,48 @@ TAG="bootc-timer"
# Flatpaks im Hintergrund aktualisieren # Flatpaks im Hintergrund aktualisieren
# ============================================================================= # =============================================================================
$LOGGER -t "$TAG" "Suche nach Flatpak-Updates..." $LOGGER -t "$TAG" "Suche nach Flatpak-Updates..."
$FLATPAK update -y --noninteractive # || true verhindert den Abbruch, falls Flatpak temporär Netzwerkfehler hat
$FLATPAK update -y --noninteractive || $LOGGER -t "$TAG" "Flatpak-Update fehlgeschlagen oder keine Updates vorhanden."
# 1. Upgrade ausführen (dein bestehender Code) # =============================================================================
$BOOTC upgrade # 1. Bootc Upgrade ausführen
# =============================================================================
$LOGGER -t "$TAG" "Suche nach System-Updates (bootc)..."
# || true ist hier ESSENZIELL, da bootc upgrade bei "keine Updates" je nach Version
# einen Exit-Code ungleich 0 zurückgeben kann, was set -e triggern würde.
$BOOTC upgrade || $LOGGER -t "$TAG" "bootc upgrade beendet (System möglicherweise bereits aktuell)."
# 2. Status-Check mit jq ... (Rest des Skripts bleibt exakt gleich) # =============================================================================
if $BOOTC status --json | jq -e '.status.staged == null' >/dev/null; then # 2. Status-Check (Sicherer Umgang mit jq)
# =============================================================================
# Wir lesen den Status aus und fangen den Wert direkt ab.
# Wenn 'staged' gleich null ist, liefert jq den Text "null".
STAGED_STATUS=$( $BOOTC status --json | jq -r '.status.staged' 2>/dev/null || echo "null" )
if [[ "$STAGED_STATUS" == "null" ]]; then
# KEIN Update gefunden # KEIN Update gefunden
$LOGGER -t "$TAG" "System aktuell (keine Updates vorhanden)." $LOGGER -t "$TAG" "System aktuell (keine gestageden Updates vorhanden)."
exit 0
else else
$LOGGER -t "$TAG" "Update gefunden und gestaged. Suche aktiven Desktop-User..." $LOGGER -t "$TAG" "Update gefunden und gestaged. Suche aktiven Desktop-User..."
# =============================================================================
# 3. Robust den User der AKTIVEN grafischen Sitzung (seat0) ermitteln # 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" ]] && \ # Wir vermeiden die Standard-Pipeline | while read, um Subshell-Probleme zu umgehen.
[[ "$( $LOGINCTL show-session "$sid" -p State --value )" == "active" ]]; then # Stattdessen nutzen wir ein Process Substitution (< <(...))
$LOGINCTL show-session "$sid" -p UID --value 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 break
fi fi
done ) fi
done < <($LOGINCTL list-sessions --no-legend)
if [[ -z "$USER_ID" ]]; then 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 auf seat0 gefunden."
@@ -44,7 +66,11 @@ else
$LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID" $LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID"
# 4. Benachrichtigung senden (mit "|| echo 'closed'" um den set -e Crash zu verhindern) # =============================================================================
# 4. Benachrichtigung senden
# =============================================================================
# Wenn der User die Benachrichtigung ignoriert/schließt, gibt notify-send einen
# Exit-Code > 0 zurück. Das "|| echo 'closed'" fängt das sauber ab.
ACTION=$( $SUDO -u "#$USER_ID" env \ ACTION=$( $SUDO -u "#$USER_ID" env \
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus \ DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus \
XDG_RUNTIME_DIR=/run/user/$USER_ID \ XDG_RUNTIME_DIR=/run/user/$USER_ID \
@@ -56,11 +82,13 @@ else
--action="reboot=Jetzt neu starten" \ --action="reboot=Jetzt neu starten" \
--wait || echo "closed" ) --wait || echo "closed" )
# 5. Auswertung # =============================================================================
# 5. Auswertung der User-Aktion
# =============================================================================
if [[ "$ACTION" == "reboot" ]]; then if [[ "$ACTION" == "reboot" ]]; then
$LOGGER -t "$TAG" "User hat Reboot gewählt. Starte System neu..." $LOGGER -t "$TAG" "User hat Reboot gewählt. Starte System neu..."
$SYSTEMCTL reboot $SYSTEMCTL reboot
else else
$LOGGER -t "$TAG" "Benachrichtigung wurde geschlossen oder ignoriert ($ACTION)." $LOGGER -t "$TAG" "Benachrichtigung wurde geschlossen, ignoriert oder Timeout ($ACTION)."
fi fi
fi fi