#!/bin/bash # Function name: Install packages # Description: Install packages from an array # Arguments: # $1: Package list (array) install_packages() { local packages=("${!1}") for package in "${packages[@]}"; do sudo pacman -S --needed --noconfirm "$package" done } # Function name: Install package # Description: Install a package given its name # Arguments: # $1: Package name install_package() { sudo pacman -S --needed --noconfirm "$1" } # Function name: Install dependencies # Description: Install package as dependency given its name # Arguments: # $1: Package name install_dependencies() { sudo pacman -S --needed --noconfirm --asdeps "$1" } # Function name: Update system # Description: Update the system update_system() { sudo pacman -Syu --noconfirm } # Function name: Check whiptail # Description: Check if whiptail is installed else install it check_whiptail() { if ! command -v whiptail &>/dev/null; then sudo pacman -S --needed --noconfirm --asdeps libnewt fi } # Function name: Setup disk partitioning # Description: Setup disk partitioning # Function name: Setup repositories # Description: Ask the user if they want to add specific repositories setup_repositories() { options=( "CachyOS" "Add CachyOS repository - x86 -v3 and -v4 optimized, custom and some AUR packages" OFF "Chromatic" "Add Chromatic repository - prebuilt AUR packages not in Chaotic.cx" ON "BlackArch" "Add BlackArch repository - hacking related packages" OFF "Chaotic.cx" "Add Chaotic.cx repository - prebuilt AUR packages (Recommended)" ON ) selected_repos=$(whiptail --title "Add Repositories" --checklist \ "Choose the repositories you want to add:" 20 78 4 \ "${options[@]}" 3>&1 1>&2 2>&3) for repo in $selected_repos; do case $repo in "\"CachyOS\"") if ! grep -q "\[cachyos\]" /etc/pacman.conf; then echo "== Adding CachyOS repository ==" curl https://mirror.cachyos.org/cachyos-repo.tar.xz -o /tmp/cachyos-repo.tar.xz tar xvf /tmp/cachyos-repo.tar.xz -C /tmp cd /tmp/cachyos-repo || exit sudo ./cachyos-repo.sh echo "CachyOS repository added successfully." else echo "CachyOS repository is already installed." fi ;; "\"Chromatic\"") if ! grep -q "\[chromatic\]" /etc/pacman.conf; then echo "== Adding Chromatic repository ==" sudo pacman-key --recv-key 6EFB412EBDDD1853DF71F4B625AE803AA8C39062 sudo pacman-key --lsign-key 6EFB412EBDDD1853DF71F4B625AE803AA8C39062 sudo pacman -U --noconfirm 'https://mirror.trap.moe/chromatic/x86_64/chromatic-keyring-1.0-1-any.pkg.tar.zst' sudo pacman -U --noconfirm 'https://mirror.trap.moe/chromatic/x86_64/chromatic-mirrorlist-20250315-1-any.pkg.tar.zst' --overwrite /etc/pacman.d/chromatic-mirrorlist echo '[chromatic]' | sudo tee -a /etc/pacman.conf echo 'Include = /etc/pacman.d/chromatic-mirrorlist' | sudo tee -a /etc/pacman.conf sudo pacman -Sy --noconfirm chromatic-keyring chromatic-mirrorlist echo "Chromatic repository added successfully." else echo "Chromatic repository is already installed." fi ;; "\"BlackArch\"") if ! grep -q "\[blackarch\]" /etc/pacman.conf; then echo "== Adding BlackArch repository ==" curl -O https://blackarch.org/strap.sh chmod +x strap.sh sudo sed -i 's/msg '\''installing blackarch-officials meta-package...'\''/#msg '\''installing blackarch-officials meta-package...'\''/' strap.sh sudo sed -i 's/pacman -S --noconfirm --needed blackarch-officials/#pacman -S --noconfirm --needed blackarch-officials/' strap.sh sudo ./strap.sh echo "BlackArch repository added successfully." else echo "BlackArch repository is already installed." fi ;; "\"Chaotic.cx\"") if ! grep -q "\[chaotic-aur\]" /etc/pacman.conf; then echo "== Adding Chaotic.cx repository ==" sudo pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com sudo pacman-key --lsign-key 3056513887B78AEB sudo pacman -U --noconfirm 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' sudo pacman -U --noconfirm 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst' echo '[chaotic-aur]' | sudo tee -a /etc/pacman.conf echo 'Include = /etc/pacman.d/chaotic-mirrorlist' | sudo tee -a /etc/pacman.conf sudo pacman -Sy --noconfirm chaotic-keyring chaotic-mirrorlist echo "Chaotic.cx repository added successfully." else echo "Chaotic.cx repository is already installed." fi ;; esac done update_system } # Function name: Setup Pacman configuration # Description: Setup Pacman configuration setup_pacman() { echo "== Setting up Pacman configuration ==" sudo sed -i 's/#Color/Color/' /etc/pacman.conf sudo sed -i 's/#ILoveCandy/ILoveCandy/' /etc/pacman.conf sudo sed -i 's/#VerbosePkgLists/VerbosePkgLists/' /etc/pacman.conf sudo sed -i 's/#CheckSpace/CheckSpace/' /etc/pacman.conf sudo sed -i 's/#PrettyProgressBar/PrettyProgressBar/' /etc/pacman.conf sudo sed -i 's/#ParallelDownloads = 5/ParallelDownloads = 10/' /etc/pacman.conf sudo sed -i 's/#DisableDownloadTimeout/DisableDownloadTimeout/' /etc/pacman.conf echo "Pacman configuration set up successfully." } # Function name: Setup shell # Description: Install selected shell and recommended packages setup_shell() { options=( "Zsh" "Install Zsh and recommended packages" ON "Fish" "Install Fish shell and recommended packages" OFF "Bash" "Install Bash and recommended packages" OFF ) selected_shell=$(whiptail --title "Setup Shell" --radiolist \ "Choose the shell you want to install:" 15 60 3 \ "${options[@]}" 3>&1 1>&2 2>&3) case $selected_shell in "\"Zsh\"") echo "== Installing Zsh and recommended packages ==" install_package zsh zsh-autosuggestions zsh-completions zsh-history-substring-search zsh-syntax-highlighting grml-zsh-config oh-my-zsh-git if (whiptail --title "Change default shell to Zsh" --yesno "Would you like to change the default shell to Zsh?" 10 60); then chsh -s /bin/zsh fi echo "Zsh and recommended packages installed successfully." ;; "\"Fish\"") echo "== Installing Fish shell and recommended packages ==" install_package fish if (whiptail --title "Change default shell to Fish" --yesno "Would you like to change the default shell to Fish?" 10 60); then chsh -s /usr/bin/fish fi echo "Fish shell and recommended packages installed successfully." ;; "\"Bash\"") echo "== Installing Bash and recommended packages ==" install_package bash install_dependencies bash-completion if pacman -Qs bash-completion > /dev/null; then echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc fi if (whiptail --title "Change default shell to Bash" --yesno "Would you like to change the default shell to Bash?" 10 60); then chsh -s /bin/bash fi echo "Bash and recommended packages installed successfully." ;; esac } # Function name: Setup audio server # Description: Install pipewire and its dependencies setup_audio_server() { if whiptail --title "Setup Audio Server" --yesno "Would you like to setup Pipewire?" 10 60; then echo "== Installing Pipewire and its dependencies ==" install_dependencies pipewire pipewire-pulse pipewire-alsa pipewire-jack wireplumber echo "Pipewire and its dependencies installed successfully." fi } # Function name: Setup GPU # Description: Setup GPU depending on the available devices setup_gpu() { if whiptail --title "Setup GPU" --yesno "Would you like to setup GPU?" 10 60; then detected_gpu=$(lspci | grep -Ei "vga|3d|display") case "$detected_gpu" in *NVIDIA*) echo "== Detected NVIDIA GPU ==" options=( "nvidia" "Official NVIDIA Drivers" ON "nouveau" "Open Source nouveau drivers" OFF ) selected_driver=$(whiptail --title "Select NVIDIA Drivers" --radiolist \ "Choose the NVIDIA driver you want to install:" 15 60 2 \ "${options[@]}" 3>&1 1>&2 2>&3) echo "== Removing existing incorrect NVIDIA drivers if any ==" if pacman -Qs nvidia > /dev/null; then sudo pacman -R --noconfirm nvidia elif pacman -Qs nvidia-dkms > /dev/null; then sudo pacman -R --noconfirm nvidia-dkms elif pacman -Qs xf86-video-nouveau > /dev/null; then sudo pacman -R --noconfirm xf86-video-nouveau fi case $selected_driver in "\"nvidia\"") if pacman -Qs linux > /dev/null; then echo "=== Installing nvidia open for linux ===" install_package nvidia-open install_dependencies libvdpau fi if pacman -Qs linux-lts > /dev/null; then echo "=== Installing nvidia open for linux-lts ===" install_package nvidia-open-lts install_dependencies libvdpau fi if pacman -Qs linux-cachyos > /dev/null; then echo "=== Installing nvidia open for linux-cachyos ===" install_package linux-cachyos-nvidia-open install_dependencies libvdpau fi if pacman -Qs linux-zen > /dev/null || pacman -Qs linux-hardened > /dev/null; then echo "=== Installing nvidia open dkms for other kernels ===" install_package nvidia-open-dkms install_dependencies libvdpau fi if ! lspci | grep -Ei "amd|intel" > /dev/null; then echo "=== Installing libva-nvidia-driver for NVIDIA only systems ===" install_dependencies libva-nvidia-driver fi if (whiptail --title "Install Cuda" --yesno "Would you like to install Cuda?" 10 60); then echo "=== Installing Cuda ===" install_dependencies cuda fi ;; "\"nouveau\"") echo "=== Installing nouveau drivers ===" install_dependencies mesa vulkan-nouveau ;; esac ;; *AMD*) echo "== Detected AMD GPU ==" echo "=== Installing AMD drivers ===" install_dependencies mesa vulkan-radeon ;; *Intel*) echo "== Detected Intel GPU ==" echo "=== Installing Intel drivers ===" install_dependencies intel-media-driver vulkan-intel ;; esac fi } # Function name: Setup plymouth # Description: Install and setup Plymouth for boot splash setup_plymouth() { if whiptail --title "Setup Plymouth" --yesno "Would you like to setup Plymouth?" 10 60; then echo "== Setting up Plymouth ==" if ! grep -q "splash" /etc/kernel/cmdline; then echo -n " quiet splash" | sudo tee -a /etc/kernel/cmdline fi if ! grep -q "plymouth" /etc/mkinitcpio.conf; then sudo sed -i 's/^HOOKS=(base systemd autodetect microcode modconf/HOOKS=(base systemd autodetect microcode plymouth modconf/' /etc/mkinitcpio.conf fi install_package plymouth echo "Plymouth setup completed." fi } # Function name: Setup network # Description: Install and setup NetworkManager and its dependencies setup_network() { if whiptail --title "Setup Network" --yesno "Would you like to setup NetworkManager?" 10 60; then echo "== Installing NetworkManager and its dependencies ==" install_dependencies networkmanager wpa_supplicant install_package networkmanager-openvpn networkmanager-strongswan sudo systemctl enable --now NetworkManager echo "NetworkManager and its dependencies installed successfully." fi wireless_ifaces=$(ip -o link show 2>/dev/null | awk -F': ' '{print $2}' | grep -E '^(wlan|wlp|wl|wifi)' || true) if [ -z "$wireless_ifaces" ]; then if lspci 2>/dev/null | grep -Ei 'network controller|wireless|wi-fi' >/dev/null 2>&1 || \ lsusb 2>/dev/null | grep -Ei 'wireless|802.11' >/dev/null 2>&1; then wireless_detected=1 else wireless_detected=0 fi else wireless_detected=1 fi if [ "$wireless_detected" -eq 1 ]; then if ! pacman -Qi wireless-regdb >/dev/null 2>&1; then if whiptail --title "Wireless regulatory database" --yesno \ "Wireless hardware detected. Would you like to install wireless-regdb (regulatory database)?" 10 60; then install_package wireless-regdb country_code=$(whiptail --title "Wireless Regulatory Domain" --inputbox \ "Enter your 2-letter ISO country code (e.g., US, GB, IN):" 10 60 3>&1 1>&2 2>&3) if [ -n "$country_code" ]; then echo "Updating regulatory domain to $country_code" echo "WIRELESS_REGDOM=\"$country_code\"" | sudo tee -a /etc/conf.d/wireless-regdom echo "Regulatory domain updated to $country_code" else echo "No country code entered. Skipping regulatory domain update." fi fi fi fi } # Function name: Setup bluetooth # Description: Install and setup Bluetooth and its dependencies setup_bluetooth() { if whiptail --title "Setup Bluetooth" --yesno "Would you like to setup Bluetooth?" 10 60; then echo "== Installing Bluetooth and its dependencies ==" install_dependencies bluedevil bluez sudo systemctl enable --now bluetooth fi } # function name : setup u2f # Description: setup pam-u2f for login using Yubikey setup_u2f() { if whiptail --title "Setup U2F" --yesno "Would you like to setup U2F (Yubikey) authentication?" 10 60; then install_package pam-u2f mkdir -p ~/.config/Yubico sudo touch /etc/pam.d/u2f-required sudo touch /etc/pam.d/u2f-sufficient echo "auth required pam_u2f.so cue origin=pam://$HOST appid=pam://$HOST" | sudo tee -a /etc/pam.d/u2f-required echo "auth sufficient pam_u2f.so cue origin=pam://$HOST appid=pam://$HOST" | sudo tee -a /etc/pam.d/u2f-sufficient sudo sed -i '/^auth\s*include\s*system-login/i auth include u2f-sufficient' /etc/pam.d/system-local-login sudo sed -i '/^auth\s*include\s*system-auth/i auth include u2f-sufficient' /etc/pam.d/sudo if [ ! -f /etc/pam.d/polkit-1 ]; then sudo cp /usr/lib/pam.d/polkit-1 /etc/pam.d/polkit-1 fi sudo sed -i '/^auth\s*include\s*system-auth/i auth include u2f-sufficient' /etc/pam.d/polkit-1 if whiptail --title "Enroll U2F Device" --yesno "Would you like to enroll your U2F device now?" 10 60; then echo "Enrolling U2F device..." pamu2fcfg -o "pam://$HOST" -i "pam://$HOST" > ~/.config/Yubico/u2f_keys whiptail --title "U2F Enrollment" --msgbox "U2F device enrolled successfully. You can add more devices by running 'pamu2fcfg -o \"pam://$HOST\" -i \"pam://$HOST\" >> ~/.config/Yubico/u2f_keys'." 10 60 fi fi } # function name : setup fprint # Description: setup fprint for login using fingerprint reader setup_fprint() { if whiptail --title "Setup Fprint" --yesno "Would you like to setup fingerprint authentication (fprintd)?" 10 60; then # using lsusb to check if fingerprint reader needs python-validity or fprintd if lsusb | grep -q "Validity Sensors, Inc."; then echo "Fingerprint reader from Validity Sensors detected. We will install python-validity instead of standard fprintd for better support" echo "== Installing python-validity and its dependencies ==" install_package python-validity echo "python-validity installation completed." else echo "== Installing fprintd and its dependencies ==" install_package fprintd install_dependencies imagemagick sudo systemctl enable --now fprintd echo "fprintd installation completed." fi sudo sed -i '/^auth\s*include\s*system-login/i auth [success=1 default=ignore] pam_succeed_if.so service in sudo:su:su-l tty in :unknown' /etc/pam.d/system-local-login sudo sed -i '/^auth\s*include\s*system-login/i auth sufficient pam_fprintd.so' /etc/pam.d/system-local-login sudo sed -i '/^auth\s*include\s*system-auth/i auth [success=1 default=ignore] pam_succeed_if.so service in sudo:su:su-l tty in :unknown' /etc/pam.d/sudo sudo sed -i '/^auth\s*include\s*system-auth/i auth sufficient pam_fprintd.so' /etc/pam.d/sudo if [ ! -f /etc/pam.d/polkit-1 ]; then sudo cp /usr/lib/pam.d/polkit-1 /etc/pam.d/polkit-1 fi sudo sed -i '/^auth\s*include\s*system-auth/i auth [success=1 default=ignore] pam_succeed_if.so service in sudo:su:su-l tty in :unknown' /etc/pam.d/polkit-1 sudo sed -i '/^auth\s*include\s*system-auth/i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1 if whiptail --title "Enroll Fingerprint" --yesno "Would you like to enroll your fingerprint now?" 10 60; then echo "Enrolling fingerprint..." fprintd-enroll fi echo "Fingerprint setup completed." fi } # function name : setup SmartCard [WIP] # Description: setup opensc for login using smartcard reader setup_smartcard() { if whiptail --title "Setup SmartCard" --yesno "Would you like to setup SmartCard (opensc) authentication?" 10 60; then echo "== Installing opensc ==" install_package opensc sudo systemctl enable --now pcscd sudo systemctl enable --now pcscd.socket echo "SmartCard (opensc) setup completed." fi } # function name : setup firewall # Description: Install and setup user selected firewall setup_firewall() { options=( "ufw" "Install UFW" ON "firewalld" "Install Firewalld" OFF ) selected_groups=$(whiptail --title "Setup Firewall" --checklist "Choose the firewall you want to install:" 20 78 2 "${options[@]}" 3>&1 1>&2 2>&3) for group in $selected_groups; do case $group in "\"ufw\"") echo "== Installing UFW ==" install_package ufw sudo systemctl enable --now ufw sudo ufw enable echo "UFW installed and started." ;; "\"firewalld\"") echo "== Installing Firewalld ==" install_package firewalld sudo systemctl enable --now firewalld echo "Firewalld installed and started." ;; esac done } # function name : Setup NTP # Description: Install selected NTP client setup_ntp() { options=( "ntpd-rs" "Install ntpd-rs" ON "chrony" "Install chrony (Current standard)" OFF "openntpd" "Install OpenNTPD" OFF "ntp" "Install ntpd (Not recommended)" OFF ) selected_ntp=$(whiptail --title "Setup NTP" --radiolist "Choose the NTP client you want to install:" 20 78 4 "${options[@]}" 3>&1 1>&2 2>&3) case $selected_ntp in "\"ntpd-rs\"") echo "== Installing ntpd-rs ==" install_package ntpd-rs sudo systemctl enable --now ntpd-rs ;; "\"chrony\"") echo "== Installing chrony ==" install_package chrony sudo systemctl enable --now chronyd ;; "\"openntpd\"") echo "== Installing openntpd ==" install_package openntpd sudo systemctl enable --now openntpd ;; "\"ntp\"") echo "== Installing ntp ==" install_package ntp sudo systemctl enable --now ntpd ;; esac } # function name : setup flatpak # Description: Install and setup Flatpak and Flathub setup_flatpak() { if whiptail --title "Setup Flatpak" --yesno "Would you like to setup Flatpak?" 10 60; then install_package flatpak flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo fi } # Function name: Setup sbctl # Description: Install and setup sbctl for managing Secure Boot keys setup_sbctl() { if whiptail --title "Setup sbctl" --yesno "Would you like to setup sbctl?" 10 60; then echo "== Installing sbctl ==" install_package sbctl echo "== Setting up sbctl ==" sudo sbctl create-keys sbctl verify | sed 's/✗ /sbctl sign -s /e' if sbctl status | grep -q "Setup Mode:.*Disabled"; then echo "Setup mode is disabled so we cannot enroll the keys. Please enable setup mode in your firmware settings and run 'sudo sbctl enroll-keys' manually." else echo "Enrolling keys with sbctl" sudo sbctl enroll-keys -m echo "Keys enrolled successfully." fi fi } # function name : setup fwupd # Description: setup fwupd setup_fwupd() { if whiptail --title "Setup fwupd" --yesno "Would you like to setup fwupd?" 10 60; then echo "== Installing fwupd ==" install_package fwupd # if sbctl install then if pacman -Qs sbctl > /dev/null; then sudo sbctl sign -s -o /usr/lib/fwupd/efi/fwupdx64.efi.signed /usr/lib/fwupd/efi/fwupdx64.efi sudo sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi if pacman -Qs shim > /dev/null; then sudo mkdir -p /boot/EFI/systemd sudo sbctl sign -s -o /boot/EFI/systemd/shimx64.efi /usr/share/shim/shimx64.efi fi fi fi } # function name : setup OpenRGB # Description: Install OpenRGB for RGB devices control setup_openrgb() { if whiptail --title "Setup OpenRGB" --yesno "Would you like to setup OpenRGB?" 10 60; then echo "== Installing OpenRGB ==" install_package openrgb sudo gpasswd -a "$USER" plugdev sudo systemctl enable --now openrgb fi } # function name : setup browser # Description: Ask the user which browsers they want to install setup_browser() { options=( "Firefox" "Install Firefox" ON "Chromium" "Install Chromium" OFF "Brave" "Install Brave" OFF "Vivaldi" "Install Vivaldi" OFF "Google Chrome" "Install Google Chrome" OFF "Zen Browser" "Install Zen Browser" OFF "Tor Browser" "Install Tor Browser" OFF "Mullvad Browser" "Install Mullvad Browser" OFF "Edge Stable" "Install Edge Stable" OFF "LibreWolf" "Install LibreWolf" OFF "Floorp" "Install Floorp" OFF "Chromium Widevine" "Install Chromium Widevine" OFF "Links" "Install Links" OFF ) selected_browsers=$(whiptail --title "Setup Browser" --checklist \ "Choose the browsers you want to install:" 20 78 13 \ "${options[@]}" 3>&1 1>&2 2>&3) for browser in $selected_browsers; do case $browser in "\"Firefox\"") sudo pacman -S --needed --noconfirm firefox ;; "\"Chromium\"") sudo pacman -S --needed --noconfirm chromium ;; "\"Brave\"") sudo pacman -S --needed --noconfirm brave-bin ;; "\"Vivaldi\"") sudo pacman -S --needed --noconfirm vivaldi ;; "\"Google Chrome\"") yay -S --needed --noconfirm google-chrome ;; "\"Zen Browser\"") yay -S --needed --noconfirm zen-browser-bin ;; "\"Tor Browser\"") sudo pacman -S --needed --noconfirm tor-browser-bin ;; "\"Mullvad Browser\"") yay -S --needed --noconfirm mullvad-browser-bin ;; "\"Edge Stable\"") yay -S --needed --noconfirm microsoft-edge-stable-bin ;; "\"LibreWolf\"") yay -S --needed --noconfirm librewolf ;; "\"Floorp\"") yay -S --needed --noconfirm floorp-bin ;; "\"Chromium Widevine\"") sudo pacman -S --needed --noconfirm chromium-widevine ;; "\"Links\"") sudo pacman -S --needed --noconfirm links ;; esac done } # function name : setup_office_suite # Description: setup office suite setup_office_suite() { options=( "LibreOffice" "Install LibreOffice" OFF "OnlyOffice" "Install OnlyOffice" OFF "WPS Office" "Install WPS Office" OFF "FreeOffice" "Install FreeOffice" OFF ) selected_option=$(whiptail --title "Setup Office Suite" --radiolist "Choose the office suite you want to install:" 20 78 4 "${options[@]}" 3>&1 1>&2 2>&3) case $selected_option in "\"LibreOffice\"") install_package libreoffice-fresh ;; "\"OnlyOffice\"") install_package onlyoffice-bin ;; "\"WPS Office\"") install_package wps-office ;; "\"FreeOffice\"") install_package freeoffice ;; esac } # Function name: Setup mail client # Description: Install choosen mail client setup_mail_client() { options=( "Thunderbird" "Install Thunderbird" ON "Evolution" "Install Evolution" OFF "Geary" "Install Geary" OFF "Mailspring" "Install Mailspring" OFF ) selected_mail_client=$(whiptail --title "Setup Mail Client" --radiolist \ "Choose the mail client you want to install:" 20 78 4 \ "${options[@]}" 3>&1 1>&2 2>&3) case $selected_mail_client in "\"Thunderbird\"") install_package thunderbird install_dependencies thunderbird-dark-reader thunderbird-ublock-origin ;; "\"Evolution\"") install_package evolution ;; "\"Geary\"") install_package geary ;; "\"Mailspring\"") install_package mailspring ;; esac } # Function name: Setup virtualization # Description: Install virtualization packages and enable libvirtd service setup_virtualization() { if whiptail --title "Setup Virtualization" --yesno "Would you like to setup virtualization?" 10 60; then echo "=== Installing virtualization packages ===" install_package virt-manager qemu-full virt-viewer install_dependencies swtpm dnsmasq openbsd-netcat if pacman -Qs libvirt > /dev/null; then sudo systemctl enable --now libvirtd sudo usermod -aG libvirt "$USER" fi echo "Virtualization setup completed." fi } # Function name: Setup containers # Description: Install choosen container packages (podman or docker, distrobox) setup_containers() { options=( "Podman" "Install Podman and its dependencies" ON "Docker" "Install Docker and its dependencies" OFF "Distrobox" "Install Distrobox for container management" ON ) selected_containers=$(whiptail --title "Setup Containers" --checklist \ "Choose the container packages you want to install:" 20 78 3 \ "${options[@]}" 3>&1 1>&2 2>&3) for container in $selected_containers; do case $container in "\"Podman\"") install_package podman install_dependencies podman-docker if pacman -Qs nvidia-open > /dev/null || pacman -Qs nvidia-open-lts > /dev/null || pacman -Qs linux-cachyos-nvidia-open > /dev/null || pacman -Qs nvidia-open-dkms > /dev/null; then install_dependencies nvidia-container-toolkit fi sudo systemctl enable --now podman.socket ;; "\"Docker\"") install_package docker install_dependencies docker-compose if pacman -Qs nvidia > /dev/null; then install_dependencies nvidia-container-toolkit fi sudo systemctl enable --now docker sudo usermod -aG docker "$USER" ;; "\"Distrobox\"") install_package distrobox ;; esac done } # Function name: Setup plasma KDE # Description: Install and setup Plasma KDE setup_plasma_kde() { if whiptail --title "Setup Plasma KDE" --yesno "Would you like to setup Plasma KDE?" 10 60; then install_package plasma-meta gwenview kate okular kcalc gparted kdeconnect ark dolphin install_dependencies qt6-quick3d flatpak-kcm plymouth-kcm sddm-kcm if pacman -Qs sddm > /dev/null; then sudo systemctl enable sddm if [ -f /etc/sddm.conf.d/10-wayland.conf ]; then echo "SDDM wayland configuration already exists." else echo "[General]" | sudo tee /etc/sddm.conf.d/10-wayland.conf echo "DisplayServer=wayland" | sudo tee -a /etc/sddm.conf.d/10-wayland.conf echo "GreeterEnvironment=QT_WAYLAND_SHELL_INTEGRATION=layer-shell" | sudo tee -a /etc/sddm.conf.d/10-wayland.conf echo "" | sudo tee -a /etc/sddm.conf.d/10-wayland.conf echo "[Wayland]" | sudo tee -a /etc/sddm.conf.d/10-wayland.conf echo "CompositorCommand=kwin_wayland --drm --no-lockscreen --no-global-shortcuts --locale1" | sudo tee -a /etc/sddm.conf.d/10-wayland.conf fi fi if ! grep -q "ELECTRON_OZONE_PLATFORM_HINT" /etc/environment; then echo "ELECTRON_OZONE_PLATFORM_HINT=auto" | sudo tee -a /etc/environment fi if [ ! -f ~/.config/electron-flags.conf ]; then mkdir -p ~/.config echo "--enable-features=WaylandWindowDecorations" > ~/.config/electron-flags.conf echo "--ozone-platform-hint=auto" >> ~/.config/electron-flags.conf fi fi } # Function name: Setup gaming packages # Description: Install choosen launchers and gaming related packages setup_gaming() { options=( "Steam" "Install Steam (Steam Games)" ON "Heroic Games Launcher" "Install Heroic Games Launcher (Epic Games, GOG Games, Amazon Games)" ON "Anime Games Launcher" "Install Anime Games Launcher (Honkai 3, Genshin Impact, Honkai: Star Rail, Zenless Zone Zero)" OFF "UmU Launcher" "Install UmU Launcher (Start games using proton without steam)" OFF "mangojuice" "Install MangoJuice for MangoHUD and vkbasalt setup" ON "Goverlay" "Install Goverlay for MangoHUD and vkbasalt setup (alternative)" OFF "MangoHud" "Install MangoHud for performance monitoring and overlays" ON "vkbasalt" "Install vkbasalt for Vulkan games" OFF "GameMode" "Install GameMode for performance optimization" ON "GameScope" "Install GameScope for gaming performance improvements (Not recommended on cachyos)" ON ) selected_gaming=$(whiptail --title "Setup Gaming" --checklist \ "Choose the gaming packages you want to install:" 20 78 8 \ "${options[@]}" 3>&1 1>&2 2>&3) for game in $selected_gaming; do case $game in "\"Steam\"") install_package steam-native-runtime ;; "\"Heroic Games Launcher\"") install_package heroic-games-launcher-bin ;; "\"Anime Games Launcher\"") install_package anime-games-launcher-git ;; "\"UmU Launcher\"") install_package umu-launcher ;; "\"mangojuice\"") install_package mangojuice ;; "\"Goverlay\"") install_package goverlay ;; "\"MangoHud\"") install_package mangohud ;; "\"vkbasalt\"") install_package vkbasalt ;; "\"GameMode\"") install_package gamemode ;; "\"GameScope\"") install_package gamescope ;; esac done } # Main script check_whiptail #setup_disk_partitioning setup_repositories setup_pacman setup_shell setup_audio_server setup_gpu setup_plymouth setup_network setup_bluetooth setup_firewall setup_ntp setup_flatpak setup_sbctl setup_fwupd setup_u2f setup_fprint setup_smartcard setup_openrgb setup_browser setup_office_suite setup_mail_client setup_virtualization setup_containers setup_plasma_kde setup_gaming # Packages group definitions # Package groups theme_packages=( btop-theme-catppuccin catppuccin-cursors-mocha catppuccin-gtk-theme-mocha papirus-folders-catppuccin-git plymouth-theme-catppuccin-mocha-git #refind-theme-catppuccin-git sddm-theme-catppuccin-git ) gnome_apps=( gnome-console gnome-disk-utility gnome-firmware ) cups_packages=( cups cups-pdf cups-filters system-config-printer )