2026-05-01 13:10:33 +02:00
|
|
|
#!/bin/bash
|
2026-05-16 09:31:45 +02:00
|
|
|
set -euo pipefail
|
2026-05-23 11:56:54 +02:00
|
|
|
|
2026-05-13 20:24:30 +02:00
|
|
|
BOOTC="/usr/bin/bootc"
|
2026-05-30 15:42:14 +02:00
|
|
|
FLATPAK="/usr/bin/flatpak"
|
2026-05-13 20:24:30 +02:00
|
|
|
LOGGER="/usr/bin/logger"
|
|
|
|
|
LOGINCTL="/usr/bin/loginctl"
|
|
|
|
|
NOTIFY="/usr/bin/notify-send"
|
|
|
|
|
SYSTEMCTL="/usr/bin/systemctl"
|
|
|
|
|
|
|
|
|
|
TAG="bootc-timer"
|
2026-05-01 13:10:33 +02:00
|
|
|
|
2026-05-23 12:50:55 +02:00
|
|
|
# =============================================================================
|
|
|
|
|
# Flatpaks im Hintergrund aktualisieren
|
|
|
|
|
# =============================================================================
|
|
|
|
|
$LOGGER -t "$TAG" "Suche nach Flatpak-Updates..."
|
2026-05-24 21:20:17 +02:00
|
|
|
$FLATPAK update -y --noninteractive || $LOGGER -t "$TAG" "Flatpak-Update fehlgeschlagen oder keine Updates vorhanden."
|
2026-05-23 12:50:55 +02:00
|
|
|
|
2026-05-24 21:20:17 +02:00
|
|
|
# =============================================================================
|
2026-05-30 15:42:14 +02:00
|
|
|
# 1. Bootc Upgrade ausfuehren
|
2026-05-24 21:20:17 +02:00
|
|
|
# =============================================================================
|
|
|
|
|
$LOGGER -t "$TAG" "Suche nach System-Updates (bootc)..."
|
2026-05-30 15:42:14 +02:00
|
|
|
$BOOTC upgrade || true
|
2026-05-03 21:15:43 +02:00
|
|
|
|
2026-05-24 21:20:17 +02:00
|
|
|
# =============================================================================
|
2026-05-30 15:42:14 +02:00
|
|
|
# 2. Pruefen ob ein gestagtes Deployment vorhanden ist
|
2026-05-24 21:20:17 +02:00
|
|
|
# =============================================================================
|
2026-05-30 15:42:14 +02:00
|
|
|
# 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)."
|
2026-05-24 21:20:17 +02:00
|
|
|
exit 0
|
2026-05-30 15:42:14 +02:00
|
|
|
fi
|
2026-05-23 11:56:54 +02:00
|
|
|
|
2026-05-30 15:42:14 +02:00
|
|
|
$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
|
2026-05-23 11:56:54 +02:00
|
|
|
fi
|
2026-05-14 20:47:53 +02:00
|
|
|
fi
|
2026-05-30 15:42:14 +02:00
|
|
|
done < <($LOGINCTL list-sessions --no-legend)
|
2026-05-14 20:47:53 +02:00
|
|
|
|
2026-05-30 15:42:14 +02:00
|
|
|
if [[ -z "$USER_ID" ]]; then
|
|
|
|
|
$LOGGER -t "$TAG" "Update bereit, aber kein aktiver Desktop-User auf seat0 gefunden."
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
2026-05-23 11:56:54 +02:00
|
|
|
|
2026-05-30 15:42:14 +02:00
|
|
|
$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" \
|
2026-05-14 20:47:53 +02:00
|
|
|
"Ein neues Image wurde heruntergeladen. Jetzt neu starten?" \
|
2026-05-17 21:10:24 +02:00
|
|
|
--app-name="System-Update" \
|
2026-05-14 20:47:53 +02:00
|
|
|
--icon=software-update-available \
|
|
|
|
|
--urgency=critical \
|
|
|
|
|
--action="reboot=Jetzt neu starten" \
|
2026-05-30 15:42:14 +02:00
|
|
|
--wait \
|
|
|
|
|
2>/dev/null || echo "closed" )
|
2026-05-14 20:47:53 +02:00
|
|
|
|
2026-05-30 15:42:14 +02:00
|
|
|
# =============================================================================
|
|
|
|
|
# 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)."
|
2026-05-01 13:10:33 +02:00
|
|
|
fi
|