199 lines
6.2 KiB
Bash
Executable File
199 lines
6.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
#------------------------------------------
|
|
# Color helpers (printf-safe, no tput)
|
|
#------------------------------------------
|
|
RED="\033[0;31m"
|
|
GREEN="\033[0;32m"
|
|
YELLOW="\033[0;33m"
|
|
CYAN="\033[0;36m"
|
|
GRAY="\033[0;37m"
|
|
BOLD="\033[1m"
|
|
RESET="\033[0m"
|
|
|
|
# Disable colors if output is not a terminal
|
|
if [ ! -t 1 ]; then
|
|
RED="" GREEN="" YELLOW="" CYAN="" GRAY="" BOLD="" RESET=""
|
|
fi
|
|
|
|
color_yellow() { printf "%b%s%b\n" "$YELLOW" "$*" "$RESET"; }
|
|
color_cyan() { printf "%b%s%b\n" "$CYAN" "$*" "$RESET"; }
|
|
color_red() { printf "%b%s%b\n" "$RED" "$*" "$RESET"; }
|
|
color_green() { printf "%b%s%b\n" "$GREEN" "$*" "$RESET"; }
|
|
color_gray() { printf "%b%s%b\n" "$GRAY" "$*" "$RESET"; }
|
|
|
|
#------------------------------------------
|
|
# Use exported variables from main detection script
|
|
#------------------------------------------
|
|
OS="${DETECTED_OS}"
|
|
DDE="${DETECTED_DE}"
|
|
DE="${SELECTED_DE}"
|
|
TWM="${SELECTED_TWM}"
|
|
INSTALL_LEVEL="${INSTALL_LEVEL}"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
echo
|
|
color_cyan "Starting Fedora setup..."
|
|
echo
|
|
color_gray "DE: $DE, TWM: $TWM, Install Level: $INSTALL_LEVEL"
|
|
|
|
#------------------------------------------
|
|
# Helper functions
|
|
#------------------------------------------
|
|
install_packages() { sudo dnf install -y "$@"; }
|
|
is_package_installed() { rpm -q "$@" &>/dev/null; }
|
|
|
|
remove_packages() {
|
|
local packages_to_remove=()
|
|
for pkg in "$@"; do
|
|
if is_package_installed "$pkg"; then
|
|
packages_to_remove+=("$pkg")
|
|
fi
|
|
done
|
|
|
|
if [ ${#packages_to_remove[@]} -gt 0 ]; then
|
|
color_cyan "Removing packages: ${packages_to_remove[*]}"
|
|
sudo dnf remove -y "${packages_to_remove[@]}"
|
|
fi
|
|
}
|
|
|
|
#------------------------------------------
|
|
# 0. Ensure base is ready for installation
|
|
#------------------------------------------
|
|
if ! command -v curl >/dev/null 2>&1; then
|
|
color_yellow "curl is not installed. Installing..."
|
|
install_packages curl
|
|
fi
|
|
|
|
#------------------------------------------
|
|
# 1. Update and Enable Repos
|
|
#------------------------------------------
|
|
color_cyan "Optimizing DNF for speed..."
|
|
|
|
# 1. Enable fastest mirror (lowest latency)
|
|
# 2. Increase parallel downloads (allows downloading multiple packages at once)
|
|
# 3. Set a minimum rate to drop slow mirrors automatically
|
|
# $. Set dnf to set YES as default instead of NO
|
|
sudo dnf config-manager setopt fastestmirror=1
|
|
sudo dnf config-manager setopt max_parallel_downloads=20
|
|
sudo dnf config-manager setopt defaultyes=True
|
|
|
|
color_green "DNF optimized. Refreshing metadata..."
|
|
sudo dnf makecache --refresh
|
|
|
|
color_cyan "Enabling RPM Fusion repositories for Fedora $(rpm -E %fedora)..."
|
|
|
|
# Define the version variable for readability
|
|
FEDORA_VER=$(rpm -E %fedora)
|
|
|
|
color_yellow "Checking for updates and sources..."
|
|
sudo dnf check-update || true
|
|
|
|
# Check if flatpak is installed, if not, install it
|
|
if ! command -v flatpak &> /dev/null; then
|
|
color_yellow "Flatpak not found. Installing..."
|
|
sudo dnf install -y flatpak
|
|
fi
|
|
|
|
color_cyan "Enabling Flathub..."
|
|
# Using --if-not-exists is good practice to prevent errors on re-runs
|
|
sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
|
|
|
sudo dnf install -y \
|
|
"https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-${FEDORA_VER}.noarch.rpm" \
|
|
"https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-${FEDORA_VER}.noarch.rpm"
|
|
|
|
color_cyan "Enabling full Flathub support..."
|
|
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
|
|
|
# Update the system
|
|
color_gray "Updating the system"
|
|
echo
|
|
sudo dnf update -y
|
|
|
|
#------------------------------------------
|
|
# 3. Detected OS / DE / TWM info
|
|
#------------------------------------------
|
|
color_yellow "Detected OS / Desktop Environment / Tiling Window Manager"
|
|
echo
|
|
color_gray "Installing OS-specific packages..."
|
|
color_gray "Selected DE:" "$DE"
|
|
color_gray "Selected TWM:" "$TWM"
|
|
color_gray "Installation Level:" "$INSTALL_LEVEL"
|
|
|
|
#------------------------------------------
|
|
# 4. Desktop Environment installation
|
|
#------------------------------------------
|
|
case "$DE" in
|
|
xfce|plasma|gnome)
|
|
color_yellow "Preparing to install" "$DE"
|
|
SCRIPT_NAME="$SCRIPT_DIR/${OS}-${DE}.sh"
|
|
if [[ -f "$SCRIPT_NAME" ]]; then
|
|
color_cyan "Running" "$SCRIPT_NAME"
|
|
bash "$SCRIPT_NAME"
|
|
else
|
|
color_red "Error:" "$SCRIPT_NAME" "not found!"
|
|
exit 1
|
|
fi
|
|
;;
|
|
none)
|
|
color_gray "No Desktop Environment selected, skipping DE installation."
|
|
;;
|
|
esac
|
|
|
|
#------------------------------------------
|
|
# 5. Tiling Window Manager installation
|
|
#------------------------------------------
|
|
case "$TWM" in
|
|
chadwm|hyprland|niri)
|
|
color_yellow "Installing" "$TWM"
|
|
SCRIPT_NAME="$SCRIPT_DIR/${OS}-${TWM}.sh"
|
|
if [[ -f "$SCRIPT_NAME" ]]; then
|
|
color_cyan "Running" "$SCRIPT_NAME"
|
|
bash "$SCRIPT_NAME"
|
|
else
|
|
color_red "Error:" "$SCRIPT_NAME" "not found!"
|
|
exit 1
|
|
fi
|
|
;;
|
|
none)
|
|
color_gray "No tiling window manager selected, skipping TWM installation."
|
|
;;
|
|
esac
|
|
|
|
#------------------------------------------
|
|
# 6. Installation level handling
|
|
#------------------------------------------
|
|
case "$INSTALL_LEVEL" in
|
|
minimal|full|workstation|server)
|
|
color_cyan "Installation level:" "$INSTALL_LEVEL"
|
|
SCRIPT_NAME="$SCRIPT_DIR/${OS}-${INSTALL_LEVEL}.sh"
|
|
if [[ -f "$SCRIPT_NAME" ]]; then
|
|
color_cyan "Running" "$SCRIPT_NAME"
|
|
bash "$SCRIPT_NAME"
|
|
else
|
|
color_red "Error:" "$SCRIPT_NAME" "not found!"
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
color_green "Fedora setup complete."
|
|
color_red "The installation has finished. A reboot is recommended."
|
|
# Reboots are dangerous to automate; we use a shorter timeout and default to No
|
|
if read -t 10 -rp "Reboot now? [y/N]: " reboot_choice; then
|
|
case "${reboot_choice,,}" in
|
|
y|yes)
|
|
color_red "Rebooting now."
|
|
sudo reboot
|
|
;;
|
|
*)
|
|
color_yellow "Skipping reboot."
|
|
exit 0
|
|
;;
|
|
esac
|
|
else
|
|
color_yellow "No input detected. Skipping reboot for safety."
|
|
exit 0
|
|
fi |