Refactor firstboot-setup.sh for improved clarity

This commit is contained in:
humocs-man
2026-03-13 13:05:04 +01:00
committed by GitHub
parent e5af49e922
commit e61189327c
@@ -2,27 +2,50 @@
set -euo pipefail set -euo pipefail
LOG="$HOME/.local/state/firstboot-setup.log" LOG="$HOME/.local/state/firstboot-setup.log"
mkdir -p "$(dirname "$LOG")"
exec > >(tee -a "$LOG") 2>&1 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() { abort() {
local code=$?
echo "Abort ausgelöst (Exitcode: $code)."
zenity --question \ zenity --question \
--title="Setup abbrechen?" \ --title="Setup abbrechen?" \
--text="Der EinrichtungsAssistent wird dann nicht erneut angezeigt. --text="<big><b>Setup abbrechen?</b></big>\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 COSMICShop installiert oder entfernt werden. exit 0
Möchtest du den SetupAssistenten wirklich abbrechen?"
if [[ $? -eq 0 ]]; then
rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service
exit 0
fi
return 0
} }
# ----------------------------
# Helper functions
# ----------------------------
ensure_flathub() { ensure_flathub() {
flatpak remote-list --columns=name 2>/dev/null | grep -qx flathub || \ flatpak remote-list --columns=name 2>/dev/null | grep -qx flathub || \
flatpak remote-add --if-not-exists flathub \ flatpak remote-add --if-not-exists flathub \
@@ -31,7 +54,7 @@ ensure_flathub() {
install_brew_and_setup_path() { install_brew_and_setup_path() {
if ! command -v brew >/dev/null 2>&1; then 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 fi
local BREW_PREFIX="/home/linuxbrew/.linuxbrew" local BREW_PREFIX="/home/linuxbrew/.linuxbrew"
@@ -50,25 +73,6 @@ install_brew_and_setup_path() {
done 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 COSMICShop 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() { choose_list() {
local title="$1" local title="$1"
local text="$2" local text="$2"
@@ -86,103 +90,92 @@ choose_list() {
--separator="|" \ --separator="|" \
) || abort ) || abort
echo "$result" echo "${result:-}"
} }
# ---------------------------- # ----------------------------
# Browser # Welcome
# ----------------------------
zenity --info \
--title="Willkommen bei COSMIC" \
--text="<big><b>Willkommen bei COSMIC</b></big>\n
Dieser Assistent hilft dir beim Einstieg in dein System.\n
<b>Hinweise:</b>\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 \ BROWSERS=$(choose_list \
"Browser" \ "Browser" \
"Webbrowser werden für viele Aufgaben benötigt." \ "<big><b>Browser auswählen</b></big>\nWähle einen oder mehrere Webbrowser aus." \
firefox "Mozilla Firefox (empfohlen)" \ firefox "Mozilla Firefox (empfohlen)" \
chromium "Chromium (OpenSource Basis)" \ chromium "Chromium (Open-Source Basis)" \
brave "Brave (datenschutzorientiert)" \ brave "Brave (datenschutzorientiert)" \
) )
# ----------------------------
# Office
# ----------------------------
OFFICE=$(choose_list \ OFFICE=$(choose_list \
"Office & Dokumente" \ "Office & Dokumente" \
"Anwendungen für Dokumente, PDFs und Büroarbeit:" \ "<big><b>Office & Dokumente</b></big>\nWähle Anwendungen für Büroarbeit und PDFs." \
libreoffice "LibreOffice (OfficeSuite)" \ libreoffice "LibreOffice (Office-Suite)" \
onlyoffice "OnlyOffice (MSOfficeähnlich)" \ onlyoffice "OnlyOffice (MS-Office-ähnlich)" \
collabora "Collabora Office" \ collabora "Collabora Office" \
papers "Papers (PDFViewer)" \ papers "Papers (PDF-Viewer)" \
simplescan "Simple Scan" \ simplescan "Simple Scan" \
) )
# ----------------------------
# Graphics
# ----------------------------
GRAPHICS=$(choose_list \ GRAPHICS=$(choose_list \
"Grafik & Kreativ" \ "Grafik & Kreativ" \
"Bildbearbeitung, Illustration und Vektorgrafik:" \ "<big><b>Grafik & Kreativ</b></big>\nWerkzeuge für Bildbearbeitung und Illustration." \
gimp "GIMP" \ gimp "GIMP" \
krita "Krita" \ krita "Krita" \
inkscape "Inkscape" \ inkscape "Inkscape" \
) )
# ----------------------------
# Media
# ----------------------------
MEDIA=$(choose_list \ MEDIA=$(choose_list \
"Medien & Unterhaltung" \ "Medien & Unterhaltung" \
"Wiedergabe von Audio und Video:" \ "<big><b>Medien & Unterhaltung</b></big>\nAudio- und Video-Wiedergabe." \
vlc "VLC Media Player" \ vlc "VLC Media Player" \
showtime "Gnome Video Player" showtime "Gnome Video Player" \
spotify "Spotify Client" \ spotify "Spotify Client" \
) )
# ----------------------------
# Audio/Video Editing
# ----------------------------
AV=$(choose_list \ AV=$(choose_list \
"Audio & VideoBearbeitung" \ "Audio & Video-Bearbeitung" \
"Erstellung und Bearbeitung von Audio und Videoinhalten:" \ "<big><b>Audio & Video-Bearbeitung</b></big>\nWerkzeuge für kreative Medienproduktion." \
shotcut "Shotcut" \ shotcut "Shotcut" \
kdenlive "Kdenlive" \ kdenlive "Kdenlive" \
audacity "Audacity" \ audacity "Audacity" \
ardour "Ardour" \ ardour "Ardour" \
) )
# ----------------------------
# Games
# ----------------------------
GAMES=$(choose_list \ GAMES=$(choose_list \
"Spiele" \ "Spiele" \
"Plattformen für PCSpiele:" \ "<big><b>Spiele-Plattformen</b></big>\nWähle Plattformen für PC-Spiele." \
steam "Steam" \ steam "Steam" \
lutris "Lutris" \ lutris "Lutris" \
) )
# ----------------------------
# Mail
# ----------------------------
MAIL=$(choose_list \ MAIL=$(choose_list \
"EMail" \ "E-Mail" \
"DesktopEMailProgramme:" \ "<big><b>E-Mail-Programme</b></big>\nWähle einen oder mehrere Mail-Clients." \
thunderbird "Thunderbird" \ thunderbird "Thunderbird" \
geary "Geary" \ geary "Geary" \
evolution "Evolution" \ evolution "Evolution" \
) )
# ----------------------------
# Development
# ----------------------------
DEV=$(choose_list \ DEV=$(choose_list \
"Entwicklung" \ "Entwicklung" \
"Werkzeuge für SoftwareEntwicklung:" \ "<big><b>Entwicklung</b></big>\nWerkzeuge für Software-Entwicklung." \
vscode "Visual Studio Code" \ vscode "Visual Studio Code" \
) )
# ----------------------------
# System Tools
# ----------------------------
SYSTEM=$(choose_list \ SYSTEM=$(choose_list \
"SystemWerkzeuge" \ "System-Werkzeuge" \
"Hilfsprogramme für SystemKonfiguration:" \ "<big><b>System-Werkzeuge</b></big>\nHilfsprogramme für Konfiguration und Verwaltung." \
flatseal "Flatseal" \ flatseal "Flatseal" \
) )
@@ -191,32 +184,28 @@ SYSTEM=$(choose_list \
# ---------------------------- # ----------------------------
zenity --question \ zenity --question \
--title="Homebrew (optional)" \ --title="Homebrew (optional)" \
--text="Homebrew ist ein zusätzlicher Paketmanager für Entwickler und CLIWerkzeuge. --text="<big><b>Homebrew installieren?</b></big>\n
Homebrew ist ein zusätzlicher Paketmanager für Entwickler- und CLI-Werkzeuge.\n
• Installation im Benutzerverzeichnis • Installation im Benutzerverzeichnis\n
• Keine Änderung am Basissystem • Keine Änderung am Basissystem\n
• Komplett optional" • Komplett optional"
USE_BREW=$([[ $? -eq 0 ]] && echo yes || echo no) USE_BREW=$([[ $? -eq 0 ]] && echo yes || echo no)
# ---------------------------- # ----------------------------
# AutoUpdate # Auto-Update
# ---------------------------- # ----------------------------
zenity --question \ zenity --question \
--title="Automatische Systemaktualisierung" \ --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. --text="<big><b>Automatische Updates aktivieren?</b></big>\n
Wenn aktiviert, prüft das System einmal pro Woche auf neue Aktualisierungen und installiert sie automatisch.\n
Du kannst den Aktualisierungsdienst jederzeit manuell starten mit: <b>Manuelle Aktualisierung:</b>\n
<tt>bootc upgrade</tt>\n
systemctl --user start bootc-update.service <b>Dienst manuell starten:</b>\n
<tt>systemctl --user start bootc-update.service</tt>"
Ohne automatische Updates kannst du Aktualisierungen jederzeit selbst anstoßen mit:
bootc upgrade"
AUTO_UPDATE=$([[ $? -eq 0 ]] && echo yes || echo no) AUTO_UPDATE=$([[ $? -eq 0 ]] && echo yes || echo no)
# ---------------------------- # ----------------------------
# Summary # Summary
# ---------------------------- # ----------------------------
@@ -226,17 +215,16 @@ Grafik: ${GRAPHICS:-keine}
Medien: ${MEDIA:-keine} Medien: ${MEDIA:-keine}
Audio/Video: ${AV:-keine} Audio/Video: ${AV:-keine}
Spiele: ${GAMES:-keine} Spiele: ${GAMES:-keine}
EMail: ${MAIL:-keine} E-Mail: ${MAIL:-keine}
Entwicklung: ${DEV:-keine} Entwicklung: ${DEV:-keine}
System: ${SYSTEM:-keine} System: ${SYSTEM:-keine}
Homebrew: $USE_BREW Homebrew: $USE_BREW
Automatische Updates: $AUTO_UPDATE" Automatische Updates: $AUTO_UPDATE"
zenity --question \ zenity --question \
--title="Zusammenfassung" \ --title="Zusammenfassung" \
--text="Bitte bestätige die Installation:\n\n$SUMMARY" \ --text="<big><b>Bitte bestätige die Installation</b></big>\n\n$SUMMARY" \
|| abort || abort
# ---------------------------- # ----------------------------
@@ -247,6 +235,7 @@ ensure_flathub
( (
echo "10"; echo "# Installiere Browser..." echo "10"; echo "# Installiere Browser..."
for b in ${BROWSERS//|/ }; do for b in ${BROWSERS//|/ }; do
[[ -z "$b" ]] && continue
case "$b" in case "$b" in
firefox) flatpak install -y flathub org.mozilla.firefox ;; firefox) flatpak install -y flathub org.mozilla.firefox ;;
chromium) flatpak install -y flathub org.chromium.Chromium ;; chromium) flatpak install -y flathub org.chromium.Chromium ;;
@@ -255,43 +244,82 @@ ensure_flathub
done done
echo "25"; echo "# Installiere Office..." echo "25"; echo "# Installiere Office..."
[[ "$OFFICE" == *libreoffice* ]] && flatpak install -y flathub org.libreoffice.LibreOffice for o in ${OFFICE//|/ }; do
[[ "$OFFICE" == *onlyoffice* ]] && flatpak install -y flathub org.onlyoffice.desktopeditors [[ -z "$o" ]] && continue
[[ "$OFFICE" == *collabora* ]] && flatpak install -y flathub com.collabora.CollaboraOffice case "$o" in
[[ "$OFFICE" == *papers* ]] && flatpak install -y flathub org.gnome.Papers libreoffice) flatpak install -y flathub org.libreoffice.LibreOffice ;;
[[ "$OFFICE" == *simplescan* ]] && flatpak install -y flathub org.gnome.SimpleScan 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 GrafikTools..." echo "40"; echo "# Installiere Grafik-Tools..."
[[ "$GRAPHICS" == *gimp* ]] && flatpak install -y flathub org.gimp.GIMP for g in ${GRAPHICS//|/ }; do
[[ "$GRAPHICS" == *krita* ]] && flatpak install -y flathub org.kde.krita [[ -z "$g" ]] && continue
[[ "$GRAPHICS" == *inkscape* ]] && flatpak install -y flathub org.inkscape.Inkscape 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..." echo "55"; echo "# Installiere Medien..."
[[ "$MEDIA" == *vlc* ]] && flatpak install -y flathub org.videolan.VLC for m in ${MEDIA//|/ }; do
[[ "$MEDIA" == *spotify* ]] && flatpak install -y flathub com.spotify.Client [[ -z "$m" ]] && continue
[[ "$MEDIA" == *showtime* ]] && flatpak install -y flathub org.gnome.Showtime 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/VideoTools..." echo "85"; echo "# Installiere Spiele-Plattformen..."
[[ "$AV" == *shotcut* ]] && flatpak install -y flathub org.shotcut.Shotcut for g in ${GAMES//|/ }; do
[[ "$AV" == *kdenlive* ]] && flatpak install -y flathub org.kde.kdenlive [[ -z "$g" ]] && continue
[[ "$AV" == *audacity* ]] && flatpak install -y flathub org.audacityteam.Audacity case "$g" in
[[ "$AV" == *ardour* ]] && flatpak install -y flathub org.ardour.Ardour steam) flatpak install -y flathub com.valvesoftware.Steam ;;
lutris) flatpak install -y flathub net.lutris.Lutris ;;
esac
done
echo "85"; echo "# Installiere SpielePlattformen..." echo "90"; echo "# Installiere E-Mail-Clients..."
[[ "$GAMES" == *steam* ]] && flatpak install -y flathub com.valvesoftware.Steam for m in ${MAIL//|/ }; do
[[ "$GAMES" == *lutris* ]] && flatpak install -y flathub net.lutris.Lutris [[ -z "$m" ]] && continue
case "$m" in
echo "90"; echo "# Installiere EMailClients..." thunderbird) flatpak install -y flathub org.mozilla.Thunderbird ;;
[[ "$MAIL" == *thunderbird* ]] && flatpak install -y flathub org.mozilla.Thunderbird geary) flatpak install -y flathub org.gnome.Geary ;;
[[ "$MAIL" == *geary* ]] && flatpak install -y flathub org.gnome.Geary evolution) flatpak install -y flathub org.gnome.Evolution ;;
[[ "$MAIL" == *evolution* ]] && flatpak install -y flathub org.gnome.Evolution esac
done
echo "95"; echo "# Installiere Entwicklung..." 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 SystemTools..." echo "97"; echo "# Installiere System-Werkzeuge..."
[[ "$SYSTEM" == *flatseal* ]] && flatpak install -y flathub com.github.tchx84.Flatseal 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..." echo "98"; echo "# Homebrew..."
[[ "$USE_BREW" == yes ]] && install_brew_and_setup_path [[ "$USE_BREW" == yes ]] && install_brew_and_setup_path
@@ -304,28 +332,23 @@ ensure_flathub
--auto-close --auto-close
# ---------------------------- # ----------------------------
# AutoUpdate aktivieren # Auto-Update aktivieren
# ---------------------------- # ----------------------------
if [[ "$AUTO_UPDATE" == yes ]]; then if [[ "$AUTO_UPDATE" == yes ]]; then
systemctl --user enable --now bootc-update.timer systemctl --user enable --now bootc-update.timer
fi fi
# ---------------------------- # ----------------------------
# Mark wizard as done # Wizard done (sauberer Abschluss)
# ---------------------------- # ----------------------------
trap - EXIT
rm -f "$HOME/.config/firstboot/run" rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service systemctl --user disable firstboot-setup.service || true
zenity --info \ zenity --info \
--title="Fertig" \ --title="Fertig" \
--text="Die Einrichtung ist abgeschlossen. --text="<big><b>Die Einrichtung ist abgeschlossen.</b></big>\n
Weitere Anwendungen kannst du jederzeit über den COSMIC-Shop installieren.\n
Weitere Anwendungen kannst du jederzeit über den COSMICShop installieren. <b>Homebrew aktualisieren:</b>\n
<tt>brew update && brew upgrade</tt>\n
Updates: Der Setup-Assistent wird nicht erneut gestartet."
• Installierte Anwendungen werden über den COSMICShop aktualisiert.
• HomebrewPakete können mit folgendem Befehl aktualisiert werden:
brew update && brew upgrade
Der SetupWizard wird nicht erneut gestartet."