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:
gunnar
2026-05-30 15:42:14 +02:00
parent 63baebf228
commit 94460a999d
8 changed files with 89 additions and 74 deletions
+52 -58
View File
@@ -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