mirror of
https://github.com/stornic56/debianito-post-install.git
synced 2026-09-13 21:52:36 +00:00
dual-gpu hardening & wireless robustness
- Protected apt repository writes across modules/repos.sh by adding `|| return 1` to `_write_deb822()` and `_write_classic()`, ensuring script continuation on failure instead of aborting under set -e. - Added idempotent backup restoration in restore_previous_repos() with `sudo cp ... || true` and `sudo rm ... || true` to prevent fatal errors during repository recovery operations. - Implemented rollback mechanism in migrate_to_branch() by wrapping _write_branch_sources() in a conditional check, restoring backup on failure and returning error code 1. - Hardened firmware installation flow in modules/firmware.sh with `|| true` guards on all apt commands (broadcom-sta-dkms, network firmware packages, backports/stable paths), preventing set -e aborts during package management. - Secured modprobe operations by adding `|| true` to wl module loading and blacklist file writes, ensuring wireless driver installation proceeds even if kernel module operations fail. - Added GPU tools installation protection in _helpers.sh with `|| true` guard on vainfo command execution after nvtop installation completes successfully. - Fixed NVIDIA Wayland configuration in modules/gpu/nvidia.sh by adding `|| return 1` to nvidia-wayland.conf tee operation, preventing silent failures when writing modprobe configuration files. - Implemented network warning notification before Broadcom wireless module removal to alert users of potential SSH disconnection during WiFi driver transitions. - Added broadcom blacklist file protection with `|| true` guard on modprobe.d/blacklist-broadcom.conf writes to prevent script termination on filesystem errors. - Standardized error handling patterns across all firmware and GPU modules, replacing direct command execution with conditional wrappers that maintain script continuity under failure conditions.
This commit is contained in:
+9
-8
@@ -207,7 +207,7 @@ _install_detected_firmware() {
|
|||||||
done
|
done
|
||||||
if [ ${#to_install[@]} -gt 0 ]; then
|
if [ ${#to_install[@]} -gt 0 ]; then
|
||||||
_run_cmd "Firmware" "sudo DEBIAN_FRONTEND=noninteractive apt install -y ${to_install[*]}" \
|
_run_cmd "Firmware" "sudo DEBIAN_FRONTEND=noninteractive apt install -y ${to_install[*]}" \
|
||||||
"Installing network firmware packages..."
|
"Installing network firmware packages..." || true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +247,7 @@ _handle_wireless() {
|
|||||||
# --- Persist blacklist of conflicting modules ---
|
# --- Persist blacklist of conflicting modules ---
|
||||||
local blacklist_conf="/etc/modprobe.d/blacklist-broadcom.conf"
|
local blacklist_conf="/etc/modprobe.d/blacklist-broadcom.conf"
|
||||||
local blacklist_content="blacklist b43\nblacklist b43legacy\nblacklist brcmsmac\nblacklist bcma\nblacklist ssb"
|
local blacklist_content="blacklist b43\nblacklist b43legacy\nblacklist brcmsmac\nblacklist bcma\nblacklist ssb"
|
||||||
echo -e "$blacklist_content" | sudo tee "$blacklist_conf" >/dev/null
|
echo -e "$blacklist_content" | sudo tee "$blacklist_conf" >/dev/null || true
|
||||||
|
|
||||||
# --- Update initramfs and load module ---
|
# --- Update initramfs and load module ---
|
||||||
_run_cmd "Initramfs" "sudo update-initramfs -u" || true
|
_run_cmd "Initramfs" "sudo update-initramfs -u" || true
|
||||||
@@ -266,7 +266,7 @@ _handle_wireless() {
|
|||||||
if $has_broadcom_bt; then
|
if $has_broadcom_bt; then
|
||||||
echo -e "${YELLOW}[+] Broadcom WiFi+BT combo card detected.${NC}"
|
echo -e "${YELLOW}[+] Broadcom WiFi+BT combo card detected.${NC}"
|
||||||
sudo mkdir -p /etc/modprobe.d
|
sudo mkdir -p /etc/modprobe.d
|
||||||
printf 'softdep wl post: btusb\n' | sudo tee /etc/modprobe.d/broadcom-combo.conf >/dev/null
|
printf 'softdep wl post: btusb\n' | sudo tee /etc/modprobe.d/broadcom-combo.conf >/dev/null || true
|
||||||
echo -e "${YELLOW} A reboot may be required for Bluetooth support.${NC}"
|
echo -e "${YELLOW} A reboot may be required for Bluetooth support.${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -291,8 +291,9 @@ _handle_wireless() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
_msg "Network Warning" "The script is about to unload current WiFi kernel modules to load the Broadcom driver.\n\nIf you are connected via SSH over WiFi, YOUR CONNECTION WILL DROP. Please reconnect after a few seconds."
|
||||||
sudo modprobe -r b43 b43legacy b44 bcma brcmsmac brcmfmac ssb wl 2>/dev/null || true
|
sudo modprobe -r b43 b43legacy b44 bcma brcmsmac brcmfmac ssb wl 2>/dev/null || true
|
||||||
sudo modprobe wl 2>/dev/null
|
sudo modprobe wl 2>/dev/null || true
|
||||||
|
|
||||||
# --- Verificación de carga ---
|
# --- Verificación de carga ---
|
||||||
if lsmod | grep -q '^wl '; then
|
if lsmod | grep -q '^wl '; then
|
||||||
@@ -440,7 +441,7 @@ install_firmware() {
|
|||||||
local current_ver
|
local current_ver
|
||||||
current_ver=$(dpkg -l "$fw_pkg" 2>/dev/null | awk '/^ii/{print $3}')
|
current_ver=$(dpkg -l "$fw_pkg" 2>/dev/null | awk '/^ii/{print $3}')
|
||||||
if _confirm "Firmware" "firmware-linux-nonfree ${current_ver} already installed.\n\nUpgrade to backports version ${fw_bpo}?\n\nBackports often includes newer hardware support."; then
|
if _confirm "Firmware" "firmware-linux-nonfree ${current_ver} already installed.\n\nUpgrade to backports version ${fw_bpo}?\n\nBackports often includes newer hardware support."; then
|
||||||
_run_cmd "Firmware" "sudo apt install -y -t ${DEBIAN_CODENAME}-backports $fw_pkg" "Upgrading firmware..."
|
_run_cmd "Firmware" "sudo apt install -y -t ${DEBIAN_CODENAME}-backports $fw_pkg" "Upgrading firmware..." || true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "$fw_pkg already installed."
|
echo "$fw_pkg already installed."
|
||||||
@@ -457,15 +458,15 @@ install_firmware() {
|
|||||||
msg+=" 2025/2026: recent GPUs, processors, WiFi.\n\n"
|
msg+=" 2025/2026: recent GPUs, processors, WiFi.\n\n"
|
||||||
msg+="Choose version:"
|
msg+="Choose version:"
|
||||||
if _confirm_custom "Firmware" "$msg" "Backports" "Stable"; then
|
if _confirm_custom "Firmware" "$msg" "Backports" "Stable"; then
|
||||||
_run_cmd "Firmware" "sudo apt install -y -t ${DEBIAN_CODENAME}-backports $fw_pkg" "Installing firmware from backports..."
|
_run_cmd "Firmware" "sudo apt install -y -t ${DEBIAN_CODENAME}-backports $fw_pkg" "Installing firmware from backports..." || true
|
||||||
else
|
else
|
||||||
_run_cmd "Firmware" "sudo apt install -y $fw_pkg" "Installing firmware from stable..."
|
_run_cmd "Firmware" "sudo apt install -y $fw_pkg" "Installing firmware from stable..." || true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
msg+=" Version: ${fw_stable}\n\n"
|
msg+=" Version: ${fw_stable}\n\n"
|
||||||
msg+="Install it?"
|
msg+="Install it?"
|
||||||
if _confirm "Firmware" "$msg"; then
|
if _confirm "Firmware" "$msg"; then
|
||||||
_run_cmd "Firmware" "sudo apt install -y $fw_pkg" "Installing firmware..."
|
_run_cmd "Firmware" "sudo apt install -y $fw_pkg" "Installing firmware..." || true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo -e "${GREEN}Base firmware installed.${NC}"
|
echo -e "${GREEN}Base firmware installed.${NC}"
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ offer_generic_tools() {
|
|||||||
local tool_pkgs
|
local tool_pkgs
|
||||||
tool_pkgs=$(pkg_versions nvtop vainfo)
|
tool_pkgs=$(pkg_versions nvtop vainfo)
|
||||||
if _confirm "GPU Tools" "Install monitoring and info tools?\n\n${tool_pkgs}"; then
|
if _confirm "GPU Tools" "Install monitoring and info tools?\n\n${tool_pkgs}"; then
|
||||||
_run_cmd "GPU Tools" "sudo apt install -y nvtop vainfo" "Installing GPU tools..."
|
_run_cmd "GPU Tools" "sudo apt install -y nvtop vainfo" "Installing GPU tools..." || true
|
||||||
vainfo
|
vainfo
|
||||||
_pause "vainfo output shown above."
|
_pause "vainfo output shown above."
|
||||||
else
|
else
|
||||||
|
|||||||
+14
-14
@@ -19,7 +19,7 @@ _enable_cuda_repo() {
|
|||||||
# Método oficial NVIDIA: cuda-keyring (extrepo no configura
|
# Método oficial NVIDIA: cuda-keyring (extrepo no configura
|
||||||
# correctamente el repo en Trixie)
|
# correctamente el repo en Trixie)
|
||||||
if dpkg -s cuda-keyring &>/dev/null; then
|
if dpkg -s cuda-keyring &>/dev/null; then
|
||||||
return 0 # ya instalado → su .list ya existe
|
return 0 # ya instalado → su .list ya existe
|
||||||
fi
|
fi
|
||||||
if ! wget -q "https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb" \
|
if ! wget -q "https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb" \
|
||||||
-O /tmp/cuda-keyring.deb; then
|
-O /tmp/cuda-keyring.deb; then
|
||||||
@@ -135,7 +135,7 @@ _verify_nvidia_dkms_build() {
|
|||||||
# Returns: 0 if a version was chosen, 1 if the user cancelled
|
# Returns: 0 if a version was chosen, 1 if the user cancelled
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
_is_cuda_repo_ready() {
|
_is_cuda_repo_ready() {
|
||||||
[ -f /etc/apt/sources.list.d/extrepo_nvidia-cuda.sources ] || \
|
[ -f /etc/apt/sources.list.d/extrepo_nvidia-cuda.sources ] ||
|
||||||
grep -qr 'developer.download.nvidia.com' /etc/apt/sources.list.d/ 2>/dev/null
|
grep -qr 'developer.download.nvidia.com' /etc/apt/sources.list.d/ 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,14 +181,14 @@ _configure_nvidia_wayland() {
|
|||||||
|
|
||||||
# ── Arquitectura: solo fbdev y mensaje de color ──
|
# ── Arquitectura: solo fbdev y mensaje de color ──
|
||||||
case "$arch" in
|
case "$arch" in
|
||||||
kepler)
|
kepler)
|
||||||
color="${RED}"
|
color="${RED}"
|
||||||
msg="WARNING: Wayland not supported on Kepler. Use X11 (Xorg)."
|
msg="WARNING: Wayland not supported on Kepler. Use X11 (Xorg)."
|
||||||
;;
|
;;
|
||||||
maxwell|pascal)
|
maxwell | pascal)
|
||||||
color="${YELLOW}"
|
color="${YELLOW}"
|
||||||
msg="Wayland support on ${arch} is experimental. X11 recommended."
|
msg="Wayland support on ${arch} is experimental. X11 recommended."
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# ── Híbrida vs desktop: NVreg independiente de la arquitectura ──
|
# ── Híbrida vs desktop: NVreg independiente de la arquitectura ──
|
||||||
@@ -200,13 +200,13 @@ _configure_nvidia_wayland() {
|
|||||||
else
|
else
|
||||||
content="options nvidia NVreg_PreserveVideoMemoryAllocations=1"$'\n'
|
content="options nvidia NVreg_PreserveVideoMemoryAllocations=1"$'\n'
|
||||||
case "$ver" in
|
case "$ver" in
|
||||||
590|595) content+="options nvidia NVreg_UseKernelSuspendNotifiers=1"$'\n' ;;
|
590 | 595) content+="options nvidia NVreg_UseKernelSuspendNotifiers=1"$'\n' ;;
|
||||||
esac
|
esac
|
||||||
content+="options nvidia-drm modeset=1"$'\n'
|
content+="options nvidia-drm modeset=1"$'\n'
|
||||||
[ "$arch" != "kepler" ] && content+="options nvidia-drm fbdev=1"$'\n'
|
[ "$arch" != "kepler" ] && content+="options nvidia-drm fbdev=1"$'\n'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf "%b" "$content" | sudo tee "$conf" >/dev/null
|
printf "%b" "$content" | sudo tee "$conf" >/dev/null || return 1
|
||||||
echo -e "${color}${msg}${NC}"
|
echo -e "${color}${msg}${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ _install_nvidia_standard() {
|
|||||||
fam=$(_get_nvidia_arch_family)
|
fam=$(_get_nvidia_arch_family)
|
||||||
local kernel_pkg="nvidia-kernel-dkms"
|
local kernel_pkg="nvidia-kernel-dkms"
|
||||||
case "$fam" in
|
case "$fam" in
|
||||||
turing|ampere|ada|blackwell) kernel_pkg="nvidia-open-kernel-dkms" ;;
|
turing | ampere | ada | blackwell) kernel_pkg="nvidia-open-kernel-dkms" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# --- 2. PAQUETES — UN SOLO apt install ---
|
# --- 2. PAQUETES — UN SOLO apt install ---
|
||||||
@@ -373,7 +373,7 @@ _install_nvidia_standard() {
|
|||||||
|
|
||||||
# Fix obligatorio para Debian 12 con módulo abierto
|
# Fix obligatorio para Debian 12 con módulo abierto
|
||||||
if [ "$DEBIAN_VERSION" = "12" ] && [[ "$kernel_pkg" == *"open"* ]]; then
|
if [ "$DEBIAN_VERSION" = "12" ] && [[ "$kernel_pkg" == *"open"* ]]; then
|
||||||
echo "options nvidia NVreg_OpenRmEnableUnsupportedGpus=1" | sudo tee /etc/modprobe.d/nvidia-open.conf > /dev/null
|
echo "options nvidia NVreg_OpenRmEnableUnsupportedGpus=1" | sudo tee /etc/modprobe.d/nvidia-open.conf >/dev/null
|
||||||
echo "Applied required Open RM parameter for Debian 12."
|
echo "Applied required Open RM parameter for Debian 12."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -27,10 +27,10 @@ restore_previous_repos() {
|
|||||||
local rel="${f#/etc/apt/}"
|
local rel="${f#/etc/apt/}"
|
||||||
local backup_file="$REPO_BACKUP_DIR/$rel"
|
local backup_file="$REPO_BACKUP_DIR/$rel"
|
||||||
if [ -f "$backup_file" ]; then
|
if [ -f "$backup_file" ]; then
|
||||||
sudo cp "$backup_file" "$f"
|
sudo cp "$backup_file" "$f" || true
|
||||||
found=true
|
found=true
|
||||||
elif [ -f "$f" ]; then
|
elif [ -f "$f" ]; then
|
||||||
sudo rm -f "$f"
|
sudo rm -f "$f" || true
|
||||||
found=true
|
found=true
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -103,7 +103,7 @@ _write_deb822() {
|
|||||||
if content_differs "$main_file" "$main_content"; then
|
if content_differs "$main_file" "$main_content"; then
|
||||||
if _confirm "Deb822 Sources" "Write main deb822 configuration to ${main_file}?"; then
|
if _confirm "Deb822 Sources" "Write main deb822 configuration to ${main_file}?"; then
|
||||||
sudo mkdir -p /etc/apt/sources.list.d
|
sudo mkdir -p /etc/apt/sources.list.d
|
||||||
echo -e "$main_content" | sudo tee "$main_file" >/dev/null
|
echo -e "$main_content" | sudo tee "$main_file" >/dev/null || return 1
|
||||||
echo "Wrote ${main_file}"
|
echo "Wrote ${main_file}"
|
||||||
else
|
else
|
||||||
echo "Main repository configuration skipped."
|
echo "Main repository configuration skipped."
|
||||||
@@ -199,7 +199,7 @@ _write_classic() {
|
|||||||
|
|
||||||
if content_differs "$main_file" "$main_content"; then
|
if content_differs "$main_file" "$main_content"; then
|
||||||
if _confirm "Classic Sources" "Write main classic configuration to ${main_file}?"; then
|
if _confirm "Classic Sources" "Write main classic configuration to ${main_file}?"; then
|
||||||
echo -e "$main_content" | sudo tee "$main_file" >/dev/null
|
echo -e "$main_content" | sudo tee "$main_file" >/dev/null || return 1
|
||||||
echo "Wrote ${main_file}"
|
echo "Wrote ${main_file}"
|
||||||
else
|
else
|
||||||
echo "Main repository configuration skipped."
|
echo "Main repository configuration skipped."
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ _write_deb822_branch() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
sudo mkdir -p /etc/apt/sources.list.d
|
sudo mkdir -p /etc/apt/sources.list.d
|
||||||
echo -e "$main_content" | sudo tee "$main_file" > /dev/null
|
echo -e "$main_content" | sudo tee "$main_file" >/dev/null
|
||||||
echo "Wrote $main_file"
|
echo "Wrote $main_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,14 +80,14 @@ _write_classic_branch() {
|
|||||||
main_content+="deb https://security.debian.org/debian-security ${target}-security main contrib non-free non-free-firmware\n"
|
main_content+="deb https://security.debian.org/debian-security ${target}-security main contrib non-free non-free-firmware\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "$main_content" | sudo tee "$main_file" > /dev/null
|
echo -e "$main_content" | sudo tee "$main_file" >/dev/null
|
||||||
echo "Wrote $main_file"
|
echo "Wrote $main_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
_branch_migration() {
|
_branch_migration() {
|
||||||
# ── Screen 1: Risk warning ──
|
# ── Screen 1: Risk warning ──
|
||||||
_msg_red "WARNING: Branch Migration" \
|
_msg_red "WARNING: Branch Migration" \
|
||||||
"Migrating from Debian Stable to Testing or SID is a\n\
|
"Migrating from Debian Stable to Testing or SID is a\n\
|
||||||
MAJOR change and CAN make your system UNBOOTABLE.\n\n\
|
MAJOR change and CAN make your system UNBOOTABLE.\n\n\
|
||||||
Risks include:\n\
|
Risks include:\n\
|
||||||
• NVIDIA / DKMS drivers may break\n\
|
• NVIDIA / DKMS drivers may break\n\
|
||||||
@@ -125,7 +125,10 @@ so you can restore if things go wrong." 16 70
|
|||||||
branch=$(_inputbox "Target Branch" \
|
branch=$(_inputbox "Target Branch" \
|
||||||
"Type exactly TESTING or SID (case-sensitive):" 10 60 "")
|
"Type exactly TESTING or SID (case-sensitive):" 10 60 "")
|
||||||
|
|
||||||
[ -z "$branch" ] && { echo "Migration cancelled."; return; }
|
[ -z "$branch" ] && {
|
||||||
|
echo "Migration cancelled."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if [ "$branch" != "TESTING" ] && [ "$branch" != "SID" ]; then
|
if [ "$branch" != "TESTING" ] && [ "$branch" != "SID" ]; then
|
||||||
_msg "Invalid Branch" "You typed: $branch\n\nExpected: TESTING or SID (exact, case-sensitive).\nAborting." 10 60
|
_msg "Invalid Branch" "You typed: $branch\n\nExpected: TESTING or SID (exact, case-sensitive).\nAborting." 10 60
|
||||||
@@ -155,7 +158,11 @@ so you can restore if things go wrong." 16 70
|
|||||||
[ -f /etc/apt/sources.list ] && sudo rm -f /etc/apt/sources.list
|
[ -f /etc/apt/sources.list ] && sudo rm -f /etc/apt/sources.list
|
||||||
|
|
||||||
# 4d. Write new sources
|
# 4d. Write new sources
|
||||||
_write_branch_sources "$target"
|
if ! _write_branch_sources "$target"; then
|
||||||
|
echo -e "${RED}[-]${NC} Failed to write new sources. Restoring backup..."
|
||||||
|
_restore_backup || true
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
# 4e. SID guardrails: install bug alerts before upgrade
|
# 4e. SID guardrails: install bug alerts before upgrade
|
||||||
if [ "$target" = "sid" ]; then
|
if [ "$target" = "sid" ]; then
|
||||||
@@ -170,7 +177,7 @@ so you can restore if things go wrong." 16 70
|
|||||||
echo -e "${RED}apt update failed. Restoring backup...${NC}"
|
echo -e "${RED}apt update failed. Restoring backup...${NC}"
|
||||||
_restore_backup
|
_restore_backup
|
||||||
_msg_red "Migration Failed" \
|
_msg_red "Migration Failed" \
|
||||||
"apt update failed. Backup has been restored from:\n\
|
"apt update failed. Backup has been restored from:\n\
|
||||||
$_MIGRATE_BACKUP\n\n\
|
$_MIGRATE_BACKUP\n\n\
|
||||||
Your system should be back to its previous state.\n\
|
Your system should be back to its previous state.\n\
|
||||||
Run 'sudo apt update' manually to verify." 12 70
|
Run 'sudo apt update' manually to verify." 12 70
|
||||||
@@ -193,7 +200,7 @@ Run 'sudo apt update' manually to verify." 12 70
|
|||||||
|
|
||||||
# ── Screen 5: Reboot reminder ──
|
# ── Screen 5: Reboot reminder ──
|
||||||
_msg "Migration Complete" \
|
_msg "Migration Complete" \
|
||||||
"System has been migrated to ${target}.\n\n\
|
"System has been migrated to ${target}.\n\n\
|
||||||
Backup saved at:\n $_MIGRATE_BACKUP\n\n\
|
Backup saved at:\n $_MIGRATE_BACKUP\n\n\
|
||||||
REBOOT your system.\nIf it fails to boot, restore the backup manually:\n\
|
REBOOT your system.\nIf it fails to boot, restore the backup manually:\n\
|
||||||
sudo tar xzf $_MIGRATE_BACKUP -C /\n sudo apt update\n sudo apt upgrade" 16 70
|
sudo tar xzf $_MIGRATE_BACKUP -C /\n sudo apt update\n sudo apt upgrade" 16 70
|
||||||
|
|||||||
Reference in New Issue
Block a user