vitorpy's Dotfiles
at main 149 lines 4.1 kB view raw
1#!/bin/bash 2# Bootstrap script for server installations 3# Installs packages from packages.txt but skips desktop/GUI applications 4 5set -e 6 7SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 8PACKAGES_FILE="$SCRIPT_DIR/packages.txt" 9 10# Color output 11GREEN='\033[0;32m' 12YELLOW='\033[1;33m' 13RED='\033[0;31m' 14NC='\033[0m' # No Color 15 16echo -e "${GREEN}=== Server Bootstrap Script ===${NC}" 17echo "Reading packages from: $PACKAGES_FILE" 18echo "" 19 20# Packages to install 21PACMAN_PACKAGES=() 22AUR_PACKAGES=() 23 24# Sections to skip (desktop/GUI related) 25SKIP_SECTIONS=( 26 "# Hyprland ecosystem" 27 "# GNOME Apps" 28 "# Sway ecosystem" 29 "# Communication & Productivity" 30 "# Theming & Fonts" 31 "# Multimedia & Hardware Acceleration" 32) 33 34# Individual packages to skip (GUI apps in other sections) 35SKIP_PACKAGES=( 36 "firefox" 37 "chromium" 38 "bitwarden" # GUI version, keep bitwarden-cli 39 "nautilus" 40 "ghostty" 41 "vlc" 42 "vscodium-bin" 43 "jan-appimage" 44 "veracrypt" 45 "framework-tool-tui" 46) 47 48skip_this_section=false 49 50while IFS= read -r line || [ -n "$line" ]; do 51 # Skip empty lines and comments 52 [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && { 53 # Check if this is a section header we should skip 54 for section in "${SKIP_SECTIONS[@]}"; do 55 if [[ "$line" == "$section"* ]]; then 56 skip_this_section=true 57 echo -e "${YELLOW}Skipping section: $line${NC}" 58 break 59 fi 60 done 61 62 # Reset skip flag on any new section that's not in skip list 63 if [[ "$line" =~ ^[[:space:]]*# ]] && [[ ! " ${SKIP_SECTIONS[@]} " =~ " ${line} " ]]; then 64 skip_this_section=false 65 fi 66 67 continue 68 } 69 70 # Skip if we're in a skipped section 71 [[ "$skip_this_section" == true ]] && continue 72 73 # Parse package line: "package-name | source" 74 if [[ "$line" =~ ^([^|]+)\|[[:space:]]*(pacman|aur|flatpak) ]]; then 75 package="${BASH_REMATCH[1]}" 76 source="${BASH_REMATCH[2]}" 77 78 # Trim whitespace 79 package=$(echo "$package" | xargs) 80 81 # Skip individual packages 82 skip=false 83 for skip_pkg in "${SKIP_PACKAGES[@]}"; do 84 if [[ "$package" == "$skip_pkg" ]]; then 85 skip=true 86 echo -e "${YELLOW}Skipping GUI package: $package${NC}" 87 break 88 fi 89 done 90 [[ "$skip" == true ]] && continue 91 92 # Skip flatpak packages on servers 93 if [[ "$source" == "flatpak" ]]; then 94 echo -e "${YELLOW}Skipping flatpak: $package${NC}" 95 continue 96 fi 97 98 # Add to appropriate array 99 if [[ "$source" == "pacman" ]]; then 100 PACMAN_PACKAGES+=("$package") 101 elif [[ "$source" == "aur" ]]; then 102 AUR_PACKAGES+=("$package") 103 fi 104 fi 105done < "$PACKAGES_FILE" 106 107echo "" 108echo -e "${GREEN}Packages to install:${NC}" 109echo " Pacman packages: ${#PACMAN_PACKAGES[@]}" 110echo " AUR packages: ${#AUR_PACKAGES[@]}" 111echo "" 112 113# Ask for confirmation 114read -p "Continue with installation? (y/N) " -n 1 -r 115echo 116if [[ ! $REPLY =~ ^[Yy]$ ]]; then 117 echo "Aborted." 118 exit 1 119fi 120 121# Update system first 122echo -e "${GREEN}Updating system...${NC}" 123sudo pacman -Syu --noconfirm 124 125# Install pacman packages 126if [ ${#PACMAN_PACKAGES[@]} -gt 0 ]; then 127 echo "" 128 echo -e "${GREEN}Installing pacman packages...${NC}" 129 sudo pacman -S --needed --noconfirm "${PACMAN_PACKAGES[@]}" || { 130 echo -e "${RED}Some pacman packages failed to install${NC}" 131 } 132fi 133 134# Install AUR packages (requires yay) 135if [ ${#AUR_PACKAGES[@]} -gt 0 ]; then 136 if command -v yay &> /dev/null; then 137 echo "" 138 echo -e "${GREEN}Installing AUR packages...${NC}" 139 yay -S --needed --noconfirm "${AUR_PACKAGES[@]}" || { 140 echo -e "${RED}Some AUR packages failed to install${NC}" 141 } 142 else 143 echo -e "${YELLOW}yay not found, skipping AUR packages${NC}" 144 echo "Install yay first or manually install: ${AUR_PACKAGES[*]}" 145 fi 146fi 147 148echo "" 149echo -e "${GREEN}=== Bootstrap complete! ===${NC}"