From 616039ef45bf1fea257cbf3fd874192d548695dc Mon Sep 17 00:00:00 2001 From: Zoness Date: Fri, 3 Apr 2026 15:11:25 -0500 Subject: [PATCH] Script rewrite for safety and Fedora 44 prep --- linux/fedora_setup.sh | 239 +++++++++++++++++++++++++++++++----------- 1 file changed, 178 insertions(+), 61 deletions(-) diff --git a/linux/fedora_setup.sh b/linux/fedora_setup.sh index ff0f7c5..fbbe87d 100755 --- a/linux/fedora_setup.sh +++ b/linux/fedora_setup.sh @@ -1,87 +1,204 @@ -#!/bin/bash +#!/usr/bin/env bash -# Fedora New Machine Setup Script -# Run as root or with sudo where needed -# Logs everything to setup.log +set -Eeuo pipefail -set -euo pipefail # Exit on error, undefined vars, pipe failures +LOGFILE="${HOME:-/root}/fedora-setup-$(date +%Y%m%d-%H%M%S).log" +exec > >(tee -a "$LOGFILE") 2>&1 -LOGFILE="$HOME/fedora-setup-$(date +%Y%m%d-%H%M%S).log" -exec &> >(tee -a "$LOGFILE") +echo "=== Fedora New Machine Setup Started at $(date --iso-8601=seconds) ===" -echo "=== Fedora New Machine Setup Started at $(date) ===" - -# Check if running as root -if [[ $EUID -ne 0 ]]; then - echo "Run this script with sudo for full functionality." +if [[ ${EUID:-$(id -u)} -eq 0 ]]; then + SUDO="" + REAL_USER="${SUDO_USER:-root}" + REAL_HOME="$(getent passwd "$REAL_USER" | cut -d: -f6)" +else + SUDO="sudo" + REAL_USER="$USER" + REAL_HOME="$HOME" fi -echo "Creating mount points..." -sudo mkdir -p /mnt/games /mnt/media -sudo systemctl daemon-reload +FEDORA_VER="$(rpm -E %fedora)" -echo "Installing RPM Fusion repos..." -sudo dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm +run() { + echo + echo ">>> $*" + "$@" +} -echo "Adding Signal repo..." -sudo dnf config-manager addrepo --from-repofile https://download.opensuse.org/repositories/network:im:signal/Fedora_$(rpm -E %fedora)/network:im:signal.repo +warn() { + echo "WARNING: $*" >&2 +} -echo "Enabling Flatpak..." -flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +have_cmd() { + command -v "$1" >/dev/null 2>&1 +} -echo "Upgrading system..." -sudo dnf upgrade -y +pkg_installed() { + rpm -q "$1" >/dev/null 2>&1 +} -echo "Installing multimedia codecs..." -sudo dnf swap ffmpeg-free ffmpeg --allowerasing -sudo dnf install -y mozilla-openh264 gstreamer1-plugins-bad-freeworld ffmpeg -sudo dnf update @multimedia --setopt="install_weak_deps=False" --exclude=PackageKit-gstreamer-plugin -sudo dnf install -y gstreamer1-plugins-{bad-freeworld,good,base} gstreamer1-plugin-openh264 lame* ffmpeg -sudo dnf group install -y multimedia sound-and-video --skip-unavailable +pkg_install() { + local to_install=() + local pkg -echo "Installing common apps..." -sudo dnf install -y davfs2 discord git hugo NetworkManager-openvpn openvpn -sudo dnf install -y oh-my-posh openrgb qbittorrent screenfetch signal-desktop steam thunderbird + for pkg in "$@"; do + if ! pkg_installed "$pkg"; then + to_install+=("$pkg") + fi + done -echo "Installing Flatpaks..." -flatpak install -y flathub org.signal.Signal com.bitwarden.desktop io.missioncenter.MissionCenter io.github.martinrotter.rssguard org.kde.konversation -flatpak install -y com.spotify.Client org.kde.konversation io.github.Archeb.opentrace + if ((${#to_install[@]} == 0)); then + echo "Packages already installed: $*" + return 0 + fi -echo "Installing fonts..." -sudo dnf install -y cascadia-fonts-all -sudo fc-cache -f -v + run $SUDO dnf install -y "${to_install[@]}" || warn "Some packages failed to install: ${to_install[*]}" +} -echo "Setting up VS Code repo..." -sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc -sudo tee /etc/yum.repos.d/vscode.repo > /dev/null </dev/null 2>&1; then + echo "Flatpak already installed: $ref" + else + run flatpak install -y flathub "$ref" || warn "Flatpak failed: $ref" + fi + done +} + +write_vscode_repo() { + run $SUDO rpm --import https://packages.microsoft.com/keys/microsoft.asc + run $SUDO tee /etc/yum.repos.d/vscode.repo >/dev/null <<'EOF' [code] name=Visual Studio Code baseurl=https://packages.microsoft.com/yumrepos/vscode enabled=1 -autorefresh=1 type=rpm-md gpgcheck=1 gpgkey=https://packages.microsoft.com/keys/microsoft.asc EOF +} -echo "Updating repos and installing VS Code..." -sudo dnf check-update -sudo dnf install -y code +echo "Detected Fedora version: $FEDORA_VER" +echo "Running as: ${REAL_USER}" -echo "=== Setup completed at $(date). Check $LOGFILE for full log. ===" +echo +echo "Creating mount points..." +run $SUDO mkdir -p /mnt/games /mnt/media -echo "" -echo "⚠️ WARNING: Mount Point Configuration Required ⚠️" -echo "" -echo "TODO: Add mount points to /etc/fstab with UUIDs for /mnt/games and /mnt/media." -echo " 1. Identify UUIDs: blkid | grep -E 'TYPE=\"ntfs\"'" -echo " 2. Edit /etc/fstab (backup first: sudo cp /etc/fstab /etc/fstab.bak)" -echo " 3. Add lines like:" -echo " UUID=XXXXXX-XXXX /mnt/games ntfs defaults,nofail,uid=1000,gid=1000,exec 0 0" -echo " UUID=YYYYYY-YYYY /mnt/media ntfs defaults,nofail,uid=1000,gid=1000 0 0" -echo " 4. Test: sudo mount -a" -echo " 5. Reboot to verify." -echo "" -echo "Use KDE Partition Manager for a GUI alternative." -echo "" -echo "⚠️ ⚠️" +if have_cmd systemctl; then + run $SUDO systemctl daemon-reload || true +fi + +echo +echo "Installing DNF tools..." +pkg_install dnf-plugins-core + +echo +echo "Installing RPM Fusion repos..." +run $SUDO dnf install -y \ + "https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-${FEDORA_VER}.noarch.rpm" \ + "https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-${FEDORA_VER}.noarch.rpm" \ + || warn "RPM Fusion install failed or repos may already exist" + +echo +echo "Enabling Flatpak + Flathub..." +pkg_install flatpak +run flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + +echo +echo "Upgrading system..." +run $SUDO dnf upgrade -y || warn "System upgrade encountered errors" + +echo +echo "Installing multimedia codecs..." +run $SUDO dnf swap -y ffmpeg-free ffmpeg --allowerasing || warn "ffmpeg swap failed" +run $SUDO dnf install -y \ + mozilla-openh264 \ + gstreamer1-plugins-bad-freeworld \ + ffmpeg \ + || warn "Codec package install failed" +run $SUDO dnf update -y @multimedia --setopt=install_weak_deps=False --exclude=PackageKit-gstreamer-plugin \ + || warn "Multimedia group update failed" + +echo +echo "Installing common RPM apps..." +pkg_install \ + git \ + hugo \ + NetworkManager-openvpn \ + openvpn \ + qbittorrent \ + steam \ + thunderbird \ + oh-my-posh \ + openrgb \ + screenfetch + +echo +echo "Installing fonts..." +pkg_install cascadia-fonts-all +run $SUDO fc-cache -f || true + +echo +echo "Setting up VS Code repo..." +write_vscode_repo +run $SUDO dnf makecache -y || warn "dnf makecache failed" +pkg_install code + +echo +echo "Installing optional RPM apps..." +pkg_install discord || warn "discord not available from enabled repos" + +echo +echo "Installing Flatpaks..." +flatpak_install \ + org.signal.Signal \ + com.bitwarden.desktop \ + io.missioncenter.MissionCenter \ + io.github.martinrotter.rssguard \ + org.kde.konversation \ + com.spotify.Client \ + io.github.Archeb.opentrace + +echo +echo "Setting ownership hint for /mnt/games..." +echo "After you mount the ext4 games partition, you may want:" +echo " sudo chown -R ${REAL_USER}:${REAL_USER} /mnt/games" + +cat <