dual-gpu fix & nvme

- Replaced the restrictive head -n1 hardware parsing with a dynamic while read loop. The script now fully detects and registers multiple coexisting GPUs (Intel+Nvidia / AMD+Nvidia).
- Rewrote install_gpu_drivers() in modules/gpu.sh from a mutually exclusive case block to independent, sequential if conditions. Laptops now install both integrated firmware (Intel/AMD with non-free VA-API acceleration) and dedicated graphics stacks (Nvidia driver + 32-bit libs for Steam) seamlessly in a single pass.
- Improved Nvidia Kepler architecture guards under Debian 13 (Trixie). The script now safely skips missing legacy Nvidia packages without aborting or crashing the remaining Intel/AMD configurations.
- Added nvme-cli utility installation across all Debian versions. For Bookworm and Trixie, it features dynamic hardware validation via lsblk transport filtering and interactive, real-time SMART log viewing with an execution screen-pause.
- Created a brand new standalone module (modules/extras/dev/jellyfin.sh) to cleanly inject Jellyfin Media Server across Debian 11, 12, and 13 using its official setup script, protected by strict SHA256 checksum validations and guaranteed error-cleanup.
- Added OpenRGB to the Gaming menu for Debian 12 and 13. Implemented secure curl downloads with an emulated Chrome User-Agent to bypass Codeberg bot blocks, complete with automatic i2c-dev module configuration, user groups provisioning, and udev permission rules execution.
- Standardized menu headers across 15 separate files using a centralized readonly SCROLL_HINT=" [↑↓]" variable, replacing messy hardcoded strings with clean, uniform Whiptail instructions.
- update README.md
This commit is contained in:
stornic56
2026-06-16 16:20:30 -05:00
committed by GitHub
parent 23301f98b3
commit 63ef2e7343
19 changed files with 269 additions and 129 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ _cat_design() {
local choices
choices=$(whiptail --title "Multimedia & Design" --checklist \
"Select multimedia and design tools:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select multimedia and design tools${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"audacity" "Audio editor/recorder$(_inst audacity)" "$audacity_state" \
"ardour" "Digital audio workstation$(_inst ardour)" "$ardour_state" \
"blender" "3D modeling/animation suite$(_inst blender)" "$blender_state" \
+5 -1
View File
@@ -23,7 +23,7 @@ _cat_dev() {
local TUI_ANCHO_REFORZADO=$((TUI_ANCHO + 6))
local choices
choices=$(whiptail --title "Development & Servers" --checklist \
"Select development tools and servers (12 items, ↑↓ scroll):" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"Select development tools and servers${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"apache2" "Apache web server$(_inst apache2)" "$apache_state" \
"build-essential" "C/C++ build tools (gcc, make)$(_inst build-essential)" "$build_state" \
"certbot" "Let's Encrypt TLS certificates$(_inst certbot)" "$certbot_state" \
@@ -37,6 +37,7 @@ _cat_dev() {
"python3-pip" "Python 3 pip + venv + dev$(_inst python3-pip)" "$pip_state" \
"redis-server" "Redis key-value store$(_inst redis-server)" "$redis_state" \
"sqlite3" "SQLite database engine$(_inst sqlite3)" "$sqlite_state" \
"jellyfin" "Jellyfin Media Server (Web GUI on port 8096)$(_inst jellyfin)" OFF \
"openjdk-dev-env" "Adoptium Temurin JDK (17, 21, 25 LTS)${jdk_desc}" "${jdk_state}" \
3>&1 1>&2 2>&3)
clear
@@ -68,6 +69,9 @@ _cat_dev() {
echo "Docker already installed."
fi
;;
jellyfin)
install_jellyfin
;;
openjdk-dev-env)
_install_dev_java
;;
+32
View File
@@ -0,0 +1,32 @@
# jellyfin.sh — Jellyfin Media Server installation
install_jellyfin() {
local tmpdir="/tmp/jellyfin_install"
mkdir -p "${tmpdir}"
_run_cmd "Jellyfin" "curl -sSL -o ${tmpdir}/install-debuntu.sh https://repo.jellyfin.org/install-debuntu.sh" "Downloading Jellyfin repository script..."
_run_cmd "Jellyfin" "curl -sSL -o ${tmpdir}/install-debuntu.sh.sha256sum https://repo.jellyfin.org/install-debuntu.sh.sha256sum" "Downloading checksum..."
if [ ! -s "${tmpdir}/install-debuntu.sh" ] || [ ! -s "${tmpdir}/install-debuntu.sh.sha256sum" ]; then
echo -e "${RED}[-]${NC} Download failed: script or checksum is empty or missing."
rm -rf "${tmpdir}"
return 1
fi
echo -e "${GREEN}[+]${NC} Verifying checksum..."
if ! (cd "${tmpdir}" && sha256sum -c install-debuntu.sh.sha256sum); then
echo -e "${RED}[-]${NC} Checksum verification failed. The downloaded script may be corrupted."
rm -rf "${tmpdir}"
return 1
fi
echo -e "${GREEN}[+]${NC} Running Jellyfin repository setup..."
if ! sudo bash "${tmpdir}/install-debuntu.sh"; then
echo -e "${RED}[-]${NC} Jellyfin installation failed."
rm -rf "${tmpdir}"
return 1
fi
rm -rf "${tmpdir}"
echo -e "${GREEN}Jellyfin Server installed. Web interface available at http://localhost:8096${NC}"
}
+1 -1
View File
@@ -25,7 +25,7 @@ _cat_internet() {
local choices
choices=$(whiptail --title "Internet" --checklist \
"Select browsers, email, and VPN tools:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select browsers, email, and VPN tools${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"chromium" "Chromium web browser$(_inst chromium)" "$chromium_state" \
"dillo" "Lightweight graphical browser$(_inst dillo)" "$dillo_state" \
"elinks" "Text-mode web browser$(_inst elinks)" "$elinks_state" \
+1 -1
View File
@@ -23,7 +23,7 @@ _cat_programming() {
local TUI_ANCHO_REFORZADO=$((TUI_ANCHO + 6))
local choices
choices=$(whiptail --title "Programming Applications" --checklist \
"Select editors and IDEs (12 items, ↑↓ scroll):" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"Select editors and IDEs${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"vim" "Classic terminal editor$(_inst vim)" "$vim_state" \
"vim-gtk3" "Vim with GTK3 GUI$(_inst vim-gtk3)" "$vimgtk_state" \
"neovim" "Modern vim fork$(_inst neovim)" "$neovim_state" \
+1 -1
View File
@@ -14,7 +14,7 @@ _cat_security() {
local TUI_ANCHO_REFORZADO=$((TUI_ANCHO + 6))
local choices
choices=$(whiptail --title "Security & Networking" --checklist \
"Select security and networking tools (6 items):" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"Select security and networking tools${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"wireshark" "Network protocol analyzer (GUI)$(_inst wireshark)" "$wireshark_state" \
"tcpdump" "Command-line packet analyzer$(_inst tcpdump)" "$tcpdump_state" \
"zenmap" "Network scanner GUI (Nmap frontend)$(_inst zenmap)" "$zenmap_state" \
+2 -2
View File
@@ -6,8 +6,8 @@ _cat_software_centers() {
local sc_choice
sc_choice=$(whiptail --title "Software Centers" --menu \
"Choose a software store to install:" 12 65 2 \
"gnome-software" "Software Center for GNOME" \
"plasma-discover" "Software manager for Plasma" \
"gnome-software" "Software Center for GNOME$(_inst gnome-software)" \
"plasma-discover" "Software manager for Plasma$(_inst plasma-discover)" \
3>&1 1>&2 2>&3)
[ -z "$sc_choice" ] && return
+25 -1
View File
@@ -57,11 +57,12 @@ _cat_general() {
local timeshift_state; timeshift_state=$(_state "timeshift")
local tmux_state; tmux_state=$(_state "tmux")
local wine_state; wine_state=$(_state "wine")
local nvme_state; nvme_state=$(_state "nvme-cli")
local TUI_ANCHO_REFORZADO=$((TUI_ANCHO + 6))
local choices
choices=$(whiptail --title "System Tools" --checklist \
"Select system utilities to install (28 items, ↑↓ scroll):" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"Select system utilities to install${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO_REFORZADO $TUI_ALTO_LISTA \
"alacritty" "GPU-accelerated terminal$(_inst alacritty)" "$alacritty_state" \
"btop" "Resource monitor (fancy top)$(_inst btop)" "$btop_state" \
"compress" "Compression tools (zip, unrar, 7z)$(_inst zip)" "$compress_state" \
@@ -84,6 +85,7 @@ _cat_general() {
"kvm" "QEMU/KVM virtualization$(_inst virt-manager)" "$kvm_state" \
"lshw" "List hardware details$(_inst lshw)" "$lshw_state" \
"mc" "Midnight Commander (file manager)$(_inst mc)" "$mc_state" \
"nvme-cli" "NVMe SSD health monitoring$(_inst nvme-cli)" "$nvme_state" \
"nala" "APT frontend (parallel downloads)$(_inst nala)" "$nala_state" \
"ncdu" "Disk usage analyzer (ncurses)$(_inst ncdu)" "$ncdu_state" \
"psensor" "Hardware temperature monitor$(_inst psensor)" "$psensor_state" \
@@ -209,6 +211,28 @@ _cat_general() {
echo "Wine already installed."
fi
;;
nvme-cli)
if ! lsblk -d -o TRAN 2>/dev/null | grep -q "^nvme$"; then
echo "No NVMe controller detected. Skipping."
break
fi
if ! is_installed "nvme-cli"; then
_run_cmd "nvme-cli" "sudo apt install -y nvme-cli" "Installing nvme-cli..."
fi
local nvme_dev
nvme_dev=$(lsblk -d -o NAME,TRAN 2>/dev/null | awk '/nvme/ {print $1; exit}')
if [ -n "$nvme_dev" ] && [ -e "/dev/${nvme_dev}" ]; then
if _confirm "NVMe Health" "Run smart-log on /dev/${nvme_dev}?"; then
echo ""
sudo nvme smart-log "/dev/${nvme_dev}"
echo ""
echo "Press [ENTER] to continue..."
read -r
fi
else
echo "No NVMe device found for health check."
fi
;;
*)
if $headless; then
echo "Skipping $pkg (headless mode)"
+1 -1
View File
@@ -11,7 +11,7 @@ _cat_cursors() {
local choices
choices=$(whiptail --title "Cursor Themes" --checklist \
"Select cursor themes to install:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select cursor themes to install${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"bibata-cursor-theme" "Bibata cursors$(_inst bibata-cursor-theme)" "$bibata_state" \
"breeze-cursor-theme" "Breeze cursors (KDE)$(_inst breeze-cursor-theme)" "$breeze_state" \
"chameleon-cursor-theme" "Chameleon cursors$(_inst chameleon-cursor-theme)" "$chameleon_state" \
@@ -14,7 +14,7 @@ _cat_themes() {
local choices
choices=$(whiptail --title "Desktop Themes (GTK/KDE)" --checklist \
"Select desktop themes to install:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select desktop themes to install${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"arc-theme" "Arc GTK theme$(_inst arc-theme)" "$arc_state" \
"blackbird-gtk-theme" "Blackbird GTK theme$(_inst blackbird-gtk-theme)" "$blackbird_state" \
"bluebird-gtk-theme" "Bluebird GTK theme$(_inst bluebird-gtk-theme)" "$bluebird_state" \
+1 -1
View File
@@ -13,7 +13,7 @@ _cat_fonts() {
local choices
choices=$(whiptail --title "Fonts" --checklist \
"Select fonts to install:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select fonts to install${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"fonts-bebas-neue" "Bebas Neue (display)$(_inst fonts-bebas-neue)" "$bebas_state" \
"fonts-anonymous-pro" "Anonymous Pro (monospace)$(_inst fonts-anonymous-pro)" "$anon_state" \
"fonts-adf-verana" "ADF Verana (sans-serif)$(_inst fonts-adf-verana)" "$verana_state" \
+1 -1
View File
@@ -42,7 +42,7 @@ _cat_icons() {
local choices
choices=$(whiptail --title "Icon Themes" --checklist \
"Select icon themes to install:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"Select icon themes to install${SCROLL_HINT}:" $TUI_ALTO $TUI_ANCHO $TUI_ALTO_LISTA \
"${items[@]}" \
3>&1 1>&2 2>&3)
clear