Refactor firstboot-setup.sh for better user experience

Refactor firstboot-setup.sh to improve user prompts and cleanup logic.
This commit is contained in:
humocs-man
2026-03-14 11:08:57 +01:00
committed by GitHub
parent b0cd3b6671
commit 692693d71e
@@ -14,35 +14,25 @@ if [[ -z "${WAYLAND_DISPLAY:-}" && -z "${DISPLAY:-}" ]]; then
fi fi
# ------------------------------------------------------------ # ------------------------------------------------------------
# Globaler Abbruch – beendet den Wizard vollständig # Abbruchdialog
# Ja -> Wizard beenden
# Nein -> zurück zur aktuellen Liste (return 2)
# ------------------------------------------------------------ # ------------------------------------------------------------
abort() { abort() {
echo "Abbruch durch Benutzer." if zenity --question \
zenity --question \
--title="Setup abbrechen?" \ --title="Setup abbrechen?" \
--text="<big><b>Setup abbrechen?</b></big>\n --text="<big><b>Setup abbrechen?</b></big>\n
Der Einrichtungs‑Assistent wird dann nicht erneut angezeigt.\n Der Einrichtungs‑Assistent wird dann nicht erneut angezeigt.\n
Alle Anwendungen können jederzeit über den COSMIC‑Shop installiert oder entfernt werden.\n Alle Anwendungen können jederzeit über den COSMIC‑Shop installiert oder entfernt werden.\n
Möchtest du den Setup‑Assistenten wirklich abbrechen?" \ Möchtest du den Setup‑Assistenten wirklich abbrechen?"
>/dev/null 2>&1 || true then
rm -f "$HOME/.config/firstboot/run" rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true
exit 1 exit 1
} else
return 2
# ------------------------------------------------------------
# Cleanup bei Fehlern
# ------------------------------------------------------------
cleanup() {
local code=$?
if [[ $code -ne 0 ]]; then
rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true
fi fi
} }
trap cleanup EXIT
# ------------------------------------------------------------ # ------------------------------------------------------------
# Helper # Helper
@@ -53,31 +43,10 @@ ensure_flathub() {
https://dl.flathub.org/repo/flathub.flatpakrepo 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
}
# ------------------------------------------------------------ # ------------------------------------------------------------
# Zenity‑Checkliste # Zenity‑Checkliste
# Erwartet Paare: id "beschreibung" # OK -> stdout = Auswahl, return 0
# Cancel -> abort(); Nein => return 2
# ------------------------------------------------------------ # ------------------------------------------------------------
choose_list() { choose_list() {
local title="$1" local title="$1"
@@ -95,16 +64,24 @@ choose_list() {
shift 2 shift 2
done done
zenity --list \ local result
if result=$(zenity --list \
--title="$title" \ --title="$title" \
--text="$text" \ --text="$text" \
--width=800 \
--height=600 \
--checklist \ --checklist \
--column="Auswahl" \ --column="Auswahl" \
--column="Anwendung" \ --column="Anwendung" \
--column="Beschreibung" \ --column="Beschreibung" \
--separator="|" \ --separator="|" \
"${rows[@]}" \ "${rows[@]}"); then
|| abort printf '%s\n' "$result"
return 0
else
abort
return 2
fi
} }
# ------------------------------------------------------------ # ------------------------------------------------------------
@@ -121,77 +98,92 @@ Dieser Assistent hilft dir beim Einstieg in dein System.\n
|| abort || abort
# ------------------------------------------------------------ # ------------------------------------------------------------
# Auswahl # Auswahl-Runner
# return 0 -> weiter
# return 2 -> gleiche Liste erneut
# ------------------------------------------------------------ # ------------------------------------------------------------
BROWSERS=$(choose_list \ run_list() {
local varname="$1"
shift
while true; do
local result
if result=$(choose_list "$@"); then
printf -v "$varname" "%s" "$result"
break
else
local code=$?
if [[ $code -eq 2 ]]; then
continue
fi
exit 1
fi
done
}
# ------------------------------------------------------------
# Listen
# ------------------------------------------------------------
run_list BROWSERS \
"Browser" \ "Browser" \
"<big><b>Browser auswählen</b></big>\nWähle einen oder mehrere Webbrowser aus." \ "<big><b>Browser auswählen</b></big>\nWähle einen oder mehrere Webbrowser aus." \
firefox "Ausgewogen, weit verbreitet, guter Datenschutz" \ firefox "Ausgewogen, weit verbreitet, guter Datenschutz" \
chromium "Schlank, schnell, Open‑Source‑Basis vieler Browser" \ chromium "Schlank, schnell, Open‑Source‑Basis vieler Browser" \
brave "Starker Fokus auf Datenschutz und Werbeblockierung" \ brave "Starker Fokus auf Datenschutz und Werbeblockierung"
)
OFFICE=$(choose_list \ run_list OFFICE \
"Office & Dokumente" \ "Office & Dokumente" \
"<big><b>Office &amp; Dokumente</b></big>\nAnwendungen für Büroarbeit und PDFs." \ "<big><b>Office &amp; Dokumente</b></big>\nAnwendungen für Büroarbeit und PDFs." \
libreoffice "Umfangreiche Office‑Suite für lokale Dokumente" \ libreoffice "Umfangreiche Office‑Suite für lokale Dokumente" \
onlyoffice "Moderne Oberfläche, hohe MS‑Office‑Kompatibilität" \ onlyoffice "Moderne Oberfläche, hohe MS‑Office‑Kompatibilität" \
collabora "LibreOffice‑Technologie mit Fokus auf Zusammenarbeit" \ collabora "LibreOffice‑Technologie mit Fokus auf Zusammenarbeit" \
papers "Leichter PDF‑Viewer zum Lesen und Kommentieren" \ papers "Leichter PDF‑Viewer zum Lesen und Kommentieren" \
simplescan "Einfaches Scannen von Dokumenten und Bildern" \ simplescan "Einfaches Scannen von Dokumenten und Bildern"
)
GRAPHICS=$(choose_list \ run_list GRAPHICS \
"Grafik & Kreativ" \ "Grafik & Kreativ" \
"<big><b>Grafik &amp; Kreativ</b></big>\nWerkzeuge für Bildbearbeitung und Illustration." \ "<big><b>Grafik &amp; Kreativ</b></big>\nWerkzeuge für Bildbearbeitung und Illustration." \
gimp "Leistungsstarke Bildbearbeitung für Fotos" \ gimp "Leistungsstarke Bildbearbeitung für Fotos" \
krita "Digitale Malerei und Illustration" \ krita "Digitale Malerei und Illustration" \
inkscape "Vektorgrafiken für Logos und Icons" \ inkscape "Vektorgrafiken für Logos und Icons"
)
MEDIA=$(choose_list \ run_list MEDIA \
"Medien & Unterhaltung" \ "Medien & Unterhaltung" \
"<big><b>Medien &amp; Unterhaltung</b></big>\nAudio‑ und Video‑Wiedergabe." \ "<big><b>Medien &amp; Unterhaltung</b></big>\nAudio‑ und Video‑Wiedergabe." \
vlc "Spielt nahezu alle Audio‑ und Videoformate ab" \ vlc "Spielt nahezu alle Audio‑ und Videoformate ab" \
showtime "Einfacher Videoplayer mit klarer Oberfläche" \ showtime "Einfacher Videoplayer mit klarer Oberfläche" \
spotify "Streaming‑Dienst für Musik und Podcasts" \ spotify "Streaming‑Dienst für Musik und Podcasts"
)
AV=$(choose_list \ run_list AV \
"Audio & Video‑Bearbeitung" \ "Audio & Video‑Bearbeitung" \
"<big><b>Audio &amp; Video‑Bearbeitung</b></big>\nWerkzeuge für kreative Medienproduktion." \ "<big><b>Audio &amp; Video‑Bearbeitung</b></big>\nWerkzeuge für kreative Medienproduktion." \
shotcut "Einfacher Videoeditor für schnelle Projekte" \ shotcut "Einfacher Videoeditor für schnelle Projekte" \
kdenlive "Umfangreicher Videoeditor mit vielen Effekten" \ kdenlive "Umfangreicher Videoeditor mit vielen Effekten" \
audacity "Aufnahme und Bearbeitung von Audio" \ audacity "Aufnahme und Bearbeitung von Audio" \
ardour "Professionelle Audio‑Produktion" \ ardour "Professionelle Audio‑Produktion"
)
GAMES=$(choose_list \ run_list GAMES \
"Spiele" \ "Spiele" \
"<big><b>Spiele‑Plattformen</b></big>\nPlattformen für PC‑Spiele." \ "<big><b>Spiele‑Plattformen</b></big>\nPlattformen für PC‑Spiele." \
steam "Große Spielebibliothek und Community‑Funktionen" \ steam "Große Spielebibliothek und Community‑Funktionen" \
lutris "Zentrale Verwaltung von Spielen aus vielen Quellen" \ lutris "Zentrale Verwaltung von Spielen aus vielen Quellen"
)
MAIL=$(choose_list \ run_list MAIL \
"E‑Mail" \ "E‑Mail" \
"<big><b>E‑Mail‑Programme</b></big>\nDesktop‑Clients für E‑Mail und Kalender." \ "<big><b>E‑Mail‑Programme</b></big>\nDesktop‑Clients für E‑Mail und Kalender." \
thunderbird "Leistungsstarker Mail‑Client mit Erweiterungen" \ thunderbird "Leistungsstarker Mail‑Client mit Erweiterungen" \
geary "Schlanker Mail‑Client mit einfacher Bedienung" \ geary "Schlanker Mail‑Client mit einfacher Bedienung" \
evolution "E‑Mail, Kalender und Kontakte in einer Anwendung" \ evolution "E‑Mail, Kalender und Kontakte in einer Anwendung"
)
DEV=$(choose_list \ run_list DEV \
"Entwicklung" \ "Entwicklung" \
"<big><b>Entwicklung</b></big>\nWerkzeuge für Software‑Entwicklung." \ "<big><b>Entwicklung</b></big>\nWerkzeuge für Software‑Entwicklung." \
vscode "Beliebter Code‑Editor mit vielen Erweiterungen" \ vscode "Beliebter Code‑Editor mit vielen Erweiterungen"
)
SYSTEM=$(choose_list \ run_list SYSTEM \
"System‑Werkzeuge" \ "System‑Werkzeuge" \
"<big><b>System‑Werkzeuge</b></big>\nHilfsprogramme für Konfiguration und Verwaltung." \ "<big><b>System‑Werkzeuge</b></big>\nHilfsprogramme für Konfiguration und Verwaltung." \
flatseal "Verwaltung von Flatpak‑Berechtigungen" \ flatseal "Verwaltung von Flatpak‑Berechtigungen"
)
# ------------------------------------------------------------ # ------------------------------------------------------------
# Installation # Installation
@@ -277,7 +269,6 @@ ensure_flathub
# ------------------------------------------------------------ # ------------------------------------------------------------
# Wizard done # Wizard done
# ------------------------------------------------------------ # ------------------------------------------------------------
trap - EXIT
rm -f "$HOME/.config/firstboot/run" rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true