#!/bin/bash # ABOUTME: Moonarch System-Updater — aktualisiert System, Repo und Defaults. # ABOUTME: Sollte regelmäßig ausgeführt werden um das System synchron zu halten. 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*$' } confirm() { read -r -p "$1 [j/N] " response [[ "$response" =~ ^[jJyY]$ ]] } # --- Voraussetzungen --- if [[ $EUID -eq 0 ]]; then err "Bitte NICHT als root ausfuehren." exit 1 fi # --- 1. Moonarch-Repo aktualisieren --- log "=== Moonarch Repo aktualisieren ===" cd "$PROJECT_DIR" if git rev-parse --is-inside-work-tree &>/dev/null; then LOCAL=$(git rev-parse HEAD) git fetch origin REMOTE=$(git rev-parse @{u} 2>/dev/null || echo "$LOCAL") if [[ "$LOCAL" != "$REMOTE" ]]; then log "Updates verfuegbar." git --no-pager log --oneline "$LOCAL".."$REMOTE" echo "" if confirm "Repo aktualisieren?"; then git pull --ff-only log "Repo aktualisiert." else log "Repo-Update uebersprungen." fi else log "Repo ist aktuell." fi else log "Kein Git-Repo — Repo-Update uebersprungen." fi # --- 2. System-Pakete aktualisieren --- log "=== System-Pakete aktualisieren ===" if confirm "pacman -Syu ausfuehren?"; then sudo pacman -Syu else log "System-Update uebersprungen." fi if command -v paru &>/dev/null; then if confirm "AUR-Pakete aktualisieren (paru -Sua)?"; then paru -Sua else log "AUR-Update uebersprungen." fi fi # --- 3. Fehlende Pakete nachinstallieren --- log "=== Paketlisten abgleichen ===" if [[ -f "$OFFICIAL_PACKAGES" ]]; then MISSING_OFFICIAL=$(comm -23 <(read_packages "$OFFICIAL_PACKAGES" | sort) <(pacman -Qqe | sort) || true) if [[ -n "$MISSING_OFFICIAL" ]]; then log "Fehlende offizielle Pakete:" echo "$MISSING_OFFICIAL" if confirm "Installieren?"; then # shellcheck disable=SC2086 sudo pacman -S --needed --noconfirm $MISSING_OFFICIAL fi else log "Alle offiziellen Pakete installiert." fi fi if [[ -f "$AUR_PACKAGES" ]] && command -v paru &>/dev/null; then MISSING_AUR=$(comm -23 <(read_packages "$AUR_PACKAGES" | sort) <(pacman -Qqe | sort) || true) if [[ -n "$MISSING_AUR" ]]; then log "Fehlende AUR-Pakete:" echo "$MISSING_AUR" if confirm "Installieren?"; then # shellcheck disable=SC2086 paru -S --needed --noconfirm $MISSING_AUR fi else log "Alle AUR-Pakete installiert." fi fi # --- 4. Defaults aktualisieren --- log "=== Defaults aktualisieren ===" # XDG Defaults CHANGED_XDG=false if ! diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' &>/dev/null 2>&1; then CHANGED_XDG=true fi if $CHANGED_XDG; then log "XDG-Defaults haben sich geaendert." diff -rq "$DEFAULTS_DIR/xdg/" /etc/xdg/ --exclude='*.pyc' 2>/dev/null | head -20 || true echo "" if confirm "XDG-Defaults nach /etc/xdg/ deployen?"; then sudo cp -r "$DEFAULTS_DIR/xdg/"* /etc/xdg/ log "XDG-Defaults aktualisiert." fi else log "XDG-Defaults sind aktuell." fi # Binaries CHANGED_BIN=false for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do name=$(basename "$bin") if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then CHANGED_BIN=true break fi done if $CHANGED_BIN; then log "Moonarch-Binaries haben sich geaendert." for bin in "$DEFAULTS_DIR/bin/moonarch-"*; do name=$(basename "$bin") if ! cmp -s "$bin" "/usr/local/bin/$name" 2>/dev/null; then log " ~ $name" fi done if confirm "Binaries nach /usr/local/bin/ deployen?"; then sudo install -m 755 "$DEFAULTS_DIR/bin/moonarch-"* /usr/local/bin/ log "Binaries aktualisiert." fi else log "Binaries sind aktuell." fi # Zsh if ! cmp -s "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch 2>/dev/null; then log "Zsh-Defaults haben sich geaendert." if confirm "Zsh-Defaults aktualisieren?"; then sudo cp "$DEFAULTS_DIR/shell/zshrc" /etc/zsh/zshrc.moonarch log "Zsh-Defaults aktualisiert." fi else log "Zsh-Defaults sind aktuell." fi # --- 5. Verwaiste Pakete --- log "=== Verwaiste Pakete ===" ORPHANS=$(pacman -Qdtq 2>/dev/null || true) if [[ -n "$ORPHANS" ]]; then log "Verwaiste Pakete gefunden:" echo "$ORPHANS" if confirm "Entfernen?"; then # shellcheck disable=SC2086 sudo pacman -Rsn --noconfirm $ORPHANS fi else log "Keine verwaisten Pakete." fi # --- Fertig --- log "" log "============================================" log " Moonarch Update abgeschlossen!" log "============================================"