Files
Fedora-PIS/backup-script.sh
T
2026-04-07 18:37:02 -07:00

450 lines
15 KiB
Bash

#!/bin/bash
# Post install script for Fedora
# Author: Jacob Schantli
# Version: 0.8
# -----------------------------------------------------------------------------
# Helper Functions
# -----------------------------------------------------------------------------
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Check if the last command was successful
check_status() {
if [ $? -eq 0 ]; then
log_info "$1 successful."
else
log_error "$1 failed."
# If the second argument is "critical", exit the script
if [ "$2" == "critical" ]; then
log_error "Critical error encountered. Exiting."
exit 1
fi
fi
}
# Append text to a file if it doesn't already exist
append_to_file_if_missing() {
local file="$1"
local text="$2"
local description="$3"
local use_sudo="$4"
if grep -Fq "$text" "$file"; then
log_warn "$description already exists in $file. Skipping."
else
if [ "$use_sudo" == "true" ]; then
echo "$text" | sudo tee -a "$file" > /dev/null
else
echo "$text" >> "$file"
fi
log_info "Added $description to $file."
fi
}
# -----------------------------------------------------------------------------
# Installation Functions
# -----------------------------------------------------------------------------
optimize_dnf() {
log_info "----------------------------------------------------"
log_info "Modifying /etc/dnf/dnf.conf for faster downloads."
log_info "----------------------------------------------------"
DNF_CONF="/etc/dnf/dnf.conf"
if [ -f "$DNF_CONF" ]; then
append_to_file_if_missing "$DNF_CONF" "max_parallel_downloads=10" "max_parallel_downloads" "true"
append_to_file_if_missing "$DNF_CONF" "defaultyes=True" "defaultyes" "true"
append_to_file_if_missing "$DNF_CONF" "keepcache=True" "keepcache" "true"
else
log_error "$DNF_CONF not found!"
fi
sleep 1
}
install_fonts() {
log_info "----------------------------------------------------"
log_info "Installing Microsoft Core Fonts and Meslo Nerd Font."
log_info "----------------------------------------------------"
log_info "Updating system and installing prerequisites..."
sudo dnf upgrade --refresh -y
check_status "System upgrade" "critical"
sudo dnf install -y curl cabextract xorg-x11-font-utils fontconfig wget
check_status "Prerequisites installation" "critical"
log_info "Installing Microsoft Core Fonts..."
if rpm -q msttcore-fonts-installer > /dev/null 2>&1; then
log_warn "Microsoft Core Fonts already installed."
else
sudo rpm -i https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm
check_status "Microsoft Core Fonts installation" "non-critical"
fi
log_info "Installing Meslo Nerd Font..."
FONT_NAME="MesloLGS Nerd Font Mono"
if fc-list :family | grep -iq "$FONT_NAME"; then
log_info "Font '$FONT_NAME' is already installed."
else
log_info "Installing font '$FONT_NAME'..."
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
FONT_DIR="$HOME/.local/share/fonts"
TEMP_DIR=$(mktemp -d)
wget -O "$TEMP_DIR/$FONT_NAME.zip" "$FONT_URL"
unzip "$TEMP_DIR/$FONT_NAME.zip" -d "$TEMP_DIR"
mkdir -p "$FONT_DIR/$FONT_NAME"
mv "$TEMP_DIR"/*.ttf "$FONT_DIR/$FONT_NAME/"
fc-cache -fv
rm -rf "$TEMP_DIR"
check_status "Meslo Nerd Font installation" "non-critical"
fi
}
install_repos() {
log_info "----------------------------------------------------"
log_info "Adding RPM Fusion repositories."
log_info "----------------------------------------------------"
sudo dnf install -y \
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
check_status "RPM Fusion repositories installation" "non-critical"
}
install_software() {
log_info "----------------------------------------------------"
log_info "Installing most used software."
log_info "----------------------------------------------------"
DNF_PACKAGES=(
"gnome-tweaks"
"steam"
"lutris"
"btop"
"fastfetch"
"jstest-gtk"
"yaru-icon-theme"
"distrobox"
"pipx"
"bash-completion"
"tar"
"bat"
"tree"
"unzip"
"git"
"fzf"
)
log_info "Installing DNF packages..."
sudo dnf install -y "${DNF_PACKAGES[@]}"
check_status "DNF packages installation" "non-critical"
# Ensure flatpak is set up
if ! command -v flatpak &> /dev/null; then
log_info "Flatpak not found. Installing..."
sudo dnf install -y flatpak
fi
log_info "Adding Flathub remote..."
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
check_status "Flathub remote add" "non-critical"
FLATPAK_PACKAGES=(
"com.discordapp.Discord"
"com.github.tchx84.Flatseal"
"net.nokyan.Resources"
"com.mattjakeman.ExtensionManager"
"io.github.realmazharhussain.GdmSettings"
"io.github.dvlv.boxbuddyrs"
"it.mijorus.gearlever"
"io.github.fastrizwaan.WineZGUI"
"com.vysp3r.ProtonPlus"
"io.missioncenter.MissionCenter"
"io.github.peazip.PeaZip"
"app.devsuite.Ptyxis"
"re.sonny.Junction"
"com.github.rafostar.Clapper"
"io.github.flattool.Ignition"
"io.github.swordpuffin.rewaita"
"page.tesk.Refine"
"io.gitlab.adhami3310.Converter"
"com.bitwarden.desktop"
"com.usebottles.bottles"
"com.ulaa.Ulaa"
"com.bambulab.BambuStudio"
"com.collaboraoffice.Office"
"org.mozilla.Thunderbird"
)
log_info "Installing Flatpak packages..."
for app in "${FLATPAK_PACKAGES[@]}"; do
log_info "Installing $app..."
flatpak install flathub -y "$app"
check_status "Flatpak $app" "non-critical"
done
}
install_cachyos() {
log_info "----------------------------------------------------"
log_info "Installing CachyOS kernel"
log_info "----------------------------------------------------"
sudo dnf copr enable -y bieszczaders/kernel-cachyos
check_status "Enabling CachyOS Copr" "non-critical"
sudo dnf install -y kernel-cachyos kernel-cachyos-devel-matched
check_status "CachyOS Kernel installation" "non-critical"
log_info "Installing CachyOS addons"
sudo dnf copr enable -y bieszczaders/kernel-cachyos-addons
check_status "Enabling CachyOS Addons Copr" "non-critical"
sudo dnf swap -y zram-generator-defaults cachyos-settings
sudo dracut -f
sudo dnf -y install scx-scheds scx-tools scx-manager ananicy-cpp
check_status "CachyOS addons installation" "non-critical"
}
install_linuxtoys() {
log_info "----------------------------------------------------"
log_info "Installing LinuxToys"
log_info "----------------------------------------------------"
curl -fsSL https://linux.toys/install.sh | bash
check_status "LinuxToys installation" "non-critical"
}
install_shell_env() {
log_info "----------------------------------------------------"
log_info "Installing Shell Environment (Starship, FZF, Zoxide, MyBash)"
log_info "----------------------------------------------------"
# Install Starship
if command_exists starship; then
log_info "Starship already installed."
else
log_info "Installing Starship..."
curl -sSL https://starship.rs/install.sh | sudo sh
check_status "Starship installation" "non-critical"
fi
# Install FZF (Fallback if not installed via DNF)
if ! command_exists fzf; then
log_info "Installing FZF via git..."
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install --all
fi
# Install Zoxide
if command_exists zoxide; then
log_info "Zoxide already installed."
else
log_info "Installing Zoxide..."
curl -sSL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
check_status "Zoxide installation" "non-critical"
fi
# Clone MyBash
log_info "Cloning MyBash configuration..."
GITPATH="$HOME/.local/share/mybash"
if [ -d "$GITPATH" ]; then
rm -rf "$GITPATH"
fi
mkdir -p "$HOME/.local/share"
if git clone https://gitea.schantli.ca/jschantli/mybash.git "$GITPATH"; then
log_info "MyBash cloned successfully."
# Link Config
log_info "Linking configuration files..."
OLD_BASHRC="$HOME/.bashrc"
# Check if .bashrc exists in the cloned repo
if [ -f "$GITPATH/.bashrc" ]; then
if [ -e "$OLD_BASHRC" ] && [ ! -e "$HOME/.bashrc.bak" ]; then
log_info "Backing up .bashrc to .bashrc.bak..."
mv "$OLD_BASHRC" "$HOME/.bashrc.bak"
fi
log_info "Linking new .bashrc..."
ln -svf "$GITPATH/.bashrc" "$HOME/.bashrc"
# Ensure Starship is initialized in the new .bashrc
if ! grep -q "starship init bash" "$HOME/.bashrc"; then
log_warn ".bashrc does not contain starship init. Appending it..."
echo 'eval "$(starship init bash)"' >> "$HOME/.bashrc"
fi
else
log_error "$GITPATH/.bashrc not found! Skipping .bashrc linking."
fi
# Check if starship.toml exists in the cloned repo
if [ -f "$GITPATH/starship.toml" ]; then
log_info "Linking starship.toml..."
mkdir -p "$HOME/.config"
ln -svf "$GITPATH/starship.toml" "$HOME/.config/starship.toml"
else
log_warn "$GITPATH/starship.toml not found! Skipping Starship config linking."
fi
check_status "Linking config files" "non-critical"
else
log_error "Failed to clone MyBash repository. Skipping shell configuration."
fi
}
install_gnome_extensions() {
log_info "----------------------------------------------------"
log_info "Installing GNOME extensions"
log_info "----------------------------------------------------"
# Ensure pipx is installed and path is set
if ! command -v pipx &> /dev/null; then
log_info "pipx not found. Installing..."
sudo dnf install -y pipx
pipx ensurepath
fi
# Install gnome-extensions-cli
log_info "Installing gnome-extensions-cli..."
pipx install gnome-extensions-cli --system-site-packages
check_status "gnome-extensions-cli installation" "non-critical"
# Define the tool path explicitly to avoid 'pipx run' overhead/warnings
EXTENSION_TOOL="$HOME/.local/bin/gnome-extensions-cli"
GNOME_EXTENSIONS=(
"dash-to-dock@micxgx.gmail.com"
"app-grid-wizard@mirzadeh.pro"
"appindicatorsupport@rgcjonas.gmail.com"
"blur-my-shell@aunetx"
"caffeine@patapon.info"
"dynamic-music-pill@andbal"
"gnome-fuzzy-app-search@gnome-shell-extensions.Czarlie.gitlab.com"
"IP-Finder@linxgem33.com"
"lan-ip-address@mrhuber.com"
"update-extension@purejava.org"
"user-theme@gnome-shell-extensions.gcampax.github.com"
)
log_info "Installing GNOME extensions..."
log_info "NOTE: A popup may appear asking you to confirm installation for each extension."
log_info "If the extension is already installed, no popup will appear."
for extension in "${GNOME_EXTENSIONS[@]}"; do
log_info "Processing $extension..."
# Install (using the direct binary path)
"$EXTENSION_TOOL" install "$extension"
# Attempt to enable the extension (in case it's installed but disabled)
log_info "Ensuring $extension is enabled..."
gnome-extensions enable "$extension"
# Prompt user to press Enter to continue
read -p "Press Enter to continue (if a popup appeared, confirm it first)..."
check_status "GNOME Extension $extension" "non-critical"
done
}
# -----------------------------------------------------------------------------
# Main Menu
# -----------------------------------------------------------------------------
show_menu() {
clear
echo "===================================================="
echo " Fedora Post-Install Script - Main Menu"
echo "===================================================="
echo "1. Install Everything (Recommended)"
echo "2. Optimize DNF"
echo "3. Install Fonts"
echo "4. Add Repositories (RPM Fusion)"
echo "5. Install Software (DNF & Flatpak)"
echo "6. Install CachyOS Kernel"
echo "7. Install LinuxToys"
echo "8. Install Shell Environment (Starship, MyBash)"
echo "9. Install GNOME Extensions"
echo "0. Exit"
echo "===================================================="
read -p "Enter your choice [0-9]: " choice
}
# -----------------------------------------------------------------------------
# Main Execution
# -----------------------------------------------------------------------------
log_info "Starting Post-install script for Fedora..."
sleep 2
# Ensure sudo permissions are available upfront
sudo -v
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
while true; do
show_menu
case $choice in
1)
optimize_dnf
install_fonts
install_repos
install_software
install_cachyos
install_linuxtoys
install_shell_env
install_gnome_extensions
log_info "All tasks completed successfully!"
break
;;
2) optimize_dnf ;;
3) install_fonts ;;
4) install_repos ;;
5) install_software ;;
6) install_cachyos ;;
7) install_linuxtoys ;;
8) install_shell_env ;;
9) install_gnome_extensions ;;
0)
log_info "Exiting..."
exit 0
;;
*)
log_error "Invalid option. Please try again."
sleep 2
;;
esac
if [ "$choice" != "1" ]; then
read -p "Press Enter to return to the main menu..."
fi
done
log_info "----------------------------------------------------"
log_info "Post-install script completed successfully!"
log_info "Please restart your shell or run 'source ~/.bashrc' to see the changes."
log_info "----------------------------------------------------"