#!/bin/bash # ABOUTME: Post-Install-Script für Moonarch — installiert Pakete, Defaults und konfiguriert das System. # ABOUTME: Wird nach der archinstall-Basisinstallation als normaler User ausgeführt. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" OFFICIAL_PACKAGES="$PROJECT_DIR/packages/official.txt" AUR_PACKAGES="$PROJECT_DIR/packages/aur.txt" DEFAULTS_DIR="$PROJECT_DIR/defaults" # --- Hilfsfunktionen --- log() { echo -e "\e[1;34m[Moonarch]\e[0m $*" } err() { echo -e "\e[1;31m[Moonarch FEHLER]\e[0m $*" >&2 } read_packages() { grep -v '^\s*#' "$1" | grep -v '^\s*$' } # --- Voraussetzungen prüfen --- if [[ $EUID -eq 0 ]]; then err "Bitte NICHT als root ausführen. Das Script nutzt sudo wo nötig." exit 1 fi if ! command -v pacman &>/dev/null; then err "pacman nicht gefunden — ist das wirklich Arch Linux?" exit 1 fi # --- Offizielle Pakete installieren --- log "Installiere offizielle Pakete..." if [[ -f "$OFFICIAL_PACKAGES" ]]; then # shellcheck disable=SC2046 sudo pacman -S --needed --noconfirm $(read_packages "$OFFICIAL_PACKAGES") else err "Paketliste nicht gefunden: $OFFICIAL_PACKAGES" exit 1 fi # --- paru installieren (AUR Helper) --- if ! command -v paru &>/dev/null; then log "Installiere paru..." PARU_TMPDIR=$(mktemp -d) git clone https://aur.archlinux.org/paru.git "$PARU_TMPDIR/paru" (cd "$PARU_TMPDIR/paru" && makepkg -si --noconfirm) rm -rf "$PARU_TMPDIR" else log "paru bereits installiert." fi # --- AUR-Pakete installieren --- log "Installiere AUR-Pakete..." if [[ -f "$AUR_PACKAGES" ]]; then # shellcheck disable=SC2046 paru -S --needed --noconfirm $(read_packages "$AUR_PACKAGES") else err "AUR-Paketliste nicht gefunden: $AUR_PACKAGES" exit 1 fi # --- Moonarch custom paru repo einrichten --- log "Richte Moonarch paru-Repo ein..." PARU_CONF="$HOME/.config/paru/paru.conf" mkdir -p "$(dirname "$PARU_CONF")" if ! grep -q '\[moonarch\]' "$PARU_CONF" 2>/dev/null; then cat >> "$PARU_CONF" <<'EOCONF' [moonarch] Url = https://gitea.moonarch.de/nevaforget/moonarch-pkgbuilds.git EOCONF log " + Moonarch-Repo zu paru.conf hinzugefuegt." else log " ~ Moonarch-Repo bereits in paru.conf." fi paru -Sy --pkgbuilds --noconfirm paru -S --needed --noconfirm moonset-git moonlock-git moongreet-git # --- Themes installieren (Cursor etc.) --- log "Installiere Themes..." "$SCRIPT_DIR/install-themes.sh" # --- XDG Defaults installieren --- log "Installiere XDG-Defaults nach /etc/xdg/..." sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/ # Sicherstellen dass Rofi-Scripts ausführbar sind sudo find /etc/xdg/rofi -name "*.sh" -exec chmod +x {} \; # --- GTK4 Theme-Symlinks für libadwaita-Apps --- THEME_NAME="Colloid-Catppuccin" THEME_GTK4="/usr/share/themes/$THEME_NAME/gtk-4.0" GTK4_XDG="/etc/xdg/gtk-4.0" if [[ -d "$THEME_GTK4" ]]; then log "Erstelle systemweite GTK4-Symlinks für $THEME_NAME..." # gtk.css zeigt auf gtk-dark.css, damit libadwaita-Apps das Dark-Theme laden sudo ln -sf "$THEME_GTK4/gtk-dark.css" "$GTK4_XDG/gtk.css" sudo ln -sf "$THEME_GTK4/gtk-dark.css" "$GTK4_XDG/gtk-dark.css" # Assets-Symlink: erst entfernen falls vorhanden (ln -sf auf Verzeichnisse folgt dem Link) sudo rm -f "$GTK4_XDG/assets" sudo ln -s "$THEME_GTK4/assets" "$GTK4_XDG/assets" else err "GTK4-Theme nicht gefunden: $THEME_GTK4 — libadwaita-Apps nutzen Fallback-Theme." fi # --- gsettings für GTK-Theme und Dark-Mode --- log "Setze gsettings für GTK-Theme..." gsettings set org.gnome.desktop.interface gtk-theme "$THEME_NAME" gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' gsettings set org.gnome.desktop.interface icon-theme 'Colloid-Grey-Catppuccin-Dark' gsettings set org.gnome.desktop.interface font-name 'UbuntuSans Nerd Font 11' # --- Helper-Scripts installieren --- log "Installiere Moonarch Helper-Scripts nach /usr/local/bin/..." sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/ # --- Zsh-Konfiguration --- log "Installiere Zsh-Default-Config..." sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch # Eintrag in /etc/zsh/zshrc damit Moonarch-Defaults geladen werden, # sofern der User keine eigene ~/.zshrc hat if ! grep -q "zshrc.moonarch" /etc/zsh/zshrc 2>/dev/null; then echo '# Moonarch defaults (wird durch ~/.zshrc überschrieben)' | sudo tee -a /etc/zsh/zshrc > /dev/null echo '[[ ! -f "$HOME/.zshrc" ]] && source /etc/zsh/zshrc.moonarch' | sudo tee -a /etc/zsh/zshrc > /dev/null fi # Falls der User noch keine .zshrc hat, Moonarch-Default verlinken if [[ ! -f "$HOME/.zshrc" ]]; then log "Keine ~/.zshrc gefunden — sourcing Moonarch-Defaults." mkdir -p "$HOME/.zshrc.d" echo "# Moonarch-Defaults laden, eigene Overrides in ~/.zshrc.d/ oder hier unten" > "$HOME/.zshrc" echo "source /etc/zsh/zshrc.moonarch" >> "$HOME/.zshrc" fi # --- moonlock systemd user service --- log "Konfiguriere moonlock User-Service..." sudo mkdir -p /etc/systemd/user sudo cp "$DEFAULTS_DIR/etc/systemd/user/moonlock.service" /etc/systemd/user/moonlock.service # --- greetd / moongreet Konfiguration --- log "Konfiguriere greetd + moongreet..." sudo mkdir -p /etc/greetd sudo cp "$DEFAULTS_DIR/etc/greetd/config.toml" /etc/greetd/config.toml sudo mkdir -p /etc/moongreet sudo cp "$DEFAULTS_DIR/etc/moongreet/moongreet.toml" /etc/moongreet/moongreet.toml # Default-Wallpaper installieren (Greeter, Lockscreen, Desktop) log "Installiere Default-Wallpaper..." sudo mkdir -p /usr/share/moonarch sudo cp "$DEFAULTS_DIR/backgrounds/wallpaper.jpg" /usr/share/moonarch/wallpaper.jpg # --- Systemd-Services aktivieren --- log "Aktiviere Services..." SERVICES=( "NetworkManager" "bluetooth" "docker" "greetd" "systemd-timesyncd" "ufw" "auto-cpufreq" ) for service in "${SERVICES[@]}"; do if systemctl list-unit-files "${service}.service" &>/dev/null; then sudo systemctl enable "$service" log " + $service" else log " ~ $service nicht gefunden, uebersprungen." fi done # --- Shell auf zsh setzen --- if [[ "$SHELL" != */zsh ]]; then log "Setze Standard-Shell auf zsh..." chsh -s "$(which zsh)" fi # --- Firewall aktivieren --- log "Konfiguriere UFW..." sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw --force enable # --- Docker-Gruppe --- if ! groups | grep -q docker; then log "Fuege User zur docker-Gruppe hinzu..." sudo usermod -aG docker "$USER" fi # --- User-Config-Defaults installieren --- log "Installiere User-Config-Defaults nach ~/.config/..." USER_DEFAULTS_DIR="$DEFAULTS_DIR/user" if [[ -d "$USER_DEFAULTS_DIR" ]]; then # Jedes Unterverzeichnis in defaults/user/ entspricht einem ~/.config/-Verzeichnis. # Dateien werden nur kopiert wenn sie noch nicht existieren (kein Ueberschreiben). for src_dir in "$USER_DEFAULTS_DIR"/*/; do app_name="$(basename "$src_dir")" dest_dir="$HOME/.config/$app_name" mkdir -p "$dest_dir" find "$src_dir" -type f -print0 | while IFS= read -r -d '' src_file; do rel_path="${src_file#"$src_dir"}" dest_file="$dest_dir/$rel_path" if [[ ! -f "$dest_file" ]]; then mkdir -p "$(dirname "$dest_file")" cp "$src_file" "$dest_file" log " + $app_name/$rel_path" else log " ~ $app_name/$rel_path existiert bereits, uebersprungen." fi done done fi # --- Screenshots-Verzeichnis --- mkdir -p "$HOME/Pictures/Screenshots" mkdir -p "$HOME/Pictures/Wallpaper" # --- moonarch-update Symlink --- log "Erstelle moonarch-update Kommando..." sudo ln -sf "$PROJECT_DIR/scripts/update.sh" /usr/local/bin/moonarch-update # --- Fertig --- log "" log "============================================" log " Moonarch Installation abgeschlossen!" log "============================================" log "" log "Naechste Schritte:" log " 1. Reboot" log " 2. Wallpaper in ~/Pictures/Wallpaper/ ablegen" log " 3. rustup default stable" log " 4. User-Overrides in ~/.config/ oder ~/.zshrc.d/" log ""