fix: Update-Skript, Containerfile-Optimierungen und chunkah-Rechunking
- notify-bootc-user.sh: D-Bus-Umgebung korrekt fuer Systemd-Service, jq-basierter Staging-Check (.status.staged != null), Guard Clauses, -Variable entfernt - Containerfile: COPY --chmod=755 fuer Skript-Permissions - build/20-multimedia.sh: Redundantes dnf5 clean all entfernt - build/30-virt.sh: dnf5 autoremove und Cleanup entfernt - build/40-remove-packages.sh: || true entfernt (Fehler sichtbar machen) - build/50-prepare-flatpak-for-bazaar.sh: curl -f --retry 3 hinzugefuegt - build.yml: chunkah Rechunk-Step fuer content-based Layers (Delta-Updates), Cache-Key erweitert (scripts/**), continue-on-error entfernt - build-installer-iso.yml: concurrency-Block hinzugefuegt
This commit is contained in:
@@ -1,13 +1,11 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# Pfade
|
||||
BOOTC="/usr/bin/bootc"
|
||||
FLATPAK="/usr/bin/flatpak"
|
||||
FLATPAK="/usr/bin/flatpak"
|
||||
LOGGER="/usr/bin/logger"
|
||||
LOGINCTL="/usr/bin/loginctl"
|
||||
NOTIFY="/usr/bin/notify-send"
|
||||
SUDO="/usr/bin/sudo"
|
||||
SYSTEMCTL="/usr/bin/systemctl"
|
||||
|
||||
TAG="bootc-timer"
|
||||
@@ -16,79 +14,75 @@ TAG="bootc-timer"
|
||||
# Flatpaks im Hintergrund aktualisieren
|
||||
# =============================================================================
|
||||
$LOGGER -t "$TAG" "Suche nach Flatpak-Updates..."
|
||||
# || 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. Bootc Upgrade ausführen
|
||||
# 1. Bootc Upgrade ausfuehren
|
||||
# =============================================================================
|
||||
$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)."
|
||||
$BOOTC upgrade || true
|
||||
|
||||
# =============================================================================
|
||||
# 2. Status-Check (Sicherer Umgang mit jq)
|
||||
# 2. Pruefen ob ein gestagtes Deployment vorhanden ist
|
||||
# =============================================================================
|
||||
# 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
|
||||
$LOGGER -t "$TAG" "System aktuell (keine gestageden Updates vorhanden)."
|
||||
# jq -e gibt Exit-Code 1 zurueck wenn das Ergebnis null/false/0/leer ist.
|
||||
if ! $BOOTC status --json | jq -e '.status.staged != null' > /dev/null 2>&1; then
|
||||
$LOGGER -t "$TAG" "Kein gestagtes Deployment gefunden (System aktuell oder bereits angewendet)."
|
||||
exit 0
|
||||
else
|
||||
$LOGGER -t "$TAG" "Update gefunden und gestaged. Suche aktiven Desktop-User..."
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 3. Robust den User der AKTIVEN grafischen Sitzung (seat0) ermitteln
|
||||
# =============================================================================
|
||||
# Wir vermeiden die Standard-Pipeline | while read, um Subshell-Probleme zu umgehen.
|
||||
# Stattdessen nutzen wir ein Process Substitution (< <(...))
|
||||
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
|
||||
$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
|
||||
done < <($LOGINCTL list-sessions --no-legend)
|
||||
|
||||
if [[ -z "$USER_ID" ]]; then
|
||||
$LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User auf seat0 gefunden."
|
||||
exit 0
|
||||
fi
|
||||
done < <($LOGINCTL list-sessions --no-legend)
|
||||
|
||||
$LOGGER -t "$TAG" "Sende Benachrichtigung an User-ID: $USER_ID"
|
||||
if [[ -z "$USER_ID" ]]; then
|
||||
$LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User auf seat0 gefunden."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 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 \
|
||||
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus \
|
||||
XDG_RUNTIME_DIR=/run/user/$USER_ID \
|
||||
$NOTIFY "System-Update bereit" \
|
||||
$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}" \
|
||||
$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" )
|
||||
--wait \
|
||||
2>/dev/null || echo "closed" )
|
||||
|
||||
# =============================================================================
|
||||
# 5. Auswertung der User-Aktion
|
||||
# =============================================================================
|
||||
if [[ "$ACTION" == "reboot" ]]; then
|
||||
$LOGGER -t "$TAG" "User hat Reboot gewählt. Starte System neu..."
|
||||
$SYSTEMCTL reboot
|
||||
else
|
||||
$LOGGER -t "$TAG" "Benachrichtigung wurde geschlossen, ignoriert oder Timeout ($ACTION)."
|
||||
fi
|
||||
# =============================================================================
|
||||
# 5. Auswertung
|
||||
# =============================================================================
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user