Files
archery/Amelia.sh
T
Jane Doe 83a1a1c4aa Change: Edited the TUI & colors
Change: When the installer detects multiple 'efi,root,home,swap,xbootldr' partitions on selected installation drive, apart from accepting said partitions as valid installation destinations, the user can now use 'Smart Partitioning', 'Partitioning Presets' or 'Manual Partitioning' to manage said drive.
2025-09-28 13:42:00 +03:00

7582 lines
231 KiB
Bash

#!/bin/bash
# Amelia Installer
# Source: https://gitlab.com/prism7/archery
# Version: 9.8.0
set -euo pipefail
###################################################################################################
# COLOR FUNCTIONS
nc="\e[0m"
red="\e[31m"
cyan="\e[36m"
blue="\e[94m"
green="\e[32m"
redl="\e[1;31m"
yellow="\e[33m"
cyanl="\e[1;36m"
redbg="\e[1;41m"
magenta="\e[35m"
bwhite="\e[0;97m"
cyanbg="\e[1;46m"
bluebg="\e[1;44m"
greenl="\e[1;32m"
greenbg="\e[1;42m"
yellowl="\e[1;33m"
magental="\e[1;35m"
magentabg="\e[1;45m"
MAGENTABG() { echo -e "${magentabg} $1${nc}" ;}
YELLOWL() { echo -e "${yellowl} $1${nc}" ;}
GREENBG() { echo -e "${greenbg} $1${nc}" ;}
MAGENTA() { echo -e "${magenta} $1${nc}" ;}
YELLOW() { echo -e "${yellow} $1${nc}" ;}
BLUEBG() { echo -e "${bluebg} $1${nc}" ;}
CYANBG() { echo -e "${cyanbg} $1${nc}" ;}
WHITEB() { echo -e "${bwhite} $1${nc}" ;}
GREEN() { echo -e "${green} $1${nc}" ;}
REDBG() { echo -e "${redbg} $1${nc}" ;}
BLUE() { echo -e "${blue} $1${nc}" ;}
CYAN() { echo -e "${cyan} $1${nc}" ;}
RED() { echo -e "${red} $1${nc}" ;}
NC() { echo -e "${nc} $1${nc}" ;}
# END COLOR FUNCTIONS
###################################################################################################
# PROMPT FUNCTIONS
skip() {
sleep 0.2
YELLOW "
--> Skipping.. "
}
reload() {
sleep 0.2
NC "
--> [${green}Reloading${nc}] "
}
alternatives() {
sleep 0.2
NC "
--> [${green}Providing alternatives..${nc}] "
}
pkg_displ() {
sleep 0.2
NC "
${green}Packages to be installed${nc}:
${deskpkgs}"
}
deskname() {
sleep 0.2
YELLOW "
### ${desktopname} has been selected
"
}
vm() {
sleep 0.2
CYAN "
>> ${yellowl}Virtual Machine ${nc}detected
"
}
invalid() {
sleep 0.2
RED "
--------------------------
### ${nc}Invalid Response ${red}###
--------------------------"
reload
}
err_try() {
sleep 0.2
RED "
--------------------------------------------
### ${nc}Errors occured. Please try again.. ${red}###
--------------------------------------------"
reload
}
err_abort() {
sleep 0.2
RED "
------------------------
### ${nc}Errors occured ${red}###
------------------------"
failure
}
reboot() {
if [[ "${luks_encrypt}" == "ok" ]]; then
sleep 0.2
RED "
-------------------------------------------------------------------
### ${nc}The system will now ${yellow}reboot ${nc}for all changes to take effect ${red}###
-------------------------------------------------------------------
"
sleep 5
systemctl reboot
fi
}
force_reboot() {
sleep 0.2
RED "
----------------------------------------------------------------
### ${nc}A reboot is ${yellow}mandatory ${nc}after performing LUKS encryption ${red}###
----------------------------------------------------------------
"
sleep 5
systemctl reboot
}
line2() {
printf '\n\n'
}
line3() {
printf '\n\n\n'
}
unmount() {
sleep 0.2
line3
REDBG " ${yellow}----------------------------------- "
REDBG " ${yellow}[!] Unmount and Retry [!] "
REDBG " ${yellow}----------------------------------- "
echo
reload
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Unmount Filesystems${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
if umount -R /mnt > "${void}" 2>&1 ; then
sleep 0.2
NC "
------------------
### ${green}Unmount OK ${nc}###
------------------"
else
sleep 0.2
RED "
-----------------------------
### ${nc}Unmounting Failed.. ${red}###
-----------------------------"
failure
fi
}
do_umount() {
unmount
reload
}
umount_manual() {
unmount
sleep 0.2
NC "
--> [Switching to ${green}Manual Mode${nc}]"
}
choice() {
sleep 0.2
RED "
--------------------------------------------
### ${nc}Please make a choice to continue.. ${red}###
--------------------------------------------"
reload
}
y_n() {
sleep 0.2
RED "
----------------------------------------------
### ${nc}Please type ${yellow}'y' ${nc}or ${yellow}'n' ${nc}to continue.. ${red}###
----------------------------------------------"
reload
}
yes_no() {
sleep 0.2
RED "
-------------------------------------------------
### ${nc}Please type ${yellow}'yes' ${nc}or ${yellow}'no' ${nc}to continue.. ${red}###
-------------------------------------------------"
reload
}
ok() {
sleep 0.2
NC "
==> [${green}${prompt} OK${nc}] "
}
stage_ok() {
sleep 0.2
NC "
==> [${green}${stage_prompt} OK${nc}]
"
sleep 0.3
}
stage_fail() {
sleep 0.2
NC "
==> [${red}[!] ${stage_prompt} ${yellow}FAILED!${nc}]
"
failure
}
completion_err() {
if [[ -e /usr/bin/pv ]]; then
sleep 0.2
CYAN "
>> ${nc}Please complete ${bwhite}'${stage_prompt}' ${nc}to continue
" | pv -qL 70
else
sleep 0.2
CYAN "
>> ${nc}Please complete ${bwhite}'${stage_prompt}' ${nc}to continue
"
fi
}
term_offer() {
sleep 0.2
YELLOW "
### NOTE: ${desktopname} desktop lacks a native Terminal emulator by design
### You can use linux console (ctrl+alt+F'n') for shell access
> Install ${nc}'gnome-terminal' ${yellow}for convenience ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " terminal
terminal="${terminal:-y}"
terminal="${terminal,,}"
case "${terminal}" in
y)
sleep 0.2
NC "
==> [${green}Terminal OK${nc}] " ;;
n)
skip ;;
*)
invalid
until term_offer; do : ; done ;;
esac
}
amd() {
line2
REDBG " ------------------------------- "
REDBG " ### AMD Graphics detected ### "
REDBG " ------------------------------- "
NC "
* ${gfxcard}
"
}
intel() {
line2
BLUEBG " --------------------------------- "
BLUEBG " ### INTEL Graphics detected ### "
BLUEBG " --------------------------------- "
NC "
* ${gfxcard}
"
}
nvidia() {
line2
GREENBG " ---------------------------------- "
GREENBG " ### NVIDIA Graphics detected ### "
GREENBG " ---------------------------------- "
NC "
* ${gfxcard}
"
}
arch() {
sleep 0.2
echo
BLUEBG "************************************************************************************************* "
BLUEBG " "
BLUEBG " ##### Archlinux Installation ##### "
BLUEBG " "
BLUEBG "************************************************************************************************* "
line2
}
installing() {
sleep 0.2
line3
MAGENTABG "------------------------------------------------------------------------------------------------- "
MAGENTABG " ### Installing System ### "
MAGENTABG "------------------------------------------------------------------------------------------------- "
line3
}
cnfg() {
sleep 0.2
line3
MAGENTABG "------------------------------------------------------------------------------------------------- "
MAGENTABG " ### Configuring System ### "
MAGENTABG "------------------------------------------------------------------------------------------------- "
MAGENTA "
... Please Wait ... "
line3
}
completion() {
sleep 0.2
line3
GREENBG "************************************************************************************************* "
GREENBG " "
GREENBG " ### Installation Completed ### "
GREENBG " "
GREENBG "************************************************************************************************* "
line3
}
failure() {
sleep 0.2
line3
REDBG "************************************************************************************************* "
REDBG " "
REDBG " ### Installation Aborted ### "
REDBG " "
REDBG "************************************************************************************************* "
line3
umount -R /mnt > "${void}" 2>&1
if [[ "${luks_root}" == "ok" || "${luks_swap}" == "ok" || "${luks_home}" == "ok" ]] && [[ "${installation}" != "ok" ]]; then
force_reboot
fi
exit
}
# END PROMPT FUNCTIONS
###################################################################################################
# FUNCTIONS
mode_check() {
if [[ "${run_as}" == "root" ]]; then
sleep 0.2
NC "
${cyan}* ${nc}Running in ${red}ROOT ${nc}mode ${cyan}* "
else
sleep 0.2
NC "
${cyan}* ${nc}Running in ${blue}DEMO ${nc}mode ${cyan}* "
fi
}
###################################################################################################
set_font() {
if [[ -f /usr/share/kbd/consolefonts/ter-v18b.psf.gz && -f /usr/share/kbd/consolefonts/ter-v32b.psf.gz ]]; then
if [[ "${tty}" == *"tty"* && "${run_as}" == "root" ]]; then
until slct_font; do : ; done
else
if [[ -e /usr/bin/pv ]]; then
MAGENTABG " 'Terminus Font' detected ==> Log in as 'root' in a tty & re-run to enable " | pv -qL 70
echo
else
MAGENTABG " 'Terminus Font' detected ==> Log in as 'root' in a tty & re-run to enable "
echo
fi
fi
fi
}
###################################################################################################
slct_font() {
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Font Selection${nc} ${magenta}]${nc}--------------------------------------${magenta}###
"
YELLOW "
> Select a Font: "
NC "
[1] Terminus Font
[2] HiDPI Terminus Font "
BLUE "
Enter a number: "
read -r -p "
==> " fontselect
echo
case "${fontselect}" in
1)
setfont ter-v18b ;;
2)
setfont ter-v32b ;;
*)
invalid
return 1 ;;
esac
local prompt="Fonts"
ok
sleep 0.7
clear
}
###################################################################################################
uefi_check() {
bitness="$(cat /sys/firmware/efi/fw_platform_size)"
local prompt="UEFI ${bitness}-bit Mode"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}UEFI Mode Verification${nc} ${magenta}]${nc}---------------------------------${magenta}###
"
if [[ "${bitness}" == "64" ]]; then
uefimode="x86_64-efi"
ok
elif [[ "${bitness}" == "32" ]]; then
uefimode="i386-efi"
ok
else
RED "
--------------------------
### ${nc}Not in UEFI Mode ${red}###
--------------------------"
failure
fi
}
###################################################################################################
connection_check() {
local prompt="Internet Connection"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Internet Connection Check${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
if ping -c 3 archlinux.org > "${void}" 2>&1; then
ok
else
RED "
----------------------------------------------------------------------
### ${nc}A connection to ${yellow}'www.archlinux.org' ${nc}could not be established ${red}###
----------------------------------------------------------------------
"
failure
fi
}
###################################################################################################
upd_clock() {
local prompt="System Clock"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}System Clock Update${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
sleep 0.2
timedatectl
echo
ok
}
###################################################################################################
dtct_hyper() {
hypervisor="$(systemd-detect-virt)"
case "${hypervisor}" in
kvm)
vmpkgs="spice spice-vdagent spice-protocol spice-gtk qemu-guest-agent swtpm" ;;
vmware)
vmpkgs="open-vm-tools"
vm_services="vmtoolsd vmware-vmblock-fuse" ;;
oracle)
vmpkgs="virtualbox-guest-utils" ;;
microsoft)
vmpkgs="hyperv"
vm_services="hv_kvp_daemon hv_vss_daemon" ;;
esac
}
###################################################################################################
machine_dtct() {
until dtct_hyper; do : ; done
local prompt="Machine Detection"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Machine Detection${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
CPU="$(grep -E 'vendor_id' /proc/cpuinfo)"
hardw_model="$(hostnamectl | grep -E "Hardware Model:" | sed 's| Hardware Model: ||')"
hardw_model_vend="$(hostnamectl | grep -E "Hardware Model:" | sed 's| Hardware Model: ||' | awk "{print \$1}")"
hardw_vendor="$(hostnamectl | grep -E "Hardware Vendor" | awk "{print \$3}")"
machine="$(hostnamectl | grep -Em 1 "Chassis" | awk "{print \$2}")"
if [[ "${hypervisor}" != "none" ]]; then
vm
vendor="Virtual Machine"
gfxconf="n"
fi
if [[ "${CPU}" == *"GenuineIntel"* ]]; then
microcode="intel-ucode"
nrg_plc="x86_energy_perf_policy"
cpu_name="Intel"
elif [[ "${CPU}" == *"AuthenticAMD"* ]]; then
microcode="amd-ucode"
cpu_name="AMD"
fi
if [[ "${hardw_model_vend}" == "${hardw_vendor}" ]]; then
sleep 0.2
YELLOW "
### This system is a(n): ${hardw_model} ${machine}
### The ${cpu_name} cpu microcode will be installed
"
else
sleep 0.2
YELLOW "
### This system is a(n): ${hardw_model} ${hardw_vendor} ${machine}
### The ${cpu_name} cpu microcode will be installed
"
fi
ok
}
###################################################################################################
main_menu() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Main Menu${nc} ${magenta}]${nc}----------------------------------------${magenta}###
"
YELLOW "
> Make a selection: "
if [[ -e /usr/bin/pv ]]; then
CYAN "
>> ${nc}Select ${bwhite}[4] ${nc}for ${yellowl}Auto-Navigation ${nc}Mode " | pv -qL 70
echo
else
CYAN "
>> ${nc}Select ${bwhite}[4] ${nc}for ${yellowl}Auto-Navigation ${nc}Mode "
echo
fi
NC "
[1] Personalization
[2] System Configuration
[3] Disk Management
[4] Start Installation "
BLUE "
Enter a number: "
read -r -p "
==> " menu
echo
case "${menu}" in
1)
until persnl_submn; do : ; done ;;
2)
until sys_submn; do : ; done ;;
3)
until dsks_submn; do : ; done ;;
4)
until instl; do : ; done ;;
"")
sleep 0.2
RED "
---------------------------------
### ${nc}Please select a Submenu ${red}###
---------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
persnl_submn() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Personalization${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select a Submenu: "
NC "
[1] Locale & Keyboard Layout Setup
[2] User, Root User & Hostname Setup
[3] Shell Selection
[ ] Return to Main Menu "
BLUE "
Enter a number: "
read -r -p "
==> " persmenu
echo
case "${persmenu}" in
1)
until slct_locale; do : ; done
until slct_kbd; do : ; done
return 1 ;;
2)
until user_setup; do : ; done
until rootuser_setup; do : ; done
until slct_hostname; do : ; done
return 1 ;;
3)
until slct_shell; do : ; done
return 1 ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
slct_locale() {
local prompt="Locale Selection"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Locale Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
> Select your Locale
### [Enter ${nc}'l'${yellow} to list locales, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] "
CYAN "
>> ${nc}Exclude ${yellowl}'.UTF_8' ${nc}suffix
"
BLUE "
Enter your Locale ${bwhite}(empty for 'en_US')${blue}: "
read -r -p "
==> " LOCALESET
echo
if [[ -z "${LOCALESET}" ]]; then
SETLOCALE="en_US.UTF-8"
sleep 0.2
YELLOW "
### en_US.UTF-8 Locale has been selected
"
elif [[ "${LOCALESET}" == "l" ]]; then
grep -E 'UTF-8' /usr/share/i18n/SUPPORTED | less
return 1
elif ! grep -q "^#\?$(sed 's/[].*[]/\\&/g' <<< "${LOCALESET}") " /usr/share/i18n/SUPPORTED; then
invalid
return 1
else
SETLOCALE="${LOCALESET}.UTF-8"
sleep 0.2
YELLOW "
### ${SETLOCALE} Locale has been selected
"
fi
ok
lcl_slct="yes"
}
###################################################################################################
slct_kbd() {
local prompt="Keyboard Layout Selection"
local stage_prompt="Setting Keyboard Layout"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Keyboard Layout Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
if [[ "${tty}" == *"pts"* ]]; then
SETKBD="us"
sleep 0.2
RED "
-------------------------------------------
### ${nc}No 'tty' (Linux console) detected ${red}###
-------------------------------------------"
YELLOW "
### Default Keyboard Layout ('us') selected
"
ok
return 0
fi
YELLOW "
> Select your Keyboard Layout
### [Enter ${nc}'l'${yellow} to list layouts, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] "
BLUE "
Enter your keyboard layout ${bwhite}(empty for 'us')${blue}: "
read -r -p "
==> " SETKBD
echo
if [[ -z "${SETKBD}" ]]; then
SETKBD="us"
sleep 0.2
YELLOW "
### 'us' Keyboard Layout has been selected
"
elif [[ "${SETKBD}" == "l" ]]; then
localectl list-keymaps | less
return 1
elif ! localectl list-keymaps | grep -Fxq "${SETKBD}"; then
invalid
return 1
else
sleep 0.2
YELLOW "
### ${SETKBD} Keyboard Layout has been selected
"
loadkeys "${SETKBD}" > "${void}" 2> "${log}" || stage_fail
fi
ok
}
###################################################################################################
user_setup() {
local prompt="User Setup"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}User Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}###
"
BLUE "
Enter a username: "
read -r -p "
==> " USERNAME
echo
USERNAME="${USERNAME,,}"
if [[ -z "${USERNAME}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${nc}Please enter a username to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${USERNAME}" =~ ^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$ ]]; then
BLUE "
Enter a password for${nc} ${cyan}${USERNAME}${blue}: "
read -r -p "
==> " USERPASSWD
echo
if [[ -z "${USERPASSWD}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${nc}Please enter a password to continue ${red}###
---------------------------------------------"
reload
return 1
fi
BLUE "
Re-enter${nc} ${cyan}${USERNAME}'s ${blue}password: "
read -r -p "
==> " USERPASSWD2
echo
if [[ "${USERPASSWD}" != "${USERPASSWD2}" ]]; then
sleep 0.2
RED "
---------------------------------------------------
### ${nc}Passwords don't match. Please try again.. ${red}###
---------------------------------------------------"
reload
return 1
fi
else
sleep 0.2
RED "
---------------------------------------------------
### ${nc}Please enter a valid username to continue ${red}###
---------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
rootuser_setup() {
local prompt="Root User Setup"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Root User Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
BLUE "
Enter a password for the${nc}${cyan} Root ${blue}user: "
read -r -p "
==> " ROOTPASSWD
echo
if [[ -z "${ROOTPASSWD}" ]]; then
sleep 0.2
RED "
---------------------------------------------------------------
### ${nc}Please enter a password for the Root user to continue ${red}###
---------------------------------------------------------------"
reload
return 1
fi
BLUE "
Re-enter${nc} ${cyan}Root ${blue}user's password: "
read -r -p "
==> " ROOTPASSWD2
echo
if [[ "${ROOTPASSWD}" != "${ROOTPASSWD2}" ]]; then
sleep 0.2
RED "
---------------------------------------------------
### ${nc}Passwords don't match. Please try again.. ${red}###
---------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
slct_hostname() {
local prompt="Hostname Setup"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Hostname Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
BLUE "
Enter a hostname: "
read -r -p "
==> " HOSTNAME
echo
if [[ -z "${HOSTNAME}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${nc}Please enter a hostname to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${HOSTNAME}" =~ [[:upper:]] ]]; then
sleep 0.2
RED "
----------------------------------------------------
### ${nc}Lowercase is preferred. Please try again.. ${red}###
----------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
slct_shell() {
local prompt="Shell Selection"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Shell Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select a Shell: "
NC "
[1] Bash
[2] Zsh
[3] Fish "
BLUE "
Enter a number: "
read -r -p "
==> " shellnmbr
echo
case "${shellnmbr}" in
1)
shell=""
shellname="bash"
shellname2="Bash"
shell_pkgs="bash-completion powerline powerline-fonts" ;;
2)
shell="zsh"
shellname="zsh"
shellname2="Zsh"
shell_pkgs="powerline powerline-fonts zsh-autocomplete zsh-autosuggestions zsh-completions zsh-syntax-highlighting" ;;
3)
shell="fish"
shellname="fish"
shellname2="Fish"
shell_pkgs="powerline powerline-fonts which" ;;
"")
sleep 0.2
RED "
-------------------------------
### ${nc}Please select a Shell ${red}###
-------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### The ${shellname2} shell has been selected
"
ok
}
###################################################################################################
sys_submn() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}System Configuration${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select a Submenu: "
NC "
[1] Kernel, Secureboot Signing, Bootloader & ESP Mountpoint
[2] Filesystem & Swap Setup
[3] Graphics Setup
[4] Desktop Setup
[5] EFI Boot Entries Deletion
[6] Optimizations
[ ] Return to Main Menu "
BLUE "
Enter a number: "
read -r -p "
==> " sysmenu
echo
case "${sysmenu}" in
1)
until slct_krnl; do : ; done
until ask_sign; do : ; done
until slct_bootldr; do : ; done
until slct_espmnt; do : ; done
return 1 ;;
2)
until slct_fs; do : ; done
until slct_swap; do : ; done
return 1 ;;
3)
until dtct_gfx; do : ; done
return 1 ;;
4)
until dsktp_setup; do : ; done
return 1 ;;
5)
until boot_entr; do : ; done
return 1 ;;
6)
until optm_submn; do : ; done
return 1 ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
slct_krnl() {
local prompt="Kernel"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Kernel Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
> Select a Kernel: "
NC "
[1] Linux
[2] Linux LTS
[3] Linux Hardened
[4] Linux Zen "
BLUE "
Enter a number: "
read -r -p "
==> " kernelnmbr
echo
case "${kernelnmbr}" in
1)
kernel="linux"
kernelname="Linux" ;;
2)
kernel="linux-lts"
kernelname="Linux LTS" ;;
3)
CYAN "
>> ${nc}System Hibernation is ${yellowl}not supported ${nc}by this kernel
"
kernel="linux-hardened"
kernelname="Linux Hardened" ;;
4)
kernel="linux-zen"
kernelname="Linux Zen" ;;
"")
sleep 0.2
RED "
--------------------------------
### ${nc}Please select a Kernel ${red}###
--------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### The ${kernelname} kernel has been selected
"
ok
}
###################################################################################################
ask_sign() {
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Secureboot Signing${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
YELLOW "
> Sign UKI(s), Kernel & binaries for use with Secure Boot ? [y/N]"
BLUE "
Enter [y/N]: "
read -r -p "
==> " sb_sign
echo
sb_sign="${sb_sign:-n}"
sb_sign="${sb_sign,,}"
if [[ "${sb_sign}" == "y" ]]; then
local prompt="Secure Boot 'Setup' Mode Verification"
SB_Status="$(bootctl status 2> "${void}" | grep -E 'Secure Boot' | awk "{print \$4}")"
if [[ "${SB_Status}" == "(setup)" ]]; then
ok
else
sleep 0.2
RED "
-----------------------------------------
### ${nc}Secure Boot Not in ${yellow}'Setup' ${nc}Mode ${red}###
-----------------------------------------"
failure
fi
sleep 0.2
YELLOW "
### 'Secure Boot Signing' has been selected
"
sleep 0.2
YELLOW "
> Create an additional bootloader Rescue entry (for troubleshooting) ? [Y/n]"
BLUE "
Enter [Y/n]: "
read -r -p "
==> " setrescue
echo
setrescue="${setrescue:-y}"
setrescue="${setrescue,,}"
if [[ "${setrescue}" == "y" ]]; then
local prompt="Rescue Entry set"
ok
elif [[ "${setrescue}" == "n" ]]; then
skip
else
y_n
return 1
fi
elif [[ "${sb_sign}" == "n" ]]; then
skip
else
y_n
return 1
fi
local prompt="Secure Boot Signing setup"
ok
}
###################################################################################################
slct_bootldr() {
local prompt="Bootloader Selection"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Bootloader Selection${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select a Bootloader: "
NC "
[1] Systemd-boot
[2] Grub "
BLUE "
Enter a number: "
read -r -p "
==> " bootloader
echo
case "${bootloader}" in
1)
uki="y"
ukify="systemd-ukify"
sleep 0.2
YELLOW "
### Systemd-boot has been selected
" ;;
2)
uki="n"
sleep 0.2
YELLOW "
### Grub has been selected
" ;;
"")
sleep 0.2
RED "
------------------------------------
### ${nc}Please select a Bootloader ${red}###
------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
slct_espmnt() {
local prompt="ESP Mountpoint"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}ESP Mountpoint Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
YELLOW "
> Select a Mountpoint for the ESP: "
NC "
[1] /mnt/efi
[2] /mnt/boot "
BLUE "
Enter a number: "
read -r -p "
==> " espmnt
echo
case "${espmnt}" in
1)
esp_mount="/mnt/efi"
btldr_esp_mount="/efi"
sleep 0.2
YELLOW "
### '/mnt/efi' mountpoint has been selected
" ;;
2)
esp_mount="/mnt/boot"
btldr_esp_mount="/boot"
sleep 0.2
YELLOW "
### '/mnt/boot' mountpoint has been selected
" ;;
"")
sleep 0.2
RED "
------------------------------------
### ${nc}Please select a Mountpoint ${red}###
------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
if [[ "${sanity}" == "no" ]]; then
until sanity_check; do : ; done
fi
}
###################################################################################################
slct_fs() {
local prompt="Filesystem Setup"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Filesystem Selection${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select Filesystem to be used: "
NC "
[1] Ext4
[2] Btrfs "
BLUE "
Enter a number: "
read -r -p "
==> " fs
echo
case "${fs}" in
1)
fsname="Ext4"
fs_mod="ext4"
fstools="e2fsprogs"
roottype="/Root"
sleep 0.2
YELLOW "
### NOTE: Keeping User Data on a separate /Home Partition is supported
> Make use of a dedicated /Home Partition ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " sep_home
echo
sep_home="${sep_home:-n}"
sep_home="${sep_home,,}"
case "${sep_home}" in
y)
sleep 0.2
YELLOW "
### A /Home Partition will be created ";;
n)
skip
echo;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### ${fsname} has been selected
" ;;
2)
fsname="Btrfs"
fs_mod="btrfs"
fstools="btrfs-progs"
roottype="/@"
btrfs_bootopts="rootflags=subvol=@"
sleep 0.2
YELLOW "
### ${fsname} has been selected "
sleep 0.2
YELLOW "
> Label your Btrfs snapshots directory: "
BLUE "
Enter a name: "
read -r -p "
==> " snapname
echo
if [[ -z "${snapname}" ]]; then
invalid
return 1
fi ;;
"")
sleep 0.2
RED "
------------------------------------
### ${nc}Please select a Filesystem ${red}###
------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
slct_swap() {
local prompt="Swap Setup"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swap Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select Swap type: "
NC "
[1] Swap Partition
[2] Swapfile
[3] Zram Swap
[4] None "
BLUE "
Enter a number: "
read -r -p "
==> " swapmode
echo
case "${swapmode}" in
1)
swaptype="swappart"
sleep 0.2
YELLOW "
### Swap Partition has been selected
" ;;
2)
if [[ "${fs}" == "1" ]]; then
swaptype="swapfile"
elif [[ "${fs}" == "2" ]]; then
swaptype="swapfile_btrfs"
fi
sleep 0.2
YELLOW "
### Swapfile has been selected
"
until set_swapsize; do : ; done ;;
3)
CYAN "
>> ${nc}Hibernating to Swap on Zram is ${yellowl}not supported${nc} "
zram="zram-generator"
YELLOW "
### Zram Swap has been selected
" ;;
4)
sleep 0.2
YELLOW "
### No Swap will be used "
skip ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
set_swapsize() {
local prompt="Swapsize"
YELLOW "
### Set Swap size (integers only eg. 1,4,8,16,34)
"
BLUE "
Enter Swap size ${bwhite}(in GB)${blue}: "
read -r -p "
==> " swapsize
echo
if [[ -z "${swapsize}" ]]; then
sleep 0.2
RED "
------------------------------------------
### ${nc}Please enter a value to continue ${red}###
------------------------------------------"
reload
line2
return 1
elif [[ "${swapsize}" == [[:digit:]] ]]; then
ok
else
sleep 0.2
RED "
---------------------------------------------
### ${nc}Please use only integers as a value ${red}###
---------------------------------------------"
reload
line2
return 1
fi
}
###################################################################################################
dtct_gfx() {
gfx_slct="yes"
vendor=""
vendors=""
if [[ "${hypervisor}" != "none" ]]; then
vendor="Virtual Machine"
vm
sleep 0.2
YELLOW "
--> Graphics Setup skipped
"
return 0
else
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Graphics Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
gfxcount="$(lspci | grep -E -c 'VGA|Display|3D')"
gfxcard="$(lspci | grep -E 'VGA|Display|3D' | sed 's/^.*: //g')"
intelcount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'Intel Corporation')"
intelcards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'Intel Corporation'| sed 's/.*Corporation //g' | cat --number | sed 's/.[0-9]//')"
amdcount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'Advanced Micro Devices')"
amdcards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'Advanced Micro Devices' | sed 's/.*\[AMD\/ATI\] //g' | cat --number | sed 's/.[0-9]//')"
nvidiacount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'NVIDIA Corporation')"
nvidiacards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'NVIDIA Corporation'| sed 's/.*Corporation //g' | cat --number | sed 's/.[0-9]//')"
if [[ "${gfxcount}" == "1" ]]; then
dtct_single_gfx
else
dtct_multi_gfx
fi
fi
}
###################################################################################################
dtct_single_gfx() {
if [[ "${intelcount}" -eq "1" ]]; then
vendor="Intel"
sourcetype="Open-source"
sleep 0.2
intel
elif [[ "${amdcount}" -eq "1" ]]; then
vendor="AMD"
sourcetype="Open-source"
sleep 0.2
amd
elif [[ "${nvidiacount}" -eq "1" ]]; then
vendor="Nvidia"
sourcetype="Proprietary"
nvidia
fi
if [[ "${vendor}" == "Nvidia" ]]; then
sleep 0.2
RED "
----------------------------------------------------
### ${nc}Only for NV110 ${yellow}(Maxwell) ${nc}Graphics or newer ${red}###
----------------------------------------------------"
fi
YELLOW "
> Configure the Graphics subsystem and enable HW acceleration ? [Y/n] "
if [[ "${vendor}" == "Nvidia" ]]; then
YELLOW "
### Selecting ${nc}'(n)o' ${yellow}defaults to using the open-source ${nc}'nouveau' ${yellow}driver"
fi
BLUE "
Enter [Y/n]: "
read -r -p "
==> " gfxconf
gfxconf="${gfxconf:-y}"
gfxconf="${gfxconf,,}"
if [[ "${gfxconf}" == "y" ]]; then
gfx_conf
elif [[ "${gfxconf}" == "n" ]]; then
local prompt="Graphics Setup"
skip
ok
else
invalid
return 1
fi
}
###################################################################################################
dtct_multi_gfx() {
if [[ "${gfxcount}" == "2" ]]; then
gfx_setup="Dual"
elif [[ "${gfxcount}" == "3" ]]; then
gfx_setup="Triple"
fi
sleep 0.2
YELLOW "
### ${gfx_setup} Graphics setup detected, consisting of: "
NC "
____________________________________________________________________"
if [[ "${intelcount}" -ge "1" ]]; then
vendor1="Intel"
echo
BLUEBG " ------------------------------- "
BLUEBG " [${intelcount}] Intel Graphics device(s) "
BLUEBG " ------------------------------- "
NC "
${intelcards}
____________________________________________________________________"
fi
if [[ "${amdcount}" -ge "1" ]]; then
vendor2="AMD"
echo
REDBG " ------------------------------- "
REDBG " [${amdcount}] AMD Graphics device(s) "
REDBG " ------------------------------- "
NC "
${amdcards}
____________________________________________________________________"
fi
if [[ "${nvidiacount}" -ge "1" ]]; then
vendor3="Nvidia"
echo
GREENBG " ------------------------------- "
GREENBG " [${nvidiacount}] Nvidia Graphics device(s) "
GREENBG " ------------------------------- "
NC "
${nvidiacards}
____________________________________________________________________"
fi
YELLOW "
> Configure the Graphics subsystem and enable HW acceleration for : "
if [[ -n "${vendor1}" && -n "${vendor2}" ]]; then
NC "
[1] Intel
[2] AMD
[3] Both
[4] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
case "${vendor_slct}" in
1)
vendor="Intel" ;;
2)
vendor="AMD" ;;
3)
vendors="Intel & AMD" ;;
4)
vendor="none" ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
elif [[ -n "${vendor1}" && -n "${vendor3}" ]]; then
NC "
[1] Intel
${red}----------------------------------------------------${nc}
[2] Nvidia ${red}### ${nc}Only for NV110 ${yellow}(Maxwell) ${nc}Graphics or newer ${red}###${nc}
${red}----------------------------------------------------${nc}
[3] Both
[4] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
case "${vendor_slct}" in
1)
vendor="Intel" ;;
2)
vendor="Nvidia" ;;
3)
vendors="Intel & Nvidia" ;;
4)
vendor="none" ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
elif [[ -n "${vendor2}" && -n "${vendor3}" ]]; then
NC "
[1] Amd
${red}----------------------------------------------------${nc}
[2] Nvidia ${red}### ${nc}Only for NV110 ${yellow}(Maxwell) ${nc}Graphics or newer ${red}###${nc}
${red}----------------------------------------------------${nc}
[3] Both
[4] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
case "${vendor_slct}" in
1)
vendor="AMD" ;;
2)
vendor="Nvidia" ;;
3)
vendors="AMD & Nvidia" ;;
4)
vendor="none" ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
fi
if [[ "${vendor}" =~ ^(intel|AMD)$ ]]; then
sourcetype="Open-source"
gfxconf="y"
gfx_conf
elif [[ "${vendor}" == "Nvidia" ]]; then
sourcetype="Proprietary"
gfxconf="y"
gfx_conf
elif [[ "${vendors}" == "Intel & AMD" ]]; then
sourcetype="Open-source"
gfxconf="y"
gfx_conf
elif [[ "${vendors}" =~ ^(Intel & Nvidia|AMD & Nvidia)$ ]]; then
sourcetype="Open-source & Proprietary"
gfxconf="y"
gfx_conf
elif [[ "${vendor}" == "none" ]]; then
local prompt="Graphics Setup"
gfxconf="n"
skip
ok
fi
}
###################################################################################################
gfx_conf() {
if [[ "${vendor}" != "none" ]]; then
sleep 0.2
YELLOW "
### ${sourcetype} drivers will be used
"
fi
if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then
sleep 0.2
YELLOW "
> Enable 'amdgpu' driver support for: "
NC "
[1] 'Southern Islands' Graphics
[2] 'Sea Islands' Graphics "
BLUE "
Enter a number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " islands
case "${islands}" in
1)
sleep 0.2
NC "
==> [${green}Southern Islands OK${nc}]
" ;;
2)
sleep 0.2
NC "
==> [${green}Sea Islands OK${nc}]
" ;;
"")
skip
echo ;;
*)
invalid
return 1 ;;
esac
fi
if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then
sleep 0.2
YELLOW "
> Select Nvidia architecture: "
NC "
[1] Turing (NV160) Graphics or newer [Nvidia Open]
[2] Maxwell (NV110) Graphics or newer [Nvidia Proprietary / Disabling GSP Firmware available] "
BLUE "
Enter a number: "
read -r -p "
==> " family
case "${family}" in
1) # Turing+ Family
sleep 0.2
NC "
==> [${green}Turing+ OK${nc}]
" ;;
2) # Maxwell+ Family
sleep 0.2
NC "
==> [${green}Maxwell+ OK${nc}]
"
local prompt="GSP Firmware Disabled"
sleep 0.2
YELLOW "
> Disable 'GSP' firmware (for troubleshooting) ? [y/n] "
BLUE "
Enter [y/n]: "
read -r -p "
==> " nogsp
if [[ "${nogsp}" == "n" ]]; then
skip
echo
elif [[ "${nogsp}" == "y" ]]; then
ok
echo
else
y_n
return 1
fi ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
local prompt="Low Latency Display Interrupts enabled"
sleep 0.2
YELLOW "
> Enable Low Latency Display Interrupts (experimental) ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " lowlat
lowlat="${lowlat:-y}"
lowlat="${lowlat,,}"
if [[ "${lowlat}" == "n" ]]; then
skip
echo
elif [[ "${lowlat}" == "y" ]]; then
ok
echo
else
y_n
return 1
fi
fi
sleep 0.2
YELLOW "
### ${vendor}${vendors} Graphics will be automatically configured
"
local prompt="Graphics Setup"
ok
}
###################################################################################################
gfxpkgs_set() {
# Graphics packages
gfxpkgs=()
# Configure Graphics = yes
if [[ "${gfxconf}" == "y" ]]; then
# Intel Graphics
if [[ "${vendor}" == "Intel" || "${vendors}" =~ "Intel" ]]; then
# /etc/sysctl.d/99-sysctld.conf
perf_stream="dev.i915.perf_stream_paranoid = 0"
gfxpkgs+=(intel-compute-runtime intel-media-driver intel-media-sdk libva-intel-driver libva-utils libvpl opencl-headers vpl-gpu-rt vkd3d vulkan-intel vulkan-mesa-layers)
fi
# AMD Graphics
if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then
gfxpkgs+=(libva-mesa-driver mesa-utils mesa-vdpau opencl-headers rocm-opencl-runtime vkd3d vulkan-mesa-layers vulkan-radeon)
fi
# Nvidia Graphics
if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then
# Swap partition|swapfile|zram-swap = yes
if [[ "${swapmode}" =~ ^(1|2|3)$ ]]; then
sleep 0.2
CYAN "
----------------------------------------------------------------
### ${yellowl}INFO: ${nc}When Hibernating ${cyan}###
### ${nc}Nvidia's ${yellowl}'Preserve Video Memory after suspend' ${nc}feature ${cyan}###
### ${nc}is incompatible with ${yellowl}'Early KMS' ${nc}use ${cyan}###
----------------------------------------------------------------"
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
fi
# Turing+ GPUs
if [[ "${family}" == "1" ]]; then
# Linux Kernel
if [[ "${kernelnmbr}" == "1" ]]; then
nvname="nvidia-open"
gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-open nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d)
# Other Kernels
else
gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-open-dkms nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d)
fi
# Maxwell+ GPUs
elif [[ "${family}" == "2" ]]; then
# Linux Kernel
if [[ "${kernelnmbr}" == "1" ]]; then
nvname="nvidia"
gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d)
# Linux LTS Kernel
elif [[ "${kernelnmbr}" == "2" ]]; then
nvname="nvidia-lts"
gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-lts nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d)
# Other Kernels
else
gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-dkms nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d)
fi
fi
fi
# Configure Graphics = no
elif [[ "${gfxconf}" == "n" ]]; then
# Nvidia Graphics
if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then
gfxpkgs+=(libva-mesa-driver vulkan-nouveau)
fi
fi
}
###################################################################################################
dsktp_setup() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Desktop Setup${nc} ${magenta}]${nc}--------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
> Make a selection: "
NC "
[1] Desktop Selection
[2] Arch 'base-devel' Meta-package
[3] Web browser Selection
[4] Printer & Scanner Support
[ ] Return to System Configuration "
BLUE "
Enter a number: "
read -r -p "
==> " desk_setup
case "${desk_setup}" in
1)
until dsktp_slct; do : ; done
return 1 ;;
2)
until base_devel; do : ; done
return 1 ;;
3)
until web_browser; do : ; done
return 1 ;;
4)
until print_scan; do : ; done
return 1 ;;
"")
until sys_submn; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
dsktp_slct() {
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Desktop Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
deskpkgs=""
custompkgs=""
terminal=""
local prompt="Desktop Selection"
sleep 0.2
YELLOW "
> Make a selection: "
NC "
[1] Plasma
[2] Plasma Light (Amelia's version)
[3] Gnome
[4] Gnome Light (Amelia's version)
[5] Xfce
[6] Cinnamon
[7] Deepin
[8] Budgie
[9] Lxqt
[10] Mate
[11] Basic Arch Linux (No GUI)
[12] Custom Arch Linux
[13] Cosmic ${red}## ${yellow}Alpha ${red}## "
BLUE "
Enter a number: "
read -r -p "
==> " desktop
echo
case "${desktop}" in
1)
desktopname="Plasma"
deskname ;;
2)
desktopname="Plasma Light"
deskname ;;
3)
desktopname="Gnome"
deskname ;;
4)
desktopname="Gnome Light"
deskname ;;
5)
desktopname="Xfce"
deskname ;;
6)
desktopname="Cinnamon"
deskname
term_offer ;;
7)
desktopname="Deepin"
deskname ;;
8)
desktopname="Budgie"
deskname
term_offer ;;
9)
desktopname="Lxqt"
deskname ;;
10)
desktopname="Mate"
deskname ;;
11)
desktopname="Basic Arch Linux"
deskname ;;
12)
desktopname="Custom Arch Linux"
until cust_sys; do :; done
return 0 ;;
13)
desktopname="Cosmic"
deskname ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
if [[ -n "${web}" && "${desktop}" =~ ^(11|12)$ ]]; then
until web_browser; do : ; done
fi
if [[ "${printer}" == "y" && "${desktop}" =~ ^(11|12)$ ]]; then
until print_scan; do : ; done
fi
}
###################################################################################################
cust_sys() {
local prompt="Custom Arch Linux"
until add_pkgs; do : ; done
until add_services; do : ; done
echo
ok
}
###################################################################################################
add_pkgs() {
local prompt="Add Packages"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Packages${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
### 'base', 'linux-firmware' (if on bare-metal), 'sudo' & your current choices are already included "
BLUE "
Enter any additional packages ${bwhite}(space-seperated)${blue}: "
read -r -p "
==> " custompkgs
if [[ -z "${custompkgs}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${nc}Please enter package(s) to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${custompkgs}" =~ "lightdm" ]]; then
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}LightDM Greeter Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
YELLOW "
> Select a Greeter: "
NC "
[1] Gtk
[2] Slick
[3] Deepin "
BLUE "
Enter a number: "
read -r -p "
==> " greeternmbr
case "${greeternmbr}" in
1)
greeter="lightdm-gtk-greeter"
sleep 0.2
NC "
==> [${green}Lightdm Gtk Greeter OK${nc}] " ;;
2)
greeter="lightdm-slick-greeter"
sleep 0.2
NC "
==> [${green}Lightdm Slick Greeter OK${nc}] " ;;
3)
greeter="lightdm-deepin-greeter"
sleep 0.2
NC "
==> [${green}Lightdm Deepin Greeter OK${nc}] " ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
else
ok
fi
}
###################################################################################################
add_services() {
local prompt="Add Services"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Services${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
### Empty to skip "
BLUE "
Enter services to be enabled ${bwhite}(space-seperated)${blue}: "
read -r -p "
==> " customservices
if [[ -z "${customservices}" ]]; then
skip
else
ok
fi
}
###################################################################################################
base_devel() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}'base-devel' Meta-package${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
local prompt="'base-devel'"
sleep 0.2
YELLOW "
### NOTE: The 'base' meta-package does not include the tools needed for building packages
> Install 'base-devel' meta-package ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " dev
dev="${dev:-y}"
dev="${dev,,}"
case "${dev}" in
y)
devel="base-devel"
ok ;;
n)
skip ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
web_browser() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Web browser Selection${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
if [[ ! "${desktop}" =~ ^(11|12)$ && -n "${desktop}" ]]; then
sleep 0.2
YELLOW "
### Web Browser support is available
> Select Web Browser to install "
NC "
[1] Firefox
[2] Chromium
[3] Vivaldi
[4] Brave Browser
[5] Microsoft Edge
[6] Zen Browser
[7] Opera
[8] Google Chrome "
BLUE "
Enter a number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " web
case "${web}" in
1)
web_pkg="firefox"
web_name="Firefox" ;;
2)
web_pkg="chromium"
web_name="Chromium" ;;
3)
web_pkg="vivaldi"
web_name="Vivaldi" ;;
4)
web_aur="brave-bin"
web_name="Brave Browser" ;;
5)
web_aur="microsoft-edge-stable-bin"
web_name="Microsoft Edge" ;;
6)
web_aur="zen-browser-bin"
web_name="Zen Browser" ;;
7)
web_aur="opera"
web_name="Opera" ;;
8)
web_aur="google-chrome"
web_name="Google Chrome" ;;
"")
web_pkg=""
web_aur=""
web_name=""
web_slct="yes"
skip ;;
*)
invalid
return 1 ;;
esac
else
sleep 0.2
RED "
-----------------------------------------
### ${nc}Incompatible Selection detected ${red}###
-----------------------------------------"
sleep 0.2
YELLOW "
### Basic Arch Linux / Custom Arch Linux detected or No Desktop selected yet
### No Browser selected
"
web_pkg=""
web_aur=""
web_name=""
web_slct=""
skip
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
fi
if [[ "${web}" =~ ^(1|2|3|4|5|6|7|8)$ ]]; then
local prompt="${web_name}"
web_slct="yes"
ok
fi
}
###################################################################################################
print_scan() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Printer & Scanner Support${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
local prompt="Printer & Scanner Support"
if [[ "${hypervisor}" == "none" ]]; then
if [[ ! "${desktop}" =~ ^(11|12)$ && -n "${desktop}" ]]; then
sleep 0.2
YELLOW "
### Printer & Scanner support is available
> Enable Printer & Scanner support ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " printer
printer="${printer:-y}"
printer="${printer,,}"
case "${printer}" in
y)
if [[ "${desktop}" == "2" ]]; then
print_pkgs="bluez-cups cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan print-manager skanlite system-config-printer xdg-utils colord"
elif [[ "${desktop}" == "4" ]]; then
print_pkgs="bluez-cups cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan simple-scan system-config-printer xdg-utils colord"
else
print_pkgs="bluez-cups cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan system-config-printer xdg-utils colord"
fi
ok ;;
n)
print_pkgs=""
skip ;;
*)
invalid
return 1 ;;
esac
else
sleep 0.2
RED "
-----------------------------------------
### ${nc}Incompatible Selection detected ${red}###
-----------------------------------------"
sleep 0.2
YELLOW "
### Basic Arch Linux / Custom Arch Linux detected or No Desktop selected yet
### Printer/Scanner support not enabled
"
print_pkgs=""
skip
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
fi
else
echo
vm
print_pkgs=""
skip
fi
}
###################################################################################################
boot_entr() {
if [[ "${hypervisor}" != "none" ]]; then
efi_entr_del="yes"
vm
sleep 0.2
YELLOW "
--> EFI Boot Entries Deletion skipped
"
return 0
fi
local prompt="Boot Entries"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}EFI Boot Entries Deletion${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
YELLOW "
> Select an EFI Boot Entry to Delete ${red}[!] (CAUTION) [!]
"
sleep 0.2
efibootmgr --unicode
entrnmbr="$(efibootmgr --unicode | grep -E 'BootOrder' | awk "{print \$2}")"
boot_entry=" "
while [[ -n "${boot_entry}" ]]; do
BLUE "
Enter a Boot Entry number for Deletion ${bwhite}(empty to skip)${blue}:
${cyan}Entries: ${yellowl}${entrnmbr} "
read -r -p "
==> " boot_entry
if [[ -n "${boot_entry}" ]]; then
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until sys_submn; do : ; done
fi
if efibootmgr -b "${boot_entry}" -B --unicode; then
sleep 0.2
NC "
==> [${green}Entry ${boot_entry} Deleted${nc}] "
else
err_try
return 1
fi
else
skip
ok
fi
done
efi_entr_del="yes"
}
###################################################################################################
optm_submn() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Optimizations${nc} ${magenta}]${nc}--------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
> Make a selection: "
NC "
[1] Custom Kernel Parameters
[2] System Watchdogs
[3] General System Optimizations
[4] Wireless Regulatory Domain
[5] Systemd-oomd
[6] Irqbalance
[7] Thermald
[8] Rng-tools
[9] Rtkit
[10] Tlp
[ ] Return to System Configuration "
BLUE "
Enter a number: "
read -r -p "
==> " set_optm
case "${set_optm}" in
1)
until cust_kern_param; do : ; done
return 1 ;;
2)
until sys_watchdog; do : ; done
return 1 ;;
3)
until gen_optm; do : ; done
return 1 ;;
4)
until ask_wireless_regdom; do : ; done
return 1 ;;
5)
until systemd_oomd; do : ; done
return 1 ;;
6)
until irqbalance; do : ; done
return 1 ;;
7)
until thermald; do : ; done
return 1 ;;
8)
until rngd; do : ; done
return 1 ;;
9)
until rtkit; do : ; done
return 1 ;;
10)
until tlp; do : ; done
return 1 ;;
"")
set_optm_slct="yes"
until sys_submn; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
ask_optm() {
local prompt="Optimizations"
sleep 0.2
YELLOW "
> Display available Optimizations ? [y/N]"
BLUE "
Enter [y/N]: "
read -r -p "
==> " askoptm
askoptm="${askoptm:-n}"
askoptm="${askoptm,,}"
if [[ "${askoptm}" == "n" ]]; then
skip
elif [[ "${askoptm}" == "y" ]]; then
return 0
else
invalid
return 1
fi
ok
}
###################################################################################################
cust_kern_param() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Custom Kernel Parameters${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### Custom Kernel Parameters can be set at boot time
> Enter your own additional Kernel Parameters to be added to the Kernel Cmdline ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " ask_param
ask_param="${ask_param:-n}"
ask_param="${ask_param,,}"
case "${ask_param}" in
y)
until add_prmtrs; do : ; done ;;
n)
skip ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
add_prmtrs() {
local prompt="Kernel Parameters"
YELLOW "
### Add Your Kernel Parameters
### Empty to skip "
BLUE "
Enter your own Kernel parameters to be set at boot ${bwhite}(space-seperated)${blue}: "
read -r -p "
==> " cust_bootopts
if [[ -z "${cust_bootopts}" ]]; then
skip
else
ok
fi
}
###################################################################################################
sys_watchdog() {
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}System Watchdogs${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### A watchdog is a hardware or software component that keeps track of a system's performance
### and intervenes if it notices any strange behaviour or malfunctions
### [Applicable for non mission-critical platforms such as desktops & laptops]
> Disable Watchdogs in the installed system ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " kill_watchdog
kill_watchdog="${kill_watchdog:-n}"
kill_watchdog="${kill_watchdog,,}"
case "${kill_watchdog}" in
y)
local prompt="Watchdogs Disabled"
ok ;;
n)
skip ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
gen_optm() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}General Optimizations${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### General System Optimizations are available
### Type ${nc}'v' ${yellow}to view a summary
> Enable System Optimizations ? [v/y/N] "
BLUE "
Enter [v/y/N]: "
read -r -p "
==> " genoptm
genoptm="${genoptm:-n}"
genoptm="${genoptm,,}"
case "${genoptm}" in
y)
local prompt="System Optimizations"
ok ;;
n)
skip ;;
v)
view_optm
return 1 ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
ask_wireless_regdom() {
if [[ "${hypervisor}" != "none" ]]; then
vm
sleep 0.2
YELLOW "
--> Wireless Regulatory Domain Setup skipped
"
return 0
fi
local prompt="Wireless Regdom Setup"
sleep 0.2
NC "
${magenta}###${nc}----------------------------${magenta}[ ${bwhite}Wireless Regulatory Domain Setup${nc} ${magenta}]${nc}----------------------------${magenta}###
"
YELLOW "
### The regulatory domain is used to reconfigure wireless drivers, to make sure that wireless
### hardware usage complies with local laws set by the FCC, ETSI and other organizations
> Select your Country Code (e.g. US)
### [Enter ${nc}'l'${yellow} to list country codes, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] "
BLUE "
Enter your Country Code, ie:${nc} ${cyan}US ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " REGDOM
REGDOM="${REGDOM^^}"
if [[ -z "${REGDOM}" ]]; then
skip
elif [[ "${REGDOM}" == "L" ]]; then
sed 's|^#WIRELESS_REGDOM=||g' /etc/conf.d/wireless-regdom | sed 's|"||g'| less
return 1
elif ! grep \""${REGDOM}"\" /etc/conf.d/wireless-regdom > "${void}" 2>&1 ; then
invalid
return 1
else
wireless_reg="wireless-regdb"
sleep 0.2
YELLOW "
### ${REGDOM} Country Code has been selected
"
fi
ok
}
###################################################################################################
systemd_oomd() {
local prompt="Systemd-oomd Setup"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Systemd-oomd Setup${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### A system service that uses cgroups-v2 and pressure stall information (PSI)
### to monitor system and take corrective action before an 'OOM' occurs in the kernel space
> Enable 'systemd-oomd' ? [y/N] "
CYAN "
>> ${nc}Swapping enabled is ${yellowl}highly recommended ${nc}for optimal performance "
BLUE "
Enter [y/N]: "
read -r -p "
==> " oomd
echo
oomd="${oomd:-n}"
oomd="${oomd,,}"
if [[ "${oomd}" == "y" ]]; then
YELLOW "
### 'Systemd-oomd' service will be enabled
"
elif [[ "${oomd}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
irqbalance() {
local prompt="Irqbalance Setup"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Irqbalance Setup${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### Distributes hardware interrupts across processors on a multiprocessor system
### in order to increase performance
> Install & enable 'irqbalance' ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " irqbalance
echo
irqbalance="${irqbalance:-n}"
irqbalance="${irqbalance,,}"
if [[ "${irqbalance}" == "y" ]]; then
YELLOW "
### 'irqbalance' service will be enabled
"
elif [[ "${irqbalance}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
thermald() {
local prompt="Thermald Setup"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Thermald Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### A Linux daemon used to prevent the overheating of platforms
### This daemon monitors temperature and applies compensation using available cooling methods
> Install & enable 'thermald' ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " thermald
echo
thermald="${thermald:-n}"
thermald="${thermald,,}"
if [[ "${thermald}" == "y" ]]; then
YELLOW "
### 'thermald' service will be enabled
"
elif [[ "${thermald}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
rngd() {
local prompt="Rng-tools Setup"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Rng-tools Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### The rngd daemon is capable of using both environmental noise
### and hardware random number generators for extracting entropy
> Install & enable 'rngd' ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " rngd
echo
rngd="${rngd:-n}"
rngd="${rngd,,}"
if [[ "${rngd}" == "y" ]]; then
YELLOW "
### 'rngd' service will be enabled
"
elif [[ "${rngd}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
rtkit() {
local prompt="Rtkit Setup"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}Rtkit Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### RealtimeKit is a D-Bus system service that changes the scheduling policy
### of user processes/threads to SCHED_RR, [Realtime Scheduling Mode on request]
> Install & enable 'rtkit' ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " rtkit
echo
rtkit="${rtkit:-n}"
rtkit="${rtkit,,}"
if [[ "${rtkit}" == "y" ]]; then
YELLOW "
### 'rtkit' service will be enabled
"
elif [[ "${rtkit}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
tlp() {
local prompt="Tlp Setup"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Tlp Setup${nc} ${magenta}]${nc}----------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
### Tlp is a laptop battery power saving utility for Linux
### working out-of-the-box & easy to further configure
> Install & enable 'tlp' ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " tlp
echo
tlp="${tlp:-n}"
tlp="${tlp,,}"
if [[ "${tlp}" == "y" ]]; then
YELLOW "
### 'tlp' service will be enabled
"
elif [[ "${tlp}" == "n" ]]; then
skip
else
invalid
return 1
fi
ok
}
###################################################################################################
dsks_submn() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Disk Management${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select a Submenu: "
NC "
[1] GPT Manager
[2] Partition Manager
[ ] Return to Main Menu "
BLUE "
Enter a number: "
read -r -p "
==> " diskmenu
echo
case "${diskmenu}" in
1)
until gpt_mngr; do : ; done ;;
2)
until part_mngr; do : ; done ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
gpt_mngr() {
local prompt="GPT Manager"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}GPT Manager${nc} ${magenta}]${nc}---------------------------------------${magenta}###
"
gpt_dsk_nmbr=" "
while [[ -n "${gpt_dsk_nmbr}" ]]; do
if [[ -z "${instl_drive}" ]]; then
YELLOW "
> Select a disk to manage its GPT: "
NC "
${disks}"
BLUE "
Enter a disk number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " gpt_dsk_nmbr
echo
if [[ -n "${gpt_dsk_nmbr}" ]]; then
gptdrive="$(echo "${disks}" | awk "\$1 == ${gpt_dsk_nmbr} {print \$2}")"
else
skip
ok
if [[ "${install}" == "yes" ]]; then
until instl_dsk; do : ; done
return 0
else
until dsks_submn; do : ; done
return 0
fi
fi
fi
if [[ -n "${instl_drive}" ]]; then
gptdrive="${instl_drive}"
fi
if [[ -e "${gptdrive}" ]]; then
parttable="$(fdisk -l "${gptdrive}" 2> "${void}" | grep '^Disklabel type' | awk "{print \$3}")"
if [[ "${parttable}" == "gpt" ]]; then
sleep 0.2
NC "
---------------------
### ${green}Disk GPT OK ${nc}###
---------------------"
elif [[ "${parttable}" != "gpt" && -z "${install}" ]]; then
sleep 0.2
RED "
------------------------------------------
### ${nc}No GPT detected on selected disk ${red}###
------------------------------------------"
fi
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
fi
YELLOW "
> Make a Selection: "
NC "
[1] Create new GPT on selected disk [Destroy any existing GPT/MBR structures]
[2] Use the 'gdisk' program interactively [Expert Mode]
[ ] Return to Previous Menu "
BLUE "
Enter a number: "
read -r -p "
==> " gptslct
echo
if [[ "${gptslct}" == "1" ]]; then
sgdisk -Z "${gptdrive}" > "${void}" &&
sgdisk -o "${gptdrive}" > "${void}" &&
parttable="$(fdisk -l "${gptdrive}" 2> "${void}" | grep '^Disklabel type' | awk "{print \$3}")"
if [[ "${parttable}" == "gpt" ]]; then
gptok="yes"
sleep 0.2
NC "
==> [${green}GPT OK${nc}] "
if [[ "${install}" == "yes" ]]; then
until instl_dsk; do : ; done
return 0
else
until dsks_submn; do : ; done
return 0
fi
else
gptok="no"
sleep 0.2
RED "
------------------------------------------
### ${nc}No GPT detected on selected disk ${red}###
------------------------------------------"
reload
return 1
fi
elif [[ "${gptslct}" == "2" ]]; then
YELLOW "
### Type ${nc}'?'${yellow} for help, ${nc}'x'${yellow} for extra functionality or ${nc}'q'${yellow} to quit "
NC "
______________________________________________
"
gdisk "${gptdrive}"
parttable="$(fdisk -l "${gptdrive}" 2> "${void}" | grep '^Disklabel type' | awk "{print \$3}")"
if [[ "${parttable}" == "gpt" ]]; then
gptok="yes"
sleep 0.2
NC "
==> [${green}GPT OK${nc}] "
if [[ "${install}" == "yes" ]]; then
until instl_dsk; do : ; done
return 0
else
until dsks_submn; do : ; done
return 0
fi
else
gptok="no"
sleep 0.2
RED "
------------------------------------------
### ${nc}No GPT detected on selected disk ${red}###
------------------------------------------"
reload
return 1
fi
elif [[ -z "${gptslct}" ]]; then
if [[ -n "${instl_drive}" ]]; then
gptabort="yes"
skip
ok
line2
until instl_dsk; do : ; done
return 0
elif [[ -z "${instl_drive}" ]]; then
reload
return 1
fi
else
invalid
return 1
fi
else
invalid
return 1
fi
done
}
###################################################################################################
ask_multibooting() {
local prompt="MultiBoot Status"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}MultiBoot Status${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
> Are you Dual/Multi-Booting with other OS's ? [y/n]
### If ${nc}'(y)es'${yellow} then: "
CYAN "
>> ${nc}Your ${yellowl}EFI ${nc}System Partition (ESP) will stay ${yellowl}intact${nc}${cyan}
>> ${nc}Only ${yellowl}Manual ${nc}Disk Partitioning will be available for ${yellowl}Disk Management
"
BLUE "
Enter [y/n]: "
read -r -p "
==> " multibooting
multibooting="${multibooting,,}"
case "${multibooting}" in
y)
sleep 0.2
YELLOW "
### Dual/Multi-Boot selected
" ;;
n) sleep 0.2
YELLOW "
### No Dual/Multi-Boot
" ;;
"")
y_n
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
part_mngr() {
if [[ "${multibooting}" == "y" ]]; then
until manual_part; do : ; done
return 0
fi
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Partition Manager${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
YELLOW "
> Select a Mode: "
NC "
[1] Automatic Partitioning
[2] Manual Partitioning "
BLUE "
Enter a number: "
read -r -p "
==> " part_mode
case "${part_mode}" in
1)
until auto_part; do : ; done ;;
2)
until manual_part; do : ; done ;;
"")
sleep 0.2
RED "
------------------------------
### ${nc}Please select a Mode ${red}###
------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
auto_part() {
sleep 0.2
NC "
${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}Automatic Partitioning${nc} ${magenta}]${nc}---------------------------------${magenta}###
"
if [[ -e "${instl_drive}" ]]; then
sleep 0.2
line2
REDBG " ------------------------------------------------------------ "
REDBG " [!] WARNING: All data on selected disk will be destroyed [!] "
REDBG " ------------------------------------------------------------ "
line2
sgdsk_nmbr="${instl_dsk_nmbr}"
sgdrive="$(echo "${disks}" | awk "\$1 == ${sgdsk_nmbr} {print \$2}")"
capacity="$(fdisk -l "${sgdrive}" | grep -E 'bytes' | grep -E 'Disk' | awk "{print \$5}")"
cap_gib="$((capacity/1024000000))"
rootsize="$((capacity*25/100/1024000000))"
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until main_menu; do : ; done
return 0
fi
sleep 0.2
NC "
------------------------------------------------------------
${cyan}>>> ${nc}Apply ${yellowl}'Smart Partitioning' ${nc}on disk ${bwhite}'${instl_drive}'${nc} ? ${cyan}[Y/n]${nc}
------------------------------------------------------------
"
read -r -p "
==> " smartpart
echo
smartpart="${smartpart:-y}"
smartpart="${smartpart,,}"
if [[ "${smartpart}" == "y" ]]; then
until smart_presets; do : ; done
until set_partsize; do : ; done
until partitioner; do : ; done
return 0
elif [[ "${smartpart}" == "n" ]]; then
alternatives
until manual_presets; do : ; done
until set_partsize; do : ; done
until partitioner; do : ; done
return 0
else
y_n
return 1
fi
else
YELLOW "
> Select a disk for Auto-Partitioning: "
NC "
${disks}"
BLUE "
Enter a disk number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " sgdsk_nmbr
echo
if [[ -n "${sgdsk_nmbr}" ]]; then
sgdrive="$(echo "${disks}" | awk "\$1 == ${sgdsk_nmbr} {print \$2}")"
if [[ -e "${sgdrive}" ]]; then
capacity="$(fdisk -l "${sgdrive}" | grep -E 'bytes' | grep -E 'Disk' | awk "{print \$5}")"
cap_gib="$((capacity/1024000000))"
rootsize="$((capacity*25/100/1024000000))"
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
return 0
fi
until manual_presets; do : ; done
until set_partsize; do : ; done
until partitioner; do : ; done
else
invalid
return 1
fi
else
skip
local prompt="Partition Manager"
ok
fi
fi
if [[ -z "${sanity}" ]]; then
until dsks_submn; do : ; done
return 0
fi
}
###################################################################################################
smart_presets() {
if [[ "${fs}" == "1" ]] ; then
if [[ "${sep_home}" == "y" && "${swapmode}" == "1" ]]; then
preset="4"
elif [[ "${sep_home}" == "y" && "${swapmode}" != "1" ]]; then
preset="3"
elif [[ "${sep_home}" == "n" && "${swapmode}" == "1" ]]; then
preset="2"
elif [[ "${sep_home}" == "n" && "${swapmode}" != "1" ]]; then
preset="1"
fi
elif [[ "${fs}" == "2" ]]; then
if [[ "${swapmode}" == "1" ]]; then
preset="2"
elif [[ "${swapmode}" != "1" ]]; then
preset="1"
fi
fi
}
###################################################################################################
manual_presets() {
preset=""
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Preset Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
sleep 0.2
line2
REDBG " ------------------------------------------------------------ "
REDBG " [!] WARNING: All data on selected disk will be destroyed [!] "
REDBG " ------------------------------------------------------------ "
line2
YELLOW "
> Select a Partition Layout Preset: "
NC "
${cyan}* Ext4${nc} compatible Layout
${magenta}* Btrfs${nc} compatible Layout
[1] Create '/ESP' & '/Root' (${cyan}Ext4${nc},${magenta}Btrfs${nc})
[2] Create '/ESP', '/Root' & '/Swap' (${cyan}Ext4${nc},${magenta}Btrfs${nc})
[3] Create '/ESP', '/Root' & '/Home' (${cyan}Ext4${nc})
[4] Create '/ESP', '/Root', '/Home' & '/Swap' (${cyan}Ext4${nc}) "
BLUE "
Enter a Preset number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " preset
echo
if [[ "${preset}" =~ ^(1|2|3|4)$ ]]; then
presetpart="y"
return 0
elif [[ -z "${preset}" && "${partok}" == "n" ]]; then
alternatives
manual_part
return 0
elif [[ -z "${preset}" ]]; then
skip
return 0
else
invalid
return 1
fi
}
###################################################################################################
set_partsize() {
if [[ "${partok}" == "y" ]]; then
return 0
fi
if [[ "${preset}" =~ ^(3|4)$ ]]; then
sleep 0.2
YELLOW "
### Total detected capacity of disk ${nc}${sgdrive} ${yellow}is ${nc}${cap_gib} GiB${yellow}
### ${nc}Default ${yellow}Root partition's size is aprox. ${nc}25%${yellow} of total disk capacity
### ${nc}Current ${yellow}Root partition's size is ${nc}[${rootsize} GiB]${yellow}
> Adjust Root Partition's size (by setting a custom ${nc}% ${yellow}value) ? "
BLUE "
Enter ${nc}% ${blue}value ${nc}eg. 40 ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " prcnt
echo
if [[ "${prcnt}" =~ [[:alpha:]] ]]; then
sleep 0.2
RED "
-------------------------------------------
### ${nc}Please use only digits as a value ${red}###
-------------------------------------------"
reload
return 1
elif [[ -z "${prcnt}" ]]; then
sleep 0.2
YELLOW "
### Default Root Partition's size selected ${nc}[${rootsize} GiB]
"
elif [[ "${prcnt}" -gt "0" && "${prcnt}" -lt "100" ]]; then
rootsize="$((capacity*"${prcnt}"/100/1024000000))"
sleep 0.2
YELLOW "
### Custom Root Partition's size selected ${nc}[${rootsize} GiB]
"
elif [[ "${prcnt}" == "100" ]]; then
sleep 0.2
RED "
-----------------------------------------------------
### ${yellow}WARNING: ${nc}No space left for other partitions ${red}###
-----------------------------------------------------"
reload
return 1
else
invalid
return 1
fi
fi
}
###################################################################################################
partitioner() {
if [[ "${partok}" == "y" ]]; then
return 0
elif [[ -z "${preset}" && "${install}" == "yes" ]]; then
until sanity_check; do : ; done
return 0
elif [[ -z "${preset}" ]]; then
local prompt="Partition Manager"
ok
return 0
fi
if [[ "${smartpart}" == "y" ]]; then
local prompt="Disk ${sgdrive} Smart-Partitioned"
elif [[ "${presetpart}" == "y" ]]; then
local prompt="Disk ${sgdrive} Preset-Partitioned"
fi
wipefs -af "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
if [[ "${gptok}" != "yes" ]]; then
sgdisk -Z "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -o "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
gptok="yes"
fi
if [[ "${preset}" == "1" ]]; then
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n2:0:0 -t2:8304 -c2:ROOT "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
partprobe -s "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
elif [[ "${preset}" == "2" ]]; then
until set_swapsize; do : ; done
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n3:0:0 -t3:8304 -c3:ROOT "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
partprobe -s "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
elif [[ "${preset}" == "3" ]]; then
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n2:0:+"${rootsize}"G -t2:8304 -c2:ROOT "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n3:0:0 -t3:8302 -c3:HOME "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
partprobe -s "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
elif [[ "${preset}" == "4" ]]; then
until set_swapsize; do : ; done
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n3:0:+"${rootsize}"G -t3:8304 -c3:ROOT "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
sgdisk -I -n4:0:0 -t4:8302 -c4:HOME "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
partprobe -s "${sgdrive}" > "${void}" 2> "${log}" || stage_fail
fi
if [[ "${install}" == "yes" ]]; then
until sanity_check; do : ; done
else
ok
fi
}
###################################################################################################
manual_part() {
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Manual Partitioning${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
cgdsk_nmbr=" "
while [[ -n "${cgdsk_nmbr}" ]]; do
line2
NC " Supported Partition Types & Mountpoints: "
line3
RED " Linux Root x86-64 Partition ${nc} [ GUID Code: 8304 ] ${red}Mountpoint: ${nc}/ "
echo
BLUE " EFI System Partition ${nc} [ GUID Code: ef00 ] ${blue}Mountpoint: ${nc}/efi or /boot "
echo
GREEN " Linux Home Partition ${nc} [ GUID Code: 8302 ] ${green}Mountpoint: ${nc}/home "
echo
YELLOW " Linux Swap Partition ${nc} [ GUID Code: 8200 ] ${yellow}Mountpoint: ${nc}/swap "
echo
MAGENTA " Linux Extended Boot Partition ${nc} [ GUID Code: ea00 ] ${magenta}Mountpoint: ${nc}/boot "
YELLOW "
> Select a disk to Manage: "
NC "
${disks}"
BLUE "
Enter a disk number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " cgdsk_nmbr
if [[ -n "${cgdsk_nmbr}" ]]; then
cgdrive="$(echo "${disks}" | awk "\$1 == ${cgdsk_nmbr} {print \$2}")"
if [[ -e "${cgdrive}" ]]; then
local prompt="Disk ${cgdrive}"
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
fi
cgdisk "${cgdrive}"
clear
ok
partprobe -s "${cgdrive}" > "${void}"
else
invalid
return 1
fi
else
skip
local prompt="Partition Manager"
ok
if [[ -z "${sanity}" ]]; then
until dsks_submn; do : ; done
return 0
elif [[ "${sanity}" == "no" || "${partok}" == "n" ]]; then
until sanity_check; do : ; done
return 0
fi
fi
done
}
###################################################################################################
instl_dsk() {
if [[ ! -e "${instl_drive}" ]]; then
sleep 0.2
NC "
${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Installation Disk Selection${nc} ${magenta}]${nc}-------------------------------${magenta}###
"
YELLOW "
> Select a disk to Install to: "
NC "
${disks}"
BLUE "
Enter a disk number: "
read -r -p "
==> " instl_dsk_nmbr
echo
fi
if [[ -n "${instl_dsk_nmbr}" ]]; then
instl_drive="$(echo "${disks}" | awk "\$1 == ${instl_dsk_nmbr} {print \$2}")"
if [[ -e "${instl_drive}" ]]; then
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${nc}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until main_menu; do : ; done
return 0
fi
volumes="$(fdisk -l | grep '^/dev' | cat --number)"
rota="$(lsblk "${instl_drive}" --nodeps --noheadings --output=rota | awk "{print \$1}")"
if [[ "${rota}" == "0" ]]; then
sbvl_mnt_opts="rw,noatime,compress=zstd:1"
trim="fstrim.timer"
else
sbvl_mnt_opts="rw,compress=zstd"
fi
parttable="$(fdisk -l "${instl_drive}" | grep '^Disklabel type' | awk "{print \$3}")"
if [[ "${parttable}" != "gpt" && -n "${gptabort}" ]]; then
sleep 0.2
RED "
---------------------------------------
### ${nc}Please create GPT to continue ${red}###
---------------------------------------"
reload
until gpt_mngr; do : ; done
return 0
elif [[ "${parttable}" != "gpt" ]]; then
sleep 0.2
RED "
------------------------------------------
### ${nc}No GPT detected on selected disk ${red}###
------------------------------------------"
reload
until gpt_mngr; do : ; done
return 0
fi
if [[ -z "${multibooting}" ]]; then
until ask_multibooting; do : ; done
fi
until sanity_check; do : ; done
return 0
else
invalid
return 1
fi
else
sleep 0.2
RED "
-----------------------------------------
### ${nc}Please select ${yellow}Installation ${nc}Disk ${red}###
-----------------------------------------"
reload
return 1
fi
}
###################################################################################################
sanity_check() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Sanity Check${nc} ${magenta}]${nc}--------------------------------------${magenta}###
"
rootcount="$(fdisk -l "${instl_drive}" | grep -E -c 'root' | awk "{print \$1}")"
root_dev="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}")"
multi_root="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}" | cat --number)"
root_comply="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")"
espcount="$(fdisk -l "${instl_drive}" | grep -E -c 'EFI' | awk "{print \$1}")"
esp_dev="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}")"
multi_esp="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}" | cat --number)"
esp_comply="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")"
xbootcount="$(fdisk -l "${instl_drive}" | grep -E -c 'extended' | awk "{print \$1}")"
xboot_dev="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}")"
multi_xboot="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}" | cat --number)"
xboot_comply="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")"
homecount="$(fdisk -l "${instl_drive}" | grep -E -c 'home' | awk "{print \$1}")"
home_dev="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}")"
multi_home="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}" | cat --number)"
home_comply="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")"
swapcount="$(fdisk -l "${instl_drive}" | grep -E -c 'swap' | awk "{print \$1}")"
swap_dev="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}")"
multi_swap="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}" | cat --number)"
swap_comply="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")"
if [[ "${rootcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
CYAN "
>> ${nc}Multiple ${greenl}Linux x86-64 /Root ${nc}Partitions have been detected
"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
NC "
${greenl}Linux x86-64 /Root Partitions:${nc}
------------------------------
${multi_root}
------------------------------
"
YELLOW "
### Only the 1st Linux x86-64 /Root partition on a selected disk can be auto-assigned as a valid /Root partition
### Partition ${nc}${root_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!]
"
BLUE "
> Proceed ? [Y/n]"
read -r -p "
==> " autoroot
autoroot="${autoroot:-y}"
autoroot="${autoroot,,}"
if [[ "${autoroot}" == "y" ]]; then
root_dev="${root_comply}"
multiroot_bootopts="root=PARTUUID=$(blkid -s PARTUUID -o value "${root_dev}")"
elif [[ "${autoroot}" == "n" ]]; then
until auto_part; do : ; done
return 0
else
y_n
return 1
fi
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------
if [[ "${espcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
CYAN "
>> ${nc}Multiple ${cyanl}EFI System ${nc}Partitions have been detected
"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
NC "
${cyanl}Linux EFI System Partitions:${nc}
----------------------------
${multi_esp}
----------------------------
"
YELLOW "
### Only the 1st EFI partition on a selected disk can be auto-assigned as a valid EFI partition
"
if [[ "${multibooting}" == "n" ]]; then
YELLOW "
### Partition ${nc}${esp_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!]
"
elif [[ "${multibooting}" == "y" ]]; then
YELLOW "
### Partition ${nc}${esp_comply} ${yellow}is auto-assigned as such
"
fi
BLUE "
> Proceed ? [Y/n]"
read -r -p "
==> " autoesp
autoesp="${autoesp:-y}"
autoesp="${autoesp,,}"
if [[ "${autoesp}" == "y" ]]; then
esp_dev="${esp_comply}"
elif [[ "${autoesp}" == "n" ]]; then
until auto_part; do : ; done
return 0
else
y_n
return 1
fi
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------
if [[ "${xbootcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
CYAN "
>> ${nc}Multiple ${redl}Linux Extended Boot ${nc}Partitions have been detected
"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
NC "
${redl}Linux Extended Boot Partitions:${nc}
----------------------------
${multi_xboot}
----------------------------
"
YELLOW "
### Only the 1st Linux Extended Boot partition on a selected disk can be auto-assigned as a valid XBOOTLDR partition
### Partition ${nc}${xboot_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!]
"
BLUE "
> Proceed ? [Y/n]"
read -r -p "
==> " autoxboot
autoxboot="${autoxboot:-y}"
autoxboot="${autoxboot,,}"
if [[ "${autoxboot}" == "y" ]]; then
xboot_dev="${xboot_comply}"
elif [[ "${autoxboot}" == "n" ]]; then
until auto_part; do : ; done
return 0
else
y_n
return 1
fi
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" && "${sep_home}" == "y" && "${homecount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
CYAN "
>> ${nc}Multiple ${magental}Linux /Home ${nc}Partitions have been detected
"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
NC "
${magental}Linux /Home Partitions:${nc}
-----------------------
${multi_home}
-----------------------
"
YELLOW "
### Only the 1st Linux /Home partition on a selected disk can be auto-assigned as a valid /Home partition
### Partition ${nc}${home_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!]
"
BLUE "
> Proceed ? [Y/n]"
read -r -p "
==> " autohome
autohome="${autohome:-y}"
autohome="${autohome,,}"
if [[ "${autohome}" == "y" ]]; then
home_dev="${home_comply}"
elif [[ "${autohome}" == "n" ]]; then
until auto_part; do : ; done
return 0
else
y_n
return 1
fi
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------
if [[ "${swapmode}" == "1" && "${swapcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
CYAN "
>> ${nc}Multiple ${yellowl}Linux /Swap ${nc}Partitions have been detected
"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
NC "
${yellowl}Linux /Swap Partitions:${nc}
------------------------
${multi_swap}
------------------------
"
YELLOW "
### Only the 1st Linux /Swap partition on a selected disk can be auto-assigned as a valid /Swap partition
### Partition ${nc}${swap_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!]
"
BLUE "
> Proceed ? [Y/n]"
read -r -p "
==> " autoswap
autoswap="${autoswap:-y}"
autoswap="${autoswap,,}"
if [[ "${autoswap}" == "y" ]]; then
swap_dev="${swap_comply}"
elif [[ "${autoswap}" == "n" ]]; then
until auto_part; do : ; done
return 0
else
y_n
return 1
fi
fi
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------
if [[ -e "${root_dev}" ]]; then
rootpartsize="$(lsblk -dno SIZE --bytes "${root_dev}")"
if [[ "${rootpartsize}" -ge "8589934592" ]]; then
rootprt="ok"
else
rootprt="ok"
sleep 0.2
RED "
-----------------------------------------------------
### ${yellow}WARNING: ${nc}/Root's size might not be adequate ${red}###
-----------------------------------------------------"
sleep 0.2
RED "
------------------------------------------------------------------------
### ${nc}Depending on the size of your setup, installation might fail ! ${red}###
------------------------------------------------------------------------"
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
fi
if [[ "${autoroot}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [Linux x86-64 /Root ${green}OK${nc}] "
else
local prompt="Confirmed /Root Partition"
ok
fi
else
sleep 0.2
NC "
==> [Linux x86-64 /Root ${green}OK${nc}] "
fi
else
rootprt="fail"
sleep 0.2
RED "
---------------------------------------------------
### ${yellow}Linux x86-64 /Root ${nc}Partition not detected ${red}###
---------------------------------------------------"
fi
#..................................................................................................
if [[ ! -e "${esp_dev}" ]]; then
espprt="fail"
sleep 0.2
RED "
-------------------------------------------
### ${yellow}EFI System ${nc}Partition not detected ${red}###
-------------------------------------------"
fi
if [[ -e "${esp_dev}" ]]; then
espsize="$(lsblk -dno SIZE --bytes "${esp_dev}")"
fi
if [[ "${espsize}" -ge "209715200" ]]; then
espprt="ok"
xbootloader="no"
if [[ "${autoesp}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
else
local prompt="Confirmed /EFI System Partition"
ok
fi
else
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
fi
fi
if [[ -e "${esp_dev}" && "${espsize}" -lt "209715200" ]]; then
if [[ "${bootloader}" == "1" ]]; then
if [[ "${multibooting}" == "y" ]]; then
xbootloader="yes"
if [[ -e "${xboot_dev}" ]]; then
xbootprt="ok"
espprt="ok"
if [[ "${autoesp}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
else
local prompt="Confirmed /EFI System Partition"
ok
fi
else
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
fi
if [[ "${autoxboot}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [Linux Extended Boot Partition ${green}OK${nc}] "
else
local prompt="Confirmed /XBOOTLDR Partition"
ok
fi
else
sleep 0.2
NC "
==> [Linux Extended Boot Partition ${green}OK${nc}] "
fi
else
xbootprt="fail"
espprt="fail"
sleep 0.2
RED "
---------------------------------------------
### ${yellow}WARNING: ${nc}ESP's size is not adequate ${red}###
---------------------------------------------"
sleep 0.2
RED "
----------------------------------------------------
### ${yellow}Linux Extended Boot ${nc}Partition not detected ${red}###
----------------------------------------------------"
fi
elif [[ "${multibooting}" == "n" ]]; then
espprt="fail"
xbootloader="no"
sleep 0.2
RED "
---------------------------------------------
### ${yellow}WARNING: ${nc}ESP's size is not adequate ${red}###
---------------------------------------------"
fi
elif [[ "${bootloader}" == "2" ]]; then
if [[ "${espmnt}" == "2" ]]; then
espprt="fail"
xbootloader="no"
sleep 0.2
RED "
---------------------------------------------
### ${yellow}WARNING: ${nc}ESP's size is not adequate ${red}###
---------------------------------------------"
elif [[ "${espmnt}" == "1" ]]; then
espprt="ok"
xbootloader="no"
if [[ "${autoesp}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
else
local prompt="Confirmed /EFI System Partition"
ok
fi
else
sleep 0.2
NC "
==> [EFI System Partition ${green}OK${nc}] "
fi
fi
fi
fi
#..................................................................................................
if [[ "${fs}" == "1" ]]; then
if [[ "${sep_home}" == "y" ]]; then
if [[ -e "${home_dev}" ]]; then
homeprt="ok"
if [[ "${autohome}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [Linux /Home ${green}OK${nc}] "
else
local prompt="Confirmed /Home Partition"
ok
fi
else
sleep 0.2
NC "
==> [Linux /Home ${green}OK${nc}] "
fi
else
homeprt="fail"
sleep 0.2
RED "
--------------------------------------------
### ${yellow}Linux /Home ${nc}Partition not detected ${red}###
--------------------------------------------"
fi
fi
fi
#..................................................................................................
if [[ "${swapmode}" == "1" ]]; then
if [[ -e "${swap_dev}" ]]; then
swapprt="ok"
if [[ "${autoswap}" == "y" ]]; then
if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [Linux /Swap ${green}OK${nc}] "
else
local prompt="Confirmed /Swap Partition"
ok
fi
else
sleep 0.2
NC "
==> [Linux /Swap ${green}OK${nc}] "
fi
else
swapprt="fail"
sleep 0.2
RED "
--------------------------------------------
### ${yellow}Linux /Swap ${nc}Partition not detected ${red}###
--------------------------------------------"
fi
fi
#..................................................................................................
if [[ "${rootprt}" == "fail" || "${espprt}" == "fail" || "${xbootprt}" == "fail" || "${homeprt}" == "fail" || "${swapprt}" == "fail" ]]; then
sanity="no"
else
sanity="ok"
fi
#--------------------------------------------------------------------------------------------------
if [[ "${sanity}" == "ok" ]]; then
if [[ "${smartpart}" == "y" ]]; then
sleep 0.2
NC "
==> [${green}Disk ${sgdrive} Smart-Partitioned OK${nc}] "
elif [[ "${presetpart}" == "y" ]]; then
sleep 0.2
NC "
==> [${green}Disk ${sgdrive} Preset-Partitioned OK${nc}] "
fi
sleep 0.2
NC "
-----------------------
### ${green}SANITY CHECK OK${nc} ###
-----------------------"
sleep 0.2
CYAN "
###${nc}------------------------------------------------${cyan}[ ${bwhite}DISK OVERVIEW ${nc}${cyan}]${nc}------------------------------------------------${cyan}###
"
fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}### "
BLUE "
> Proceed using the ${nc}${cyan}current ${blue}partitioning layout ? [Y/n]
"
read -r -p "
==> " partok
echo
partok="${partok:-y}"
partok="${partok,,}"
local prompt="Disk Partitioning"
local stage_prompt="Partitioning"
if [[ "${partok}" == "y" ]]; then
ok
return 0
elif [[ "${partok}" == "n" ]]; then
if [[ "${multibooting}" == "n" ]]; then
reload
until auto_part; do : ; done
return 0
elif [[ "${multibooting}" == "y" ]]; then
reload
until manual_part; do : ; done
return 0
fi
else
y_n
return 1
fi
#--------------------------------------------------------------------------------------------------
elif [[ "${sanity}" == "no" ]]; then
sleep 0.2
NC "
-----------------------------
### ${red}SANITY CHECK FAILED ${nc}###
-----------------------------"
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
if [[ "${multibooting}" == "y" ]]; then
if [[ "${espprt}" == "fail" && -e "${esp_dev}" ]]; then
sleep 0.2
CYAN "
--------------------------------------------------
### ${yellowl}ESP: ${nc}Not all prerequisites are satisfied ${cyan}###
--------------------------------------------------"
if [[ "${espmnt}" == "2" ]]; then
sleep 0.2
CYAN "
>> ${nc}Select ${yellowl}/mnt/efi ${nc}as the mountpoint for your ${yellowl}ESP "
fi
if [[ "${xbootprt}" == "fail" ]]; then
sleep 0.2
CYAN "
>> ${yellowl}Systemd-boot:${nc}${cyan}
>> ${nc}Create a ${yellowl}300M ${nc}(at minimum) Linux Extended Boot Partition ${bwhite}(XBOOTLDR) ${yellowl}[GUID CODE: ea00]
"
fi
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
if [[ "${espmnt}" == "2" ]]; then
until slct_espmnt; do : ; done
fi
if [[ "${xbootprt}" == "fail" ]]; then
until manual_part; do : ; done
fi
elif [[ "${espprt}" == "fail" && ! -e "${esp_dev}" ]]; then
reload
until manual_part; do : ; done
elif [[ "${homeprt}" == "fail" || "${swapprt}" == "fail" ]]; then
reload
until manual_part; do : ; done
fi
elif [[ "${multibooting}" == "n" ]]; then
reload
until auto_part; do : ; done
fi
fi
}
###################################################################################################
ask_crypt() {
local prompt="Encryption Setup"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Encryption Setup${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
BLUE "
> Enable${nc} ${cyan}${roottype} ${blue}Encryption? [LUKS] "
NC "
* Type '${cyan}no${nc}' to proceed without encryption
* Type '${cyan}yes${nc}' to encrypt your ${roottype}
"
read -r -p "
==> " encrypt
echo
if [[ "${encrypt}" == "no" ]]; then
skip
ok
line2
return 0
elif [[ "${encrypt}" == "yes" ]]; then
if [[ "${bootloader}" == "2" && "${espmnt}" == "1" ]]; then
sleep 0.2
RED "
-----------------------------------------
### ${nc}Incompatible Selection detected ${red}###
-----------------------------------------"
YELLOW "
### ESP cannot be mounted on ${nc}'/efi' ${yellow}when using Grub on a LUKS encrypted Root partition
> Change ESP mountpoint to ${nc}'/boot' ${yellow}instead ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " cng_espmnt
echo
cng_espmnt="${cng_espmnt:-y}"
cng_espmnt="${cng_espmnt,,}"
if [[ "${cng_espmnt}" == "y" ]]; then
espmnt="2"
esp_mount="/mnt/boot"
btldr_esp_mount="/boot"
sleep 0.2
YELLOW "
### '/mnt/boot' mountpoint has been selected
"
elif [[ "${cng_espmnt}" == "n" ]]; then
failure
else
y_n
return 1
fi
fi
sleep 0.2
YELLOW "
> Set your LUKS encryption password: "
BLUE "
Enter password: "
read -r -p "
==> " CRYPTPASS
sleep 0.2
YELLOW "
> Verify your LUKS encryption password: "
BLUE "
Re-enter password: "
read -r -p "
==> " CRYPTPASS2
if [[ "${CRYPTPASS}" != "${CRYPTPASS2}" ]]; then
sleep 0.2
RED "
---------------------------------------------------
### ${nc}Passwords don't match. Please try again.. ${red}###
---------------------------------------------------"
reload
return 1
fi
line2
sleep 0.2
YELLOW "
> Enter a name for your Encrypted ${roottype} Partition: "
BLUE "
Enter a name: "
read -r -p "
==> " ENCROOT
echo
ENCROOT="${ENCROOT,,}"
if [[ -z "${ENCROOT}" ]]; then
sleep 0.2
RED "
-----------------------------------------
### ${nc}Please enter a name to continue ${red}###
-----------------------------------------"
reload
return 1
elif [[ -n "${ENCROOT}" ]]; then
sleep 0.2
NC "
==> [${green}Encrypted ${roottype} Label OK${nc}] "
fi
if [[ -e "${home_dev}" ]]; then
if [[ "${sep_home}" == "y" ]]; then
sleep 0.2
YELLOW "
### A /Home Partition has been detected "
sleep 0.2
BLUE "
> Encrypt${nc} ${nc}/Home ${blue}partition? [LUKS] "
NC "
* Type '${cyan}no${nc}' to proceed without encryption
* Type '${cyan}yes${nc}' to encrypt your /Home
"
read -r -p "
==> " homecrypt
echo
if [[ "${homecrypt}" == "no" ]]; then
skip
elif [[ "${homecrypt}" == "yes" ]]; then
sleep 0.2
YELLOW "
> Enter a name for your Encrypted /Home Partition: "
BLUE "
Enter a name: "
read -r -p "
==> " ENCRHOME
ENCRHOME="${ENCRHOME,,}"
echo
if [[ -z "${ENCRHOME}" ]]; then
sleep 0.2
RED "
-----------------------------------------
### ${nc}Please enter a name to continue ${red}###
-----------------------------------------"
reload
return 1
elif [[ -n "${ENCRHOME}" ]]; then
sleep 0.2
NC "
==> [${green}Encrypted /Home Label OK${nc}] "
fi
else
yes_no
return 1
fi
fi
fi
ok
else
yes_no
return 1
fi
}
###################################################################################################
instl() {
install="yes"
if [[ -z "${lcl_slct}" ]]; then
if [[ -e /usr/bin/pv ]]; then
sleep 0.2
CYAN "
>> ${nc}Please complete ${bwhite}'Locale & Keyboard Layout Selection' ${nc}to continue
" | pv -qL 70
else
sleep 0.2
CYAN "
>> ${nc}Please complete ${bwhite}'Locale & Keyboard Layout Selection' ${nc}to continue
"
fi
until slct_locale; do : ; done
until slct_kbd; do : ; done
fi
if [[ -z "${USERNAME}" ]]; then
local stage_prompt="User, Root User, Hostname & Shell Setup"
completion_err
until user_setup; do : ; done
until rootuser_setup; do : ; done
until slct_hostname; do : ; done
until slct_shell; do : ; done
fi
if [[ -z "${kernelnmbr}" ]]; then
local stage_prompt="Kernel, Secureboot Signing, Bootloader & ESP Mountpoint"
completion_err
until slct_krnl; do : ; done
until ask_sign; do : ; done
until slct_bootldr; do : ; done
until slct_espmnt; do : ; done
fi
if [[ -z "${fs}" ]]; then
local stage_prompt="Filesystem & Swap Setup"
completion_err
until slct_fs; do : ; done
until slct_swap; do : ; done
fi
if [[ "${hypervisor}" == "none" && -z "${gfx_slct}" ]]; then
local stage_prompt="Graphics Setup"
completion_err
until dtct_gfx; do : ; done
fi
if [[ -z "${desktop}" ]]; then
local stage_prompt="Desktop Setup"
completion_err
until dsktp_slct; do : ; done
fi
if [[ -z "${dev}" ]]; then
until base_devel; do : ; done
fi
if [[ -z "${web_slct}" ]]; then
if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then
until web_browser; do : ; done
fi
fi
if [[ "${hypervisor}" == "none" ]]; then
if [[ -z "${printer}" ]]; then
if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then
until print_scan; do : ; done
fi
fi
if [[ -z "${efi_entr_del}" ]]; then
local stage_prompt="EFI Boot Entries Deletion"
completion_err
until boot_entr; do : ; done
fi
fi
if [[ -z "${set_optm_slct}" ]]; then
local stage_prompt="Optimizations"
completion_err
until ask_optm; do : ; done
if [[ "${askoptm}" == "y" ]]; then
until cust_kern_param; do : ; done
until sys_watchdog; do : ; done
until gen_optm; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until ask_wireless_regdom; do : ; done
fi
until systemd_oomd; do : ; done
until irqbalance; do : ; done
until thermald; do : ; done
until rngd; do : ; done
until rtkit; do : ; done
until tlp; do : ; done
fi
fi
until instl_dsk; do : ; done
until ask_crypt; do : ; done
if [[ "${swapmode}" == "1" ]]; then
until "${swaptype}"; do : ; done
fi
if [[ "${encrypt}" == "no" ]]; then
until set_mode; do : ; done
until confirm_status; do : ; done
elif [[ "${encrypt}" == "yes" ]]; then
until sec_erase; do : ; done
until luks; do : ; done
until opt_pcmn; do : ; done
until pacstrap_system; do : ; done
if [[ "${swapmode}" == "2" ]]; then
until "${swaptype}"; do : ; done
fi
if [[ -n "${REGDOM}" ]]; then
until set_wireless_regdom; do : ; done
fi
set_vars
chroot_conf
fi
}
###################################################################################################
swappart() {
local stage_prompt="Swap Partition Creation"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Swap Partition Setup${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
if mkswap "${swap_dev}" > "${void}" 2> "${log}" ; then
stage_ok
else
stage_fail
fi
}
###################################################################################################
set_mode() {
if [[ "${rootcount}" -gt "1" || "${espcount}" -gt "1" || "${xbootcount}" -gt "1" || "${homecount}" -gt "1" || "${swapcount}" -gt "1" ]]; then
until auto_mode; do : ; done
sleep 0.2
NC "
==> [${green}Filesystems OK${nc}]
"
sleep 0.2
CYAN "
###${nc}---------------------------------------------${cyan}[ ${bwhite}FILESYSTEM OVERVIEW ${nc}${cyan}]${nc}---------------------------------------------${cyan}###
"
lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}###
"
sleep 0.2
return 0
fi
if [[ "${swapmode}" != "1" ]]; then
line2
fi
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Mode Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select a Mode to continue: "
NC "
[1] Auto (Automatically Format, Label & Mount partitions)
[2] Manual (Manually Format, Label & Mount partitions) "
BLUE "
Enter a Mode number: "
read -r -p "
==> " setmode
echo
case "${setmode}" in
1)
until auto_mode; do : ; done ;;
2)
until manual_mode; do : ; done ;;
"")
RED "
------------------------------------------
### ${nc}Please select a Mode to continue ${red}###
------------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
NC "
==> [${green}Filesystems OK${nc}]
"
sleep 0.2
CYAN "
###${nc}---------------------------------------------${cyan}[ ${bwhite}FILESYSTEM OVERVIEW ${nc}${cyan}]${nc}---------------------------------------------${cyan}###
"
lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}###
"
sleep 0.2
}
###################################################################################################
auto_mode() {
espfs="$(lsblk -dno FSTYPE "${esp_dev}")"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Auto Mode${nc} ${magenta}]${nc}----------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
> Auto Mode Selected
"
if [[ "${fs}" == "1" ]]; then
if mkfs.ext4 -F -L Root "${root_dev}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${root_dev}" > "${void}" 2> "${log}" || err_abort
mount "${root_dev}" /mnt > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/Root OK${nc}]
"
else
umount_manual
until form_root; do : ; done
until mount_mnt; do : ; done
fi
#--------------------------------------------------------------------------------------------------
elif [[ "${fs}" == "2" ]]; then
if mkfs.btrfs -f -L Root "${root_dev}" > "${void}" 2> "${log}" ; then
mount "${root_dev}" /mnt > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@ > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@home > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@cache > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@log > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@tmp > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@snapshots > "${void}" 2> "${log}" || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > "${void}" 2> "${log}" || err_abort
fi
umount /mnt > "${void}" 2> "${log}" || err_abort
mount -o "${sbvl_mnt_opts}",subvol=@ "${root_dev}" /mnt > "${void}" 2> "${log}" || err_abort
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap "${root_dev}" /mnt/swap > "${void}" 2> "${log}" || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${root_dev}" /mnt/var/cache > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${root_dev}" /mnt/home > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${root_dev}" /mnt/var/log > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${root_dev}" /mnt/"${snapname}" > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${root_dev}" /mnt/var/tmp > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/@ OK${nc}]
"
else
umount_manual
until form_root; do : ; done
until mount_mnt; do : ; done
fi
fi
sleep 0.2
#--------------------------------------------------------------------------------------------------
if [[ "${multibooting}" == "n" ]]; then
if mkfs.fat -F 32 -n ESP "${esp_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/ESP OK${nc}]
"
else
umount_manual
until form_esp; do : ; done
until mount_mnt; do : ; done
until mount_esp; do : ; done
fi
elif [[ "${multibooting}" == "y" && "${espfs}" == "vfat" ]]; then
if mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Unformatted /ESP OK${nc}]
"
else
umount_manual
until mount_mnt; do : ; done
until mount_esp; do : ; done
fi
elif [[ "${multibooting}" == "y" && "${espfs}" != "vfat" ]]; then
if mkfs.fat -F 32 -n ESP "${esp_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/ESP OK${nc}]
"
else
umount_manual
until form_esp; do : ; done
until mount_mnt; do : ; done
until mount_esp; do : ; done
fi
fi
sleep 0.2
#--------------------------------------------------------------------------------------------------
if [[ "${xbootloader}" == "yes" ]]; then
if mkfs.fat -F 32 -n XBOOTLDR "${xboot_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${xboot_dev}" /mnt/boot > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/XBOOTLDR OK${nc}]
"
else
umount_manual
until form_xboot; do : ; done
until mount_mnt; do : ; done
until mount_esp; do : ; done
until mount_xboot; do : ; done
fi
fi
sleep 0.2
#--------------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" && -e "${home_dev}" && "${sep_home}" == "y" ]]; then
if [[ "${smartpart}" == "y" ]]; then
homeform="y"
elif [[ "${preset}" =~ ^(3|4)$ ]]; then
homeform="y"
elif [[ -z "${smartpart}" || -z "${preset}" ]]; then
BLUE "
> A ${nc}/Home ${blue}partition has been detected. Format as ${nc}${fsname}${blue} ? [y/N]
"
read -r -p "
==> " homeform
echo
homeform="${homeform:-n}"
homeform="${homeform,,}"
fi
if [[ "${homeform}" == "y" ]]; then
if mkfs.ext4 -F -L Home "${home_dev}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${home_dev}" > "${void}" 2> "${log}" || err_abort
mount --mkdir "${home_dev}" /mnt/home > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/Home OK${nc}]
"
else
umount_manual
until manual_part; do : ; done
until form_home; do : ; done
until mount_mnt; do : ; done
until mount_esp; do : ; done
if [[ "${xbootloader}" == "yes" ]]; then
until mount_xboot; do : ; done
fi
until mount_home; do : ; done
fi
elif [[ "${homeform}" == "n" ]]; then
skip
else
y_n
until ask_homepart_form; do : ; done
fi
fi
}
###################################################################################################
manual_mode() {
volumes="$(fdisk -l | grep '^/dev' | cat --number)"
until form_esp; do : ; done
if [[ "${xbootloader}" == "yes" ]]; then
until form_xboot; do : ; done
fi
until form_root; do : ; done
if [[ -e "${home_dev}" && "${sep_home}" == "y" ]]; then
until form_home; do : ; done
fi
until mount_mnt; do : ; done
until mount_esp; do : ; done
if [[ "${xbootloader}" == "yes" ]]; then
until mount_xboot; do : ; done
fi
if [[ -e "${home_dev}" && "${sep_home}" == "y" ]]; then
until mount_home; do : ; done
fi
}
###################################################################################################
form_esp() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Format EFI System Partition${nc} ${magenta}]${nc}-------------------------------${magenta}###
"
form_esp_nmbr=" "
while [[ -n "${form_esp_nmbr}" ]]; do
YELLOW "
> Select an EFI System Partition to format as ${nc}vfat
${volumes}"
BLUE "
Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " form_esp_nmbr
if [[ -n "${form_esp_nmbr}" ]]; then
esppart="$(echo "${volumes}" | awk "\$1 == ${form_esp_nmbr} {print \$2}")"
manespfs="$(lsblk -dno FSTYPE "${esppart}")"
if [[ -e "${esppart}" ]]; then
if [[ "${multibooting}" == "n" ]]; then
if mkfs.fat -F 32 -n ESP "${esppart}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Format & Label /ESP OK${nc}] "
return 0
else
do_umount
until manual_part; do : ; done
until form_esp; do : ; done
return 0
fi
elif [[ "${multibooting}" == "y" && "${manespfs}" == "vfat" ]]; then
sleep 0.2
NC "
==> [${green}/Unformatted ESP OK${nc}] "
return 0
elif [[ "${multibooting}" == "y" && "${manespfs}" != "vfat" ]]; then
if mkfs.fat -F 32 -n ESP "${esppart}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Format & Label /ESP OK${nc}] "
return 0
else
do_umount
until manual_part; do : ; done
until form_esp; do : ; done
return 0
fi
fi
else
invalid
return 1
fi
fi
RED "
---------------------------------------------------
### ${yellow}WARNING: ${nc}PARTITION HAS NOT BEEN FORMATTED ${red}###
---------------------------------------------------"
sleep 2
skip
done
}
###################################################################################################
form_xboot() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------${magenta}[ ${bwhite}Format Linux Extended Boot Partition${nc} ${magenta}]${nc}--------------------------${magenta}###
"
form_xboot_nmbr=" "
while [[ -n "${form_xboot_nmbr}" ]]; do
YELLOW "
> Select a Linux Extended Boot Partition to format as ${nc}vfat
${volumes}"
BLUE "
Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " form_xboot_nmbr
if [[ -n "${form_xboot_nmbr}" ]]; then
xbootpart="$(echo "${volumes}" | awk "\$1 == ${form_xboot_nmbr} {print \$2}")"
if [[ -e "${xbootpart}" ]]; then
if mkfs.fat -F 32 -n XBOOTLDR "${xbootpart}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Format & Label /XBOOTLDR OK${nc}] "
return 0
else
do_umount
until manual_part; do : ; done
until form_xboot; do : ; done
return 0
fi
else
invalid
return 1
fi
fi
RED "
---------------------------------------------------
### ${yellow}WARNING: ${nc}PARTITION HAS NOT BEEN FORMATTED ${red}###
---------------------------------------------------"
sleep 2
skip
done
}
###################################################################################################
form_root() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
form_root_nmbr=" "
while [[ -n "${form_root_nmbr}" ]]; do
YELLOW "
> Select a ${roottype} Partition to format as ${nc}${fsname}
${volumes}"
BLUE "
Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " form_root_nmbr
if [[ -n "${form_root_nmbr}" ]]; then
rootpart="$(echo "${volumes}" | awk "\$1 == ${form_root_nmbr} {print \$2}")"
if [[ -e "${rootpart}" ]]; then
#--------------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" ]]; then
if mkfs.ext4 -F "${rootpart}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${rootpart}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Format ${roottype} OK${nc}] "
else
do_umount
until manual_part; do : ; done
until form_root; do : ; done
return 0
fi
#--------------------------------------------------------------------------------------------------
elif [[ "${fs}" == "2" ]]; then
if mkfs.btrfs -f "${rootpart}" > "${void}" 2> "${log}" ; then
mount "${rootpart}" /mnt > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@ > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@home > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@cache > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@log > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@tmp > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@snapshots > "${void}" 2> "${log}" || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > "${void}" 2> "${log}" || err_abort
fi
umount /mnt > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Format ${roottype} OK${nc}] "
else
do_umount
until manual_part; do : ; done
until form_root; do : ; done
return 0
fi
fi
else
invalid
return 1
fi
YELLOW "
> Label the ${roottype} Partition "
BLUE "
Enter a name ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " rootpartname
if [[ -n "${rootpartname}" ]]; then
if [[ "${fs}" == "1" ]]; then
if e2label "${rootpart}" "${rootpartname}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Label ${roottype} OK${nc}] "
return 0
else
err_try
return 1
fi
elif [[ "${fs}" == "2" ]]; then
mount "${rootpart}" /mnt || err_abort
btrfs filesystem label /mnt "${rootpartname}" > "${void}" 2> "${log}" || err_abort
umount /mnt || err_abort
sleep 0.2
NC "
==> [${green}Label ${roottype} OK${nc}] "
return 0
fi
fi
skip
return 0
else
RED "
---------------------------------------------------
### ${yellow}WARNING: ${nc}PARTITION HAS NOT BEEN FORMATTED ${red}###
---------------------------------------------------"
sleep 2
skip
return 0
fi
done
}
###################################################################################################
ask_homepart_form() {
if [[ "${fs}" == "1" && -e "${home_dev}" && "${sep_home}" == "y" ]]; then
if [[ "${smartpart}" == "y" ]]; then
homeform="y"
elif [[ "${preset}" =~ ^(3|4)$ ]]; then
homeform="y"
elif [[ -z "${smartpart}" || -z "${preset}" ]]; then
BLUE "
> A${nc} ${cyan}/Home ${blue}partition has been detected. Format as ${nc}${fsname}${blue} ? [y/N]
"
read -r -p "
==> " homeform
echo
homeform="${homeform:-n}"
homeform="${homeform,,}"
fi
if [[ "${homeform}" == "y" ]]; then
if mkfs.ext4 -F -L Home "${home_dev}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${home_dev}" > "${void}" 2> "${log}" || err_abort
mount --mkdir "${home_dev}" /mnt/home > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/Home OK${nc}]
"
else
umount_manual
until manual_part; do : ; done
until form_home; do : ; done
until mount_mnt; do : ; done
until mount_esp; do : ; done
if [[ "${xbootloader}" == "yes" ]]; then
until mount_xboot; do : ; done
fi
until mount_home; do : ; done
fi
elif [[ "${homeform}" == "n" ]]; then
skip
else
y_n
return 1
fi
fi
}
###################################################################################################
form_home() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
form_home_nmbr=" "
while [[ -n "${form_home_nmbr}" ]]; do
YELLOW "
> Select a /Home Partition to format as ${nc}Ext4
${volumes} "
BLUE "
Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " form_home_nmbr
if [[ -n "${form_home_nmbr}" ]]; then
homepart="$(echo "${volumes}" | awk "\$1 == ${form_home_nmbr} {print \$2}")"
if [[ -e "${homepart}" ]]; then
if mkfs.ext4 -F "${homepart}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${homepart}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Format /Home OK${nc}] "
else
do_umount
until manual_part; do : ; done
until form_home; do : ; done
return 0
fi
else
invalid
return 1
fi
YELLOW "
> Label the /Home Partition "
BLUE "
Enter a name ${bwhite}(empty to skip and proceed)${blue}: "
read -r -p "
==> " homepartname
if [[ -n "${homepartname}" ]]; then
if e2label "${homepart}" "${homepartname}" > "${void}" 2> "${log}" ;then
sleep 0.2
NC "
==> [${green}Label /Home OK${nc}] "
return 0
else
err_try
return 1
fi
fi
skip
return 0
else
RED "
---------------------------------------------------
### ${yellow}WARNING: ${nc}PARTITION HAS NOT BEEN FORMATTED ${red}###
---------------------------------------------------"
skip
return 0
fi
done
}
###################################################################################################
mount_mnt() {
local prompt="Mount ${roottype}"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select a ${roottype} Partition to mount to ${nc}/mnt
${volumes} "
BLUE "
Enter your${nc} ${cyan}${roottype} ${blue}partition number: "
read -r -p "
==> " mntroot_nmbr
echo
if [[ -n "${mntroot_nmbr}" ]]; then
rootpart="$(echo "${volumes}" | awk "\$1 == ${mntroot_nmbr} {print \$2}")"
if [[ -e "${rootpart}" ]]; then
#--------------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" ]]; then
if mount "${rootpart}" /mnt > "${void}" 2> "${log}" ; then
sleep 0.2
ok
return 0
else
do_umount
until mount_mnt; do : ; done
fi
#--------------------------------------------------------------------------------------------------
elif [[ "${fs}" == "2" ]]; then
if mount -o "${sbvl_mnt_opts}",subvol=@ "${rootpart}" /mnt > "${void}" 2> "${log}" ; then
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap "${rootpart}" /mnt/swap > "${void}" 2> "${log}" || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${rootpart}" /mnt/var/cache > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${rootpart}" /mnt/home > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${rootpart}" /mnt/var/log > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${rootpart}" /mnt/"${snapname}" > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${rootpart}" /mnt/var/tmp > "${void}" 2> "${log}" || err_abort
sleep 0.2
ok
return 0
else
do_umount
until mount_mnt; do : ; done
fi
fi
#--------------------------------------------------------------------------------------------------
else
invalid
return 1
fi
else
choice
return 1
fi
}
###################################################################################################
mount_esp() {
local prompt="Mount ESP"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Mount ESP Partition${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
YELLOW "
> Select an EFI System Partition to mount to ${nc}${esp_mount}
${volumes}"
BLUE "
Enter your${nc} ${cyan}/ESP ${blue}partition number: "
read -r -p "
==> " mntesp_nmbr
echo
if [[ -n "${mntesp_nmbr}" ]]; then
esppart="$(echo "${volumes}" | awk "\$1 == ${mntesp_nmbr} {print \$2}")"
if [[ -e "${esppart}" ]]; then
if mount --mkdir "${esppart}" "${esp_mount}" > "${void}" 2> "${log}" ; then
ok
return 0
else
do_umount
until mount_mnt; do : ; done
until mount_esp; do : ; done
fi
else
invalid
return 1
fi
else
choice
return 1
fi
}
###################################################################################################
mount_xboot() {
local prompt="Mount XBOOTLDR"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Mount XBOOTLDR Partition${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
YELLOW "
> Select a Linux Extended Boot Partition to mount to ${nc}/mnt/boot
${volumes}"
BLUE "
Enter your${nc} ${cyan}/XBOOTLDR ${blue}partition number: "
read -r -p "
==> " mntxboot_nmbr
echo
if [[ -n "${mntxboot_nmbr}" ]]; then
xbootpart="$(echo "${volumes}" | awk "\$1 == ${mntxboot_nmbr} {print \$2}")"
if [[ -e "${xbootpart}" ]]; then
if mount --mkdir "${xbootpart}" /mnt/boot > "${void}" 2> "${log}" ; then
ok
return 0
else
do_umount
until mount_mnt; do : ; done
until mount_esp; do : ; done
until mount_xboot; do : ; done
fi
else
invalid
return 1
fi
else
choice
return 1
fi
}
###################################################################################################
mount_home() {
local prompt="Mount /Home"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select a /Home Partition to mount to ${nc}/mnt/home
${volumes}"
BLUE "
Enter your${nc} ${cyan}/Home ${blue}partition number: "
read -r -p "
==> " mnthome_nmbr
echo
if [[ -n "${mnthome_nmbr}" ]]; then
homepart="$(echo "${volumes}" | awk "\$1 == ${mnthome_nmbr} {print \$2}")"
if [[ -e "${homepart}" ]]; then
if mount --mkdir "${homepart}" /mnt/home > "${void}" 2> "${log}" ; then
ok
return 0
else
do_umount
until mount_mnt; do : ; done
until mount_esp; do : ; done
until mount_xboot; do : ; done
until mount_home; do : ; done
fi
else
invalid
return 1
fi
else
choice
return 1
fi
}
###################################################################################################
confirm_status() {
local prompt="System Ready"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Confirm Installation Status${nc} ${magenta}]${nc}-------------------------------${magenta}###
"
BLUE "
> Proceed ? "
NC "
* Type '${cyan}yes${nc}' to continue installation
* Type '${cyan}no${nc}' to revise installation
"
read -r -p "
==> " agree
if [[ "${agree}" == "yes" ]]; then
ok
until opt_pcmn; do : ; done
until pacstrap_system; do : ; done
if [[ "${swapmode}" == "2" ]]; then
until "${swaptype}"; do : ; done
fi
if [[ -n "${REGDOM}" ]]; then
until set_wireless_regdom; do : ; done
fi
set_vars
chroot_conf
elif [[ "${agree}" == "no" ]]; then
unmount
until revise; do : ; done
else
yes_no
return 1
fi
}
###################################################################################################
revise() {
reset=(xbootloader="" gfxconf="" vendor_slct="" vendor="" desktop="" terminal="" custompkgs="" customservices="" cust_bootopts="" REGDOM="" autoroot="" autoxboot="" autohome="" autoswap="" vendors="" lowlat="" nogsp="" sanity="" partok="" preset="" set_optm="" ask_param="" kill_watchdog="" genoptm="" desk_setup="" devel="" web="" web_pkg="" web_aur="" web_slct="" set_optm_slct="" oomd="" irqbalance="" thermald="" rngd="" rtkit="" tlp="" CRYPTPASS="" CRYPTPASS2="" askoptm="" gptslct="" gptok="" gptabort="")
export "${reset[@]}"
gfxpkgs=()
if [[ "${hypervisor}" != "none" ]]; then
vendor="Virtual Machine"
gfxconf="n"
fi
until slct_krnl; do : ; done
until ask_sign; do : ; done
until slct_bootldr; do : ; done
until slct_espmnt; do : ; done
until slct_fs; do : ; done
until slct_swap; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until dtct_gfx; do : ; done
fi
until dsktp_slct; do : ; done
until base_devel; do : ; done
until web_browser; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until print_scan; do : ; done
until boot_entr; do : ; done
fi
if [[ "${askoptm}" == "y" ]]; then
until cust_kern_param; do : ; done
until sys_watchdog; do : ; done
until gen_optm; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until ask_wireless_regdom; do : ; done
fi
until systemd_oomd; do : ; done
until irqbalance; do : ; done
until thermald; do : ; done
until rngd; do : ; done
until rtkit; do : ; done
until tlp; do : ; done
fi
until instl_dsk; do : ; done
until ask_crypt; do : ; done
if [[ "${swapmode}" == "1" ]]; then
until "${swaptype}"; do : ; done
fi
if [[ "${encrypt}" == "no" ]]; then
until set_mode; do : ; done
until confirm_status; do : ; done
elif [[ "${encrypt}" == "yes" ]]; then
until sec_erase; do : ; done
until luks; do : ; done
until opt_pcmn; do : ; done
until pacstrap_system; do : ; done
if [[ "${swapmode}" == "2" ]]; then
until "${swaptype}"; do : ; done
fi
if [[ -n "${REGDOM}" ]]; then
until set_wireless_regdom; do : ; done
fi
set_vars
chroot_conf
fi
}
###################################################################################################
sec_erase() {
local prompt="Secure Erasure"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Secure Disk Erasure${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
erase_dsk_nmbr=" "
while [[ -n "${erase_dsk_nmbr}" ]]; do
YELLOW "
> Select a disk for Secure Erasure ${red}[!] (CAUTION) [!]${yellow} "
RED "
--------------------------------------------------------------------------
### ${nc}A reboot is mandatory and will take effect ${yellowl}immediately ${nc}when done ${red}###
--------------------------------------------------------------------------"
NC "
${disks}"
BLUE "
Enter a disk number ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " erase_dsk_nmbr
echo
if [[ -n "${erase_dsk_nmbr}" ]]; then
erasedrive="$(echo "${disks}" | awk "\$1 == ${erase_dsk_nmbr} {print \$2}")"
if [[ -e "${erasedrive}" ]]; then
cryptsetup open --type plain -d /dev/urandom "${erasedrive}" temp || err_abort
dd if=/dev/zero of=/dev/mapper/temp status=progress bs=1M oflag=direct || err_abort
cryptsetup close temp || err_abort
sleep 0.2
NC "
==> [${green}Drive ${erasedrive} Erased OK${nc}] "
sleep 0.2
NC "
==> [${green}Rebooting${nc}] "
sleep 1
reboot
else
invalid
return 1
fi
else
skip
ok
fi
done
}
###################################################################################################
luks() {
espfs="$(lsblk -f --noheadings "${esp_dev}" | awk "{print \$2}")"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}LUKS Encryption${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Initiating Encryption process:
"
if echo -n "${CRYPTPASS}" | cryptsetup luksFormat --label CRYPTROOT "${root_dev}" > "${void}"; then
if [[ "${rota}" == "0" ]]; then
echo -n "${CRYPTPASS}" | cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${root_dev}" "${ENCROOT}" || err_abort
else
echo -n "${CRYPTPASS}" | cryptsetup luksOpen "${root_dev}" "${ENCROOT}" || err_abort
fi
#------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" ]]; then
mkfs.ext4 -F -L Root /dev/mapper/"${ENCROOT}" > "${void}" 2> "${log}" || err_abort
tune2fs -O fast_commit /dev/mapper/"${ENCROOT}" > "${void}" 2> "${log}" || err_abort
mount /dev/mapper/"${ENCROOT}" /mnt > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Root OK${nc}]
"
luks_root="ok"
#------------------------------------------------------------------------------------------
elif [[ "${fs}" == "2" ]]; then
mkfs.btrfs -f -L Root /dev/mapper/"${ENCROOT}" > "${void}" 2> "${log}" || err_abort
mount /dev/mapper/"${ENCROOT}" /mnt > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@ > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@home > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@cache > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@log > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@snapshots > "${void}" 2> "${log}" || err_abort
btrfs subvolume create /mnt/@tmp > "${void}" 2> "${log}" || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > "${void}" 2> "${log}" || err_abort
fi
umount /mnt > "${void}" 2> "${log}" || err_abort
mount -o "${sbvl_mnt_opts}",subvol=@ /dev/mapper/"${ENCROOT}" /mnt > "${void}" 2> "${log}" || err_abort
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap /dev/mapper/"${ENCROOT}" /mnt/swap > "${void}" 2> "${log}" || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache /dev/mapper/"${ENCROOT}" /mnt/var/cache > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home /dev/mapper/"${ENCROOT}" /mnt/home > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log /dev/mapper/"${ENCROOT}" /mnt/var/log > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots /dev/mapper/"${ENCROOT}" /mnt/"${snapname}" > "${void}" 2> "${log}" || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp /dev/mapper/"${ENCROOT}" /mnt/var/tmp > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /@ OK${nc}]
"
luks_root="ok"
fi
else
line2
err_try
do_umount
return 1
fi
#--------------------------------------------------------------------------------------------------
if [[ -e "${swap_dev}" && "${swapmode}" == "1" ]]; then
line2
if echo -n "${CRYPTPASS}" | cryptsetup luksFormat --label CRYPTSWAP "${swap_dev}" > "${void}"; then
if [[ "${rota}" == "0" ]]; then
echo -n "${CRYPTPASS}" | cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${swap_dev}" swap || err_abort
else
echo -n "${CRYPTPASS}" | cryptsetup luksOpen "${swap_dev}" swap || err_abort
fi
mkswap /dev/mapper/swap > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Swap OK${nc}]
"
luks_swap="ok"
else
line2
err_try
do_umount
return 1
fi
fi
#--------------------------------------------------------------------------------------------------
if [[ "${homecrypt}" == "yes" ]]; then
line2
if echo -n "${CRYPTPASS}" | cryptsetup luksFormat --label CRYPTHOME "${home_dev}" > "${void}"; then
if [[ "${rota}" == "0" ]]; then
echo -n "${CRYPTPASS}" | cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${home_dev}" "${ENCRHOME}" || err_abort
else
echo -n "${CRYPTPASS}" | cryptsetup luksOpen "${home_dev}" "${ENCRHOME}" || err_abort
fi
mkfs.ext4 -F -L Home /dev/mapper/"${ENCRHOME}" > "${void}" 2> "${log}" || err_abort
tune2fs -O fast_commit /dev/mapper/"${ENCRHOME}" > "${void}" 2> "${log}" || err_abort
mount --mkdir /dev/mapper/"${ENCRHOME}" /mnt/home > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Home OK${nc}]
"
luks_home="ok"
else
line2
err_try
do_umount
return 1
fi
elif [[ "${homecrypt}" == "no" ]]; then
BLUE "
> A ${nc}/Home ${blue}partition has been detected. Format as${nc} ${fsname}${blue}? [y/N]
"
read -r -p "
==> " homeform
echo
homeform="${homeform:-n}"
homeform="${homeform,,}"
if [[ "${homeform}" == "y" ]]; then
if mkfs.ext4 -F -L Home "${home_dev}" > "${void}" 2> "${log}" ; then
tune2fs -O fast_commit "${home_dev}" > "${void}" 2> "${log}" || err_abort
mount --mkdir "${home_dev}" /mnt/home > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/Home OK${nc}]
"
else
line2
err_try
do_umount
return 1
fi
elif [[ "${homeform}" == "n" ]]; then
skip
else
y_n
return 1
fi
fi
#--------------------------------------------------------------------------------------------------
if [[ "${multibooting}" == "n" ]]; then
if mkfs.fat -F 32 -n ESP "${esp_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/ESP OK${nc}]
"
else
do_umount
until luks; do : ; done
fi
elif [[ "${multibooting}" == "y" && "${espfs}" == "vfat" ]]; then
if mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" ; then
sleep 0.2
NC "
==> [${green}Unformatted /ESP OK${nc}]
"
else
line2
err_try
do_umount
return 1
fi
elif [[ "${multibooting}" == "y" && "${espfs}" != "vfat" ]]; then
if mkfs.fat -F 32 -n ESP "${esp_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/ESP OK${nc}]
"
else
do_umount
until luks; do : ; done
fi
fi
#--------------------------------------------------------------------------------------------------
if [[ "${xbootloader}" == "yes" ]] ; then
if mkfs.fat -F 32 -n XBOOTLDR "${xboot_dev}" > "${void}" 2> "${log}" ; then
mount --mkdir "${xboot_dev}" /mnt/boot > "${void}" 2> "${log}" || err_abort
sleep 0.2
NC "
==> [${green}/XBOOTLDR OK${nc}]
"
else
line2
err_try
do_umount
return 1
fi
fi
#--------------------------------------------------------------------------------------------------
sleep 0.2
NC "
==> [${green}Encryption Completed OK${nc}]"
luks_encrypt="ok"
sleep 0.2
NC "
==> [${green}Filesystems OK${nc}]
"
sleep 0.2
CYAN "
###${nc}---------------------------------------------${cyan}[ ${bwhite}FILESYSTEM OVERVIEW ${nc}${cyan}]${nc}---------------------------------------------${cyan}###
"
lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$'
CYAN "
###${nc}-----------------------------------------------------------------------------------------------------------------${cyan}###
"
sleep 0.2
}
###################################################################################################
opt_pcmn() {
local prompt="PacMan"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Pacman Optimization${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
YELLOW "
> Select a Country for your Arch Mirrors:
### [Enter ${nc}'l' ${yellow}to list Countries, then ${nc}'enter' ${yellow}to search or ${nc}'q' ${yellow}to quit] "
BLUE "
Enter country name or country code ${bwhite}(Empty for Defaults)${blue}: "
read -r -p "
==> " COUNTRY
echo
if [[ -z "${COUNTRY}" ]] ; then
sleep 0.2
NC "
==> [${green}Default Mirrors OK${nc}] "
elif [[ "${COUNTRY}" == "l" ]]; then
reflector --list-countries | less
return 1
elif [[ -n "${COUNTRY}" ]]; then
line2
if reflector --verbose -c "${COUNTRY}" -l 10 -p https -f 10 --sort rate --save /etc/pacman.d/mirrorlist ; then
sleep 0.2
NC "
==> [${green}${COUNTRY}'s Mirrors OK${nc}] "
else
err_try
return 1
fi
fi
YELLOW "
> Enable Arch's 'Multilib' repository in the installed system ? [y/N] "
BLUE "
Enter [y/N]: "
read -r -p "
==> " multilib
echo
multilib="${multilib:-n}"
multilib="${multilib,,}"
if [[ "${multilib}" == "y" ]]; then
sleep 0.2
NC "
==> [${green}Multilib repository OK${nc}]"
elif [[ "${multilib}" == "n" ]]; then
skip
else
y_n
return 1
fi
ok
}
###################################################################################################
pacstrap_system() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Pacstrap System${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
installing
gfxpkgs_set
if [[ "${bootloader}" == "2" ]]; then
if [[ "${fs}" == "1" ]]; then
bootldr_pkgs="grub os-prober"
elif [[ "${fs}" == "2" ]]; then
bootldr_pkgs="grub-btrfs inotify-tools os-prober"
fi
fi
basepkgs=(base efibootmgr nano networkmanager pkgstats sudo vim "${bootldr_pkgs}" "${fstools}" "${kernel}" "${microcode}" "${shell_pkgs}")
if [[ -n "${shell}" ]]; then
basepkgs+=("${shell}")
fi
if [[ -n "${nrg_plc}" ]]; then
basepkgs+=("${nrg_plc}")
fi
if [[ "${vendor}" == "Virtual Machine" ]]; then
basepkgs+=("${vmpkgs}")
else
basepkgs+=(alsa-firmware linux-firmware sof-firmware)
fi
if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then
basepkgs+=(7zip alsa-utils bluez bluez-hid2hci bluez-obex bluez-utils exfatprogs git glibc-locales gst-libav gst-plugin-libcamera gst-plugin-pipewire gst-plugins-bad gst-plugins-good gst-plugins-ugly libfido2 man-db man-pages mesa-utils nano-syntax-highlighting pacman-contrib pipewire-alsa pipewire-libcamera pipewire-pulse pipewire-zeroconf reflector xdg-user-dirs)
fi
if [[ "${terminal}" == "y" ]]; then
basepkgs+=(gnome-terminal)
fi
if [[ -n "${ukify}" ]]; then
basepkgs+=("${ukify}")
fi
if [[ -n "${zram}" ]]; then
basepkgs+=("${zram}")
fi
if [[ -n "${gfxpkgs[*]}" ]]; then
basepkgs+=("${gfxpkgs[*]}")
fi
if [[ "${vendor}" == "Nvidia" ]]; then
basepkgs+=("${kernel}-headers")
fi
if [[ -n "${devel}" ]]; then
basepkgs+=("${devel}")
fi
if [[ -n "${wireless_reg}" ]]; then
basepkgs+=("${wireless_reg}")
fi
if [[ -n "${print_pkgs}" ]]; then
basepkgs+=("${print_pkgs}")
fi
if [[ -n "${web_pkg}" ]]; then
basepkgs+=("${web_pkg}")
fi
case "${desktop}" in
1) # Plasma Desktop:
deskpkgs="${basepkgs[*]} dolphin-plugins konsole plasma plasma-x11-session qt6-multimedia-gstreamer"
displaymanager="sddm" ;;
2) # Plasma Light Desktop:
deskpkgs="${basepkgs[*]} ark bluedevil breeze-gtk colord-kde dolphin-plugins flatpak-kcm freerdp kate kcalc kclock kde-gtk-config kdegraphics-mobipocket kdegraphics-thumbnailers kdenetwork-filesharing kdeplasma-addons kdf kdialog keditbookmarks kget kimageformats kio-admin kio-gdrive kio-zeroconf konsole krdc krfb kscreen kwayland-integration kwrited okular purpose ocean-sound-theme packagekit-qt6 partitionmanager plasma5-integration plasma-browser-integration plasma-desktop plasma-disks plasma-firewall plasma-nm plasma-pa plasma-systemmonitor plasma-wayland-protocols plasma-x11-session sddm-kcm spectacle appmenu-gtk-module arj dosfstools ffmpegthumbs icoutils kvantum libappimage lrzip lzop maliit-keyboard ntfs-3g power-profiles-daemon qt5-xmlpatterns qt6-connectivity qt6-multimedia-gstreamer unarchiver unrar xdg-desktop-portal-gtk"
displaymanager="sddm" ;;
3) # Gnome Desktop:
deskpkgs="${basepkgs[*]} gnome"
displaymanager="gdm" ;;
4) # Gnome Light Desktop:
deskpkgs="${basepkgs[*]} dconf-editor file-roller gdm gnome-browser-connector gnome-calculator gnome-clocks gnome-console gnome-control-center gnome-disk-utility gnome-keyring gnome-menus gnome-shell-extensions gnome-system-monitor gnome-text-editor gnome-tweaks gnome-user-share gvfs gvfs-afc gvfs-mtp gvfs-smb loupe papers sushi dosfstools glib2-devel gparted ntfs-3g power-profiles-daemon unrar unzip xorg-xhost zip"
displaymanager="gdm" ;;
5) # Xfce Desktop:
deskpkgs="${basepkgs[*]} blueman catfish ffmpegthumbnailer gvfs gvfs-afc gvfs-mtp gvfs-smb libgsf libopenraw lightdm-gtk-greeter mousepad mugshot network-manager-applet pavucontrol poppler-glib ristretto thunar-archive-plugin thunar-media-tags-plugin thunar-shares-plugin xfce4 xfce4-artwork xfce4-battery-plugin xfce4-clipman-plugin xfce4-datetime-plugin xfce4-indicator-plugin xfce4-mount-plugin xfce4-power-manager xfce4-pulseaudio-plugin xfce4-screensaver xfce4-screenshooter xfce4-taskmanager xfce4-whiskermenu-plugin xfce4-power-manager xiccd"
displaymanager="lightdm" ;;
6) # Cinnamon Desktop:
deskpkgs="${basepkgs[*]} blueman cinnamon ffmpegthumbnailer gnome-color-manager gnome-keyring lightdm-slick-greeter touchegg wget"
displaymanager="lightdm" ;;
7) # Deepin Desktop:
deskpkgs="${basepkgs[*]} adobe-source-han-sans-otc-fonts deepin deepin-album deepin-calculator deepin-camera deepin-clipboard deepin-community-wallpapers deepin-compressor deepin-device-formatter deepin-editor deepin-font-manager deepin-grand-search deepin-kwin deepin-movie deepin-printer deepin-reader deepin-screensaver deepin-shortcut-viewer deepin-terminal gtk-engine-murrine iw proxychains-ng qt6-multimedia-gstreamer redshift zssh"
displaymanager="lightdm" ;;
8) # Budgie Desktop:
deskpkgs="${basepkgs[*]} blueman budgie gnome-user-share gtk-engine-murrine lightdm-gtk-greeter materia-gtk-theme nautilus network-manager-applet openssh papirus-icon-theme power-profiles-daemon rygel"
displaymanager="lightdm" ;;
9) # Lxqt Desktop:
deskpkgs="${basepkgs[*]} blueman breeze-icons gvfs gvfs-mtp kimageformats libarchive lxqt network-manager-applet oxygen-icons python-pyxdg qt6-imageformats qt6-multimedia-gstreamer sddm xscreensaver xsettingsd"
displaymanager="sddm" ;;
10) # Mate Desktop:
deskpkgs="${basepkgs[*]} atril blueman caja-actions caja-audio-video-properties caja-open-terminal caja-sendto caja-share caja-wallpaper cpio engrampa eom gnome-keyring gtk-engine-murrine gtk-engines lightdm-gtk-greeter mate mate-applets mate-calc mate-icon-theme mate-icon-theme-faenza mate-media mate-netbook mate-power-manager mate-screensaver mate-system-monitor mate-terminal mate-user-share mate-utils mozo network-manager-applet pluma python-gobject unace unrar webp-pixbuf-loader xdg-user-dirs-gtk"
displaymanager="lightdm" ;;
11) # Base System:
deskpkgs="${basepkgs[*]}" ;;
12) # Custom System:
custarray=(base sudo "${bootldr_pkgs}" "${custompkgs}" "${fstools}" "${kernel}" "${microcode}")
if [[ -n "${shell}" ]]; then
custarray+=("${shell}")
fi
if [[ "${vendor}" == "Virtual Machine" ]]; then
custarray+=("${vmpkgs}")
else
custarray+=(linux-firmware)
fi
if [[ -n "${ukify}" ]]; then
custarray+=("${ukify}")
fi
if [[ -n "${zram}" ]]; then
custarray+=("${zram}")
fi
if [[ -n "${gfxpkgs[*]}" ]]; then
custarray+=("${gfxpkgs[*]}")
fi
if [[ "${greeternmbr}" =~ ^(1|2|3)$ ]]; then
custarray+=("${greeter}")
fi
if [[ -n "${wireless_reg}" ]]; then
custarray+=("${wireless_reg}")
fi
if [[ -n "${print_pkgs}" ]]; then
custarray+=("${print_pkgs}")
fi
deskpkgs="${custarray[*]}" ;;
13) # Cosmic Desktop:
deskpkgs="${basepkgs[*]} cosmic cosmic-player dconf packagekit power-profiles-daemon pulseaudio-alsa"
displaymanager="cosmic-greeter" ;;
esac
pkg_displ
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
if pacstrap -K /mnt ${deskpkgs} 2> "${log}" ; then
if [[ "${fs}" == "2" ]]; then
genfstab -t PARTUUID /mnt >> /mnt/etc/fstab || err_abort
sleep 0.2
NC "
==> [${green}Fstab OK${nc}] "
fi
local prompt="Pacstrap System"
ok
else
failure
fi
if [[ "${swapmode}" != "2" ]]; then
line2
fi
}
###################################################################################################
swapfile() {
local stage_prompt="Swapfile Creation"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swapfile Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
if arch-chroot /mnt <<-SWAPFILE > "${void}" 2>&1 2> "${log}" ; then
mkswap -U clear --size ${swapsize}G --file /swapfile || exit
SWAPFILE
cat >> /mnt/etc/fstab <<-FSTAB || err_abort
/swapfile none swap defaults 0 0
FSTAB
stage_ok
else
stage_fail
fi
}
###################################################################################################
swapfile_btrfs() {
local stage_prompt="Btrfs Swapfile Creation"
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Btrfs Swapfile Setup${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
if arch-chroot /mnt <<-SWAPFILE > "${void}" 2>&1 2> "${log}" ; then
btrfs filesystem mkswapfile --size ${swapsize}g --uuid clear /swap/swapfile || exit
SWAPFILE
cat >> /mnt/etc/fstab <<-FSTAB || err_abort
/swap/swapfile none swap defaults 0 0
FSTAB
stage_ok
else
stage_fail
fi
}
###################################################################################################
set_wireless_regdom() {
local stage_prompt="Wireless Regulatory Domain"
sleep 0.2
NC "
${magenta}###${nc}--------------------------${magenta}[ ${bwhite}Setting Up Wireless Regulatory Domain${nc} ${magenta}]${nc}--------------------------${magenta}###
"
if sed -i "/^#WIRELESS_REGDOM=\"${REGDOM}\"/s/^#//" /mnt/etc/conf.d/wireless-regdom ; then
stage_ok
else
stage_fail
fi
}
###################################################################################################
main_chroot() {
local stage_prompt="Base System Configuration"
if arch-chroot /mnt <<-CONF > "${void}" 2>&1 2> "${log}" ; then
sed -i "/^#${SETLOCALE}/s/^#//" /etc/locale.gen || exit
locale-gen || exit
echo LANG=${SETLOCALE} > /etc/locale.conf || exit
export LANG=${SETLOCALE} || exit
echo KEYMAP=${SETKBD} > /etc/vconsole.conf || exit
cat <<-MKINITCPIO > /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit
${mkinitcpio_mods}
${mkinitcpio_bins}
${mkinitcpio_hooks}
MKINITCPIO
mkinitcpio -P || exit
ln -sf /usr/share/zoneinfo/$(curl -s http://ip-api.com/line?fields=timezone) /etc/localtime || exit
hwclock --systohc || exit
echo ${HOSTNAME} > /etc/hostname || exit
cat <<-HOSTS > /etc/hosts || exit
127.0.0.1 localhost
::1 localhost
127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME}
HOSTS
echo root:${ROOTPASSWD2} | chpasswd || exit
chsh -s /bin/${shellname} || exit
useradd -m -G wheel -s /bin/${shellname} ${USERNAME} || exit
echo ${USERNAME}:${USERPASSWD2} | chpasswd || exit
echo "%wheel ALL=(ALL) ALL" | tee /etc/sudoers.d/sudoersd || exit
visudo -c /etc/sudoers.d/sudoersd || exit
CONF
stage_ok
else
stage_fail
fi
}
###################################################################################################
btldrcfg() {
if [[ "${bootloader}" == "1" ]]; then
local stage_prompt="Systemd-boot Configuration"
if [[ "${xbootloader}" == "no" ]]; then
if arch-chroot /mnt <<-BOOTCTL > "${void}" 2>&1 2> "${log}" ; then
bootctl install || exit
sed -i "/^#timeout 3/s/^#//" ${btldr_esp_mount}/loader/loader.conf || exit
systemctl enable systemd-boot-update || exit
BOOTCTL
stage_ok
else
stage_fail
fi
elif [[ "${xbootloader}" == "yes" ]]; then
if arch-chroot /mnt <<-XBOOTCTL > "${void}" 2>&1 2> "${log}" ; then
bootctl --esp-path=/efi --boot-path=/boot install || exit
sed -i "/^#timeout 3/s/^#//" ${btldr_esp_mount}/loader/loader.conf || exit
systemctl enable systemd-boot-update || exit
XBOOTCTL
stage_ok
else
stage_fail
fi
fi
elif [[ "${bootloader}" == "2" ]]; then
local stage_prompt="Grub Configuration"
if arch-chroot /mnt <<-GRUB > "${void}" 2>&1 2> "${log}" ; then
cp /etc/default/grub /etc/default/grub.bak || exit
cat <<-CFG > /etc/default/grub || exit
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="${boot_opts[*]}"
GRUB_CMDLINE_LINUX=""
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
GRUB_TIMEOUT_STYLE=menu
GRUB_TERMINAL_INPUT=console
GRUB_GFXMODE=auto
GRUB_GFXPAYLOAD_LINUX=keep
GRUB_DISABLE_RECOVERY=true
GRUB_DISABLE_OS_PROBER=false
#GRUB_TERMINAL_OUTPUT=console
CFG
GRUB
stage_ok
else
stage_fail
fi
local stage_prompt="Grub Installation"
if [[ "${sb_sign}" == "y" ]]; then
if arch-chroot /mnt <<-SBGRUBINST > "${void}" 2>&1 2> "${log}" ; then
grub-install --target=${uefimode} --efi-directory=${btldr_esp_mount} --bootloader-id=GRUB --modules="tpm" --disable-shim-lock --recheck || exit
sed -i 's/SecureBoot/SecureB00t/' ${btldr_esp_mount}/EFI/GRUB/grubx64.efi || exit
grub-mkconfig -o /boot/grub/grub.cfg || exit
SBGRUBINST
stage_ok
else
stage_fail
fi
elif [[ "${sb_sign}" == "n" ]]; then
if arch-chroot /mnt <<-GRUBINST > "${void}" 2>&1 2> "${log}" ; then
grub-install --target=${uefimode} --efi-directory=${btldr_esp_mount} --bootloader-id=GRUB --recheck || exit
grub-mkconfig -o /boot/grub/grub.cfg || exit
GRUBINST
stage_ok
else
stage_fail
fi
fi
if [[ "${fs}" == "2" ]]; then
local stage_prompt="Grub-Btrfsd Service Activation"
if arch-chroot /mnt <<-GRUB_BTRFSD > "${void}" 2>&1 2> "${log}" ; then
systemctl enable grub-btrfsd || exit
GRUB_BTRFSD
stage_ok
else
stage_fail
fi
fi
if [[ "${gfxconf}" == "y" && "${vendor}" == "Nvidia" ]]; then
local stage_prompt="Grub/Nvidia Configuration"
if arch-chroot /mnt <<-NVGRUB > "${void}" 2>&1 2> "${log}" ; then
sed -i "/^#GRUB_TERMINAL_OUTPUT=console/s/^#//" /etc/default/grub || exit
grub-mkconfig -o /boot/grub/grub.cfg || exit
NVGRUB
stage_ok
else
stage_fail
fi
fi
fi
}
###################################################################################################
trimcfg() {
if [[ -n "${trim}" ]]; then
local stage_prompt="Trim Service Activation"
if arch-chroot /mnt <<-TRIM > "${void}" 2>&1 2> "${log}" ; then
systemctl enable ${trim} || exit
TRIM
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
vm_serv() {
if [[ -n "${vm_services}" ]]; then
local stage_prompt="VM Service(s) Activation"
if arch-chroot /mnt <<-VM > "${void}" 2>&1 2> "${log}" ; then
systemctl enable ${vm_services} || exit
VM
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
zramcfg() {
if [[ -n "${zram}" ]]; then
local stage_prompt="Zram Swap Activation"
zram_service="systemd-zram-setup@zram0.service"
if arch-chroot /mnt <<-ZRAMCONF > "${void}" 2>&1 2> "${log}" ; then
mkdir -p /etc/systemd/zram-generator.conf.d || exit
cat <<-ZCONF > /etc/systemd/zram-generator.conf.d/zram.conf || exit
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
ZCONF
cat <<-VMZCONF > /etc/sysctl.d/99-vm-zram-parameters.conf || exit
vm.swappiness = 180
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0
VMZCONF
systemctl daemon-reload || exit
systemctl start ${zram_service} || exit
ZRAMCONF
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
nvidia_hook() {
if [[ "${gfxconf}" == "y" && "${vendor}" == "Nvidia" ]] || [[ "${gfxconf}" == "y" && "${vendors}" =~ "Nvidia" ]]; then
if [[ "${nvname}" =~ ^(nvidia-open|nvidia|nvidia-lts)$ ]]; then
local stage_prompt="Nvidia Hook Creation"
if arch-chroot /mnt <<-NVIDIAHOOK > "${void}" 2>&1 2> "${log}" ; then
mkdir -p /etc/pacman.d/hooks/ || exit
cat <<-HOOK > /etc/pacman.d/hooks/nvidia.hook || exit
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=${nvname}
Target=${kernel}
[Action]
Description=Update NVIDIA module in initcpio
Depends=mkinitcpio
When=PostTransaction
NeedsTargets
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'
HOOK
NVIDIAHOOK
stage_ok
else
stage_fail
fi
fi
fi
}
###################################################################################################
mkinitcpio_preset() {
local stage_prompt="Mkinitcpio Kernel Presets Configuration"
if [[ "${uki}" == "y" ]]; then
if [[ ! -e "${esp_mount}"/EFI/Linux ]]; then
mkdir -p "${esp_mount}"/EFI/Linux || exit
fi
if arch-chroot /mnt <<-UKI > "${void}" 2>&1 2> "${log}" ; then
mkdir /etc/cmdline.d || exit
echo "rw ${boot_opts[*]}" | tee /etc/cmdline.d/cmdlined.conf || exit
cp /etc/mkinitcpio.d/${kernel}.preset /etc/mkinitcpio.d/${kernel}.preset.bak || exit
cat <<-MKINITPRESET > /etc/mkinitcpio.d/${kernel}.preset || exit
ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf"
ALL_kver="/boot/vmlinuz-${kernel}"
PRESETS=('default')
default_uki="${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi"
MKINITPRESET
mkinitcpio -P || exit
UKI
stage_ok
else
stage_fail
fi
if [[ -e /mnt/boot/initramfs-"${kernel}".img ]]; then
rm /mnt/boot/initramfs-"${kernel}".img || exit
fi
if [[ -e /mnt/boot/initramfs-"${kernel}"-fallback.img ]]; then
rm /mnt/boot/initramfs-"${kernel}"-fallback.img || exit
fi
elif [[ "${uki}" == "n" ]]; then
if arch-chroot /mnt <<-NOUKI > "${void}" 2>&1 2> "${log}" ; then
cp /etc/mkinitcpio.d/${kernel}.preset /etc/mkinitcpio.d/${kernel}.preset.bak || exit
cat <<-MKINITPRESET > /etc/mkinitcpio.d/${kernel}.preset || exit
ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf"
ALL_kver="/boot/vmlinuz-${kernel}"
PRESETS=('default')
default_image="/boot/initramfs-${kernel}.img"
MKINITPRESET
mkinitcpio -P || exit
NOUKI
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
var_opts() {
if [[ "${sb_sign}" == "y" && "${setrescue}" == "y" ]]; then
local stage_prompt="Rescue Entry Creation"
if [[ "${bootloader}" == "1" ]]; then
if arch-chroot /mnt <<-RESCUE > "${void}" 2>&1 2> "${log}" ; then
echo "systemd.unit=rescue.target rw ${boot_opts[*]}" | tee /etc/cmdline.d/rescued.conf || exit
cat <<-PRESET > /etc/mkinitcpio.d/${kernel}.preset || exit
ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf"
ALL_kver="/boot/vmlinuz-${kernel}"
PRESETS=('default' 'rescue')
default_uki="${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi"
default_options="--cmdline /etc/cmdline.d/cmdlined.conf"
rescue_uki="${btldr_esp_mount}/EFI/Linux/rescue.efi"
rescue_options="--cmdline /etc/cmdline.d/rescued.conf"
PRESET
mkinitcpio -P || exit
RESCUE
stage_ok
else
stage_fail
fi
elif [[ "${bootloader}" == "2" ]]; then
if arch-chroot /mnt <<-RESCUE > "${void}" 2>&1 2> "${log}" ; then
touch /boot/grub/custom.cfg
grep -E -A 11 "'Arch Linux'" /boot/grub/grub.cfg > /boot/grub/custom.cfg || exit
sed -i 's/Arch Linux/Rescue Environment/' /boot/grub/custom.cfg || exit
sed -i '/vmlinuz/ s/$/ systemd.unit=rescue.target/' /boot/grub/custom.cfg || exit
RESCUE
stage_ok
else
stage_fail
fi
fi
fi
if [[ "${multilib}" == "y" ]]; then
local stage_prompt="Multilib Configuration"
if arch-chroot /mnt <<-MULTILIB > "${void}" 2>&1 2> "${log}" ; then
sed -i "/\[multilib\]/,/Include/"'s/^#//' /etc/pacman.conf || exit
pacman -Syy || exit
MULTILIB
stage_ok
else
stage_fail
fi
fi
if [[ "${CPU}" == *"GenuineIntel"* && "${kill_watchdog}" == "y" ]]; then
local stage_prompt="Intel Watchdog Configuration"
if arch-chroot /mnt <<-INTEL_WATCHDOG > "${void}" 2>&1 2> "${log}" ; then
echo "blacklist iTCO_wdt" | tee /etc/modprobe.d/blacklist.conf || exit
INTEL_WATCHDOG
stage_ok
else
stage_fail
fi
elif [[ "${CPU}" == *"AuthenticAMD"* && "${kill_watchdog}" == "y" ]]; then
local stage_prompt="AMD Watchdog Configuration"
if arch-chroot /mnt <<-AMD_WATCHDOG > "${void}" 2>&1 2> "${log}" ; then
echo "blacklist sp5100_tco" | tee /etc/modprobe.d/blacklist.conf || exit
AMD_WATCHDOG
stage_ok
else
stage_fail
fi
fi
if [[ "${oomd}" == "y" ]]; then
local stage_prompt="Systemd-oomd Service Activation"
if arch-chroot /mnt <<-OOMD > "${void}" 2>&1 2> "${log}" ; then
mkdir -p /etc/systemd/system.conf.d > "${void}" 2>&1 || exit
cat <<-OOMD_CONF > /etc/systemd/system.conf.d/00-oomd.conf || exit
[Manager]
DefaultMemoryAccounting=yes
OOMD_CONF
systemctl enable systemd-oomd || exit
OOMD
stage_ok
else
stage_fail
fi
fi
if [[ "${irqbalance}" == "y" ]]; then
local stage_prompt="Irqbalance Service Activation"
if arch-chroot /mnt <<-IRQBALANCE > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm irqbalance || exit
systemctl enable irqbalance || exit
IRQBALANCE
stage_ok
else
stage_fail
fi
fi
if [[ "${thermald}" == "y" ]]; then
local stage_prompt="Thermald Service Activation"
if arch-chroot /mnt <<-THERMALD > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm thermald || exit
systemctl enable thermald || exit
THERMALD
stage_ok
else
stage_fail
fi
fi
if [[ "${rngd}" == "y" ]]; then
local stage_prompt="Rngd Service Activation"
if arch-chroot /mnt <<-RNGD > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm rng-tools || exit
systemctl enable rngd || exit
RNGD
stage_ok
else
stage_fail
fi
fi
if [[ "${rtkit}" == "y" ]]; then
local stage_prompt="Rtkit Service Activation"
if arch-chroot /mnt <<-RTKIT > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm realtime-privileges rtkit || exit
systemctl enable rtkit-daemon || exit
usermod -aG realtime ${USERNAME}
RTKIT
stage_ok
else
stage_fail
fi
fi
if [[ "${tlp}" == "y" ]]; then
local stage_prompt="Power-profiles-daemon Removal"
if [[ -e usr/lib/power-profiles-daemon ]]; then
if arch-chroot /mnt <<-PPD > "${void}" 2>&1 2> "${log}" ; then
pacman -Rns --noconfirm power-profiles-daemon || exit
PPD
stage_ok
else
stage_fail
fi
fi
local stage_prompt="Tlp Service Activation"
if arch-chroot /mnt <<-TLP > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm tlp || exit
systemctl enable tlp
systemctl mask systemd-rfkill.service systemd-rfkill.socket || exit
TLP
stage_ok
else
stage_fail
fi
fi
if [[ "${printer}" == "y" ]]; then
local stage_prompt="Print & Scan Services Activation"
if arch-chroot /mnt <<-PRINT_CONF > "${void}" 2>&1 2> "${log}" ; then
systemctl enable avahi-daemon.socket cups.socket cups-browsed ipp-usb || exit
sed -i 's|^hosts.*|hosts: mymachines mdns_minimal resolve [!UNAVAIL=return] files myhostname dns|g' /etc/nsswitch.conf || exit
sed -i 's/ interface = [^ ]*/ interface = all/g' /etc/ipp-usb/ipp-usb.conf || exit
PRINT_CONF
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
foreign() {
if [[ -n "${web_aur}" ]]; then
local stage_prompt="Base-devel Installation"
if [[ "${dev}" != "y" ]]; then
if arch-chroot /mnt <<-BASE-DEVEL > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm base-devel || exit
BASE-DEVEL
stage_ok
else
stage_fail
fi
fi
local stage_prompt="AUR Packages Installation"
if arch-chroot /mnt <<-AUR-PKGS > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm git || exit
sed -i 's|if (( EUID == 0 )); then|if (( EUID != 0 )); then|g' /usr/bin/makepkg || exit
git clone https://aur.archlinux.org/${web_aur}.git && cd ${web_aur} && makepkg -s --noconfirm && pacman -U --noconfirm *x86_64.pkg.tar.zst && cd .. && rm -rf ${web_aur} || exit
sed -i 's|if (( EUID != 0 )); then|if (( EUID == 0 )); then|g' /usr/bin/makepkg || exit
AUR-PKGS
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
optimizations() {
if [[ "${genoptm}" == "y" ]]; then
local stage_prompt="General System Optimizations"
if arch-chroot /mnt <<-GENOPTM > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm ccache ntfs-3g pbzip2 pigz || exit
sed -i 's/^#Color/Color\nILoveCandy/' /etc/pacman.conf || exit
update-pciids || exit
cat <<-MKINITCPIO >> /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit
COMPRESSION="zstd"
COMPRESSION_OPTIONS=(-c -T$(nproc) --auto-threads=logical -)
MODULES_DECOMPRESS="yes"
MKINITCPIO
mkinitcpio -P || exit
cat <<-MAKEPKG > /etc/makepkg.conf.d/makepkgd.conf || exit
#!/hint/bash
CFLAGS="-march=native -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection \
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
MAKEFLAGS="-j$(nproc)"
BUILDENV=(!distcc color ccache check !sign)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto)
COMPRESSGZ=(pigz -c -f -n)
COMPRESSBZ2=(pbzip2 -c -f)
COMPRESSZST=(zstd -c -T0 --auto-threads=logical -)
MAKEPKG
cat <<-SYSCTL > /etc/sysctl.d/99-sysctld.conf || exit
net.core.netdev_max_backlog = 16384
net.core.somaxconn = 8192
net.core.rmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_default = 1048576
net.core.wmem_max = 16777216
net.core.optmem_max = 65536
net.ipv4.tcp_rmem = 4096 1048576 2097152
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_sack = 1
net.core.default_qdisc = cake
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_local_port_range = 30000 65535
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
vm.vfs_cache_pressure = 50
vm.mmap_min_addr = 65536
vm.max_map_count = 1048576
kernel.printk = 0 0 0 0
${perf_stream}
SYSCTL
cat <<-POLKIT > /etc/polkit-1/rules.d/99-udisks2.rules || exit
// Original rules: https://github.com/coldfix/udiskie/wiki/Permissions
// Changes: Added org.freedesktop.udisks2.filesystem-mount-system, as this is used by Dolphin.
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// Dolphin specific:
"org.freedesktop.udisks2.filesystem-mount-system": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.filesystem-unmount-others": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-system": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("wheel")) {
return permission[action.id];
}
});
POLKIT
mkdir -p /etc/systemd/journald.conf.d > ${void} 2>&1 || exit
cat <<-JOURNAL > /etc/systemd/journald.conf.d/00-journald.conf || exit
[Journal]
SystemMaxUse=100M
JOURNAL
mkdir -p /etc/systemd/user.conf.d > ${void} 2>&1 || exit
cat <<-TIMEOUT > /etc/systemd/user.conf.d/00-timeout.conf || exit
[Manager]
DefaultTimeoutStopSec=5s
DefaultTimeoutAbortSec=5s
TIMEOUT
sed -i \
-e '/^# set linenumbers/s/^#//' \
-e '/^# set minibar/s/^#//' \
-e '/^# set mouse/s/^#//' /etc/nanorc || exit
echo " include /usr/share/nano/*.nanorc" | tee -a /etc/nanorc || exit
echo tcp_bbr | tee /etc/modules-load.d/modulesd.conf || exit
cat <<-SUDOERS > /etc/sudoers.d/sudoersd || exit
Defaults pwfeedback
Defaults editor=/usr/bin/nano
%wheel ALL=(ALL) ALL
SUDOERS
visudo -c /etc/sudoers.d/sudoersd || exit
GENOPTM
stage_ok
else
stage_fail
fi
if [[ -d /mnt/etc/udisks2 ]]; then
local stage_prompt="Udisks2 Mount Options"
if arch-chroot /mnt <<-UDISKS2 > "${void}" 2>&1 2> "${log}" ; then
cat <<-UDISKS_CONF > /etc/udisks2/mount_options.conf || exit
[defaults]
ntfs_drivers=ntfs3,ntfs
ntfs:ntfs3_defaults=uid=*,gid=*,windows_names
ntfs:ntfs_defaults=uid=*,gid=*,windows_names
exfat_defaults=uid=*,gid=*,errors=remount-ro
UDISKS_CONF
UDISKS2
stage_ok
else
stage_fail
fi
fi
if [[ -n "${REGDOM}" ]]; then
local stage_prompt="Wpa_Supplicant Configuration"
if arch-chroot /mnt <<-WPA > "${void}" 2>&1 2> "${log}" ; then
cat <<-SUPPLICANT > /etc/wpa_supplicant/wpa_supplicant.conf || exit
country=${REGDOM}
wps_cred_add_sae=1
pmf=2
SUPPLICANT
WPA
stage_ok
else
stage_fail
fi
fi
fi
}
###################################################################################################
view_optm() {
if [[ "${genoptm}" == "v" ]]; then
typeset -f optimizations |grep -E 'pacman|/pacman.conf|update-pciids|usermod|systemctl|/etc|/mkinitcpio.conf.d|/makepkg.conf.d|/sysctl.d|/polkit-1/rules.d|/systemd/journald.conf.d|/systemd/user.conf.d|/nanorc|/modules-load.d|/sudoers.d|/udisks2|/wpa_supplicant/'| less
fi
}
###################################################################################################
secboot_sign() {
if [[ "${sb_sign}" == "y" ]]; then
local stage_prompt="Secure-Boot Signing"
if [[ "${bootloader}" == "1" ]]; then
if arch-chroot /mnt <<-SECSIGN > "${void}" 2>&1 2> "${log}" ; then
systemctl disable systemd-boot-update || exit
pacman -S --noconfirm sbctl || exit
sbctl create-keys || exit
sbctl enroll-keys -m || exit
sbctl sign -s /boot/vmlinuz-${kernel} || exit
sbctl sign -s ${btldr_esp_mount}/EFI/BOOT/BOOTX64.EFI || exit
sbctl sign -s ${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi || exit
sbctl sign -s ${btldr_esp_mount}/EFI/systemd/systemd-bootx64.efi || exit
sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi || exit
SECSIGN
stage_ok
else
stage_fail
fi
if [[ "${setrescue}" == "y" ]]; then
local stage_prompt="Rescue Entry Secure-Boot Signing"
if arch-chroot /mnt <<-SECSIGN > "${void}" 2>&1 2> "${log}" ; then
sbctl sign -s ${btldr_esp_mount}/EFI/Linux/rescue.efi || exit
SECSIGN
stage_ok
else
stage_fail
fi
fi
elif [[ "${bootloader}" == "2" ]]; then
if arch-chroot /mnt <<-SECSIGN > "${void}" 2>&1 2> "${log}" ; then
pacman -S --noconfirm sbctl || exit
sbctl create-keys || exit
sbctl enroll-keys -m || exit
sbctl sign -s /boot/vmlinuz-${kernel} || exit
sbctl sign -s ${btldr_esp_mount}/EFI/GRUB/grubx64.efi || exit
SECSIGN
stage_ok
else
stage_fail
fi
fi
fi
}
###################################################################################################
set_vars() {
# Main Kernel Parameters
boot_opts=()
# Graphics Kernel Parameters
gfx_bootopts=()
# Mkinitcpio Modules
MODULES=()
# Mkinitcpio Binaries
BINARIES=()
# Mkinitcpio Hooks
HOOKS=()
# Zram Swap
if [[ "${swapmode}" == "3" ]]; then
# Zram Swap Kernel Parameters
zram_bootopts="zswap.enabled=0"
fi
# Mkinitcpio Btrfs Binary
if [[ "${fs}" == "2" ]]; then
# Mkinitcpio Binaries
BINARIES+=(/usr/bin/btrfs)
fi
#--------------------------------------------------------------------------------------------------
# ENCRYPTION = 'YES'
if [[ "${encrypt}" == "yes" ]]; then
# Mkinitcpio Modules (Encryption)
MODULES+=("${fs_mod}")
# Encrypted Root Device
encr_root_dev="/dev/mapper/${ENCROOT}"
# Encrypted Root Options
encr_root_opts="rd.luks.name=$(blkid -s UUID -o value "${root_dev}")=${ENCROOT}"
# Encryption Kernel Parameters
encr_root_bootopts="${encr_root_opts} root=${encr_root_dev}"
# SWAP SETUP (Encryption)
# Encrypted Swap Partition
if [[ "${swapmode}" == "1" ]]; then
# Encrypted Swap Partition Options
encr_swap_opts="rd.luks.name=$(blkid -s UUID -o value "${swap_dev}")=swap"
# Encrypted Swap Kernel Parameters
encr_swap_bootopts="resume=/dev/mapper/swap ${encr_swap_opts}"
# Encrypted Swapfile
elif [[ "${swapmode}" == "2" ]]; then
# Ext4 Offset calculation
if [[ "${fs}" == "1" ]]; then
offst="$(filefrag -v /mnt/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}')"
# Btrfs Offset calculation
elif [[ "${fs}" == "2" ]]; then
offst="$(btrfs inspect-internal map-swapfile -r /mnt/swap/swapfile)"
fi
# Encrypted Swap Kernel Parameters
encr_swap_bootopts="resume=${encr_root_dev} resume_offset=${offst}"
fi
# HOOKS SETUP (Encryption)
# Nvidia Vendor
if [[ "${vendor}" == "Nvidia" ]]; then
HOOKS+=(systemd keyboard autodetect microcode modconf sd-vconsole block sd-encrypt filesystems)
# Other Vendors / Multi-Vendors
else
HOOKS+=(systemd keyboard autodetect microcode modconf kms sd-vconsole block sd-encrypt filesystems)
fi
# Fsck
if [[ "${fs}" == "1" ]]; then
HOOKS+=(fsck)
fi
# MAIN KERNEL PARAMETERS (Encryption)
# Encrypted Root Kernel Parameters
boot_opts+=("${encr_root_bootopts}")
# Encrypted Swap Kernel Parameters
if [[ -n "${encr_swap_bootopts}" ]]; then
boot_opts+=("${encr_swap_bootopts}")
fi
# ENCRYPTION = 'NO'
elif [[ "${encrypt}" == "no" ]]; then
# HOOKS SETUP
# Nvidia Vendor
if [[ "${vendor}" == "Nvidia" ]]; then
HOOKS+=(systemd autodetect microcode modconf keyboard sd-vconsole block filesystems)
# Other Vendors / Multi-Vendors
else
HOOKS+=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems)
fi
# Fsck
if [[ "${fs}" == "1" ]]; then
HOOKS+=(fsck)
fi
# MAIN KERNEL PARAMETERS
if [[ "${autoroot}" == "y" ]]; then
boot_opts+=("${multiroot_bootopts}")
fi
fi
#--------------------------------------------------------------------------------------------------
# GFX CONFIGURATION = 'YES'
if [[ "${gfxconf}" == "y" ]]; then
# Nvidia
if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then
MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
gfx_bootopts+=(nvidia.NVreg_UsePageAttributeTable=1)
# Disable GSP Firmware
if [[ "${nogsp}" == "y" ]]; then
gfx_bootopts+=(nvidia.NVreg_EnableGpuFirmware=0)
fi
# Enable Experimental Low Latency Interrupts
if [[ "${lowlat}" == "y" ]]; then
gfx_bootopts+=(nvidia.NVreg_RegistryDwords=RMIntrLockingMode=1)
fi
fi
# AMD
if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then
if [[ -n "${islands}" ]]; then
MODULES+=(amdgpu)
fi
# 'Southern Islands' support
if [[ "${islands}" == "1" ]]; then
gfx_bootopts+=(amdgpu.dc=1 radeon.si_support=0 amdgpu.si_support=1)
# 'Sea Islands' support
elif [[ "${islands}" == "2" ]]; then
gfx_bootopts+=(amdgpu.dc=1 radeon.cik_support=0 amdgpu.cik_support=1)
fi
fi
fi
#--------------------------------------------------------------------------------------------------
# MAIN KERNEL PARAMETERS
if [[ -n "${gfx_bootopts[*]}" ]]; then
boot_opts+=("${gfx_bootopts[*]}")
fi
if [[ "${kill_watchdog}" == "y" ]]; then
boot_opts+=(nowatchdog)
fi
if [[ -n "${cust_bootopts}" ]]; then
boot_opts+=("${cust_bootopts}")
fi
if [[ -n "${btrfs_bootopts}" ]]; then
boot_opts+=("${btrfs_bootopts}")
fi
if [[ -n "${zram_bootopts}" ]]; then
boot_opts+=("${zram_bootopts}")
fi
# MAIN MKINITCPIO MODULES
mkinitcpio_mods="MODULES=(${MODULES[*]})"
# MAIN MKINITCPIO BINARIES
mkinitcpio_bins="BINARIES=(${BINARIES[*]})"
# MAIN MKINITCPIO HOOKS
mkinitcpio_hooks="HOOKS=(${HOOKS[*]})"
}
###################################################################################################
chroot_conf() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Chroot & Configure System${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc}
"
# All Desktop Configuration:
if [[ "${desktop}" != "12" ]]; then
cnfg
main_chroot
if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then
if [[ "${desktop}" == "7" ]]; then
local stage_prompt="Deepin Greeter Configuration"
if arch-chroot /mnt <<-DEEPIN > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-deepin-greeter|g' /etc/lightdm/lightdm.conf || exit
DEEPIN
stage_ok
else
stage_fail
fi
elif [[ "${desktop}" =~ ^(5|8|10)$ ]]; then
local stage_prompt="GTK Greeter Configuration"
if arch-chroot /mnt <<-GTK > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-gtk-greeter|g' /etc/lightdm/lightdm.conf || exit
GTK
stage_ok
else
stage_fail
fi
elif [[ "${desktop}" == "6" ]]; then
local stage_prompt="Slick Greeter Configuration"
if arch-chroot /mnt <<-SLICK > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-slick-greeter|g' /etc/lightdm/lightdm.conf || exit
SLICK
stage_ok
else
stage_fail
fi
fi
fi
if [[ "${vendor}" != "Virtual Machine" ]]; then
if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then
local stage_prompt="Bluetooth Services Activation"
if arch-chroot /mnt <<-BLUETOOTH > "${void}" 2>&1 2> "${log}" ; then
systemctl enable bluetooth || exit
BLUETOOTH
stage_ok
else
stage_fail
fi
fi
fi
if [[ -n "${displaymanager}" ]]; then
local stage_prompt="Display Manager Service Activation"
if arch-chroot /mnt <<-DMSERVICE > "${void}" 2>&1 2> "${log}" ; then
systemctl enable ${displaymanager} || exit
DMSERVICE
stage_ok
else
stage_fail
fi
fi
if [[ "${desktop}" != "12" ]]; then
local stage_prompt="Network Manager Service Activation"
if arch-chroot /mnt <<-NETWORK > "${void}" 2>&1 2> "${log}" ; then
systemctl enable NetworkManager || exit
NETWORK
stage_ok
else
stage_fail
fi
fi
fi
#--------------------------------------------------------------------------------------------------
# Custom System Configuration:
if [[ "${desktop}" == "12" ]]; then
cnfg
main_chroot
if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then
if [[ "${greeternmbr}" == "1" ]]; then
local stage_prompt="GTK Greeter Configuration"
if arch-chroot /mnt <<-GTK > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-gtk-greeter|g' /etc/lightdm/lightdm.conf || exit
GTK
stage_ok
else
stage_fail
fi
elif [[ "${greeternmbr}" == "2" ]]; then
local stage_prompt="Slick Greeter Configuration"
if arch-chroot /mnt <<-SLICK > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-slick-greeter|g' /etc/lightdm/lightdm.conf || exit
SLICK
stage_ok
else
stage_fail
fi
elif [[ "${greeternmbr}" == "3" ]]; then
local stage_prompt="Deepin Greeter Configuration"
if arch-chroot /mnt <<-DEEPIN > "${void}" 2>&1 2> "${log}" ; then
sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-deepin-greeter|g' /etc/lightdm/lightdm.conf || exit
DEEPIN
stage_ok
else
stage_fail
fi
fi
fi
if [[ -n "${customservices}" ]]; then
local stage_prompt="Custom Service(s) Activation"
if arch-chroot /mnt <<-CUSTOMSERV > "${void}" 2>&1 2> "${log}" ; then
systemctl enable ${customservices} || exit
CUSTOMSERV
stage_ok
else
stage_fail
fi
fi
fi
btldrcfg
trimcfg
vm_serv
zramcfg
nvidia_hook
mkinitcpio_preset
var_opts
foreign
optimizations
secboot_sign
completion
installation="ok"
umount -R /mnt
reboot
exit
}
# END FUNCTIONS
###################################################################################################
clear
run_as="$(whoami)"
tty="$(tty)"
void="/dev/null"
log="Amelia_log.txt"
disks="$(lsblk --nodeps --paths --noheadings --output=name,size,model | cat --number)"
trg=""
vars=(LOCALESET="" SETLOCALE="" lcl_slct="" USERNAME="" kernelnmbr="" fs="" gfxcount="" gfxcard="" intelcount="" intelcards="" nvidiacount="" nvidiacards="" amdcount="" amdcards="" gfxconf="" gfx_conf="" gfx_setup="" vendor="" vendor1="" vendor2="" vendor3="" vendor_slct="" desktop="" terminal="" efi_entr_del="" sanity="" install="" bootldr_pkgs="" devel="" REGDOM="" gfx_bootopts="" btrfs_bootopts="" trim="" swapmode="" homecrypt="" greeter="" greeternmbr="" cust_bootopts="" vmpkgs="" vm_services="" perf_stream="" displaymanager="" wireless_reg="" bitness="" bootloader="" gfx_slct="" espsize="" autoroot="" autoesp="" autoxboot="" autohome="" autoswap="" rootprt="" espprt="" xbootprt="" homeprt="" swapprt="" partok="" instl_drive="" sgdsk_nmbr="" part_mode="" preset="" capacity="" cap_gib="" rootsize="" sgdrive="" cgdrive="" smartpart="" presetpart="" prcnt="" roottype="" stage_prompt="" zram="" zram_bootopts="" xbootloader="" multibooting="" hypervisor="" mkinitcpio_mods="" mkinitcpio_bins="" uki="" ukify="" cng_espmnt="" sep_home="" encr_swap_bootopts="" uefimode="" luks_encrypt="" nrg_plc="" multilib="" nvname="" nogsp="" luks_root="" luks_swap="" luks_home="" installation="" kill_watchdog="" oomd="" setrescue="" lowlat="" vendors="" dev="" web="" web_pkg="" web_aur="" web_slct="" printer="" print_pkgs="" shellnmbr="" shell="" shellname="" shellname2="" shell_pkgs="" genoptm="" set_optm="" ask_param="" desk_setup="" set_optm_slct="" irqbalance="" thermald="" rngd="" rtkit="" tlp="" CRYPTPASS="" CRYPTPASS2="" askoptm="" gptslct="" gptok="" gptabort="")
export "${vars[@]}"
sleep 0.2
CYANBG "************************************************************************************************* "
CYANBG " "
CYANBG " ### Amelia Installer ### "
CYANBG " "
CYANBG "************************************************************************************************* "
mode_check
NC "
${bwhite}Press any key to start${nc} "
read -r -s -n 1
clear
set_font
arch
uefi_check
connection_check
upd_clock
machine_dtct
until main_menu; do : ; done