#!/usr/bin/env bash set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { local level="${2:-info}" local color="$GREEN" local label="[LOG]" case "$level" in error) color="$RED" label="[ERROR]" ;; warning) color="$YELLOW" label="[WARN]" ;; esac echo -e "${color}${label}${NC} $1" } require_root() { if [[ $EUID -ne 0 ]]; then log "This script must be run as root or with sudo." error exit 1 fi } prompt_yes_no() { local answer prompt prompt=$1 while true; do read -r -p "$prompt (y/n): " answer case "${answer,,}" in y|yes) return 0 ;; n|no) return 1 ;; *) echo "Please answer y or n." ;; esac done } has_package() { local pkg pkg=$1 pacman -Qq "$pkg" >/dev/null 2>&1 } build_package_list() { local -a add_packages=() remove_packages=() base_packages=("$@") local raw_add raw_remove echo "The default packages set to be installed:" printf ' - %s\n' "${base_packages[@]}" echo read -r -p "Enter additional packages to install (space-separated) or press Enter to continue: " raw_add read -r -p "Enter packages to remove from the list (space-separated) or press Enter to continue: " raw_remove echo if [[ -n "$raw_add" ]]; then read -r -a add_packages <<< "$raw_add" fi if [[ -n "$raw_remove" ]]; then read -r -a remove_packages <<< "$raw_remove" fi local -A selected=() local pkg for pkg in "${base_packages[@]}"; do selected["$pkg"]=1 done for pkg in "${add_packages[@]}"; do selected["$pkg"]=1 done for pkg in "${remove_packages[@]}"; do unset "selected[$pkg]" done BASE_FINAL_PACKAGES=() for pkg in "${!selected[@]}"; do BASE_FINAL_PACKAGES+=("$pkg") done mapfile -t BASE_FINAL_PACKAGES < <(printf '%s\n' "${BASE_FINAL_PACKAGES[@]}" | sort -u) } detect_nvidia_package() { # FIX: The proprietary 'nvidia' package no longer exists in official repos. # Arch now provides nvidia-open as the standard driver for Turing+ GPUs (GTX 16xx, RTX 20xx+). # Fall back to nvidia-open-dkms if using a non-standard kernel. if pacman -Si nvidia-open &>/dev/null; then echo "nvidia-open" elif pacman -Si nvidia-open-dkms &>/dev/null; then echo "nvidia-open-dkms" else log "Could not find nvidia-open or nvidia-open-dkms in repos." warning log "You may need to install GPU drivers manually." warning echo fi } enable_nvidia_tweaks() { local nvidia_pkg="$1" # Enable DRM kernel modesetting for NVIDIA echo "options nvidia_drm modeset=1" > /etc/modprobe.d/nvidia-drm.conf # Pacman hook to rebuild initramfs when NVIDIA driver or kernel is updated mkdir -p /etc/pacman.d/hooks cat > /etc/pacman.d/hooks/nvidia.hook <