#!/bin/bash set -euo pipefail BOOTC="/usr/bin/bootc" FLATPAK="/usr/bin/flatpak" LOGGER="/usr/bin/logger" LOGINCTL="/usr/bin/loginctl" NOTIFY="/usr/bin/notify-send" SYSTEMCTL="/usr/bin/systemctl" TAG="bootc-timer" # ============================================================================= # Flatpaks im Hintergrund aktualisieren # ============================================================================= $LOGGER -t "$TAG" "Suche nach Flatpak-Updates..." $FLATPAK update -y --noninteractive || $LOGGER -t "$TAG" "Flatpak-Update fehlgeschlagen oder keine Updates vorhanden." # ============================================================================= # 1. Bootc Upgrade ausfuehren # ============================================================================= $LOGGER -t "$TAG" "Suche nach System-Updates (bootc)..." $BOOTC upgrade || true # ============================================================================= # 2. Pruefen ob ein gestagtes Deployment vorhanden ist # ============================================================================= # 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 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 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 $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 \ 2>/dev/null || echo "closed" ) # ============================================================================= # 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