vitorpy's Dotfiles
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}"