#!/usr/bin/env bash set -euo pipefail LOG="$HOME/.local/state/firstboot-setup.log" mkdir -p "$(dirname "$LOG")" exec > >(tee -a "$LOG") 2>&1 # ---------------------------- # Session check # ---------------------------- if [[ -z "${WAYLAND_DISPLAY:-}" && -z "${DISPLAY:-}" ]]; then echo "Keine grafische Session verfügbar – breche ab." exit 1 fi # ---------------------------- # Cleanup trap (nur bei Fehlern) # ---------------------------- cleanup() { local code=$? if [[ $code -ne 0 ]]; then echo "Wizard abgebrochen oder mit Fehler beendet (Exitcode: $code)." rm -f "$HOME/.config/firstboot/run" systemctl --user disable firstboot-setup.service || true fi } trap cleanup EXIT # ---------------------------- # Abort dialog # ---------------------------- abort() { local code=$? echo "Abort ausgelöst (Exitcode: $code)." zenity --question \ --title="Setup abbrechen?" \ --text="Setup abbrechen?\n Der Einrichtungs-Assistent wird dann nicht erneut angezeigt.\n Alle Anwendungen können jederzeit über den COSMIC-Shop installiert oder entfernt werden.\n Möchtest du den Setup-Assistenten wirklich abbrechen?" || return 0 exit 0 } # ---------------------------- # Helper functions # ---------------------------- ensure_flathub() { flatpak remote-list --columns=name 2>/dev/null | grep -qx flathub || \ flatpak remote-add --if-not-exists flathub \ https://dl.flathub.org/repo/flathub.flatpakrepo } install_brew_and_setup_path() { if ! command -v brew >/dev/null 2>&1; then NONINTERACTIVE=1 CI=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" fi local BREW_PREFIX="/home/linuxbrew/.linuxbrew" local BREW_BIN="$BREW_PREFIX/bin/brew" [[ -x "$BREW_BIN" ]] || BREW_BIN="$(command -v brew)" eval "$("$BREW_BIN" shellenv)" for rc in "$HOME/.bashrc" "$HOME/.zshrc"; do [[ -f "$rc" ]] || continue grep -q 'brew shellenv' "$rc" || { echo "" >> "$rc" echo "# Homebrew" >> "$rc" echo "eval \"\$($BREW_BIN shellenv)\"" >> "$rc" } done } choose_list() { local title="$1" local text="$2" shift 2 local result result=$(zenity --list \ --title="$title" \ --text="$text" \ --checklist \ --column="Auswahl" \ --column="ID" \ --column="Beschreibung" \ FALSE "$@" \ --separator="|" \ ) || abort echo "${result:-}" } # ---------------------------- # Welcome # ---------------------------- zenity --info \ --title="Willkommen bei COSMIC" \ --text="Willkommen bei COSMIC\n Dieser Assistent hilft dir beim Einstieg in dein System.\n Hinweise:\n • Alle Anwendungen können später jederzeit über den COSMIC-Shop installiert oder entfernt werden.\n • Der Assistent ist optional und erscheint nur einmal.\n • Die Auswahl deckt gängige Anwendungen ab, aber nicht alles." \ || abort # ---------------------------- # Auswahl # ---------------------------- BROWSERS=$(choose_list \ "Browser" \ "Browser auswählen\nWähle einen oder mehrere Webbrowser aus." \ firefox "Mozilla Firefox (empfohlen)" \ chromium "Chromium (Open-Source Basis)" \ brave "Brave (datenschutzorientiert)" \ ) OFFICE=$(choose_list \ "Office & Dokumente" \ "Office & Dokumente\nWähle Anwendungen für Büroarbeit und PDFs." \ libreoffice "LibreOffice (Office-Suite)" \ onlyoffice "OnlyOffice (MS-Office-ähnlich)" \ collabora "Collabora Office" \ papers "Papers (PDF-Viewer)" \ simplescan "Simple Scan" \ ) GRAPHICS=$(choose_list \ "Grafik & Kreativ" \ "Grafik & Kreativ\nWerkzeuge für Bildbearbeitung und Illustration." \ gimp "GIMP" \ krita "Krita" \ inkscape "Inkscape" \ ) MEDIA=$(choose_list \ "Medien & Unterhaltung" \ "Medien & Unterhaltung\nAudio- und Video-Wiedergabe." \ vlc "VLC Media Player" \ showtime "Gnome Video Player" \ spotify "Spotify Client" \ ) AV=$(choose_list \ "Audio & Video-Bearbeitung" \ "Audio & Video-Bearbeitung\nWerkzeuge für kreative Medienproduktion." \ shotcut "Shotcut" \ kdenlive "Kdenlive" \ audacity "Audacity" \ ardour "Ardour" \ ) GAMES=$(choose_list \ "Spiele" \ "Spiele-Plattformen\nWähle Plattformen für PC-Spiele." \ steam "Steam" \ lutris "Lutris" \ ) MAIL=$(choose_list \ "E-Mail" \ "E-Mail-Programme\nWähle einen oder mehrere Mail-Clients." \ thunderbird "Thunderbird" \ geary "Geary" \ evolution "Evolution" \ ) DEV=$(choose_list \ "Entwicklung" \ "Entwicklung\nWerkzeuge für Software-Entwicklung." \ vscode "Visual Studio Code" \ ) SYSTEM=$(choose_list \ "System-Werkzeuge" \ "System-Werkzeuge\nHilfsprogramme für Konfiguration und Verwaltung." \ flatseal "Flatseal" \ ) # ---------------------------- # Homebrew # ---------------------------- zenity --question \ --title="Homebrew (optional)" \ --text="Homebrew installieren?\n Homebrew ist ein zusätzlicher Paketmanager für Entwickler- und CLI-Werkzeuge.\n • Installation im Benutzerverzeichnis\n • Keine Änderung am Basissystem\n • Komplett optional" USE_BREW=$([[ $? -eq 0 ]] && echo yes || echo no) # ---------------------------- # Auto-Update # ---------------------------- zenity --question \ --title="Automatische Systemaktualisierung" \ --text="Automatische Updates aktivieren?\n Wenn aktiviert, prüft das System einmal pro Woche auf neue Aktualisierungen und installiert sie automatisch.\n Manuelle Aktualisierung:\n bootc upgrade\n Dienst manuell starten:\n systemctl --user start bootc-update.service" AUTO_UPDATE=$([[ $? -eq 0 ]] && echo yes || echo no) # ---------------------------- # Summary # ---------------------------- SUMMARY="Browser: ${BROWSERS:-keine} Office: ${OFFICE:-keine} Grafik: ${GRAPHICS:-keine} Medien: ${MEDIA:-keine} Audio/Video: ${AV:-keine} Spiele: ${GAMES:-keine} E-Mail: ${MAIL:-keine} Entwicklung: ${DEV:-keine} System: ${SYSTEM:-keine} Homebrew: $USE_BREW Automatische Updates: $AUTO_UPDATE" zenity --question \ --title="Zusammenfassung" \ --text="Bitte bestätige die Installation\n\n$SUMMARY" \ || abort # ---------------------------- # Installation # ---------------------------- ensure_flathub ( echo "10"; echo "# Installiere Browser..." for b in ${BROWSERS//|/ }; do [[ -z "$b" ]] && continue case "$b" in firefox) flatpak install -y flathub org.mozilla.firefox ;; chromium) flatpak install -y flathub org.chromium.Chromium ;; brave) flatpak install -y flathub com.brave.Browser ;; esac done echo "25"; echo "# Installiere Office..." for o in ${OFFICE//|/ }; do [[ -z "$o" ]] && continue case "$o" in libreoffice) flatpak install -y flathub org.libreoffice.LibreOffice ;; onlyoffice) flatpak install -y flathub org.onlyoffice.desktopeditors ;; collabora) flatpak install -y flathub com.collabora.CollaboraOffice ;; papers) flatpak install -y flathub org.gnome.Papers ;; simplescan) flatpak install -y flathub org.gnome.SimpleScan ;; esac done echo "40"; echo "# Installiere Grafik-Tools..." for g in ${GRAPHICS//|/ }; do [[ -z "$g" ]] && continue case "$g" in gimp) flatpak install -y flathub org.gimp.GIMP ;; krita) flatpak install -y flathub org.kde.krita ;; inkscape) flatpak install -y flathub org.inkscape.Inkscape ;; esac done echo "55"; echo "# Installiere Medien..." for m in ${MEDIA//|/ }; do [[ -z "$m" ]] && continue case "$m" in vlc) flatpak install -y flathub org.videolan.VLC ;; spotify) flatpak install -y flathub com.spotify.Client ;; showtime) flatpak install -y flathub org.gnome.Showtime ;; esac done echo "70"; echo "# Installiere Audio/Video-Tools..." for a in ${AV//|/ }; do [[ -z "$a" ]] && continue case "$a" in shotcut) flatpak install -y flathub org.shotcut.Shotcut ;; kdenlive) flatpak install -y flathub org.kde.kdenlive ;; audacity) flatpak install -y flathub org.audacityteam.Audacity ;; ardour) flatpak install -y flathub org.ardour.Ardour ;; esac done echo "85"; echo "# Installiere Spiele-Plattformen..." for g in ${GAMES//|/ }; do [[ -z "$g" ]] && continue case "$g" in steam) flatpak install -y flathub com.valvesoftware.Steam ;; lutris) flatpak install -y flathub net.lutris.Lutris ;; esac done echo "90"; echo "# Installiere E-Mail-Clients..." for m in ${MAIL//|/ }; do [[ -z "$m" ]] && continue case "$m" in thunderbird) flatpak install -y flathub org.mozilla.Thunderbird ;; geary) flatpak install -y flathub org.gnome.Geary ;; evolution) flatpak install -y flathub org.gnome.Evolution ;; esac done echo "95"; echo "# Installiere Entwicklung..." for d in ${DEV//|/ }; do [[ -z "$d" ]] && continue case "$d" in vscode) flatpak install -y flathub com.visualstudio.code ;; esac done echo "97"; echo "# Installiere System-Werkzeuge..." for s in ${SYSTEM//|/ }; do [[ -z "$s" ]] && continue case "$s" in flatseal) flatpak install -y flathub com.github.tchx84.Flatseal ;; esac done echo "98"; echo "# Homebrew..." [[ "$USE_BREW" == yes ]] && install_brew_and_setup_path echo "100"; echo "# Fertig." ) | zenity --progress \ --title="Installation läuft" \ --text="Bitte warten..." \ --percentage=0 \ --auto-close # ---------------------------- # Auto-Update aktivieren # ---------------------------- if [[ "$AUTO_UPDATE" == yes ]]; then systemctl --user enable --now bootc-update.timer fi # ---------------------------- # Wizard done (sauberer Abschluss) # ---------------------------- trap - EXIT rm -f "$HOME/.config/firstboot/run" systemctl --user disable firstboot-setup.service || true zenity --info \ --title="Fertig" \ --text="Die Einrichtung ist abgeschlossen.\n Weitere Anwendungen kannst du jederzeit über den COSMIC-Shop installieren.\n Homebrew aktualisieren:\n brew update && brew upgrade\n Der Setup-Assistent wird nicht erneut gestartet."