From a92de3193a9d442ed125f42cfb938ace6f4b7b63 Mon Sep 17 00:00:00 2001 From: The_miro Date: Fri, 26 Jun 2026 14:12:09 +0200 Subject: [PATCH] fix(installer): address issues 2-8 from sanity check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #2 — Word-boundary match for all module patterns Generator now pads SELECTED_APPS with spaces and uses *" id "* in counters, summary, and dispatch, matching the conflict fix from #1. plymouth-custom no longer false-triggers any plymouth check. #3 — Guided installer now runs tui-install.sh archbaseos-guided-install.sh was calling simple-install.sh; both paths now use the full TUI (sentinel-managed, modules.conf-driven). #4 — EFI/boot partition size unified at 10 GiB arch-autoinstall.sh was 15 GiB, archbaseos-guided-install.sh was 5 GiB. Both now use 10 GiB. #5 — Interactive retry for dotfiles clone (guided installer) Clone moved outside the chroot heredoc so read() reaches the terminal. Loops until success or the user skips; AF_MODE warns and continues. #6 — PAM target unified on system-local-login archbaseos-guided-install.sh was writing to system-auth (affects sudo). Both installers now target system-local-login only. #7 — Redundant second clone removed from autoinstaller arch-autoinstall.sh had a second git clone inside the chroot as a fallback that collided with the skel copy and printed a spurious warning. Removed; skel-only approach matches the guided installer (last updated). Also removed the individual .zshrc/.bashrc/.vimrc cp block; aligned to the guided installer's cleaner skel structure. #8 — Docs: remove stale plymouth core-module section docs/md/modules.md still described plymouth under Core Modules. Section removed; plymouth appears in Optional Applications (system category) via the generated sentinel. Co-Authored-By: Claude Sonnet 4.6 --- docs/md/modules.md | 11 - setup/arch-autoinstall.sh | 38 +-- setup/archbaseos-guided-install.sh | 45 ++- setup/tools/generate-modules.sh | 6 +- setup/tui-install.sh | 480 ++++++++++++++--------------- 5 files changed, 283 insertions(+), 297 deletions(-) diff --git a/docs/md/modules.md b/docs/md/modules.md index bacc6bd..3ea5e68 100644 --- a/docs/md/modules.md +++ b/docs/md/modules.md @@ -47,17 +47,6 @@ Also deploys `greetd-tuigreet` config from the dotfiles. - **Yazi** file manager - Deploys `.bashrc`, `.zshrc`, `starship.toml`, Micro config, Neovim config -### `plymouth` — Boot Splash *(on by default)* - -Installs the **M-Archy Plymouth theme**: the skull logo (`resources/bg-skull.svg`) centred on a dark background with a 12-dot magenta spinner animation below it. - -- Converts the bundled SVG to PNG via `rsvg-convert` (Plymouth's image loader is PNG-only) -- Injects the `plymouth` or `sd-plymouth` mkinitcpio hook automatically (detects `udev` vs `systemd` hook set) -- Adds `quiet splash` to `GRUB_CMDLINE_LINUX_DEFAULT` and regenerates GRUB config -- Rebuilds the initramfs so the theme is baked in - -To install with a **custom image** on an existing system, use `install-modules.sh` and select *Plymouth (custom)* — you will be prompted for a PNG or SVG path. - --- ## Desktop Environments diff --git a/setup/arch-autoinstall.sh b/setup/arch-autoinstall.sh index 195fa79..fdc7c21 100755 --- a/setup/arch-autoinstall.sh +++ b/setup/arch-autoinstall.sh @@ -273,15 +273,15 @@ fi # Read installed RAM in GiB; used to size both the swap and to calculate remaining # root space. `--giga` prints in GiB units; awk extracts the total column. RAM_GB=$(free --giga | awk '/^Mem:/ {print $2}') -# 15 GiB boot partition: large enough for multiple kernels, initramfs, and UKIs. -BOOT_SIZE=15GiB +# 10 GiB boot partition: large enough for multiple kernels, initramfs, and UKIs. +BOOT_SIZE=10GiB SWAP_SIZE="${RAM_GB}GiB" # lsblk -b reports raw bytes; divide down to GiB for integer arithmetic. DISK_SIZE=$(lsblk -b -dn -o SIZE "$DRIVE") DISK_GIB=$((DISK_SIZE / 1024 / 1024 / 1024)) -# Root gets whatever is left after reserving 15 GiB for boot and RAM_GB for swap. -ROOT_GIB=$((DISK_GIB - RAM_GB - 15)) +# Root gets whatever is left after reserving 10 GiB for boot and RAM_GB for swap. +ROOT_GIB=$((DISK_GIB - RAM_GB - 10)) if (( ROOT_GIB < 8 )); then echo "ERROR: Not enough disk space. Root would be only ${ROOT_GIB}GiB (need ≥8GiB)." exit 1 @@ -296,16 +296,16 @@ echo " Swap: ${SWAP_SIZE}" # PARTITION DISK ############################################ # --script suppresses interactive prompts; mklabel gpt wipes any existing table. -# Partition 1: ESP at 1MiB–15GiB, flagged boot/esp so firmware can find it. +# Partition 1: ESP at 1MiB–10GiB, flagged boot/esp so firmware can find it. # Partition 2: ROOT immediately after the ESP. # Partition 3: SWAP fills the rest (100%). # Starting at 1MiB aligns the first partition to a 1 MiB boundary, which is # optimal for both SSD erase blocks and spinner track alignment. parted "$DRIVE" --script mklabel gpt \ - mkpart ESP fat32 1MiB 15GiB \ + mkpart ESP fat32 1MiB 10GiB \ set 1 boot on \ - mkpart ROOT 15GiB "$((15 + ROOT_GIB))"GiB \ - mkpart SWAP "$((15 + ROOT_GIB))"GiB 100% + mkpart ROOT 10GiB "$((10 + ROOT_GIB))"GiB \ + mkpart SWAP "$((10 + ROOT_GIB))"GiB 100% # Resolve partition device paths via the `part` helper (handles NVMe 'p' suffix). BOOT_PART=$(part "$DRIVE" 1) @@ -488,16 +488,8 @@ systemctl enable NetworkManager # Populate /etc/skel before user creation so useradd -m copies everything echo "Cloning dotfiles into /etc/skel..." git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /etc/skel/Dotfiles \ - || echo "Warning: dotfiles clone into skel failed — will fall back to direct clone." -# Seed /etc/skel with base shell dotfiles from the repo clone -if [[ -d /etc/skel/Dotfiles ]]; then - D=/etc/skel/Dotfiles - # Copy individually; `2>/dev/null || true` silently skips any file that is absent - # in this repo revision rather than aborting the install. - cp "$D/.zshrc" /etc/skel/.zshrc 2>/dev/null || true - cp "$D/.bashrc" /etc/skel/.bashrc 2>/dev/null || true - cp "$D/.vimrc" /etc/skel/.vimrc 2>/dev/null || true -fi + || echo "Warning: dotfiles clone failed — clone manually after first boot." +mkdir -p /etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos} # User # -m: create home dir; -G wheel: add to sudoers group; -s /bin/zsh: default shell. @@ -568,16 +560,6 @@ if [[ "$FIDO_USER" == "YES" ]]; then echo "auth required pam_u2f.so" >> /etc/pam.d/system-local-login fi -################################################### -# CLONE DOTFILES -################################################### -# Fall back to a direct clone if /etc/skel/Dotfiles was not copied into home -# (happens when the skel clone failed or useradd did not copy skel). -echo "Cloning dotfiles..." -git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git "/home/$USERNAME/Dotfiles" \ - && chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/Dotfiles" \ - || echo "Warning: dotfiles clone failed — clone manually after first boot." - CHROOT_EOF ############################################ diff --git a/setup/archbaseos-guided-install.sh b/setup/archbaseos-guided-install.sh index ee9a89c..310746c 100755 --- a/setup/archbaseos-guided-install.sh +++ b/setup/archbaseos-guided-install.sh @@ -243,8 +243,8 @@ RAM_GB=$(free --giga | awk '/Mem/ {print $2}') # lsblk -b: bytes; -d: disk only (no partitions); -n: no header; -o SIZE: size column. DISK_GB=$(lsblk -dn -o SIZE -b "$DRIVE" | awk '{print int($1/1024/1024/1024)}') -# Reserve 5 GiB for the EFI partition and 1 GiB for alignment/overhead. -EFI_SIZE=5 +# Reserve 10 GiB for the EFI partition and 1 GiB for alignment/overhead. +EFI_SIZE=10 SWAP_SIZE=$RAM_GB ROOT_SIZE=$((DISK_GB - SWAP_SIZE - EFI_SIZE - 1)) @@ -389,6 +389,29 @@ if $AF_MODE; then install -m 644 "$ANSWERFILE" /mnt/answerfile.json fi +############################################ +# DOTFILES CLONE TO SKEL (with retry) +############################################ +# Clone before entering the chroot so useradd -m inside will copy Dotfiles to +# the new user's home. Interactive retry is available so a transient network +# failure doesn't silently leave the system without dotfiles. +echo "Cloning dotfiles into /mnt/etc/skel..." +_clone_ok=false +while ! $_clone_ok; do + if git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /mnt/etc/skel/Dotfiles; then + mkdir -p /mnt/etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos} + _clone_ok=true + else + if $AF_MODE; then + echo "Warning: dotfiles clone failed — continuing without dotfiles." + _clone_ok=true + else + read -rp "Clone failed — retry? [y/N]: " _retry + [[ "${_retry,,}" == "y" ]] || { echo "Skipping dotfiles — clone manually after first boot."; _clone_ok=true; } + fi + fi +done + ############################################ # CHROOT Configuration ############################################ @@ -430,15 +453,7 @@ echo "$HOSTNAME" > /etc/hostname # Enable NetworkManager at boot so the installed system has networking on first login. systemctl enable NetworkManager -# Populate /etc/skel before user creation so useradd -m copies everything -echo "Cloning dotfiles into /etc/skel..." -git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /etc/skel/Dotfiles \ - || echo "Warning: dotfiles clone failed — clone manually after first boot." - -# Create standard XDG user directories in skel so they are present in every new home. -mkdir -p /etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos} - -# -m: create home from /etc/skel; -G wheel: allow sudo; -s /bin/zsh: default shell. +# -m: create home from /etc/skel (dotfiles cloned before chroot); -G wheel: allow sudo; -s /bin/zsh: default shell. useradd -m -G wheel -s /bin/zsh "$USERNAME" # chpasswd reads "user:pass" from stdin to set the password non-interactively. echo "$USERNAME:$USERPASS" | chpasswd @@ -492,7 +507,7 @@ if [[ "$ENABLE_FIDO_USER" == "YES" ]]; then mkdir -p "/home/$USERNAME/.config/Yubico" chown "$USERNAME:$USERNAME" "/home/$USERNAME/.config/Yubico" # `cue` option: pam_u2f prints a prompt so the user knows to touch the key. - echo "auth required pam_u2f.so cue" >> /etc/pam.d/system-auth + echo "auth required pam_u2f.so cue" >> /etc/pam.d/system-local-login fi CHROOT_EOF @@ -535,11 +550,11 @@ if [[ "${_DO_TUI^^}" == "YES" ]]; then echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" \ | arch-chroot /mnt tee /etc/sudoers.d/99-setup-nopasswd > /dev/null - echo "Running simple-install.sh as ${USERNAME} inside chroot..." + echo "Running tui-install.sh as ${USERNAME} inside chroot..." # `runuser -u` switches to the unprivileged user inside the chroot so that # AUR helpers and dotfiles are owned/built by the correct UID. arch-chroot /mnt runuser -u "${USERNAME}" -- \ - bash "/home/${USERNAME}/Dotfiles/setup/simple-install.sh" \ + bash "/home/${USERNAME}/Dotfiles/setup/tui-install.sh" \ || echo "Warning: tui-install exited with errors — check ~/dotfiles-install.log in the new system." # Remove the temporary no-password sudoers drop-in after setup completes. @@ -560,7 +575,7 @@ echo " umount -R /mnt && reboot" if [[ "${_DO_TUI^^}" != "YES" ]]; then echo echo "After first boot, login as ${USERNAME} and run:" - echo " ~/Dotfiles/setup/simple-install.sh" + echo " ~/Dotfiles/setup/tui-install.sh" fi if [[ "$ENCRYPT_DISK" == "YES" ]]; then echo diff --git a/setup/tools/generate-modules.sh b/setup/tools/generate-modules.sh index cbdb2c3..8f1f545 100755 --- a/setup/tools/generate-modules.sh +++ b/setup/tools/generate-modules.sh @@ -56,7 +56,7 @@ fi gen_counters="" for i in "${ACTIVE_IDS[@]}"; do id="${M_IDS[$i]}" - gen_counters+=" [[ \"\$a\" == *\"${id}\"* ]] && TOTAL=\$(( TOTAL + 1 ))\n" + gen_counters+=" [[ \" \$a \" == *\" ${id} \"* ]] && TOTAL=\$(( TOTAL + 1 ))\n" done # -- module-checklist (tui-install.sh and generate-answerfile.sh) ------------- @@ -99,7 +99,7 @@ gen_checklist_af=$(build_checklist_af) gen_summary="" for i in "${ACTIVE_IDS[@]}"; do id="${M_IDS[$i]}" - gen_summary+=" [[ \"\$SELECTED_APPS\" == *\"${id}\"* ]] && SUMMARY+=\" ✦ ${id}\\\\n\"\n" + gen_summary+=" [[ \" \$SELECTED_APPS \" == *\" ${id} \"* ]] && SUMMARY+=\" ✦ ${id}\\\\n\"\n" done # -- module-conflicts (tui-install.sh: before dispatch) ----------------------- @@ -125,7 +125,7 @@ done gen_dispatch="" for i in "${ACTIVE_IDS[@]}"; do id="${M_IDS[$i]}" - gen_dispatch+="[[ \"\$SELECTED_APPS\" == *\"${id}\"* ]] && run_module \"${id}\" \"\$APPS/${id}.sh\"\n" + gen_dispatch+="[[ \" \$SELECTED_APPS \" == *\" ${id} \"* ]] && run_module \"${id}\" \"\$APPS/${id}.sh\"\n" done # -- per-category doc tables (docs/md/modules.md) ----------------------------- diff --git a/setup/tui-install.sh b/setup/tui-install.sh index 6b931fa..767dbc9 100755 --- a/setup/tui-install.sh +++ b/setup/tui-install.sh @@ -174,86 +174,86 @@ count_steps() { # Glob syntax *"tag"* matches if the space-separated SELECTED_APPS string # contains the tag anywhere — works because tags never share substrings. # BEGIN GENERATED MODULES: module-counters - [[ "$a" == *"ollama"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"llama-cpp"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"open-webui"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"claude"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"networking-cli"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"disk-recovery"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"himalaya"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"mail-notmuch"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"caldav-sync"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"ssh-server"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"wireshark"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"anti-malware"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"gnuplot"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"blender-povray"* ]] && 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" == *"python"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"k8s"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"docker"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"podman"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"cockpit"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"tlp"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"butter"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"localsend"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"croc"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"opendeck"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"localtunnel"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"timeshift"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"zfs"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"wprs"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"plymouth"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"plymouth-custom"* ]] && 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" == *"openarena"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"tetris"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"doom"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"sauerbraten"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"stuntrally"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"onlyoffice"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"xournal"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"rnote"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"obsidian"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"tangent-notes"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"ffmpeg"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"sox"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"imagemagick"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"yt-dlp"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"gimp"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"inkscape"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"krita"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"kdenlive"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"openshot"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"shotcut"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"ardour"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"audacity"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"lmms"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"mixxx"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"cecilia"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"chromium"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"firefox-browser"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"zen-browser"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"nyxt"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"librewolf"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"min-browser"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"vscodium"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"zed-ide"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"geany"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"codeblocks"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"kate"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"rdp-client"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"lamco-rdp-server"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"qemu"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"freeipa-client"* ]] && TOTAL=$(( TOTAL + 1 )) - [[ "$a" == *"freeipa-server"* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" ollama "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" llama-cpp "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" open-webui "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" claude "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" networking-cli "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" disk-recovery "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" himalaya "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" mail-notmuch "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" caldav-sync "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" ssh-server "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" wireshark "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" anti-malware "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" gnuplot "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" blender-povray "* ]] && 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 " == *" python "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" k8s "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" docker "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" podman "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" cockpit "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" tlp "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" butter "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" localsend "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" croc "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" opendeck "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" localtunnel "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" timeshift "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" zfs "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" wprs "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" plymouth "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" plymouth-custom "* ]] && 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 " == *" openarena "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" tetris "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" doom "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" sauerbraten "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" stuntrally "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" onlyoffice "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" xournal "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" rnote "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" obsidian "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" tangent-notes "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" ffmpeg "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" sox "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" imagemagick "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" yt-dlp "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" gimp "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" inkscape "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" krita "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" kdenlive "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" openshot "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" shotcut "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" ardour "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" audacity "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" lmms "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" mixxx "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" cecilia "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" chromium "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" firefox-browser "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" zen-browser "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" nyxt "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" librewolf "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" min-browser "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" vscodium "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" zed-ide "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" geany "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" codeblocks "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" kate "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" rdp-client "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" lamco-rdp-server "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" qemu "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" freeipa-client "* ]] && TOTAL=$(( TOTAL + 1 )) + [[ " $a " == *" freeipa-server "* ]] && TOTAL=$(( TOTAL + 1 )) # END GENERATED MODULES: module-counters } @@ -571,86 +571,86 @@ if ! $ANSWERFILE_MODE; then if [[ -n "$SELECTED_APPS" ]]; then SUMMARY+="\n Applications:\n" # BEGIN GENERATED MODULES: module-summary - [[ "$SELECTED_APPS" == *"ollama"* ]] && SUMMARY+=" ✦ ollama\n" - [[ "$SELECTED_APPS" == *"llama-cpp"* ]] && SUMMARY+=" ✦ llama-cpp\n" - [[ "$SELECTED_APPS" == *"open-webui"* ]] && SUMMARY+=" ✦ open-webui\n" - [[ "$SELECTED_APPS" == *"claude"* ]] && SUMMARY+=" ✦ claude\n" - [[ "$SELECTED_APPS" == *"networking-cli"* ]] && SUMMARY+=" ✦ networking-cli\n" - [[ "$SELECTED_APPS" == *"disk-recovery"* ]] && SUMMARY+=" ✦ disk-recovery\n" - [[ "$SELECTED_APPS" == *"himalaya"* ]] && SUMMARY+=" ✦ himalaya\n" - [[ "$SELECTED_APPS" == *"mail-notmuch"* ]] && SUMMARY+=" ✦ mail-notmuch\n" - [[ "$SELECTED_APPS" == *"caldav-sync"* ]] && SUMMARY+=" ✦ caldav-sync\n" - [[ "$SELECTED_APPS" == *"ssh-server"* ]] && SUMMARY+=" ✦ ssh-server\n" - [[ "$SELECTED_APPS" == *"wireshark"* ]] && SUMMARY+=" ✦ wireshark\n" - [[ "$SELECTED_APPS" == *"anti-malware"* ]] && SUMMARY+=" ✦ anti-malware\n" - [[ "$SELECTED_APPS" == *"gnuplot"* ]] && SUMMARY+=" ✦ gnuplot\n" - [[ "$SELECTED_APPS" == *"blender-povray"* ]] && SUMMARY+=" ✦ blender-povray\n" - [[ "$SELECTED_APPS" == *"toot"* ]] && SUMMARY+=" ✦ toot\n" - [[ "$SELECTED_APPS" == *"db-clients"* ]] && SUMMARY+=" ✦ db-clients\n" - [[ "$SELECTED_APPS" == *"mysql"* ]] && SUMMARY+=" ✦ mysql\n" - [[ "$SELECTED_APPS" == *"productivity"* ]] && SUMMARY+=" ✦ productivity\n" - [[ "$SELECTED_APPS" == *"python"* ]] && SUMMARY+=" ✦ python\n" - [[ "$SELECTED_APPS" == *"k8s"* ]] && SUMMARY+=" ✦ k8s\n" - [[ "$SELECTED_APPS" == *"docker"* ]] && SUMMARY+=" ✦ docker\n" - [[ "$SELECTED_APPS" == *"podman"* ]] && SUMMARY+=" ✦ podman\n" - [[ "$SELECTED_APPS" == *"cockpit"* ]] && SUMMARY+=" ✦ cockpit\n" - [[ "$SELECTED_APPS" == *"tlp"* ]] && SUMMARY+=" ✦ tlp\n" - [[ "$SELECTED_APPS" == *"butter"* ]] && SUMMARY+=" ✦ butter\n" - [[ "$SELECTED_APPS" == *"localsend"* ]] && SUMMARY+=" ✦ localsend\n" - [[ "$SELECTED_APPS" == *"croc"* ]] && SUMMARY+=" ✦ croc\n" - [[ "$SELECTED_APPS" == *"opendeck"* ]] && SUMMARY+=" ✦ opendeck\n" - [[ "$SELECTED_APPS" == *"localtunnel"* ]] && SUMMARY+=" ✦ localtunnel\n" - [[ "$SELECTED_APPS" == *"timeshift"* ]] && SUMMARY+=" ✦ timeshift\n" - [[ "$SELECTED_APPS" == *"zfs"* ]] && SUMMARY+=" ✦ zfs\n" - [[ "$SELECTED_APPS" == *"wprs"* ]] && SUMMARY+=" ✦ wprs\n" - [[ "$SELECTED_APPS" == *"plymouth"* ]] && SUMMARY+=" ✦ plymouth\n" - [[ "$SELECTED_APPS" == *"plymouth-custom"* ]] && SUMMARY+=" ✦ plymouth-custom\n" - [[ "$SELECTED_APPS" == *"steam"* ]] && SUMMARY+=" ✦ steam\n" - [[ "$SELECTED_APPS" == *"vesktop"* ]] && SUMMARY+=" ✦ vesktop\n" - [[ "$SELECTED_APPS" == *"spotify"* ]] && SUMMARY+=" ✦ spotify\n" - [[ "$SELECTED_APPS" == *"prism"* ]] && SUMMARY+=" ✦ prism\n" - [[ "$SELECTED_APPS" == *"vintagestory"* ]] && SUMMARY+=" ✦ vintagestory\n" - [[ "$SELECTED_APPS" == *"openarena"* ]] && SUMMARY+=" ✦ openarena\n" - [[ "$SELECTED_APPS" == *"tetris"* ]] && SUMMARY+=" ✦ tetris\n" - [[ "$SELECTED_APPS" == *"doom"* ]] && SUMMARY+=" ✦ doom\n" - [[ "$SELECTED_APPS" == *"sauerbraten"* ]] && SUMMARY+=" ✦ sauerbraten\n" - [[ "$SELECTED_APPS" == *"stuntrally"* ]] && SUMMARY+=" ✦ stuntrally\n" - [[ "$SELECTED_APPS" == *"onlyoffice"* ]] && SUMMARY+=" ✦ onlyoffice\n" - [[ "$SELECTED_APPS" == *"xournal"* ]] && SUMMARY+=" ✦ xournal\n" - [[ "$SELECTED_APPS" == *"rnote"* ]] && SUMMARY+=" ✦ rnote\n" - [[ "$SELECTED_APPS" == *"obsidian"* ]] && SUMMARY+=" ✦ obsidian\n" - [[ "$SELECTED_APPS" == *"tangent-notes"* ]] && SUMMARY+=" ✦ tangent-notes\n" - [[ "$SELECTED_APPS" == *"ffmpeg"* ]] && SUMMARY+=" ✦ ffmpeg\n" - [[ "$SELECTED_APPS" == *"sox"* ]] && SUMMARY+=" ✦ sox\n" - [[ "$SELECTED_APPS" == *"imagemagick"* ]] && SUMMARY+=" ✦ imagemagick\n" - [[ "$SELECTED_APPS" == *"yt-dlp"* ]] && SUMMARY+=" ✦ yt-dlp\n" - [[ "$SELECTED_APPS" == *"gimp"* ]] && SUMMARY+=" ✦ gimp\n" - [[ "$SELECTED_APPS" == *"inkscape"* ]] && SUMMARY+=" ✦ inkscape\n" - [[ "$SELECTED_APPS" == *"krita"* ]] && SUMMARY+=" ✦ krita\n" - [[ "$SELECTED_APPS" == *"kdenlive"* ]] && SUMMARY+=" ✦ kdenlive\n" - [[ "$SELECTED_APPS" == *"openshot"* ]] && SUMMARY+=" ✦ openshot\n" - [[ "$SELECTED_APPS" == *"shotcut"* ]] && SUMMARY+=" ✦ shotcut\n" - [[ "$SELECTED_APPS" == *"ardour"* ]] && SUMMARY+=" ✦ ardour\n" - [[ "$SELECTED_APPS" == *"audacity"* ]] && SUMMARY+=" ✦ audacity\n" - [[ "$SELECTED_APPS" == *"lmms"* ]] && SUMMARY+=" ✦ lmms\n" - [[ "$SELECTED_APPS" == *"mixxx"* ]] && SUMMARY+=" ✦ mixxx\n" - [[ "$SELECTED_APPS" == *"cecilia"* ]] && SUMMARY+=" ✦ cecilia\n" - [[ "$SELECTED_APPS" == *"chromium"* ]] && SUMMARY+=" ✦ chromium\n" - [[ "$SELECTED_APPS" == *"firefox-browser"* ]] && SUMMARY+=" ✦ firefox-browser\n" - [[ "$SELECTED_APPS" == *"zen-browser"* ]] && SUMMARY+=" ✦ zen-browser\n" - [[ "$SELECTED_APPS" == *"nyxt"* ]] && SUMMARY+=" ✦ nyxt\n" - [[ "$SELECTED_APPS" == *"librewolf"* ]] && SUMMARY+=" ✦ librewolf\n" - [[ "$SELECTED_APPS" == *"min-browser"* ]] && SUMMARY+=" ✦ min-browser\n" - [[ "$SELECTED_APPS" == *"vscodium"* ]] && SUMMARY+=" ✦ vscodium\n" - [[ "$SELECTED_APPS" == *"zed-ide"* ]] && SUMMARY+=" ✦ zed-ide\n" - [[ "$SELECTED_APPS" == *"geany"* ]] && SUMMARY+=" ✦ geany\n" - [[ "$SELECTED_APPS" == *"codeblocks"* ]] && SUMMARY+=" ✦ codeblocks\n" - [[ "$SELECTED_APPS" == *"kate"* ]] && SUMMARY+=" ✦ kate\n" - [[ "$SELECTED_APPS" == *"rdp-client"* ]] && SUMMARY+=" ✦ rdp-client\n" - [[ "$SELECTED_APPS" == *"lamco-rdp-server"* ]] && SUMMARY+=" ✦ lamco-rdp-server\n" - [[ "$SELECTED_APPS" == *"qemu"* ]] && SUMMARY+=" ✦ qemu\n" - [[ "$SELECTED_APPS" == *"freeipa-client"* ]] && SUMMARY+=" ✦ freeipa-client\n" - [[ "$SELECTED_APPS" == *"freeipa-server"* ]] && SUMMARY+=" ✦ freeipa-server\n" + [[ " $SELECTED_APPS " == *" ollama "* ]] && SUMMARY+=" ✦ ollama\n" + [[ " $SELECTED_APPS " == *" llama-cpp "* ]] && SUMMARY+=" ✦ llama-cpp\n" + [[ " $SELECTED_APPS " == *" open-webui "* ]] && SUMMARY+=" ✦ open-webui\n" + [[ " $SELECTED_APPS " == *" claude "* ]] && SUMMARY+=" ✦ claude\n" + [[ " $SELECTED_APPS " == *" networking-cli "* ]] && SUMMARY+=" ✦ networking-cli\n" + [[ " $SELECTED_APPS " == *" disk-recovery "* ]] && SUMMARY+=" ✦ disk-recovery\n" + [[ " $SELECTED_APPS " == *" himalaya "* ]] && SUMMARY+=" ✦ himalaya\n" + [[ " $SELECTED_APPS " == *" mail-notmuch "* ]] && SUMMARY+=" ✦ mail-notmuch\n" + [[ " $SELECTED_APPS " == *" caldav-sync "* ]] && SUMMARY+=" ✦ caldav-sync\n" + [[ " $SELECTED_APPS " == *" ssh-server "* ]] && SUMMARY+=" ✦ ssh-server\n" + [[ " $SELECTED_APPS " == *" wireshark "* ]] && SUMMARY+=" ✦ wireshark\n" + [[ " $SELECTED_APPS " == *" anti-malware "* ]] && SUMMARY+=" ✦ anti-malware\n" + [[ " $SELECTED_APPS " == *" gnuplot "* ]] && SUMMARY+=" ✦ gnuplot\n" + [[ " $SELECTED_APPS " == *" blender-povray "* ]] && SUMMARY+=" ✦ blender-povray\n" + [[ " $SELECTED_APPS " == *" toot "* ]] && SUMMARY+=" ✦ toot\n" + [[ " $SELECTED_APPS " == *" db-clients "* ]] && SUMMARY+=" ✦ db-clients\n" + [[ " $SELECTED_APPS " == *" mysql "* ]] && SUMMARY+=" ✦ mysql\n" + [[ " $SELECTED_APPS " == *" productivity "* ]] && SUMMARY+=" ✦ productivity\n" + [[ " $SELECTED_APPS " == *" python "* ]] && SUMMARY+=" ✦ python\n" + [[ " $SELECTED_APPS " == *" k8s "* ]] && SUMMARY+=" ✦ k8s\n" + [[ " $SELECTED_APPS " == *" docker "* ]] && SUMMARY+=" ✦ docker\n" + [[ " $SELECTED_APPS " == *" podman "* ]] && SUMMARY+=" ✦ podman\n" + [[ " $SELECTED_APPS " == *" cockpit "* ]] && SUMMARY+=" ✦ cockpit\n" + [[ " $SELECTED_APPS " == *" tlp "* ]] && SUMMARY+=" ✦ tlp\n" + [[ " $SELECTED_APPS " == *" butter "* ]] && SUMMARY+=" ✦ butter\n" + [[ " $SELECTED_APPS " == *" localsend "* ]] && SUMMARY+=" ✦ localsend\n" + [[ " $SELECTED_APPS " == *" croc "* ]] && SUMMARY+=" ✦ croc\n" + [[ " $SELECTED_APPS " == *" opendeck "* ]] && SUMMARY+=" ✦ opendeck\n" + [[ " $SELECTED_APPS " == *" localtunnel "* ]] && SUMMARY+=" ✦ localtunnel\n" + [[ " $SELECTED_APPS " == *" timeshift "* ]] && SUMMARY+=" ✦ timeshift\n" + [[ " $SELECTED_APPS " == *" zfs "* ]] && SUMMARY+=" ✦ zfs\n" + [[ " $SELECTED_APPS " == *" wprs "* ]] && SUMMARY+=" ✦ wprs\n" + [[ " $SELECTED_APPS " == *" plymouth "* ]] && SUMMARY+=" ✦ plymouth\n" + [[ " $SELECTED_APPS " == *" plymouth-custom "* ]] && SUMMARY+=" ✦ plymouth-custom\n" + [[ " $SELECTED_APPS " == *" steam "* ]] && SUMMARY+=" ✦ steam\n" + [[ " $SELECTED_APPS " == *" vesktop "* ]] && SUMMARY+=" ✦ vesktop\n" + [[ " $SELECTED_APPS " == *" spotify "* ]] && SUMMARY+=" ✦ spotify\n" + [[ " $SELECTED_APPS " == *" prism "* ]] && SUMMARY+=" ✦ prism\n" + [[ " $SELECTED_APPS " == *" vintagestory "* ]] && SUMMARY+=" ✦ vintagestory\n" + [[ " $SELECTED_APPS " == *" openarena "* ]] && SUMMARY+=" ✦ openarena\n" + [[ " $SELECTED_APPS " == *" tetris "* ]] && SUMMARY+=" ✦ tetris\n" + [[ " $SELECTED_APPS " == *" doom "* ]] && SUMMARY+=" ✦ doom\n" + [[ " $SELECTED_APPS " == *" sauerbraten "* ]] && SUMMARY+=" ✦ sauerbraten\n" + [[ " $SELECTED_APPS " == *" stuntrally "* ]] && SUMMARY+=" ✦ stuntrally\n" + [[ " $SELECTED_APPS " == *" onlyoffice "* ]] && SUMMARY+=" ✦ onlyoffice\n" + [[ " $SELECTED_APPS " == *" xournal "* ]] && SUMMARY+=" ✦ xournal\n" + [[ " $SELECTED_APPS " == *" rnote "* ]] && SUMMARY+=" ✦ rnote\n" + [[ " $SELECTED_APPS " == *" obsidian "* ]] && SUMMARY+=" ✦ obsidian\n" + [[ " $SELECTED_APPS " == *" tangent-notes "* ]] && SUMMARY+=" ✦ tangent-notes\n" + [[ " $SELECTED_APPS " == *" ffmpeg "* ]] && SUMMARY+=" ✦ ffmpeg\n" + [[ " $SELECTED_APPS " == *" sox "* ]] && SUMMARY+=" ✦ sox\n" + [[ " $SELECTED_APPS " == *" imagemagick "* ]] && SUMMARY+=" ✦ imagemagick\n" + [[ " $SELECTED_APPS " == *" yt-dlp "* ]] && SUMMARY+=" ✦ yt-dlp\n" + [[ " $SELECTED_APPS " == *" gimp "* ]] && SUMMARY+=" ✦ gimp\n" + [[ " $SELECTED_APPS " == *" inkscape "* ]] && SUMMARY+=" ✦ inkscape\n" + [[ " $SELECTED_APPS " == *" krita "* ]] && SUMMARY+=" ✦ krita\n" + [[ " $SELECTED_APPS " == *" kdenlive "* ]] && SUMMARY+=" ✦ kdenlive\n" + [[ " $SELECTED_APPS " == *" openshot "* ]] && SUMMARY+=" ✦ openshot\n" + [[ " $SELECTED_APPS " == *" shotcut "* ]] && SUMMARY+=" ✦ shotcut\n" + [[ " $SELECTED_APPS " == *" ardour "* ]] && SUMMARY+=" ✦ ardour\n" + [[ " $SELECTED_APPS " == *" audacity "* ]] && SUMMARY+=" ✦ audacity\n" + [[ " $SELECTED_APPS " == *" lmms "* ]] && SUMMARY+=" ✦ lmms\n" + [[ " $SELECTED_APPS " == *" mixxx "* ]] && SUMMARY+=" ✦ mixxx\n" + [[ " $SELECTED_APPS " == *" cecilia "* ]] && SUMMARY+=" ✦ cecilia\n" + [[ " $SELECTED_APPS " == *" chromium "* ]] && SUMMARY+=" ✦ chromium\n" + [[ " $SELECTED_APPS " == *" firefox-browser "* ]] && SUMMARY+=" ✦ firefox-browser\n" + [[ " $SELECTED_APPS " == *" zen-browser "* ]] && SUMMARY+=" ✦ zen-browser\n" + [[ " $SELECTED_APPS " == *" nyxt "* ]] && SUMMARY+=" ✦ nyxt\n" + [[ " $SELECTED_APPS " == *" librewolf "* ]] && SUMMARY+=" ✦ librewolf\n" + [[ " $SELECTED_APPS " == *" min-browser "* ]] && SUMMARY+=" ✦ min-browser\n" + [[ " $SELECTED_APPS " == *" vscodium "* ]] && SUMMARY+=" ✦ vscodium\n" + [[ " $SELECTED_APPS " == *" zed-ide "* ]] && SUMMARY+=" ✦ zed-ide\n" + [[ " $SELECTED_APPS " == *" geany "* ]] && SUMMARY+=" ✦ geany\n" + [[ " $SELECTED_APPS " == *" codeblocks "* ]] && SUMMARY+=" ✦ codeblocks\n" + [[ " $SELECTED_APPS " == *" kate "* ]] && SUMMARY+=" ✦ kate\n" + [[ " $SELECTED_APPS " == *" rdp-client "* ]] && SUMMARY+=" ✦ rdp-client\n" + [[ " $SELECTED_APPS " == *" lamco-rdp-server "* ]] && SUMMARY+=" ✦ lamco-rdp-server\n" + [[ " $SELECTED_APPS " == *" qemu "* ]] && SUMMARY+=" ✦ qemu\n" + [[ " $SELECTED_APPS " == *" freeipa-client "* ]] && SUMMARY+=" ✦ freeipa-client\n" + [[ " $SELECTED_APPS " == *" freeipa-server "* ]] && SUMMARY+=" ✦ freeipa-server\n" # END GENERATED MODULES: module-summary fi @@ -711,86 +711,86 @@ if [[ " $SELECTED_APPS " == *" plymouth-custom "* && " $SELECTED_APPS " == *" pl fi # END GENERATED MODULES: module-conflicts # BEGIN GENERATED MODULES: module-dispatch -[[ "$SELECTED_APPS" == *"ollama"* ]] && run_module "ollama" "$APPS/ollama.sh" -[[ "$SELECTED_APPS" == *"llama-cpp"* ]] && run_module "llama-cpp" "$APPS/llama-cpp.sh" -[[ "$SELECTED_APPS" == *"open-webui"* ]] && run_module "open-webui" "$APPS/open-webui.sh" -[[ "$SELECTED_APPS" == *"claude"* ]] && run_module "claude" "$APPS/claude.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" == *"mail-notmuch"* ]] && run_module "mail-notmuch" "$APPS/mail-notmuch.sh" -[[ "$SELECTED_APPS" == *"caldav-sync"* ]] && run_module "caldav-sync" "$APPS/caldav-sync.sh" -[[ "$SELECTED_APPS" == *"ssh-server"* ]] && run_module "ssh-server" "$APPS/ssh-server.sh" -[[ "$SELECTED_APPS" == *"wireshark"* ]] && run_module "wireshark" "$APPS/wireshark.sh" -[[ "$SELECTED_APPS" == *"anti-malware"* ]] && run_module "anti-malware" "$APPS/anti-malware.sh" -[[ "$SELECTED_APPS" == *"gnuplot"* ]] && run_module "gnuplot" "$APPS/gnuplot.sh" -[[ "$SELECTED_APPS" == *"blender-povray"* ]] && run_module "blender-povray" "$APPS/blender-povray.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" "$APPS/mysql.sh" -[[ "$SELECTED_APPS" == *"productivity"* ]] && run_module "productivity" "$APPS/productivity.sh" -[[ "$SELECTED_APPS" == *"python"* ]] && run_module "python" "$APPS/python.sh" -[[ "$SELECTED_APPS" == *"k8s"* ]] && run_module "k8s" "$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" == *"tlp"* ]] && run_module "tlp" "$APPS/tlp.sh" -[[ "$SELECTED_APPS" == *"butter"* ]] && run_module "butter" "$APPS/butter.sh" -[[ "$SELECTED_APPS" == *"localsend"* ]] && run_module "localsend" "$APPS/localsend.sh" -[[ "$SELECTED_APPS" == *"croc"* ]] && run_module "croc" "$APPS/croc.sh" -[[ "$SELECTED_APPS" == *"opendeck"* ]] && run_module "opendeck" "$APPS/opendeck.sh" -[[ "$SELECTED_APPS" == *"localtunnel"* ]] && run_module "localtunnel" "$APPS/localtunnel.sh" -[[ "$SELECTED_APPS" == *"timeshift"* ]] && run_module "timeshift" "$APPS/timeshift.sh" -[[ "$SELECTED_APPS" == *"zfs"* ]] && run_module "zfs" "$APPS/zfs.sh" -[[ "$SELECTED_APPS" == *"wprs"* ]] && run_module "wprs" "$APPS/wprs.sh" -[[ "$SELECTED_APPS" == *"plymouth"* ]] && run_module "plymouth" "$APPS/plymouth.sh" -[[ "$SELECTED_APPS" == *"plymouth-custom"* ]] && run_module "plymouth-custom" "$APPS/plymouth-custom.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 "prism" "$APPS/prism.sh" -[[ "$SELECTED_APPS" == *"vintagestory"* ]] && run_module "vintagestory" "$APPS/vintagestory.sh" -[[ "$SELECTED_APPS" == *"openarena"* ]] && run_module "openarena" "$APPS/openarena.sh" -[[ "$SELECTED_APPS" == *"tetris"* ]] && run_module "tetris" "$APPS/tetris.sh" -[[ "$SELECTED_APPS" == *"doom"* ]] && run_module "doom" "$APPS/doom.sh" -[[ "$SELECTED_APPS" == *"sauerbraten"* ]] && run_module "sauerbraten" "$APPS/sauerbraten.sh" -[[ "$SELECTED_APPS" == *"stuntrally"* ]] && run_module "stuntrally" "$APPS/stuntrally.sh" -[[ "$SELECTED_APPS" == *"onlyoffice"* ]] && run_module "onlyoffice" "$APPS/onlyoffice.sh" -[[ "$SELECTED_APPS" == *"xournal"* ]] && run_module "xournal" "$APPS/xournal.sh" -[[ "$SELECTED_APPS" == *"rnote"* ]] && run_module "rnote" "$APPS/rnote.sh" -[[ "$SELECTED_APPS" == *"obsidian"* ]] && run_module "obsidian" "$APPS/obsidian.sh" -[[ "$SELECTED_APPS" == *"tangent-notes"* ]] && run_module "tangent-notes" "$APPS/tangent-notes.sh" -[[ "$SELECTED_APPS" == *"ffmpeg"* ]] && run_module "ffmpeg" "$APPS/ffmpeg.sh" -[[ "$SELECTED_APPS" == *"sox"* ]] && run_module "sox" "$APPS/sox.sh" -[[ "$SELECTED_APPS" == *"imagemagick"* ]] && run_module "imagemagick" "$APPS/imagemagick.sh" -[[ "$SELECTED_APPS" == *"yt-dlp"* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh" -[[ "$SELECTED_APPS" == *"gimp"* ]] && run_module "gimp" "$APPS/gimp.sh" -[[ "$SELECTED_APPS" == *"inkscape"* ]] && run_module "inkscape" "$APPS/inkscape.sh" -[[ "$SELECTED_APPS" == *"krita"* ]] && run_module "krita" "$APPS/krita.sh" -[[ "$SELECTED_APPS" == *"kdenlive"* ]] && run_module "kdenlive" "$APPS/kdenlive.sh" -[[ "$SELECTED_APPS" == *"openshot"* ]] && run_module "openshot" "$APPS/openshot.sh" -[[ "$SELECTED_APPS" == *"shotcut"* ]] && run_module "shotcut" "$APPS/shotcut.sh" -[[ "$SELECTED_APPS" == *"ardour"* ]] && run_module "ardour" "$APPS/ardour.sh" -[[ "$SELECTED_APPS" == *"audacity"* ]] && run_module "audacity" "$APPS/audacity.sh" -[[ "$SELECTED_APPS" == *"lmms"* ]] && run_module "lmms" "$APPS/lmms.sh" -[[ "$SELECTED_APPS" == *"mixxx"* ]] && run_module "mixxx" "$APPS/mixxx.sh" -[[ "$SELECTED_APPS" == *"cecilia"* ]] && run_module "cecilia" "$APPS/cecilia.sh" -[[ "$SELECTED_APPS" == *"chromium"* ]] && run_module "chromium" "$APPS/chromium.sh" -[[ "$SELECTED_APPS" == *"firefox-browser"* ]] && run_module "firefox-browser" "$APPS/firefox-browser.sh" -[[ "$SELECTED_APPS" == *"zen-browser"* ]] && run_module "zen-browser" "$APPS/zen-browser.sh" -[[ "$SELECTED_APPS" == *"nyxt"* ]] && run_module "nyxt" "$APPS/nyxt.sh" -[[ "$SELECTED_APPS" == *"librewolf"* ]] && run_module "librewolf" "$APPS/librewolf.sh" -[[ "$SELECTED_APPS" == *"min-browser"* ]] && run_module "min-browser" "$APPS/min-browser.sh" -[[ "$SELECTED_APPS" == *"vscodium"* ]] && run_module "vscodium" "$APPS/vscodium.sh" -[[ "$SELECTED_APPS" == *"zed-ide"* ]] && run_module "zed-ide" "$APPS/zed-ide.sh" -[[ "$SELECTED_APPS" == *"geany"* ]] && run_module "geany" "$APPS/geany.sh" -[[ "$SELECTED_APPS" == *"codeblocks"* ]] && run_module "codeblocks" "$APPS/codeblocks.sh" -[[ "$SELECTED_APPS" == *"kate"* ]] && run_module "kate" "$APPS/kate.sh" -[[ "$SELECTED_APPS" == *"rdp-client"* ]] && run_module "rdp-client" "$APPS/rdp-client.sh" -[[ "$SELECTED_APPS" == *"lamco-rdp-server"* ]] && run_module "lamco-rdp-server" "$APPS/lamco-rdp-server.sh" -[[ "$SELECTED_APPS" == *"qemu"* ]] && run_module "qemu" "$APPS/qemu.sh" -[[ "$SELECTED_APPS" == *"freeipa-client"* ]] && run_module "freeipa-client" "$APPS/freeipa-client.sh" -[[ "$SELECTED_APPS" == *"freeipa-server"* ]] && run_module "freeipa-server" "$APPS/freeipa-server.sh" +[[ " $SELECTED_APPS " == *" ollama "* ]] && run_module "ollama" "$APPS/ollama.sh" +[[ " $SELECTED_APPS " == *" llama-cpp "* ]] && run_module "llama-cpp" "$APPS/llama-cpp.sh" +[[ " $SELECTED_APPS " == *" open-webui "* ]] && run_module "open-webui" "$APPS/open-webui.sh" +[[ " $SELECTED_APPS " == *" claude "* ]] && run_module "claude" "$APPS/claude.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 " == *" mail-notmuch "* ]] && run_module "mail-notmuch" "$APPS/mail-notmuch.sh" +[[ " $SELECTED_APPS " == *" caldav-sync "* ]] && run_module "caldav-sync" "$APPS/caldav-sync.sh" +[[ " $SELECTED_APPS " == *" ssh-server "* ]] && run_module "ssh-server" "$APPS/ssh-server.sh" +[[ " $SELECTED_APPS " == *" wireshark "* ]] && run_module "wireshark" "$APPS/wireshark.sh" +[[ " $SELECTED_APPS " == *" anti-malware "* ]] && run_module "anti-malware" "$APPS/anti-malware.sh" +[[ " $SELECTED_APPS " == *" gnuplot "* ]] && run_module "gnuplot" "$APPS/gnuplot.sh" +[[ " $SELECTED_APPS " == *" blender-povray "* ]] && run_module "blender-povray" "$APPS/blender-povray.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" "$APPS/mysql.sh" +[[ " $SELECTED_APPS " == *" productivity "* ]] && run_module "productivity" "$APPS/productivity.sh" +[[ " $SELECTED_APPS " == *" python "* ]] && run_module "python" "$APPS/python.sh" +[[ " $SELECTED_APPS " == *" k8s "* ]] && run_module "k8s" "$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 " == *" tlp "* ]] && run_module "tlp" "$APPS/tlp.sh" +[[ " $SELECTED_APPS " == *" butter "* ]] && run_module "butter" "$APPS/butter.sh" +[[ " $SELECTED_APPS " == *" localsend "* ]] && run_module "localsend" "$APPS/localsend.sh" +[[ " $SELECTED_APPS " == *" croc "* ]] && run_module "croc" "$APPS/croc.sh" +[[ " $SELECTED_APPS " == *" opendeck "* ]] && run_module "opendeck" "$APPS/opendeck.sh" +[[ " $SELECTED_APPS " == *" localtunnel "* ]] && run_module "localtunnel" "$APPS/localtunnel.sh" +[[ " $SELECTED_APPS " == *" timeshift "* ]] && run_module "timeshift" "$APPS/timeshift.sh" +[[ " $SELECTED_APPS " == *" zfs "* ]] && run_module "zfs" "$APPS/zfs.sh" +[[ " $SELECTED_APPS " == *" wprs "* ]] && run_module "wprs" "$APPS/wprs.sh" +[[ " $SELECTED_APPS " == *" plymouth "* ]] && run_module "plymouth" "$APPS/plymouth.sh" +[[ " $SELECTED_APPS " == *" plymouth-custom "* ]] && run_module "plymouth-custom" "$APPS/plymouth-custom.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 "prism" "$APPS/prism.sh" +[[ " $SELECTED_APPS " == *" vintagestory "* ]] && run_module "vintagestory" "$APPS/vintagestory.sh" +[[ " $SELECTED_APPS " == *" openarena "* ]] && run_module "openarena" "$APPS/openarena.sh" +[[ " $SELECTED_APPS " == *" tetris "* ]] && run_module "tetris" "$APPS/tetris.sh" +[[ " $SELECTED_APPS " == *" doom "* ]] && run_module "doom" "$APPS/doom.sh" +[[ " $SELECTED_APPS " == *" sauerbraten "* ]] && run_module "sauerbraten" "$APPS/sauerbraten.sh" +[[ " $SELECTED_APPS " == *" stuntrally "* ]] && run_module "stuntrally" "$APPS/stuntrally.sh" +[[ " $SELECTED_APPS " == *" onlyoffice "* ]] && run_module "onlyoffice" "$APPS/onlyoffice.sh" +[[ " $SELECTED_APPS " == *" xournal "* ]] && run_module "xournal" "$APPS/xournal.sh" +[[ " $SELECTED_APPS " == *" rnote "* ]] && run_module "rnote" "$APPS/rnote.sh" +[[ " $SELECTED_APPS " == *" obsidian "* ]] && run_module "obsidian" "$APPS/obsidian.sh" +[[ " $SELECTED_APPS " == *" tangent-notes "* ]] && run_module "tangent-notes" "$APPS/tangent-notes.sh" +[[ " $SELECTED_APPS " == *" ffmpeg "* ]] && run_module "ffmpeg" "$APPS/ffmpeg.sh" +[[ " $SELECTED_APPS " == *" sox "* ]] && run_module "sox" "$APPS/sox.sh" +[[ " $SELECTED_APPS " == *" imagemagick "* ]] && run_module "imagemagick" "$APPS/imagemagick.sh" +[[ " $SELECTED_APPS " == *" yt-dlp "* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh" +[[ " $SELECTED_APPS " == *" gimp "* ]] && run_module "gimp" "$APPS/gimp.sh" +[[ " $SELECTED_APPS " == *" inkscape "* ]] && run_module "inkscape" "$APPS/inkscape.sh" +[[ " $SELECTED_APPS " == *" krita "* ]] && run_module "krita" "$APPS/krita.sh" +[[ " $SELECTED_APPS " == *" kdenlive "* ]] && run_module "kdenlive" "$APPS/kdenlive.sh" +[[ " $SELECTED_APPS " == *" openshot "* ]] && run_module "openshot" "$APPS/openshot.sh" +[[ " $SELECTED_APPS " == *" shotcut "* ]] && run_module "shotcut" "$APPS/shotcut.sh" +[[ " $SELECTED_APPS " == *" ardour "* ]] && run_module "ardour" "$APPS/ardour.sh" +[[ " $SELECTED_APPS " == *" audacity "* ]] && run_module "audacity" "$APPS/audacity.sh" +[[ " $SELECTED_APPS " == *" lmms "* ]] && run_module "lmms" "$APPS/lmms.sh" +[[ " $SELECTED_APPS " == *" mixxx "* ]] && run_module "mixxx" "$APPS/mixxx.sh" +[[ " $SELECTED_APPS " == *" cecilia "* ]] && run_module "cecilia" "$APPS/cecilia.sh" +[[ " $SELECTED_APPS " == *" chromium "* ]] && run_module "chromium" "$APPS/chromium.sh" +[[ " $SELECTED_APPS " == *" firefox-browser "* ]] && run_module "firefox-browser" "$APPS/firefox-browser.sh" +[[ " $SELECTED_APPS " == *" zen-browser "* ]] && run_module "zen-browser" "$APPS/zen-browser.sh" +[[ " $SELECTED_APPS " == *" nyxt "* ]] && run_module "nyxt" "$APPS/nyxt.sh" +[[ " $SELECTED_APPS " == *" librewolf "* ]] && run_module "librewolf" "$APPS/librewolf.sh" +[[ " $SELECTED_APPS " == *" min-browser "* ]] && run_module "min-browser" "$APPS/min-browser.sh" +[[ " $SELECTED_APPS " == *" vscodium "* ]] && run_module "vscodium" "$APPS/vscodium.sh" +[[ " $SELECTED_APPS " == *" zed-ide "* ]] && run_module "zed-ide" "$APPS/zed-ide.sh" +[[ " $SELECTED_APPS " == *" geany "* ]] && run_module "geany" "$APPS/geany.sh" +[[ " $SELECTED_APPS " == *" codeblocks "* ]] && run_module "codeblocks" "$APPS/codeblocks.sh" +[[ " $SELECTED_APPS " == *" kate "* ]] && run_module "kate" "$APPS/kate.sh" +[[ " $SELECTED_APPS " == *" rdp-client "* ]] && run_module "rdp-client" "$APPS/rdp-client.sh" +[[ " $SELECTED_APPS " == *" lamco-rdp-server "* ]] && run_module "lamco-rdp-server" "$APPS/lamco-rdp-server.sh" +[[ " $SELECTED_APPS " == *" qemu "* ]] && run_module "qemu" "$APPS/qemu.sh" +[[ " $SELECTED_APPS " == *" freeipa-client "* ]] && run_module "freeipa-client" "$APPS/freeipa-client.sh" +[[ " $SELECTED_APPS " == *" freeipa-server "* ]] && run_module "freeipa-server" "$APPS/freeipa-server.sh" # END GENERATED MODULES: module-dispatch # ── Colorway (final step) ─────────────────────────────────────────────────────