From 3a4845d99909e076174dd1d8725542ac869c9bf9 Mon Sep 17 00:00:00 2001 From: Jacob Schantli Date: Tue, 21 Apr 2026 19:34:31 -0700 Subject: [PATCH] Add bazzite-postinstall.sh Adding a script to install my packages in Bazzite (Atomic Fedora). This is a WIP and is not done. --- bazzite-postinstall.sh | 435 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 435 insertions(+) create mode 100644 bazzite-postinstall.sh diff --git a/bazzite-postinstall.sh b/bazzite-postinstall.sh new file mode 100644 index 0000000..a43c827 --- /dev/null +++ b/bazzite-postinstall.sh @@ -0,0 +1,435 @@ +#!/bin/bash + +# Post install script for Bazzite (Fedora Atomic) +# Author: Jacob Schantli +# Version: 0.1 + +# ----------------------------------------------------------------------------- +# Global Configuration +# ----------------------------------------------------------------------------- + +# Note: Packages like Steam, Lutris, Git, and Distrobox are pre-installed on Bazzite. +SYSTEM_PACKAGES=( + "gnome-tweaks" + "btop" + "fastfetch" + "jstest-gtk" + "yaru-icon-theme" + "pipx" + "bash-completion" + "bat" + "tree" + "fzf" + "syncthing" +) + +FLATPAK_PACKAGES=( + "com.discordapp.Discord" + "com.github.tchx84.Flatseal" + "net.nokyan.Resources" + "com.mattjakeman.ExtensionManager" + "io.github.realmazharhussain.GdmSettings" + "com.ranfdev.DistroShelf" + "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.usebottles.bottles" + "com.bambulab.BambuStudio" + "com.collaboraoffice.Office" + "org.mozilla.Thunderbird" + "io.github.martchus.syncthingtray" + "io.github.kolunmi.Bazaar" +) + +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" +) + +# ----------------------------------------------------------------------------- +# 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 +} + +# ----------------------------------------------------------------------------- +# Installation Functions +# ----------------------------------------------------------------------------- + +install_fonts() { + log_info "----------------------------------------------------" + log_info "Installing Microsoft Core Fonts and Meslo Nerd Font." + log_info "----------------------------------------------------" + + log_info "Updating system (rpm-ostree upgrade)..." + sudo rpm-ostree upgrade + check_status "System upgrade" "non-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-ostree install 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_software() { + log_info "----------------------------------------------------" + log_info "Installing most used software." + log_info "----------------------------------------------------" + + log_info "Installing System packages via rpm-ostree..." + local PKGS_TO_INSTALL=() + for pkg in "${SYSTEM_PACKAGES[@]}"; do + if rpm -q "$pkg" > /dev/null 2>&1; then + log_info "$pkg is already installed." + else + PKGS_TO_INSTALL+=("$pkg") + fi + done + + if [ ${#PKGS_TO_INSTALL[@]} -gt 0 ]; then + log_info "Installing: ${PKGS_TO_INSTALL[*]}" + sudo rpm-ostree install ${PKGS_TO_INSTALL[@]} + check_status "System packages installation" "non-critical" + else + log_info "All system packages are already installed." + fi + + # Ensure flatpak is set up + if ! command -v flatpak &> /dev/null; then + log_info "Flatpak not found. Installing..." + sudo rpm-ostree install 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" + + 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 + + log_info "----------------------------------------------------" + log_info "Installing Homebrew and Gemini CLI" + log_info "----------------------------------------------------" + + # Install Homebrew + if command_exists brew; then + log_info "Homebrew already installed." + else + log_info "Installing Homebrew..." + # Using NONINTERACTIVE=1 to avoid prompts during brew install + NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Add brew to path for the current session + if [ -d "/home/linuxbrew/.linuxbrew/bin" ]; then + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + elif [ -d "$HOME/.linuxbrew/bin" ]; then + eval "$($HOME/.linuxbrew/bin/brew shellenv)" + fi + + check_status "Homebrew installation" "non-critical" + fi + + # Install Gemini CLI + log_info "Installing gemini-cli via Homebrew..." + brew install gemini-cli + check_status "gemini-cli installation" "non-critical" + + log_info "----------------------------------------------------" + log_info "Installing 1Password" + log_info "----------------------------------------------------" + if rpm -q 1password > /dev/null 2>&1; then + log_info "1Password already installed." + else + log_info "Downloading and installing 1Password..." + sudo rpm-ostree install https://downloads.1password.com/linux/rpm/stable/x86_64/1password-latest.rpm + check_status "1Password installation" "non-critical" + fi +} + +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 to ~/.local/bin..." + # Bazzite's /usr/local/bin might be read-only so we install into user directory + mkdir -p ~/.local/bin + curl -sSL https://starship.rs/install.sh | sh -s -- -b ~/.local/bin -y + check_status "Starship installation" "non-critical" + fi + + # Install FZF (Fallback if not installed via base system) + 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 if config.jsonc exists in the cloned repo + if [ -f "$GITPATH/config.jsonc" ]; then + log_info "Linking config.jsonc..." + mkdir -p "$HOME/.config/fastfetch/" + ln -svf "$GITPATH/config.jsonc" "$HOME/.config/fastfetch/config.jsonc" + else + log_warn "$GITPATH/config.jsonc not found! Skipping fastfetch 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 via rpm-ostree..." + sudo rpm-ostree install 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" + + 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 " Bazzite Post-Install Script - Main Menu" + echo "====================================================" + echo "1. Install Everything" + echo "2. Install Fonts" + echo "3. Install Software (rpm-ostree & Flatpak)" + echo "4. Install LinuxToys" + echo "5. Install Shell Environment (Starship, MyBash)" + echo "6. Install GNOME Extensions" + echo "0. Exit" + echo "====================================================" + read -p "Enter your choice [0-6]: " choice +} + +# ----------------------------------------------------------------------------- +# Main Execution +# ----------------------------------------------------------------------------- + +log_info "Starting Post-install script for Bazzite..." +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) + install_fonts + install_software + install_linuxtoys + install_shell_env + install_gnome_extensions + log_info "All tasks completed successfully!" + log_warn "IMPORTANT: You MUST REBOOT your system to apply rpm-ostree package installations!" + break + ;; + 2) install_fonts ;; + 3) install_software ;; + 4) install_linuxtoys ;; + 5) install_shell_env ;; + 6) 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_warn "If you installed system packages via rpm-ostree, PLEASE REBOOT now." +log_info "----------------------------------------------------" \ No newline at end of file