From e61189327cc7a1a1d881ec35ad183837958e848f Mon Sep 17 00:00:00 2001 From: humocs-man <251756307+humocs-man@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:05:04 +0100 Subject: [PATCH] Refactor firstboot-setup.sh for improved clarity --- .../skel/.config/firstboot/firstboot-setup.sh | 297 ++++++++++-------- 1 file changed, 160 insertions(+), 137 deletions(-) diff --git a/files/etc/skel/.config/firstboot/firstboot-setup.sh b/files/etc/skel/.config/firstboot/firstboot-setup.sh index 233a251..2fe3835 100644 --- a/files/etc/skel/.config/firstboot/firstboot-setup.sh +++ b/files/etc/skel/.config/firstboot/firstboot-setup.sh @@ -2,27 +2,50 @@ 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="Der Einrichtungs‑Assistent wird dann nicht erneut angezeigt. + --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 -Alle Anwendungen können jederzeit über den COSMIC‑Shop installiert oder entfernt werden. - -Möchtest du den Setup‑Assistenten wirklich abbrechen?" - - if [[ $? -eq 0 ]]; then - rm -f "$HOME/.config/firstboot/run" - systemctl --user disable firstboot-setup.service - exit 0 - fi - - 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 \ @@ -31,7 +54,7 @@ ensure_flathub() { install_brew_and_setup_path() { if ! command -v brew >/dev/null 2>&1; then - NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + 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" @@ -50,25 +73,6 @@ install_brew_and_setup_path() { done } -# ---------------------------- -# Welcome -# ---------------------------- -zenity --info \ - --title="Willkommen bei COSMIC" \ - --text="Dieser Assistent erleichtert dir den Einstieg, indem er eine Auswahl gängiger Anwendungen anbietet. - -Wichtig: -• Alle hier angebotenen Anwendungen können jederzeit auch über den COSMIC‑Shop installiert oder entfernt werden. -• Der Wizard ist optional und kann komplett übersprungen werden. -• Er deckt nur eine Auswahl verbreiteter Anwendungen ab – nicht alles. - -Nach Abschluss wird dieser Assistent nicht erneut angezeigt." \ - || abort - -# ---------------------------- -# Auswahlfunktionen -# ---------------------------- - choose_list() { local title="$1" local text="$2" @@ -86,103 +90,92 @@ choose_list() { --separator="|" \ ) || abort - echo "$result" + echo "${result:-}" } # ---------------------------- -# Browser +# 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" \ - "Webbrowser werden für viele Aufgaben benötigt." \ + "Browser auswählen\nWähle einen oder mehrere Webbrowser aus." \ firefox "Mozilla Firefox (empfohlen)" \ - chromium "Chromium (Open‑Source Basis)" \ + chromium "Chromium (Open-Source Basis)" \ brave "Brave (datenschutzorientiert)" \ ) -# ---------------------------- -# Office -# ---------------------------- OFFICE=$(choose_list \ "Office & Dokumente" \ - "Anwendungen für Dokumente, PDFs und Büroarbeit:" \ - libreoffice "LibreOffice (Office‑Suite)" \ - onlyoffice "OnlyOffice (MS‑Office‑ähnlich)" \ + "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)" \ + papers "Papers (PDF-Viewer)" \ simplescan "Simple Scan" \ ) -# ---------------------------- -# Graphics -# ---------------------------- GRAPHICS=$(choose_list \ "Grafik & Kreativ" \ - "Bildbearbeitung, Illustration und Vektorgrafik:" \ + "Grafik & Kreativ\nWerkzeuge für Bildbearbeitung und Illustration." \ gimp "GIMP" \ krita "Krita" \ inkscape "Inkscape" \ ) -# ---------------------------- -# Media -# ---------------------------- MEDIA=$(choose_list \ "Medien & Unterhaltung" \ - "Wiedergabe von Audio und Video:" \ + "Medien & Unterhaltung\nAudio- und Video-Wiedergabe." \ vlc "VLC Media Player" \ - showtime "Gnome Video Player" + showtime "Gnome Video Player" \ spotify "Spotify Client" \ ) -# ---------------------------- -# Audio/Video Editing -# ---------------------------- AV=$(choose_list \ - "Audio & Video‑Bearbeitung" \ - "Erstellung und Bearbeitung von Audio‑ und Videoinhalten:" \ + "Audio & Video-Bearbeitung" \ + "Audio & Video-Bearbeitung\nWerkzeuge für kreative Medienproduktion." \ shotcut "Shotcut" \ kdenlive "Kdenlive" \ audacity "Audacity" \ ardour "Ardour" \ ) -# ---------------------------- -# Games -# ---------------------------- GAMES=$(choose_list \ "Spiele" \ - "Plattformen für PC‑Spiele:" \ + "Spiele-Plattformen\nWähle Plattformen für PC-Spiele." \ steam "Steam" \ lutris "Lutris" \ ) -# ---------------------------- -# Mail -# ---------------------------- MAIL=$(choose_list \ - "E‑Mail" \ - "Desktop‑E‑Mail‑Programme:" \ + "E-Mail" \ + "E-Mail-Programme\nWähle einen oder mehrere Mail-Clients." \ thunderbird "Thunderbird" \ geary "Geary" \ evolution "Evolution" \ ) -# ---------------------------- -# Development -# ---------------------------- DEV=$(choose_list \ "Entwicklung" \ - "Werkzeuge für Software‑Entwicklung:" \ + "Entwicklung\nWerkzeuge für Software-Entwicklung." \ vscode "Visual Studio Code" \ ) -# ---------------------------- -# System Tools -# ---------------------------- SYSTEM=$(choose_list \ - "System‑Werkzeuge" \ - "Hilfsprogramme für System‑Konfiguration:" \ + "System-Werkzeuge" \ + "System-Werkzeuge\nHilfsprogramme für Konfiguration und Verwaltung." \ flatseal "Flatseal" \ ) @@ -191,32 +184,28 @@ SYSTEM=$(choose_list \ # ---------------------------- zenity --question \ --title="Homebrew (optional)" \ - --text="Homebrew ist ein zusätzlicher Paketmanager für Entwickler‑ und CLI‑Werkzeuge. - -• Installation im Benutzerverzeichnis -• Keine Änderung am Basissystem -• Komplett 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 +# Auto-Update # ---------------------------- zenity --question \ --title="Automatische Systemaktualisierung" \ - --text="Wenn diese Option aktiviert ist, prüft das System einmal pro Woche automatisch auf neue Aktualisierungen und installiert sie im Hintergrund. - -Du kannst den Aktualisierungsdienst jederzeit manuell starten mit: - - systemctl --user start bootc-update.service - -Ohne automatische Updates kannst du Aktualisierungen jederzeit selbst anstoßen mit: - - bootc upgrade" + --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 # ---------------------------- @@ -226,17 +215,16 @@ Grafik: ${GRAPHICS:-keine} Medien: ${MEDIA:-keine} Audio/Video: ${AV:-keine} Spiele: ${GAMES:-keine} -E‑Mail: ${MAIL:-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" \ + --text="Bitte bestätige die Installation\n\n$SUMMARY" \ || abort # ---------------------------- @@ -247,6 +235,7 @@ 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 ;; @@ -255,43 +244,82 @@ ensure_flathub done echo "25"; echo "# Installiere Office..." - [[ "$OFFICE" == *libreoffice* ]] && flatpak install -y flathub org.libreoffice.LibreOffice - [[ "$OFFICE" == *onlyoffice* ]] && flatpak install -y flathub org.onlyoffice.desktopeditors - [[ "$OFFICE" == *collabora* ]] && flatpak install -y flathub com.collabora.CollaboraOffice - [[ "$OFFICE" == *papers* ]] && flatpak install -y flathub org.gnome.Papers - [[ "$OFFICE" == *simplescan* ]] && flatpak install -y flathub org.gnome.SimpleScan + 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..." - [[ "$GRAPHICS" == *gimp* ]] && flatpak install -y flathub org.gimp.GIMP - [[ "$GRAPHICS" == *krita* ]] && flatpak install -y flathub org.kde.krita - [[ "$GRAPHICS" == *inkscape* ]] && flatpak install -y flathub org.inkscape.Inkscape + 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..." - [[ "$MEDIA" == *vlc* ]] && flatpak install -y flathub org.videolan.VLC - [[ "$MEDIA" == *spotify* ]] && flatpak install -y flathub com.spotify.Client - [[ "$MEDIA" == *showtime* ]] && flatpak install -y flathub org.gnome.Showtime + 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 "70"; echo "# Installiere Audio/Video‑Tools..." - [[ "$AV" == *shotcut* ]] && flatpak install -y flathub org.shotcut.Shotcut - [[ "$AV" == *kdenlive* ]] && flatpak install -y flathub org.kde.kdenlive - [[ "$AV" == *audacity* ]] && flatpak install -y flathub org.audacityteam.Audacity - [[ "$AV" == *ardour* ]] && flatpak install -y flathub org.ardour.Ardour + 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 "85"; echo "# Installiere Spiele‑Plattformen..." - [[ "$GAMES" == *steam* ]] && flatpak install -y flathub com.valvesoftware.Steam - [[ "$GAMES" == *lutris* ]] && flatpak install -y flathub net.lutris.Lutris - - echo "90"; echo "# Installiere E‑Mail‑Clients..." - [[ "$MAIL" == *thunderbird* ]] && flatpak install -y flathub org.mozilla.Thunderbird - [[ "$MAIL" == *geary* ]] && flatpak install -y flathub org.gnome.Geary - [[ "$MAIL" == *evolution* ]] && flatpak install -y flathub org.gnome.Evolution + 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..." - [[ "$DEV" == *vscode* ]] && flatpak install -y flathub com.visualstudio.code + 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‑Tools..." - [[ "$SYSTEM" == *flatseal* ]] && flatpak install -y flathub com.github.tchx84.Flatseal + 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 @@ -304,28 +332,23 @@ ensure_flathub --auto-close # ---------------------------- -# Auto‑Update aktivieren +# Auto-Update aktivieren # ---------------------------- if [[ "$AUTO_UPDATE" == yes ]]; then systemctl --user enable --now bootc-update.timer fi # ---------------------------- -# Mark wizard as done +# Wizard done (sauberer Abschluss) # ---------------------------- +trap - EXIT rm -f "$HOME/.config/firstboot/run" -systemctl --user disable firstboot-setup.service +systemctl --user disable firstboot-setup.service || true zenity --info \ --title="Fertig" \ - --text="Die Einrichtung ist abgeschlossen. - -Weitere Anwendungen kannst du jederzeit über den COSMIC‑Shop installieren. - -Updates: -• Installierte Anwendungen werden über den COSMIC‑Shop aktualisiert. -• Homebrew‑Pakete können mit folgendem Befehl aktualisiert werden: - - brew update && brew upgrade - -Der Setup‑Wizard wird nicht erneut gestartet." + --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."