From 00e6d245aebec1129d1664ba8e85b7af2f4b4f08 Mon Sep 17 00:00:00 2001 From: The_miro Date: Mon, 18 May 2026 10:41:47 +0200 Subject: [PATCH] setup: add 17 optional modules, expand core packages, add install-modules entrypoint New modules: networking-cli (nmap/nethogs/mitmproxy/httpie), disk-recovery (ddrescue/f3), himalaya, gnuplot, povray, blender, toot, db-clients (pgcli/mycli), mysql (mariadb), productivity (taskwarrior/watson/jrnl), yt-dlp, sox, imagemagick, ffmpeg-extras, localtunnel, butter, tlp. core-packages: add fdupes, tldr, onefetch; move networking analysis tools (nmap, mtr, net-tools, ipcalc, tcpdump, traceroute) to networking-cli module. tui-install: expand checklist to 34 optional modules with full count/summary/ dispatch coverage. install-modules.sh: standalone TUI entrypoint to install any optional module on an already-configured system. Co-Authored-By: Claude Sonnet 4.6 --- setup/install-modules.sh | 268 ++++++++++++++++++ setup/modules/core-packages.sh | 9 +- .../modules/optional-Modules/apps/blender.sh | 4 + setup/modules/optional-Modules/apps/butter.sh | 6 + .../optional-Modules/apps/db-clients.sh | 6 + .../optional-Modules/apps/disk-recovery.sh | 6 + setup/modules/optional-Modules/apps/ffmpeg.sh | 6 + .../modules/optional-Modules/apps/gnuplot.sh | 4 + .../modules/optional-Modules/apps/himalaya.sh | 4 + .../optional-Modules/apps/imagemagick.sh | 4 + .../optional-Modules/apps/localtunnel.sh | 8 + setup/modules/optional-Modules/apps/mysql.sh | 10 + .../optional-Modules/apps/networking-cli.sh | 6 + setup/modules/optional-Modules/apps/povray.sh | 4 + .../optional-Modules/apps/productivity.sh | 6 + setup/modules/optional-Modules/apps/sox.sh | 4 + setup/modules/optional-Modules/apps/tlp.sh | 8 + setup/modules/optional-Modules/apps/toot.sh | 4 + setup/modules/optional-Modules/apps/yt-dlp.sh | 4 + setup/tui-install.sh | 206 +++++++++----- 20 files changed, 503 insertions(+), 74 deletions(-) create mode 100755 setup/install-modules.sh create mode 100755 setup/modules/optional-Modules/apps/blender.sh create mode 100755 setup/modules/optional-Modules/apps/butter.sh create mode 100755 setup/modules/optional-Modules/apps/db-clients.sh create mode 100755 setup/modules/optional-Modules/apps/disk-recovery.sh create mode 100755 setup/modules/optional-Modules/apps/ffmpeg.sh create mode 100755 setup/modules/optional-Modules/apps/gnuplot.sh create mode 100755 setup/modules/optional-Modules/apps/himalaya.sh create mode 100755 setup/modules/optional-Modules/apps/imagemagick.sh create mode 100755 setup/modules/optional-Modules/apps/localtunnel.sh create mode 100755 setup/modules/optional-Modules/apps/mysql.sh create mode 100755 setup/modules/optional-Modules/apps/networking-cli.sh create mode 100755 setup/modules/optional-Modules/apps/povray.sh create mode 100755 setup/modules/optional-Modules/apps/productivity.sh create mode 100755 setup/modules/optional-Modules/apps/sox.sh create mode 100755 setup/modules/optional-Modules/apps/tlp.sh create mode 100755 setup/modules/optional-Modules/apps/toot.sh create mode 100755 setup/modules/optional-Modules/apps/yt-dlp.sh diff --git a/setup/install-modules.sh b/setup/install-modules.sh new file mode 100755 index 0000000..bf39708 --- /dev/null +++ b/setup/install-modules.sh @@ -0,0 +1,268 @@ +#!/bin/bash +# install-modules.sh — install optional modules on an already-configured system + +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +MODULES="$SCRIPT_DIR/modules" +APPS="$MODULES/optional-Modules/apps" +LOG="$HOME/dotfiles-modules.log" +TMP_D="$(mktemp -d)" +trap 'rm -rf "$TMP_D"' EXIT + +BACKTITLE="the_miro's Arch Dotfiles — Module Installer" + +export DIALOGRC="$TMP_D/dialogrc" +cat > "$DIALOGRC" <<'EOF' +use_shadow = ON +use_colors = ON +screen_color = (BLACK,BLACK,ON) +shadow_color = (BLACK,BLACK,ON) +title_color = (MAGENTA,BLACK,ON) +border_color = (MAGENTA,BLACK,ON) +button_active_color = (BLACK,MAGENTA,ON) +button_inactive_color = (WHITE,BLACK,OFF) +button_key_active_color = (BLACK,CYAN,ON) +button_key_inactive_color = (CYAN,BLACK,ON) +button_label_active_color = (BLACK,MAGENTA,ON) +button_label_inactive_color = (WHITE,BLACK,OFF) +inputbox_color = (WHITE,BLACK,OFF) +inputbox_border_color = (MAGENTA,BLACK,ON) +menubox_color = (WHITE,BLACK,OFF) +menubox_border_color = (MAGENTA,BLACK,ON) +item_color = (WHITE,BLACK,OFF) +item_selected_color = (BLACK,MAGENTA,ON) +tag_color = (CYAN,BLACK,ON) +tag_selected_color = (BLACK,CYAN,ON) +tag_key_color = (CYAN,BLACK,ON) +tag_key_selected_color = (BLACK,CYAN,ON) +check_color = (WHITE,BLACK,OFF) +check_selected_color = (BLACK,MAGENTA,ON) +uarrow_color = (MAGENTA,BLACK,ON) +darrow_color = (MAGENTA,BLACK,ON) +EOF + +STEP=0 +TOTAL=0 + +require_dialog() { + command -v dialog &>/dev/null && return + echo "dialog not found — installing..." + sudo pacman -S --noconfirm dialog || { echo "Failed to install dialog."; exit 1; } +} + +die() { + clear + printf "\n Error: %s\n\n" "$1" >&2 + exit 1 +} + +log_sep() { + printf "\n══════════════════════════════════\n %s\n %s\n" "$1" "$(date)" >> "$LOG" +} + +run_module() { + local label="$1" script="$2" + STEP=$(( STEP + 1 )) + log_sep "[$STEP/$TOTAL] $label" + + clear + printf "\n\033[1;35m [$STEP/$TOTAL] %s\033[0m\n" "$label" + printf "\033[35m ─────────────────────────────────────────────\033[0m\n\n" + + local rc=0 + bash "$script" 2>&1 | tee -a "$LOG" || rc=${PIPESTATUS[0]} + + if [[ $rc -ne 0 ]]; then + dialog --backtitle "$BACKTITLE" \ + --title " Module Failed " \ + --yesno "$label exited with code $rc.\n\nContinue anyway?" 8 54 \ + || { clear; exit 1; } + fi +} + +count_steps() { + local sel="$1" + TOTAL=0 + [[ "$sel" == *"networking-cli"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"disk-recovery"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"himalaya"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"gnuplot"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"povray"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"blender"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"toot"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"db-clients"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"mysql"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"productivity"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"yt-dlp"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"sox"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"imagemagick"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"ffmpeg"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"localtunnel"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"butter"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"tlp"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"steam"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"vesktop"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"spotify"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"prism"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"vintagestory"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"localsend"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"croc"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"onlyoffice"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"wireshark"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"k8s"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"docker"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"podman"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"cockpit"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"ssh-server"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"python"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"zfs"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$sel" == *"wprs"* ]] && TOTAL=$(( TOTAL + 1 )) +} + +[[ $EUID -eq 0 ]] && die "Run as your normal user (not root)." +command -v pacman &>/dev/null || die "pacman not found — Arch Linux required." + +require_dialog + +> "$LOG" +printf "Module install: %s\n" "$(date)" >> "$LOG" + +dialog --backtitle "$BACKTITLE" \ + --title " Module Installer " \ + --msgbox "\n\ + Install optional modules on an existing system.\n\ + ─────────────────────────────────────────────────\n\ +\n\ + Select any combination of modules below.\n\ + Each module is idempotent — safe to re-run.\n\ +\n\ + Log: $LOG\n" 13 62 + +SELECTED=$(dialog --backtitle "$BACKTITLE" \ + --title " Select Modules " \ + --checklist "Space toggles · Enter confirms · Arrow keys scroll" 40 76 32 \ + \ + "networking-cli" "Networking CLI nmap · nethogs · mitmproxy · httpie" off \ + "disk-recovery" "Disk Recovery ddrescue · f3" off \ + "himalaya" "Himalaya terminal email client (AUR)" off \ + "gnuplot" "Gnuplot scientific plotting" off \ + "povray" "POV-Ray ray-tracing renderer" off \ + "blender" "Blender 3D creation suite" off \ + "toot" "toot Mastodon CLI client (AUR)" off \ + "db-clients" "DB Clients pgcli · mycli" off \ + "mysql" "MySQL / MariaDB mariadb server + setup" off \ + "productivity" "Productivity taskwarrior · watson · jrnl" off \ + "yt-dlp" "yt-dlp YouTube / media downloader" off \ + "sox" "SoX audio processing toolkit" off \ + "imagemagick" "ImageMagick image manipulation" off \ + "ffmpeg" "FFmpeg extras thumbnailer · GStreamer codecs" off \ + "localtunnel" "LocalTunnel expose localhost via tunnel" off \ + "butter" "butter btrfs snapshot backup (AUR)" off \ + "tlp" "TLP laptop power management" off \ + \ + "steam" "Steam gaming platform" off \ + "vesktop" "Vesktop Discord + Vencord theme" off \ + "spotify" "Spotify launcher + Spicetify theming" off \ + "prism" "PrismLauncher Minecraft launcher (Flatpak)" off \ + "vintagestory" "Vintage Story survival game (AUR)" off \ + "localsend" "LocalSend LAN file transfer (AUR)" off \ + "croc" "croc cross-platform file transfer" off \ + "onlyoffice" "OnlyOffice office suite (AUR)" off \ + "wireshark" "Wireshark network packet analyser (GUI)" off \ + "k8s" "Kubernetes tools kubectl · podman-desktop" off \ + "docker" "Docker docker · docker-compose" off \ + "podman" "Podman rootless containers · buildah" off \ + "cockpit" "Cockpit web UI · machines · podman" off \ + "ssh-server" "SSH server openssh · key-auth · enabled" off \ + "python" "Python tools pyright · pipx · pynvim" off \ + "zfs" "ZFS zfs-dkms kernel module" off \ + "wprs" "WPRS wprs-git (AUR)" off \ + 3>&1 1>&2 2>&3) || { clear; echo "Aborted."; exit 0; } + +[[ -z "$SELECTED" ]] && { clear; echo "Nothing selected."; exit 0; } + +SUMMARY="" +[[ "$SELECTED" == *"networking-cli"* ]] && SUMMARY+=" ✦ Networking CLI (nmap, nethogs, mitmproxy, httpie)\n" +[[ "$SELECTED" == *"disk-recovery"* ]] && SUMMARY+=" ✦ Disk Recovery (ddrescue, f3)\n" +[[ "$SELECTED" == *"himalaya"* ]] && SUMMARY+=" ✦ Himalaya\n" +[[ "$SELECTED" == *"gnuplot"* ]] && SUMMARY+=" ✦ Gnuplot\n" +[[ "$SELECTED" == *"povray"* ]] && SUMMARY+=" ✦ POV-Ray\n" +[[ "$SELECTED" == *"blender"* ]] && SUMMARY+=" ✦ Blender\n" +[[ "$SELECTED" == *"toot"* ]] && SUMMARY+=" ✦ toot\n" +[[ "$SELECTED" == *"db-clients"* ]] && SUMMARY+=" ✦ DB Clients (pgcli, mycli)\n" +[[ "$SELECTED" == *"mysql"* ]] && SUMMARY+=" ✦ MySQL / MariaDB\n" +[[ "$SELECTED" == *"productivity"* ]] && SUMMARY+=" ✦ Productivity (taskwarrior, watson, jrnl)\n" +[[ "$SELECTED" == *"yt-dlp"* ]] && SUMMARY+=" ✦ yt-dlp\n" +[[ "$SELECTED" == *"sox"* ]] && SUMMARY+=" ✦ SoX\n" +[[ "$SELECTED" == *"imagemagick"* ]] && SUMMARY+=" ✦ ImageMagick\n" +[[ "$SELECTED" == *"ffmpeg"* ]] && SUMMARY+=" ✦ FFmpeg extras\n" +[[ "$SELECTED" == *"localtunnel"* ]] && SUMMARY+=" ✦ LocalTunnel\n" +[[ "$SELECTED" == *"butter"* ]] && SUMMARY+=" ✦ butter (btrfs backup)\n" +[[ "$SELECTED" == *"tlp"* ]] && SUMMARY+=" ✦ TLP\n" +[[ "$SELECTED" == *"steam"* ]] && SUMMARY+=" ✦ Steam\n" +[[ "$SELECTED" == *"vesktop"* ]] && SUMMARY+=" ✦ Vesktop\n" +[[ "$SELECTED" == *"spotify"* ]] && SUMMARY+=" ✦ Spotify\n" +[[ "$SELECTED" == *"prism"* ]] && SUMMARY+=" ✦ PrismLauncher\n" +[[ "$SELECTED" == *"vintagestory"* ]] && SUMMARY+=" ✦ Vintage Story\n" +[[ "$SELECTED" == *"localsend"* ]] && SUMMARY+=" ✦ LocalSend\n" +[[ "$SELECTED" == *"croc"* ]] && SUMMARY+=" ✦ croc\n" +[[ "$SELECTED" == *"onlyoffice"* ]] && SUMMARY+=" ✦ OnlyOffice\n" +[[ "$SELECTED" == *"wireshark"* ]] && SUMMARY+=" ✦ Wireshark\n" +[[ "$SELECTED" == *"k8s"* ]] && SUMMARY+=" ✦ Kubernetes tools\n" +[[ "$SELECTED" == *"docker"* ]] && SUMMARY+=" ✦ Docker\n" +[[ "$SELECTED" == *"podman"* ]] && SUMMARY+=" ✦ Podman\n" +[[ "$SELECTED" == *"cockpit"* ]] && SUMMARY+=" ✦ Cockpit\n" +[[ "$SELECTED" == *"ssh-server"* ]] && SUMMARY+=" ✦ SSH server\n" +[[ "$SELECTED" == *"python"* ]] && SUMMARY+=" ✦ Python tools\n" +[[ "$SELECTED" == *"zfs"* ]] && SUMMARY+=" ✦ ZFS\n" +[[ "$SELECTED" == *"wprs"* ]] && SUMMARY+=" ✦ WPRS\n" + +dialog --backtitle "$BACKTITLE" \ + --title " Confirm " \ + --yesno "\n Modules to install:\n\n${SUMMARY}\n Log: $LOG\n\n Proceed?" \ + 30 64 || { clear; echo "Aborted."; exit 0; } + +count_steps "$SELECTED" + +[[ "$SELECTED" == *"networking-cli"* ]] && run_module "Networking CLI" "$APPS/networking-cli.sh" +[[ "$SELECTED" == *"disk-recovery"* ]] && run_module "Disk Recovery" "$APPS/disk-recovery.sh" +[[ "$SELECTED" == *"himalaya"* ]] && run_module "Himalaya" "$APPS/himalaya.sh" +[[ "$SELECTED" == *"gnuplot"* ]] && run_module "Gnuplot" "$APPS/gnuplot.sh" +[[ "$SELECTED" == *"povray"* ]] && run_module "POV-Ray" "$APPS/povray.sh" +[[ "$SELECTED" == *"blender"* ]] && run_module "Blender" "$APPS/blender.sh" +[[ "$SELECTED" == *"toot"* ]] && run_module "toot" "$APPS/toot.sh" +[[ "$SELECTED" == *"db-clients"* ]] && run_module "DB Clients" "$APPS/db-clients.sh" +[[ "$SELECTED" == *"mysql"* ]] && run_module "MySQL / MariaDB" "$APPS/mysql.sh" +[[ "$SELECTED" == *"productivity"* ]] && run_module "Productivity" "$APPS/productivity.sh" +[[ "$SELECTED" == *"yt-dlp"* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh" +[[ "$SELECTED" == *"sox"* ]] && run_module "SoX" "$APPS/sox.sh" +[[ "$SELECTED" == *"imagemagick"* ]] && run_module "ImageMagick" "$APPS/imagemagick.sh" +[[ "$SELECTED" == *"ffmpeg"* ]] && run_module "FFmpeg extras" "$APPS/ffmpeg.sh" +[[ "$SELECTED" == *"localtunnel"* ]] && run_module "LocalTunnel" "$APPS/localtunnel.sh" +[[ "$SELECTED" == *"butter"* ]] && run_module "butter" "$APPS/butter.sh" +[[ "$SELECTED" == *"tlp"* ]] && run_module "TLP" "$APPS/tlp.sh" +[[ "$SELECTED" == *"steam"* ]] && run_module "Steam" "$APPS/steam.sh" +[[ "$SELECTED" == *"vesktop"* ]] && run_module "Vesktop" "$APPS/vesktop.sh" +[[ "$SELECTED" == *"spotify"* ]] && run_module "Spotify" "$APPS/spotify.sh" +[[ "$SELECTED" == *"prism"* ]] && run_module "PrismLauncher" "$APPS/prismlauncher.sh" +[[ "$SELECTED" == *"vintagestory"* ]] && run_module "Vintage Story" "$APPS/vintagestory.sh" +[[ "$SELECTED" == *"localsend"* ]] && run_module "LocalSend" "$APPS/localsend.sh" +[[ "$SELECTED" == *"croc"* ]] && run_module "croc" "$APPS/croc.sh" +[[ "$SELECTED" == *"onlyoffice"* ]] && run_module "OnlyOffice" "$APPS/onlyoffice.sh" +[[ "$SELECTED" == *"wireshark"* ]] && run_module "Wireshark" "$APPS/wireshark.sh" +[[ "$SELECTED" == *"k8s"* ]] && run_module "Kubernetes Tools" "$APPS/k8s.sh" +[[ "$SELECTED" == *"docker"* ]] && run_module "Docker" "$APPS/docker.sh" +[[ "$SELECTED" == *"podman"* ]] && run_module "Podman" "$APPS/podman.sh" +[[ "$SELECTED" == *"cockpit"* ]] && run_module "Cockpit" "$APPS/cockpit.sh" +[[ "$SELECTED" == *"ssh-server"* ]] && run_module "SSH Server" "$APPS/ssh-server.sh" +[[ "$SELECTED" == *"python"* ]] && run_module "Python Tools" "$MODULES/optional-Modules/python.sh" +[[ "$SELECTED" == *"zfs"* ]] && run_module "ZFS" "$MODULES/optional-Modules/zfs.sh" +[[ "$SELECTED" == *"wprs"* ]] && run_module "WPRS" "$MODULES/optional-Modules/wprs.sh" + +dialog --backtitle "$BACKTITLE" \ + --title " Done " \ + --msgbox "\n All selected modules installed.\n\n Log: $LOG\n\n A reboot may be required for some changes.\n" 11 56 + +clear +printf "\n Done. Log: %s\n\n" "$LOG" diff --git a/setup/modules/core-packages.sh b/setup/modules/core-packages.sh index 0e9bb86..cb57f80 100644 --- a/setup/modules/core-packages.sh +++ b/setup/modules/core-packages.sh @@ -5,14 +5,13 @@ sudo pacman -Syu --noconfirm --needed \ 7zip arch-install-scripts atftp atool \ base base-devel bind bluez btrfs-progs btop \ cockpit cockpit-files cockpit-podman cronie curl \ - distrobox fail2ban fastfetch fd ffmpeg firefox flatpak \ + distrobox fail2ban fastfetch fd fdupes ffmpeg firefox flatpak \ gcc glib2 greetd-tuigreet grub \ - htop inetutils iwd jq ldns less libpulse linux linux-firmware \ + htop inetutils iputils iwd jq ldns less libpulse linux linux-firmware \ man-db mc nano neovim networkmanager \ - openssh pciutils pipewire podman podman-compose \ + onefetch openssh pciutils pipewire podman podman-compose \ python python-pip qrencode ruby-pkg-config rust rustup \ - ipcalc iputils mtr net-tools nmap \ - smartmontools symlinks tcpdump traceroute tree \ + smartmontools symlinks tldr tree \ udisks2 udisks2-btrfs udiskie ufw usbutils \ vim vnstat wget wireplumber wireless_tools wpa_supplicant wprs \ yazi zip unzip zram-generator diff --git a/setup/modules/optional-Modules/apps/blender.sh b/setup/modules/optional-Modules/apps/blender.sh new file mode 100755 index 0000000..8282e3f --- /dev/null +++ b/setup/modules/optional-Modules/apps/blender.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed blender diff --git a/setup/modules/optional-Modules/apps/butter.sh b/setup/modules/optional-Modules/apps/butter.sh new file mode 100755 index 0000000..0ad5535 --- /dev/null +++ b/setup/modules/optional-Modules/apps/butter.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed btrfs-progs + +yay -S --answerdiff None --answerclean All --noconfirm butter diff --git a/setup/modules/optional-Modules/apps/db-clients.sh b/setup/modules/optional-Modules/apps/db-clients.sh new file mode 100755 index 0000000..f6f11d0 --- /dev/null +++ b/setup/modules/optional-Modules/apps/db-clients.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed pgcli + +yay -S --answerdiff None --answerclean All --noconfirm mycli diff --git a/setup/modules/optional-Modules/apps/disk-recovery.sh b/setup/modules/optional-Modules/apps/disk-recovery.sh new file mode 100755 index 0000000..96e9f6d --- /dev/null +++ b/setup/modules/optional-Modules/apps/disk-recovery.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed ddrescue + +yay -S --answerdiff None --answerclean All --noconfirm f3 diff --git a/setup/modules/optional-Modules/apps/ffmpeg.sh b/setup/modules/optional-Modules/apps/ffmpeg.sh new file mode 100755 index 0000000..e557a03 --- /dev/null +++ b/setup/modules/optional-Modules/apps/ffmpeg.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed \ + ffmpeg ffmpegthumbnailer \ + gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly diff --git a/setup/modules/optional-Modules/apps/gnuplot.sh b/setup/modules/optional-Modules/apps/gnuplot.sh new file mode 100755 index 0000000..5dcf98c --- /dev/null +++ b/setup/modules/optional-Modules/apps/gnuplot.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed gnuplot diff --git a/setup/modules/optional-Modules/apps/himalaya.sh b/setup/modules/optional-Modules/apps/himalaya.sh new file mode 100755 index 0000000..2787861 --- /dev/null +++ b/setup/modules/optional-Modules/apps/himalaya.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +yay -S --answerdiff None --answerclean All --noconfirm himalaya-bin diff --git a/setup/modules/optional-Modules/apps/imagemagick.sh b/setup/modules/optional-Modules/apps/imagemagick.sh new file mode 100755 index 0000000..fb7b4a2 --- /dev/null +++ b/setup/modules/optional-Modules/apps/imagemagick.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed imagemagick diff --git a/setup/modules/optional-Modules/apps/localtunnel.sh b/setup/modules/optional-Modules/apps/localtunnel.sh new file mode 100755 index 0000000..6039676 --- /dev/null +++ b/setup/modules/optional-Modules/apps/localtunnel.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +if command -v npm &>/dev/null; then + npm install -g localtunnel +else + yay -S --answerdiff None --answerclean All --noconfirm localtunnel +fi diff --git a/setup/modules/optional-Modules/apps/mysql.sh b/setup/modules/optional-Modules/apps/mysql.sh new file mode 100755 index 0000000..bb706b4 --- /dev/null +++ b/setup/modules/optional-Modules/apps/mysql.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed mariadb + +if [[ ! -d /var/lib/mysql/mysql ]]; then + sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql +fi + +sudo systemctl enable --now mariadb.service diff --git a/setup/modules/optional-Modules/apps/networking-cli.sh b/setup/modules/optional-Modules/apps/networking-cli.sh new file mode 100755 index 0000000..6d80186 --- /dev/null +++ b/setup/modules/optional-Modules/apps/networking-cli.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed \ + httpie ipcalc mitmproxy mtr net-tools nethogs \ + nmap tcpdump traceroute diff --git a/setup/modules/optional-Modules/apps/povray.sh b/setup/modules/optional-Modules/apps/povray.sh new file mode 100755 index 0000000..bbe7d55 --- /dev/null +++ b/setup/modules/optional-Modules/apps/povray.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed povray diff --git a/setup/modules/optional-Modules/apps/productivity.sh b/setup/modules/optional-Modules/apps/productivity.sh new file mode 100755 index 0000000..7030594 --- /dev/null +++ b/setup/modules/optional-Modules/apps/productivity.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed task + +yay -S --answerdiff None --answerclean All --noconfirm watson python-jrnl diff --git a/setup/modules/optional-Modules/apps/sox.sh b/setup/modules/optional-Modules/apps/sox.sh new file mode 100755 index 0000000..beb91a0 --- /dev/null +++ b/setup/modules/optional-Modules/apps/sox.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed sox diff --git a/setup/modules/optional-Modules/apps/tlp.sh b/setup/modules/optional-Modules/apps/tlp.sh new file mode 100755 index 0000000..07ef5e4 --- /dev/null +++ b/setup/modules/optional-Modules/apps/tlp.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed tlp tlp-rdw + +sudo systemctl enable --now tlp.service +sudo systemctl enable NetworkManager-dispatcher.service +sudo systemctl mask systemd-rfkill.service systemd-rfkill.socket diff --git a/setup/modules/optional-Modules/apps/toot.sh b/setup/modules/optional-Modules/apps/toot.sh new file mode 100755 index 0000000..69b9b7b --- /dev/null +++ b/setup/modules/optional-Modules/apps/toot.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +yay -S --answerdiff None --answerclean All --noconfirm toot diff --git a/setup/modules/optional-Modules/apps/yt-dlp.sh b/setup/modules/optional-Modules/apps/yt-dlp.sh new file mode 100755 index 0000000..2b971b3 --- /dev/null +++ b/setup/modules/optional-Modules/apps/yt-dlp.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +sudo pacman -S --noconfirm --needed yt-dlp diff --git a/setup/tui-install.sh b/setup/tui-install.sh index 5a45b8a..c021334 100755 --- a/setup/tui-install.sh +++ b/setup/tui-install.sh @@ -94,23 +94,40 @@ count_steps() { [[ "$c" == *"svc"* ]] && TOTAL=$(( TOTAL + 1 )) [[ "$c" == *"shell"* ]] && TOTAL=$(( TOTAL + 1 )) [[ "$c" == *"de"* && "$de" != "none" ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"steam"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"vesktop"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"spotify"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"prism"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"vintagestory"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"localsend"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"croc"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"onlyoffice"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"wireshark"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"k8s"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"docker"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"podman"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"cockpit"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"ssh-server"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"python"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"zfs"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"wprs"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"networking-cli"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"disk-recovery"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"himalaya"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"gnuplot"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"povray"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"blender"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"toot"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"db-clients"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"mysql"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"productivity"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"yt-dlp"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"sox"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"imagemagick"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"ffmpeg"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"localtunnel"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"butter"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"tlp"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"steam"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"vesktop"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"spotify"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"prism"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"vintagestory"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"localsend"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"croc"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"onlyoffice"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"wireshark"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"k8s"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"docker"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"podman"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"cockpit"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"ssh-server"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"python"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"zfs"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ "$a" == *"wprs"* ]] && TOTAL=$(( TOTAL + 1 )) } # ── Preflight ───────────────────────────────────────────────────────────────── @@ -161,24 +178,41 @@ fi # ── Apps selection ──────────────────────────────────────────────────────────── SELECTED_APPS=$(dialog --backtitle "$BACKTITLE" \ --title " Applications " \ - --checklist "Optional applications — installed after base components:" 32 72 18 \ - "steam" "Steam gaming platform" off \ - "vesktop" "Vesktop Discord + Vencord theme" off \ - "spotify" "Spotify launcher + Spicetify theming" off \ - "prism" "PrismLauncher Minecraft launcher (Flatpak)" off \ - "vintagestory" "Vintage Story survival game (AUR)" off \ - "localsend" "LocalSend LAN file transfer (AUR)" off \ - "croc" "croc cross-platform file transfer" off \ - "onlyoffice" "OnlyOffice office suite (AUR)" off \ - "wireshark" "Wireshark network packet analyser" off \ - "k8s" "Kubernetes tools kubectl · podman-desktop" off \ - "docker" "Docker docker · docker-compose" off \ - "podman" "Podman rootless containers · buildah" off \ - "cockpit" "Cockpit web UI · machines · podman" off \ - "ssh-server" "SSH server openssh · key-auth · enabled" off \ - "python" "Python tools pyright · pipx · pynvim" off \ - "zfs" "ZFS zfs-dkms kernel module" off \ - "wprs" "WPRS wprs-git (AUR)" off \ + --checklist "Optional applications — installed after base components:" 40 76 32 \ + "networking-cli" "Networking CLI nmap · nethogs · mitmproxy · httpie" off \ + "disk-recovery" "Disk Recovery ddrescue · f3" off \ + "himalaya" "Himalaya terminal email client (AUR)" off \ + "gnuplot" "Gnuplot scientific plotting" off \ + "povray" "POV-Ray ray-tracing renderer" off \ + "blender" "Blender 3D creation suite" off \ + "toot" "toot Mastodon CLI client (AUR)" off \ + "db-clients" "DB Clients pgcli · mycli" off \ + "mysql" "MySQL / MariaDB mariadb server + setup" off \ + "productivity" "Productivity taskwarrior · watson · jrnl" off \ + "yt-dlp" "yt-dlp YouTube / media downloader" off \ + "sox" "SoX audio processing toolkit" off \ + "imagemagick" "ImageMagick image manipulation" off \ + "ffmpeg" "FFmpeg extras thumbnailer · GStreamer codecs" off \ + "localtunnel" "LocalTunnel expose localhost via tunnel" off \ + "butter" "butter btrfs snapshot backup (AUR)" off \ + "tlp" "TLP laptop power management" off \ + "steam" "Steam gaming platform" off \ + "vesktop" "Vesktop Discord + Vencord theme" off \ + "spotify" "Spotify launcher + Spicetify theming" off \ + "prism" "PrismLauncher Minecraft launcher (Flatpak)" off \ + "vintagestory" "Vintage Story survival game (AUR)" off \ + "localsend" "LocalSend LAN file transfer (AUR)" off \ + "croc" "croc cross-platform file transfer" off \ + "onlyoffice" "OnlyOffice office suite (AUR)" off \ + "wireshark" "Wireshark network packet analyser (GUI)" off \ + "k8s" "Kubernetes tools kubectl · podman-desktop" off \ + "docker" "Docker docker · docker-compose" off \ + "podman" "Podman rootless containers · buildah" off \ + "cockpit" "Cockpit web UI · machines · podman" off \ + "ssh-server" "SSH server openssh · key-auth · enabled" off \ + "python" "Python tools pyright · pipx · pynvim" off \ + "zfs" "ZFS zfs-dkms kernel module" off \ + "wprs" "WPRS wprs-git (AUR)" off \ 3>&1 1>&2 2>&3) || SELECTED_APPS="" # ── Confirmation ────────────────────────────────────────────────────────────── @@ -191,23 +225,40 @@ SUMMARY="" if [[ -n "$SELECTED_APPS" ]]; then SUMMARY+="\n Applications:\n" - [[ "$SELECTED_APPS" == *"steam"* ]] && SUMMARY+=" ✦ Steam\n" - [[ "$SELECTED_APPS" == *"vesktop"* ]] && SUMMARY+=" ✦ Vesktop + Vencord theme\n" - [[ "$SELECTED_APPS" == *"spotify"* ]] && SUMMARY+=" ✦ Spotify + Spicetify\n" - [[ "$SELECTED_APPS" == *"prism"* ]] && SUMMARY+=" ✦ PrismLauncher\n" - [[ "$SELECTED_APPS" == *"vintagestory"* ]] && SUMMARY+=" ✦ Vintage Story\n" - [[ "$SELECTED_APPS" == *"localsend"* ]] && SUMMARY+=" ✦ LocalSend\n" - [[ "$SELECTED_APPS" == *"croc"* ]] && SUMMARY+=" ✦ croc\n" - [[ "$SELECTED_APPS" == *"onlyoffice"* ]] && SUMMARY+=" ✦ OnlyOffice\n" - [[ "$SELECTED_APPS" == *"wireshark"* ]] && SUMMARY+=" ✦ Wireshark\n" - [[ "$SELECTED_APPS" == *"k8s"* ]] && SUMMARY+=" ✦ Kubernetes tools\n" - [[ "$SELECTED_APPS" == *"docker"* ]] && SUMMARY+=" ✦ Docker + Compose\n" - [[ "$SELECTED_APPS" == *"podman"* ]] && SUMMARY+=" ✦ Podman (rootless) + Buildah\n" - [[ "$SELECTED_APPS" == *"cockpit"* ]] && SUMMARY+=" ✦ Cockpit web UI\n" - [[ "$SELECTED_APPS" == *"ssh-server"* ]] && SUMMARY+=" ✦ SSH server (openssh, key auth)\n" - [[ "$SELECTED_APPS" == *"python"* ]] && SUMMARY+=" ✦ Python tools\n" - [[ "$SELECTED_APPS" == *"zfs"* ]] && SUMMARY+=" ✦ ZFS\n" - [[ "$SELECTED_APPS" == *"wprs"* ]] && SUMMARY+=" ✦ WPRS\n" + [[ "$SELECTED_APPS" == *"networking-cli"* ]] && SUMMARY+=" ✦ Networking CLI (nmap, nethogs, mitmproxy, httpie)\n" + [[ "$SELECTED_APPS" == *"disk-recovery"* ]] && SUMMARY+=" ✦ Disk Recovery (ddrescue, f3)\n" + [[ "$SELECTED_APPS" == *"himalaya"* ]] && SUMMARY+=" ✦ Himalaya\n" + [[ "$SELECTED_APPS" == *"gnuplot"* ]] && SUMMARY+=" ✦ Gnuplot\n" + [[ "$SELECTED_APPS" == *"povray"* ]] && SUMMARY+=" ✦ POV-Ray\n" + [[ "$SELECTED_APPS" == *"blender"* ]] && SUMMARY+=" ✦ Blender\n" + [[ "$SELECTED_APPS" == *"toot"* ]] && SUMMARY+=" ✦ toot\n" + [[ "$SELECTED_APPS" == *"db-clients"* ]] && SUMMARY+=" ✦ DB Clients (pgcli, mycli)\n" + [[ "$SELECTED_APPS" == *"mysql"* ]] && SUMMARY+=" ✦ MySQL / MariaDB\n" + [[ "$SELECTED_APPS" == *"productivity"* ]] && SUMMARY+=" ✦ Productivity (taskwarrior, watson, jrnl)\n" + [[ "$SELECTED_APPS" == *"yt-dlp"* ]] && SUMMARY+=" ✦ yt-dlp\n" + [[ "$SELECTED_APPS" == *"sox"* ]] && SUMMARY+=" ✦ SoX\n" + [[ "$SELECTED_APPS" == *"imagemagick"* ]] && SUMMARY+=" ✦ ImageMagick\n" + [[ "$SELECTED_APPS" == *"ffmpeg"* ]] && SUMMARY+=" ✦ FFmpeg extras\n" + [[ "$SELECTED_APPS" == *"localtunnel"* ]] && SUMMARY+=" ✦ LocalTunnel\n" + [[ "$SELECTED_APPS" == *"butter"* ]] && SUMMARY+=" ✦ butter (btrfs backup)\n" + [[ "$SELECTED_APPS" == *"tlp"* ]] && SUMMARY+=" ✦ TLP\n" + [[ "$SELECTED_APPS" == *"steam"* ]] && SUMMARY+=" ✦ Steam\n" + [[ "$SELECTED_APPS" == *"vesktop"* ]] && SUMMARY+=" ✦ Vesktop + Vencord theme\n" + [[ "$SELECTED_APPS" == *"spotify"* ]] && SUMMARY+=" ✦ Spotify + Spicetify\n" + [[ "$SELECTED_APPS" == *"prism"* ]] && SUMMARY+=" ✦ PrismLauncher\n" + [[ "$SELECTED_APPS" == *"vintagestory"* ]] && SUMMARY+=" ✦ Vintage Story\n" + [[ "$SELECTED_APPS" == *"localsend"* ]] && SUMMARY+=" ✦ LocalSend\n" + [[ "$SELECTED_APPS" == *"croc"* ]] && SUMMARY+=" ✦ croc\n" + [[ "$SELECTED_APPS" == *"onlyoffice"* ]] && SUMMARY+=" ✦ OnlyOffice\n" + [[ "$SELECTED_APPS" == *"wireshark"* ]] && SUMMARY+=" ✦ Wireshark\n" + [[ "$SELECTED_APPS" == *"k8s"* ]] && SUMMARY+=" ✦ Kubernetes tools\n" + [[ "$SELECTED_APPS" == *"docker"* ]] && SUMMARY+=" ✦ Docker + Compose\n" + [[ "$SELECTED_APPS" == *"podman"* ]] && SUMMARY+=" ✦ Podman (rootless) + Buildah\n" + [[ "$SELECTED_APPS" == *"cockpit"* ]] && SUMMARY+=" ✦ Cockpit web UI\n" + [[ "$SELECTED_APPS" == *"ssh-server"* ]] && SUMMARY+=" ✦ SSH server (openssh, key auth)\n" + [[ "$SELECTED_APPS" == *"python"* ]] && SUMMARY+=" ✦ Python tools\n" + [[ "$SELECTED_APPS" == *"zfs"* ]] && SUMMARY+=" ✦ ZFS\n" + [[ "$SELECTED_APPS" == *"wprs"* ]] && SUMMARY+=" ✦ WPRS\n" fi dialog --backtitle "$BACKTITLE" \ @@ -231,23 +282,40 @@ if [[ "$COMPONENTS" == *"de"* && "$DE" != "none" ]]; then fi # ── Installation: applications ──────────────────────────────────────────────── -[[ "$SELECTED_APPS" == *"steam"* ]] && run_module "Steam" "$APPS/steam.sh" -[[ "$SELECTED_APPS" == *"vesktop"* ]] && run_module "Vesktop" "$APPS/vesktop.sh" -[[ "$SELECTED_APPS" == *"spotify"* ]] && run_module "Spotify" "$APPS/spotify.sh" -[[ "$SELECTED_APPS" == *"prism"* ]] && run_module "PrismLauncher" "$APPS/prismlauncher.sh" -[[ "$SELECTED_APPS" == *"vintagestory"* ]] && run_module "Vintage Story" "$APPS/vintagestory.sh" -[[ "$SELECTED_APPS" == *"localsend"* ]] && run_module "LocalSend" "$APPS/localsend.sh" -[[ "$SELECTED_APPS" == *"croc"* ]] && run_module "croc" "$APPS/croc.sh" -[[ "$SELECTED_APPS" == *"onlyoffice"* ]] && run_module "OnlyOffice" "$APPS/onlyoffice.sh" -[[ "$SELECTED_APPS" == *"wireshark"* ]] && run_module "Wireshark" "$APPS/wireshark.sh" -[[ "$SELECTED_APPS" == *"k8s"* ]] && run_module "Kubernetes Tools" "$APPS/k8s.sh" -[[ "$SELECTED_APPS" == *"docker"* ]] && run_module "Docker" "$APPS/docker.sh" -[[ "$SELECTED_APPS" == *"podman"* ]] && run_module "Podman" "$APPS/podman.sh" -[[ "$SELECTED_APPS" == *"cockpit"* ]] && run_module "Cockpit" "$APPS/cockpit.sh" -[[ "$SELECTED_APPS" == *"ssh-server"* ]] && run_module "SSH Server" "$APPS/ssh-server.sh" -[[ "$SELECTED_APPS" == *"python"* ]] && run_module "Python Tools" "$MODULES/optional-Modules/python.sh" -[[ "$SELECTED_APPS" == *"zfs"* ]] && run_module "ZFS" "$MODULES/optional-Modules/zfs.sh" -[[ "$SELECTED_APPS" == *"wprs"* ]] && run_module "WPRS" "$MODULES/optional-Modules/wprs.sh" +[[ "$SELECTED_APPS" == *"networking-cli"* ]] && run_module "Networking CLI" "$APPS/networking-cli.sh" +[[ "$SELECTED_APPS" == *"disk-recovery"* ]] && run_module "Disk Recovery" "$APPS/disk-recovery.sh" +[[ "$SELECTED_APPS" == *"himalaya"* ]] && run_module "Himalaya" "$APPS/himalaya.sh" +[[ "$SELECTED_APPS" == *"gnuplot"* ]] && run_module "Gnuplot" "$APPS/gnuplot.sh" +[[ "$SELECTED_APPS" == *"povray"* ]] && run_module "POV-Ray" "$APPS/povray.sh" +[[ "$SELECTED_APPS" == *"blender"* ]] && run_module "Blender" "$APPS/blender.sh" +[[ "$SELECTED_APPS" == *"toot"* ]] && run_module "toot" "$APPS/toot.sh" +[[ "$SELECTED_APPS" == *"db-clients"* ]] && run_module "DB Clients" "$APPS/db-clients.sh" +[[ "$SELECTED_APPS" == *"mysql"* ]] && run_module "MySQL / MariaDB" "$APPS/mysql.sh" +[[ "$SELECTED_APPS" == *"productivity"* ]] && run_module "Productivity" "$APPS/productivity.sh" +[[ "$SELECTED_APPS" == *"yt-dlp"* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh" +[[ "$SELECTED_APPS" == *"sox"* ]] && run_module "SoX" "$APPS/sox.sh" +[[ "$SELECTED_APPS" == *"imagemagick"* ]] && run_module "ImageMagick" "$APPS/imagemagick.sh" +[[ "$SELECTED_APPS" == *"ffmpeg"* ]] && run_module "FFmpeg extras" "$APPS/ffmpeg.sh" +[[ "$SELECTED_APPS" == *"localtunnel"* ]] && run_module "LocalTunnel" "$APPS/localtunnel.sh" +[[ "$SELECTED_APPS" == *"butter"* ]] && run_module "butter" "$APPS/butter.sh" +[[ "$SELECTED_APPS" == *"tlp"* ]] && run_module "TLP" "$APPS/tlp.sh" +[[ "$SELECTED_APPS" == *"steam"* ]] && run_module "Steam" "$APPS/steam.sh" +[[ "$SELECTED_APPS" == *"vesktop"* ]] && run_module "Vesktop" "$APPS/vesktop.sh" +[[ "$SELECTED_APPS" == *"spotify"* ]] && run_module "Spotify" "$APPS/spotify.sh" +[[ "$SELECTED_APPS" == *"prism"* ]] && run_module "PrismLauncher" "$APPS/prismlauncher.sh" +[[ "$SELECTED_APPS" == *"vintagestory"* ]] && run_module "Vintage Story" "$APPS/vintagestory.sh" +[[ "$SELECTED_APPS" == *"localsend"* ]] && run_module "LocalSend" "$APPS/localsend.sh" +[[ "$SELECTED_APPS" == *"croc"* ]] && run_module "croc" "$APPS/croc.sh" +[[ "$SELECTED_APPS" == *"onlyoffice"* ]] && run_module "OnlyOffice" "$APPS/onlyoffice.sh" +[[ "$SELECTED_APPS" == *"wireshark"* ]] && run_module "Wireshark" "$APPS/wireshark.sh" +[[ "$SELECTED_APPS" == *"k8s"* ]] && run_module "Kubernetes Tools" "$APPS/k8s.sh" +[[ "$SELECTED_APPS" == *"docker"* ]] && run_module "Docker" "$APPS/docker.sh" +[[ "$SELECTED_APPS" == *"podman"* ]] && run_module "Podman" "$APPS/podman.sh" +[[ "$SELECTED_APPS" == *"cockpit"* ]] && run_module "Cockpit" "$APPS/cockpit.sh" +[[ "$SELECTED_APPS" == *"ssh-server"* ]] && run_module "SSH Server" "$APPS/ssh-server.sh" +[[ "$SELECTED_APPS" == *"python"* ]] && run_module "Python Tools" "$MODULES/optional-Modules/python.sh" +[[ "$SELECTED_APPS" == *"zfs"* ]] && run_module "ZFS" "$MODULES/optional-Modules/zfs.sh" +[[ "$SELECTED_APPS" == *"wprs"* ]] && run_module "WPRS" "$MODULES/optional-Modules/wprs.sh" # ── Done ────────────────────────────────────────────────────────────────────── dialog --backtitle "$BACKTITLE" \