Refactor firstboot-setup.sh for clarity and updates

This commit is contained in:
humocs-man
2026-03-13 13:24:12 +01:00
committed by GitHub
parent e61189327c
commit 3d2dbfa06a
@@ -5,47 +5,49 @@ LOG="$HOME/.local/state/firstboot-setup.log"
mkdir -p "$(dirname "$LOG")" mkdir -p "$(dirname "$LOG")"
exec > >(tee -a "$LOG") 2>&1 exec > >(tee -a "$LOG") 2>&1
# ---------------------------- # ------------------------------------------------------------
# Session check # Session check
# ---------------------------- # ------------------------------------------------------------
if [[ -z "${WAYLAND_DISPLAY:-}" && -z "${DISPLAY:-}" ]]; then if [[ -z "${WAYLAND_DISPLAY:-}" && -z "${DISPLAY:-}" ]]; then
echo "Keine grafische Session verfügbar breche ab." echo "Keine grafische Session verfügbar breche ab."
exit 1 exit 1
fi fi
# ---------------------------- # ------------------------------------------------------------
# Cleanup trap (nur bei Fehlern) # Globaler Abbruch beendet den Wizard vollständig
# ---------------------------- # ------------------------------------------------------------
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 "Abbruch durch Benutzer."
echo "Abort ausgelöst (Exitcode: $code)."
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 EinrichtungsAssistent 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 COSMICShop installiert oder entfernt werden.\n
Möchtest du den Setup-Assistenten wirklich abbrechen?" || return 0 Möchtest du den SetupAssistenten wirklich abbrechen?" \
>/dev/null 2>&1 || true
rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true
exit 0 exit 0
} }
# ---------------------------- # ------------------------------------------------------------
# Helper functions # Cleanup bei Fehlern
# ---------------------------- # ------------------------------------------------------------
cleanup() {
local code=$?
if [[ $code -ne 0 ]]; then
echo "Wizard mit Fehler beendet (Exitcode: $code)."
rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true
fi
}
trap cleanup EXIT
# ------------------------------------------------------------
# Helper
# ------------------------------------------------------------
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 \
@@ -54,7 +56,8 @@ 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 CI=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"
@@ -73,149 +76,162 @@ install_brew_and_setup_path() {
done done
} }
# ------------------------------------------------------------
# ZenityCheckliste
# Erwartet Paare: id "beschreibung"
# ------------------------------------------------------------
choose_list() { choose_list() {
local title="$1" local title="$1"
local text="$2" local text="$2"
shift 2 shift 2
if (( $# % 2 != 0 )); then
echo "choose_list: Ungerade Anzahl Argumente (id/beschreibung Paare erwartet)." >&2
exit 1
fi
local -a rows=()
while (( $# )); do
rows+=(FALSE "$1" "$2")
shift 2
done
local result local result
result=$(zenity --list \ result=$(zenity --list \
--title="$title" \ --title="$title" \
--text="$text" \ --text="$text" \
--checklist \ --checklist \
--column="Auswahl" \ --column="Auswahl" \
--column="ID" \ --column="Anwendung" \
--column="Beschreibung" \ --column="Beschreibung" \
FALSE "$@" \
--separator="|" \ --separator="|" \
"${rows[@]}" \
) || abort ) || abort
echo "${result:-}" echo "${result:-}"
} }
# ---------------------------- # ------------------------------------------------------------
# Welcome # Welcome
# ---------------------------- # ------------------------------------------------------------
zenity --info \ zenity --info \
--title="Willkommen bei COSMIC" \ --title="Willkommen bei COSMIC" \
--text="<big><b>Willkommen bei COSMIC</b></big>\n --text="<big><b>Willkommen bei COSMIC</b></big>\n
Dieser Assistent hilft dir beim Einstieg in dein System.\n Dieser Assistent hilft dir beim Einstieg in dein System.\n
<b>Hinweise:</b>\n <b>Hinweise:</b>\n
• Alle Anwendungen können später jederzeit über den COSMIC-Shop installiert oder entfernt werden.\n • Alle Anwendungen können später jederzeit über den COSMICShop installiert oder entfernt werden.\n
• Der Assistent ist optional und erscheint nur einmal.\n • Der Assistent ist optional und erscheint nur einmal.\n
• Die Auswahl deckt gängige Anwendungen ab, aber nicht alles." \ • Die Auswahl deckt gängige Anwendungen ab, aber nicht alles." \
|| abort || abort
# ---------------------------- # ------------------------------------------------------------
# Auswahl # Auswahl
# ---------------------------- # ------------------------------------------------------------
BROWSERS=$(choose_list \ BROWSERS=$(choose_list \
"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 "Mozilla Firefox (empfohlen)" \ firefox "Ausgewogen, weit verbreitet, guter Datenschutz" \
chromium "Chromium (Open-Source Basis)" \ chromium "Schlank, schnell, OpenSourceBasis vieler Browser" \
brave "Brave (datenschutzorientiert)" \ brave "Starker Fokus auf Datenschutz und Werbeblockierung" \
) )
OFFICE=$(choose_list \ OFFICE=$(choose_list \
"Office & Dokumente" \ "Office &amp; Dokumente" \
"<big><b>Office & Dokumente</b></big>\nWähle Anwendungen für Büroarbeit und PDFs." \ "<big><b>Office &amp; Dokumente</b></big>\nAnwendungen für Büroarbeit und PDFs." \
libreoffice "LibreOffice (Office-Suite)" \ libreoffice "Umfangreiche OfficeSuite für lokale Dokumente" \
onlyoffice "OnlyOffice (MS-Office-ähnlich)" \ onlyoffice "Moderne Oberfläche, hohe MSOfficeKompatibilität" \
collabora "Collabora Office" \ collabora "LibreOfficeTechnologie mit Fokus auf Zusammenarbeit" \
papers "Papers (PDF-Viewer)" \ papers "Leichter PDFViewer zum Lesen und Kommentieren" \
simplescan "Simple Scan" \ simplescan "Einfaches Scannen von Dokumenten und Bildern" \
) )
GRAPHICS=$(choose_list \ GRAPHICS=$(choose_list \
"Grafik & Kreativ" \ "Grafik &amp; Kreativ" \
"<big><b>Grafik & Kreativ</b></big>\nWerkzeuge für Bildbearbeitung und Illustration." \ "<big><b>Grafik &amp; Kreativ</b></big>\nWerkzeuge für Bildbearbeitung und Illustration." \
gimp "GIMP" \ gimp "Leistungsstarke Bildbearbeitung für Fotos" \
krita "Krita" \ krita "Digitale Malerei und Illustration" \
inkscape "Inkscape" \ inkscape "Vektorgrafiken für Logos und Icons" \
) )
MEDIA=$(choose_list \ MEDIA=$(choose_list \
"Medien & Unterhaltung" \ "Medien &amp; Unterhaltung" \
"<big><b>Medien & Unterhaltung</b></big>\nAudio- und Video-Wiedergabe." \ "<big><b>Medien &amp; Unterhaltung</b></big>\nAudio und VideoWiedergabe." \
vlc "VLC Media Player" \ vlc "Spielt nahezu alle Audio und Videoformate ab" \
showtime "Gnome Video Player" \ showtime "Einfacher Videoplayer mit klarer Oberfläche" \
spotify "Spotify Client" \ spotify "StreamingDienst für Musik und Podcasts" \
) )
AV=$(choose_list \ AV=$(choose_list \
"Audio & Video-Bearbeitung" \ "Audio &amp; VideoBearbeitung" \
"<big><b>Audio & Video-Bearbeitung</b></big>\nWerkzeuge für kreative Medienproduktion." \ "<big><b>Audio &amp; VideoBearbeitung</b></big>\nWerkzeuge für kreative Medienproduktion." \
shotcut "Shotcut" \ shotcut "Einfacher Videoeditor für schnelle Projekte" \
kdenlive "Kdenlive" \ kdenlive "Umfangreicher Videoeditor mit vielen Effekten" \
audacity "Audacity" \ audacity "Aufnahme und Bearbeitung von Audio" \
ardour "Ardour" \ ardour "Professionelle AudioProduktion" \
) )
GAMES=$(choose_list \ GAMES=$(choose_list \
"Spiele" \ "Spiele" \
"<big><b>Spiele-Plattformen</b></big>\nWähle Plattformen für PC-Spiele." \ "<big><b>SpielePlattformen</b></big>\nPlattformen für PCSpiele." \
steam "Steam" \ steam "Große Spielebibliothek und CommunityFunktionen" \
lutris "Lutris" \ lutris "Zentrale Verwaltung von Spielen aus vielen Quellen" \
) )
MAIL=$(choose_list \ MAIL=$(choose_list \
"E-Mail" \ "EMail" \
"<big><b>E-Mail-Programme</b></big>\nWähle einen oder mehrere Mail-Clients." \ "<big><b>EMailProgramme</b></big>\nDesktopClients für EMail und Kalender." \
thunderbird "Thunderbird" \ thunderbird "Leistungsstarker MailClient mit Erweiterungen" \
geary "Geary" \ geary "Schlanker MailClient mit einfacher Bedienung" \
evolution "Evolution" \ evolution "EMail, Kalender und Kontakte in einer Anwendung" \
) )
DEV=$(choose_list \ DEV=$(choose_list \
"Entwicklung" \ "Entwicklung" \
"<big><b>Entwicklung</b></big>\nWerkzeuge für Software-Entwicklung." \ "<big><b>Entwicklung</b></big>\nWerkzeuge für SoftwareEntwicklung." \
vscode "Visual Studio Code" \ vscode "Beliebter CodeEditor mit vielen Erweiterungen" \
) )
SYSTEM=$(choose_list \ SYSTEM=$(choose_list \
"System-Werkzeuge" \ "SystemWerkzeuge" \
"<big><b>System-Werkzeuge</b></big>\nHilfsprogramme für Konfiguration und Verwaltung." \ "<big><b>SystemWerkzeuge</b></big>\nHilfsprogramme für Konfiguration und Verwaltung." \
flatseal "Flatseal" \ flatseal "Verwaltung von FlatpakBerechtigungen" \
) )
# ---------------------------- # ------------------------------------------------------------
# Homebrew # Homebrew
# ---------------------------- # ------------------------------------------------------------
zenity --question \ zenity --question \
--title="Homebrew (optional)" \ --title="Homebrew (optional)" \
--text="<big><b>Homebrew installieren?</b></big>\n --text="<big><b>Homebrew installieren?</b></big>\n
Homebrew ist ein zusätzlicher Paketmanager für Entwickler- und CLI-Werkzeuge.\n Zusätzlicher Paketmanager für Entwickler und CLIWerkzeuge.\n
• Installation im Benutzerverzeichnis\n • Installation im Benutzerverzeichnis\n
• Keine Änderung am Basissystem\n • Keine Änderung am Basissystem\n
• Komplett optional" • Komplett optional" \
|| true
USE_BREW=$([[ $? -eq 0 ]] && echo yes || echo no) USE_BREW=$([[ $? -eq 0 ]] && echo yes || echo no)
# ---------------------------- # ------------------------------------------------------------
# Auto-Update # AutoUpdate
# ---------------------------- # ------------------------------------------------------------
zenity --question \ zenity --question \
--title="Automatische Systemaktualisierung" \ --title="Automatische Systemaktualisierung" \
--text="<big><b>Automatische Updates aktivieren?</b></big>\n --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 Wöchentliche Prüfung und Installation von SystemUpdates.\n
<b>Manuelle Aktualisierung:</b>\n <b>Manuell:</b>\n
<tt>bootc upgrade</tt>\n <tt>bootc upgrade</tt>" \
<b>Dienst manuell starten:</b>\n || true
<tt>systemctl --user start bootc-update.service</tt>"
AUTO_UPDATE=$([[ $? -eq 0 ]] && echo yes || echo no) AUTO_UPDATE=$([[ $? -eq 0 ]] && echo yes || echo no)
# ---------------------------- # ------------------------------------------------------------
# Summary # Zusammenfassung
# ---------------------------- # ------------------------------------------------------------
SUMMARY="Browser: ${BROWSERS:-keine} SUMMARY="Browser: ${BROWSERS:-keine}
Office: ${OFFICE:-keine} Office: ${OFFICE:-keine}
Grafik: ${GRAPHICS:-keine} Grafik: ${GRAPHICS:-keine}
Medien: ${MEDIA:-keine} Medien: ${MEDIA:-keine}
Audio/Video: ${AV:-keine} Audio/Video: ${AV:-keine}
Spiele: ${GAMES:-keine} Spiele: ${GAMES:-keine}
E-Mail: ${MAIL:-keine} EMail: ${MAIL:-keine}
Entwicklung: ${DEV:-keine} Entwicklung: ${DEV:-keine}
System: ${SYSTEM:-keine} System: ${SYSTEM:-keine}
@@ -227,15 +243,15 @@ zenity --question \
--text="<big><b>Bitte bestätige die Installation</b></big>\n\n$SUMMARY" \ --text="<big><b>Bitte bestätige die Installation</b></big>\n\n$SUMMARY" \
|| abort || abort
# ---------------------------- # ------------------------------------------------------------
# Installation # Installation
# ---------------------------- # ------------------------------------------------------------
ensure_flathub ensure_flathub
( (
echo "10"; echo "# Installiere Browser..." echo "10"; echo "# Installiere Anwendungen…"
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 ;;
@@ -243,9 +259,7 @@ ensure_flathub
esac esac
done done
echo "25"; echo "# Installiere Office..."
for o in ${OFFICE//|/ }; do for o in ${OFFICE//|/ }; do
[[ -z "$o" ]] && continue
case "$o" in case "$o" in
libreoffice) flatpak install -y flathub org.libreoffice.LibreOffice ;; libreoffice) flatpak install -y flathub org.libreoffice.LibreOffice ;;
onlyoffice) flatpak install -y flathub org.onlyoffice.desktopeditors ;; onlyoffice) flatpak install -y flathub org.onlyoffice.desktopeditors ;;
@@ -255,9 +269,7 @@ ensure_flathub
esac esac
done done
echo "40"; echo "# Installiere Grafik-Tools..."
for g in ${GRAPHICS//|/ }; do for g in ${GRAPHICS//|/ }; do
[[ -z "$g" ]] && continue
case "$g" in case "$g" in
gimp) flatpak install -y flathub org.gimp.GIMP ;; gimp) flatpak install -y flathub org.gimp.GIMP ;;
krita) flatpak install -y flathub org.kde.krita ;; krita) flatpak install -y flathub org.kde.krita ;;
@@ -265,19 +277,15 @@ ensure_flathub
esac esac
done done
echo "55"; echo "# Installiere Medien..."
for m in ${MEDIA//|/ }; do for m in ${MEDIA//|/ }; do
[[ -z "$m" ]] && continue
case "$m" in case "$m" in
vlc) flatpak install -y flathub org.videolan.VLC ;; vlc) flatpak install -y flathub org.videolan.VLC ;;
spotify) flatpak install -y flathub com.spotify.Client ;;
showtime) flatpak install -y flathub org.gnome.Showtime ;; showtime) flatpak install -y flathub org.gnome.Showtime ;;
spotify) flatpak install -y flathub com.spotify.Client ;;
esac esac
done done
echo "70"; echo "# Installiere Audio/Video-Tools..."
for a in ${AV//|/ }; do for a in ${AV//|/ }; do
[[ -z "$a" ]] && continue
case "$a" in case "$a" in
shotcut) flatpak install -y flathub org.shotcut.Shotcut ;; shotcut) flatpak install -y flathub org.shotcut.Shotcut ;;
kdenlive) flatpak install -y flathub org.kde.kdenlive ;; kdenlive) flatpak install -y flathub org.kde.kdenlive ;;
@@ -286,18 +294,14 @@ ensure_flathub
esac esac
done done
echo "85"; echo "# Installiere Spiele-Plattformen..."
for g in ${GAMES//|/ }; do for g in ${GAMES//|/ }; do
[[ -z "$g" ]] && continue
case "$g" in case "$g" in
steam) flatpak install -y flathub com.valvesoftware.Steam ;; steam) flatpak install -y flathub com.valvesoftware.Steam ;;
lutris) flatpak install -y flathub net.lutris.Lutris ;; lutris) flatpak install -y flathub net.lutris.Lutris ;;
esac esac
done done
echo "90"; echo "# Installiere E-Mail-Clients..."
for m in ${MAIL//|/ }; do for m in ${MAIL//|/ }; do
[[ -z "$m" ]] && continue
case "$m" in case "$m" in
thunderbird) flatpak install -y flathub org.mozilla.Thunderbird ;; thunderbird) flatpak install -y flathub org.mozilla.Thunderbird ;;
geary) flatpak install -y flathub org.gnome.Geary ;; geary) flatpak install -y flathub org.gnome.Geary ;;
@@ -305,50 +309,39 @@ ensure_flathub
esac esac
done done
echo "95"; echo "# Installiere Entwicklung..."
for d in ${DEV//|/ }; do for d in ${DEV//|/ }; do
[[ -z "$d" ]] && continue [[ "$d" == vscode ]] && flatpak install -y flathub com.visualstudio.code
case "$d" in
vscode) flatpak install -y flathub com.visualstudio.code ;;
esac
done done
echo "97"; echo "# Installiere System-Werkzeuge..."
for s in ${SYSTEM//|/ }; do for s in ${SYSTEM//|/ }; do
[[ -z "$s" ]] && continue [[ "$s" == flatseal ]] && flatpak install -y flathub com.github.tchx84.Flatseal
case "$s" in
flatseal) flatpak install -y flathub com.github.tchx84.Flatseal ;;
esac
done done
echo "98"; echo "# Homebrew..."
[[ "$USE_BREW" == yes ]] && install_brew_and_setup_path [[ "$USE_BREW" == yes ]] && install_brew_and_setup_path
echo "100"; echo "# Fertig." echo "100"; echo "# Fertig."
) | zenity --progress \ ) | zenity --progress \
--title="Installation läuft" \ --title="Installation läuft" \
--text="Bitte warten..." \ --text="Bitte warten" \
--percentage=0 \ --percentage=0 \
--auto-close --auto-close
# ---------------------------- # ------------------------------------------------------------
# Auto-Update aktivieren # AutoUpdate aktivieren
# ---------------------------- # ------------------------------------------------------------
if [[ "$AUTO_UPDATE" == yes ]]; then [[ "$AUTO_UPDATE" == yes ]] && systemctl --user enable --now bootc-update.timer || true
systemctl --user enable --now bootc-update.timer
fi
# ---------------------------- # ------------------------------------------------------------
# Wizard done (sauberer Abschluss) # Wizard done
# ---------------------------- # ------------------------------------------------------------
trap - EXIT trap - EXIT
rm -f "$HOME/.config/firstboot/run" rm -f "$HOME/.config/firstboot/run"
systemctl --user disable firstboot-setup.service || true systemctl --user disable firstboot-setup.service >/dev/null 2>&1 || true
zenity --info \ zenity --info \
--title="Fertig" \ --title="Fertig" \
--text="<big><b>Die Einrichtung ist abgeschlossen.</b></big>\n --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.\n
<b>Homebrew aktualisieren:</b>\n <b>Homebrew aktualisieren:</b>\n
<tt>brew update && brew upgrade</tt>\n <tt>brew update &amp;&amp; brew upgrade</tt>\n
Der Setup-Assistent wird nicht erneut gestartet." Der SetupAssistent wird nicht erneut gestartet."