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."