archery/Amelia.sh
Jane Doe 8e6c6402cd Add: Now, a mandatory reboot will take place automatically after a successful LUKS encrypted installation, to prevent re-running the installer in an environment where the kernel has not been/cannot be informed about the recent changes.
Change: A few warning prompts have been edited/added for enhanced clarity.
Add: Now, an 'error_log.txt' file will be created if an error occurs that forces the installation to abort.
This file will be placed at the same directory that 'Amelia.sh' resides, to be used for troubleshooting.
2024-12-28 00:37:19 +00:00

6295 lines
200 KiB
Bash

#!/bin/bash
# Amelia Installer
# https://gitlab.com/prism7/archery
# Version: 8.2.1
set -euo pipefail
###################################################################################################
# COLOR FUNCTIONS
redbg="\e[1;41m"
red="\e[31m"
greenbg="\e[1;42m"
green="\e[32m"
yellowbg="\e[1;43m"
yellow="\e[33m"
yellowl="\e[93m"
bluebg="\e[1;44m"
blue="\e[94m"
magentabg="\e[1;45m"
magenta="\e[35m"
cyanbg="\e[1;46m"
cyan="\e[36m"
bwhite="\e[0;97m"
nc="\e[0m"
REDBG() {
echo -e "${redbg} $1${nc}"
}
RED() {
echo -e "${red} $1${nc}"
}
GREENBG() {
echo -e "${greenbg} $1${nc}"
}
GREEN() {
echo -e "${green} $1${nc}"
}
YELLOWBG() {
echo -e "${yellowbg} $1${nc}"
}
YELLOW() {
echo -e "${yellow} $1${nc}"
}
YELLOWL() {
echo -e "${yellowl} $1${nc}"
}
BLUEBG() {
echo -e "${bluebg} $1${nc}"
}
BLUE() {
echo -e "${blue} $1${nc}"
}
MAGENTABG() {
echo -e "${magentabg} $1${nc}"
}
MAGENTA() {
echo -e "${magenta} $1${nc}"
}
CYANBG() {
echo -e "${cyanbg} $1${nc}"
}
CYAN() {
echo -e "${cyan} $1${nc}"
}
NC() {
echo -e "${nc} $1${nc}"
}
WHITEB() {
echo -e "${bwhite} $1${nc}"
}
# END COLOR FUNCTIONS
###################################################################################################
# PROMPT FUNCTIONS
skip() {
sleep 0.2
YELLOW "
--> Skipping.. "
}
reload() {
sleep 0.2
NC "
--> [${green}Reloading${nc}] "
}
process() {
sleep 0.2
NC "
--> [${green}Processing..${nc}] "
}
pkg_displ() {
sleep 0.2
NC "
${green}Packages to be installed${nc}:
${deskpkgs}"
}
vm() {
sleep 0.2
RED "
----------------------------------
### ${yellow}Virtual Machine detected ${red}###
----------------------------------"
}
invalid() {
sleep 0.2
RED "
--------------------------
### ${yellow}Invalid Response ${red}###
--------------------------"
reload
}
err_try() {
sleep 0.2
RED "
--------------------------------------------
### ${yellow}Errors occured. Please try again.. ${red}###
--------------------------------------------"
reload
}
err_abort() {
sleep 0.2
RED "
------------------------
### ${yellow}Errors occured ${red}###
------------------------"
failure
}
reboot() {
if [[ "${luks_encrypt}" == "ok" ]]; then
sleep 0.2
RED "
-------------------------------------------------------------------
### ${yellow}The system will now ${nc}reboot ${yellow}for all changes to take effect ${red}###
-------------------------------------------------------------------
"
sleep 5
systemctl reboot
fi
}
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 > /dev/null 2>&1 ; then
sleep 0.2
NC "
------------------
### ${green}Unmount OK ${nc}###
------------------"
else
sleep 0.2
RED "
-----------------------------
### ${yellow}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 "
--------------------------------------------
### ${yellow}Please make a choice to continue.. ${red}###
--------------------------------------------"
reload
}
y_n() {
sleep 0.2
RED "
----------------------------------------------
### ${yellow}Please type 'y' or 'n' to continue.. ${red}###
----------------------------------------------"
reload
}
yes_no() {
sleep 0.2
RED "
-------------------------------------------------
### ${yellow}Please type 'yes' or 'no' 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
line2
REDBG " ${yellow}[!] ${stage_prompt} FAILED [!]"
failure
}
completion_err() {
if [[ -e /usr/bin/pv ]]; then
sleep 0.2
CYAN "
(*) ${nc}Please complete${yellowl} '${stage_prompt}' ${nc}to continue
"| pv -qL 70
else
sleep 0.2
CYAN "
(*) ${nc}Please complete${yellowl} '${stage_prompt}' ${nc}to continue
"
fi
}
intel() {
line2
BLUEBG " --------------------------------- "
BLUEBG " ### INTEL Graphics detected ### "
BLUEBG " --------------------------------- "
NC "
* ${vgacard}
"
}
nvidia() {
line2
GREENBG " ---------------------------------- "
GREENBG " ### NVIDIA Graphics detected ### "
GREENBG " ---------------------------------- "
NC "
* ${vgacard}
"
}
amd() {
line2
REDBG " ------------------------------- "
REDBG " ### AMD Graphics detected ### "
REDBG " ------------------------------- "
NC "
* ${vgacard}
"
}
arch() {
sleep 0.2
line3
BLUEBG "************************************************************************************************* "
BLUEBG " "
BLUEBG " ##### Archlinux Installation ##### "
BLUEBG " "
BLUEBG "************************************************************************************************* "
line2
}
cnfg() {
sleep 0.2
line3
MAGENTABG "------------------------------------------------------------------------------------------------- "
MAGENTABG " ### Configuring ### "
MAGENTABG "------------------------------------------------------------------------------------------------- "
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 > /dev/null 2>&1
exit
}
# END PROMPT FUNCTIONS
###################################################################################################
# FUNCTIONS
first_check() {
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 console & re-run to enable "| pv -qL 70
echo
else
MAGENTABG " 'Terminus Font' detected ==> Log in as 'ROOT' in console & re-run to enable "
echo
fi
fi
fi
if [[ "${run_as}" == "root" ]]; then
REDBG " ${yellow}---------------------------------------- "
REDBG " ${yellow}### The Installer Runs In ROOT Mode ### "
REDBG " ${yellow}---------------------------------------- "
else
YELLOWBG " ---------------------------------------- "
YELLOWBG " ### The Installer Runs In DEMO Mode ### "
YELLOWBG " ---------------------------------------- "
fi
}
###################################################################################################
slct_font() {
sleep 0.2
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
if [[ "${fontselect}" == "1" ]]; then
setfont ter-v18b
elif [[ "${fontselect}" == "2" ]]; then
setfont ter-v32b
else
invalid
return 1
fi
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 "
--------------------------
### ${yellow}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 > /dev/null 2>&1; then
ok
else
RED "
----------------------------------------------------------------------
### ${yellow}A connection to ${nc}'www.archlinux.org' ${yellow}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
ok
}
###################################################################################################
machine_dtct() {
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 -E 'Chassis' | awk "{print \$2}")"
if [[ "${CPU}" == *"GenuineIntel"* ]]; then
microcode="intel-ucode"
nrg_plc="x86_energy_perf_policy"
cpu_name="Intel"
else
microcode="amd-ucode"
cpu_name="AMD"
fi
if [[ "${hardw_model_vend}" == "${hardw_vendor}" ]]; then
sleep 0.2
YELLOW "
### This system is a(n) ${nc}${hardw_model} ${yellow}${machine}
### The ${nc}${cpu_name} ${yellow}cpu microcode will be installed
"
else
sleep 0.2
YELLOW "
### This system is a(n) ${nc}${hardw_model} ${yellow}${hardw_vendor} ${machine}
### The ${nc}${cpu_name} ${yellow}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}to utilize ${yellowl}'Guided Navigation' ${nc}& ${yellowl}'Smart Partitioning' ${nc}functions
" | pv -qL 70
else
CYAN "
(*) ${nc}Select ${bwhite}[4] ${nc}to utilize ${yellowl}'Guided Navigation' ${nc}& ${yellowl}'Smart Partitioning' ${nc}functions
"
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 "
---------------------------------
### ${yellow}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
[ ] 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 ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
slct_locale() {
local prompt="Locale"
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]
### Exclude ${nc}'.UTF_8' ${yellow}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 | more
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"
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Keyboard Layout Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###
"
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 | more
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}" > /dev/null 2>&1
fi
ok
}
###################################################################################################
user_setup() {
local prompt="User"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}User Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}###
"
BLUE "
Enter a username: "
read -r -p "
==> " USERNAME
echo
if [[ -z "${USERNAME}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${yellow}Please enter a username to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${USERNAME}" =~ [[:upper:]] ]]; then
sleep 0.2
RED "
------------------------------------------------------
### ${yellow}Uppercase is not allowed. Please try again.. ${red}###
------------------------------------------------------"
reload
return 1
fi
BLUE "
Enter a password for${nc} ${cyan}${USERNAME}${blue}: "
read -r -p "
==> " USERPASSWD
echo
if [[ -z "${USERPASSWD}" ]]; then
sleep 0.2
RED "
---------------------------------------------
### ${yellow}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 "
---------------------------------------------------
### ${yellow}Passwords don't match. Please try again.. ${red}###
---------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
rootuser_setup() {
local prompt="Root User"
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 "
---------------------------------------------------------------
### ${yellow}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 "
---------------------------------------------------
### ${yellow}Passwords don't match. Please try again.. ${red}###
---------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
slct_hostname() {
local prompt="Hostname"
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 "
---------------------------------------------
### ${yellow}Please enter a hostname to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${HOSTNAME}" =~ [[:upper:]] ]]; then
sleep 0.2
RED "
----------------------------------------------------
### ${yellow}Lowercase is preferred. Please try again.. ${red}###
----------------------------------------------------"
reload
return 1
fi
ok
}
###################################################################################################
sys_submn() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}System Configuration${nc} ${magenta}]${nc}----------------------------------${magenta}###
"
YELLOW "
> Select a Submenu: "
NC "
[1] Kernel, Bootloader, ESP Mountpoint & Secure Signing
[2] Filesystem & Swap Setup
[3] Graphics Setup
[4] Desktop Setup
[5] EFI Boot Entries Deletion
[6] Wireless Regulatory Domain Setup
[ ] Return to Main Menu "
BLUE "
Enter a number: "
read -r -p "
==> " sysmenu
echo
case "${sysmenu}" in
1)
until dtct_hyper; do : ; done
until slct_krnl; do : ; done
until ask_bootldr; do : ; done
until slct_espmnt; do : ; done
until ask_sign; do : ; done
return 1 ;;
2)
until ask_fs; do : ; done
until ask_swap; do : ; done
return 1 ;;
3)
until dtct_vga; do : ; done
return 1 ;;
4)
until slct_dsktp; do : ; done
return 1 ;;
5)
until boot_entr; do : ; done
return 1 ;;
6)
until wireless_rgd; do : ; done
return 1 ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
dtct_hyper() {
hypervisor="$(systemd-detect-virt)"
if [[ "${hypervisor}" != "none" ]]; then
vendor="Virtual Machine"
vgaconf="n"
vgapkgs=""
fi
case "${hypervisor}" in
kvm)
vmpkgs="spice spice-vdagent spice-protocol spice-gtk qemu-guest-agent swtpm"
vm_services="qemu-guest-agent" ;;
vmware)
vmpkgs="open-vm-tools"
vm_services="vmtoolsd vmware-vmblock-fuse" ;;
oracle)
vmpkgs="virtualbox-guest-utils"
vm_services="" ;;
microsoft)
vmpkgs="hyperv"
vm_services="hv_fcopy_daemon hv_kvp_daemon hv_vss_daemon" ;;
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 kernel
"
kernel="linux-hardened"
kernelname="Linux Hardened" ;;
4)
kernel="linux-zen"
kernelname="Linux Zen" ;;
"")
sleep 0.2
RED "
--------------------------------
### ${yellow}Please select a Kernel ${red}###
--------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### The ${kernelname} kernel has been selected
"
ok
if [[ "${vga_slct}" == "yes" ]]; then
local stage_prompt="Graphics Setup"
completion_err
until dtct_hyper; do : ; done
until dtct_vga; do : ; done
fi
}
###################################################################################################
ask_bootldr() {
local prompt="Bootloader"
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 "
------------------------------------
### ${yellow}Please select a Bootloader ${red}###
------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
local prompt="Bootloader Selection"
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
if [[ "${espmnt}" == "1" ]]; then
esp_mount="/mnt/efi"
btldr_esp_mount="/efi"
sleep 0.2
YELLOW "
### '/mnt/efi' mountpoint has been selected
"
elif [[ "${espmnt}" == "2" ]]; then
esp_mount="/mnt/boot"
btldr_esp_mount="/boot"
sleep 0.2
YELLOW "
### '/mnt/boot' mountpoint has been selected
"
else
invalid
return 1
fi
ok
if [[ "${sanity}" == "no" ]]; then
until sanity_check; do : ; done
fi
}
###################################################################################################
ask_sign() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Secure Signing${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
if [[ "${bootloader}" == "1" ]]; then
YELLOW "
> Sign Unified Kernel Image(s) for use with ${nc}Secure Boot ${nc}${yellow}? [Y/n]"
elif [[ "${bootloader}" == "2" ]]; then
YELLOW "
> Sign Kernel for use with ${nc}Secure Boot ${nc}${yellow}? [Y/n]"
fi
BLUE "
Enter [Y/n]: "
read -r -p "
==> " sb_sign
echo
sb_sign="${sb_sign:-y}"
sb_sign="${sb_sign,,}"
if [[ "${sb_sign}" == "y" ]]; then
local prompt="Secure Boot 'Setup' Mode Verification"
SB_Status="$(bootctl status 2> /dev/null | grep -E 'Secure Boot' | awk "{print \$4}")"
if [[ ${SB_Status} == "(setup)" ]]; then
ok
else
sleep 0.2
RED "
-----------------------------------------
### ${yellow}Secure Boot Not in 'Setup' Mode ${red}###
-----------------------------------------"
failure
fi
sleep 0.2
YELLOW "
### 'Secure Boot Signing' has been selected
"
elif [[ "${sb_sign}" == "n" ]]; then
skip
else
y_n
return 1
fi
local prompt="Secure Boot Signing setup"
ok
}
###################################################################################################
ask_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:-y}"
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 "
------------------------------------
### ${yellow}Please select a Filesystem ${red}###
------------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
ask_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
"
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
if [[ "${vga_slct}" == "yes" ]]; then
local stage_prompt="Graphics Setup"
completion_err
until dtct_hyper; do : ; done
until dtct_vga; do : ; done
fi
}
###################################################################################################
set_swapsize() {
local prompt="Swapsize"
BLUE "
Enter Swap size ${bwhite}(in GB)${blue}: "
read -r -p "
==> " swapsize
echo
if [[ -z "${swapsize}" ]]; then
sleep 0.2
RED "
------------------------------------------
### ${yellow}Please enter a value to continue ${red}###
------------------------------------------"
reload
line2
return 1
elif [[ "${swapsize}" =~ [[:digit:]] ]]; then
ok
else
sleep 0.2
RED "
-------------------------------------------
### ${yellow}Please use only digits as a value ${red}###
-------------------------------------------"
reload
line2
return 1
fi
}
###################################################################################################
dtct_vga() {
if [[ "${hypervisor}" != "none" ]]; then
vm
sleep 0.2
YELLOW "
--> Graphics Setup skipped
"
return 0
fi
if [[ -z "${kernelnmbr}" ]]; then
local stage_prompt="Kernel, Bootloader, ESP Mountpoint & Secure Signing"
completion_err
until slct_krnl; do : ; done
until ask_bootldr; do : ; done
until slct_espmnt; do : ; done
until ask_sign; do : ; done
return 1
fi
if [[ -z "${fs}" ]]; then
local stage_prompt="Filesystem & Swap Setup"
completion_err
until ask_fs; do : ; done
until ask_swap; do : ; done
return 1
fi
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Graphics Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
vgacount="$(lspci | grep -E -c 'VGA|Display|3D')"
vgacard="$(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 [[ "${vgacount}" == "1" ]]; then
dtct_single_vga
else
dtct_multi_vga
fi
}
###################################################################################################
dtct_single_vga() {
local prompt="Graphics Setup"
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
YELLOW "
### ${sourcetype} drivers will be used "
if [[ "${vendor}" == "Nvidia" ]]; then
sleep 0.2
RED "
----------------------------------------------------
### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}###
----------------------------------------------------"
fi
YELLOW "
> Configure the Graphics subsystem and enable HW acceleration ? [Y/n]
"
if [[ "${vendor}" == "Nvidia" ]]; then
YELLOW "
### Selecting 'n' defaults to using the open-source 'nouveau' driver"
fi
BLUE "
Enter [Y/n]: "
read -r -p "
==> " vgaconf
vgaconf="${vgaconf:-y}"
vgaconf="${vgaconf,,}"
if [[ "${vgaconf}" == "y" || "${vgaconf}" == "n" ]]; then
vga_conf
else
invalid
return 1
fi
}
###################################################################################################
dtct_multi_vga() {
local prompt="Graphics Setup"
if [[ "${vgacount}" == "2" ]]; then
vga_setup="Dual"
elif [[ "${vgacount}" == "3" ]]; then
vga_setup="Triple"
fi
sleep 0.2
YELLOW "
### ${vga_setup} Graphics setup detected, consisting of: "
NC "
____________________________________________________________________"
if [[ "${intelcount}" -ge "1" ]]; then
vendor1="Intel"
NC "
[${intelcount}] Intel Graphics device(s)
${intelcards}
____________________________________________________________________"
fi
if [[ "${amdcount}" -ge "1" ]]; then
vendor2="AMD"
NC "
[${amdcount}] AMD Graphics device(s)
${amdcards}
____________________________________________________________________"
fi
if [[ "${nvidiacount}" -ge "1" ]]; then
vendor3="Nvidia"
NC "
[${nvidiacount}] Nvidia Graphics device(s)
${nvidiacards}
____________________________________________________________________"
fi
YELLOW "
> Configure the Graphics subsystem and enable HW acceleration for : "
if [[ -n "${vendor1}" && -n "${vendor2}" ]]; then
NC "
[1] Intel
[2] AMD
[3] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
if [[ "${vendor_slct}" == "1" ]]; then
vendor="Intel"
elif [[ "${vendor_slct}" == "2" ]]; then
vendor="AMD"
else
vendor="none"
fi
elif [[ -n "${vendor1}" && -n "${vendor3}" ]]; then
NC "
[1] Intel
${red}----------------------------------------------------${nc}
[2] Nvidia ${red}### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}###${nc}
${red}----------------------------------------------------${nc}
[3] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
if [[ "${vendor_slct}" == "1" ]]; then
vendor="Intel"
elif [[ "${vendor_slct}" == "2" ]]; then
vendor="Nvidia"
else
vendor="none"
fi
elif [[ -n "${vendor2}" && -n "${vendor3}" ]]; then
NC "
[1] Amd
${red}----------------------------------------------------${nc}
[2] Nvidia ${red}### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}###${nc}
${red}----------------------------------------------------${nc}
[3] None "
BLUE "
Enter a number: "
read -r -p "
==> " vendor_slct
if [[ "${vendor_slct}" == "1" ]]; then
vendor="AMD"
elif [[ "${vendor_slct}" == "2" ]]; then
vendor="Nvidia"
else
vendor="none"
fi
fi
if [[ "${vendor}" == "Intel" || "${vendor}" == "AMD" ]]; then
sourcetype="Open-source"
vgaconf="y"
elif [[ "${vendor}" == "Nvidia" ]]; then
sourcetype="Proprietary"
vgaconf="y"
elif [[ "${vendor}" == "none" ]]; then
vgaconf="n"
vgapkgs=""
echo
skip
ok
return 0
fi
if [[ "${vendor}" != "none" ]]; then
sleep 0.2
YELLOW "
### ${sourcetype} drivers will be used
"
fi
vga_conf
}
###################################################################################################
vga_conf() {
local prompt="Graphics Setup"
if [[ "${vgaconf}" == "y" ]]; then
if [[ "${vendor}" == "Intel" ]]; then
perf_stream="dev.i915.perf_stream_paranoid = 0"
vgapkgs="intel-media-driver intel-media-sdk libva-intel-driver vpl-gpu-rt vkd3d vulkan-intel vulkan-mesa-layers"
elif [[ "${vendor}" == "AMD" ]]; then
vgapkgs="libva-mesa-driver mesa-vdpau vkd3d vulkan-mesa-layers vulkan-radeon"
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
if [[ -z "${islands}" ]]; then
skip
echo
elif [[ "${islands}" == "1" ]]; then
NC "
==> [${green}Southern Islands OK${nc}]
"
elif [[ "${islands}" == "2" ]]; then
NC "
==> [${green}Sea Islands OK${nc}]
"
else
invalid
return 1
fi
elif [[ "${vendor}" == "Nvidia" ]]; then
sleep 0.2
YELLOW "
> Select Nvidia architecture: "
NC "
[1] NV160 (Turing) Graphics or newer
[2] NV110 (Maxwell) Graphics or newer "
BLUE "
Enter a number: "
read -r -p "
==> " family
if [[ "${family}" == "1" ]]; then
sleep 0.2
NC "
==> [${green}Turing+ OK${nc}]
"
elif [[ "${family}" == "2" ]]; then
sleep 0.2
NC "
==> [${green}Maxwell+ OK${nc}]
"
else
echo
invalid
return 1
fi
# Turing+ Family
if [[ "${family}" == "1" ]]; then
# Linux Kernel
if [[ "${kernelnmbr}" == "1" ]]; then
nvname="nvidia-open"
vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-open nvidia-settings nvidia-utils opencl-nvidia vkd3d"
# Other Kernels
else
vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-open-dkms nvidia-settings nvidia-utils opencl-nvidia vkd3d"
fi
# Maxwell+ Family
elif [[ "${family}" == "2" ]]; then
# Linux Kernel
if [[ "${kernelnmbr}" == "1" ]]; then
nvname="nvidia"
vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia nvidia-settings nvidia-utils opencl-nvidia vkd3d"
# Linux LTS Kernel
elif [[ "${kernelnmbr}" == "2" ]]; then
nvname="nvidia-lts"
vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-lts nvidia-settings nvidia-utils opencl-nvidia vkd3d"
# Other Kernels
else
vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-dkms nvidia-settings nvidia-utils opencl-nvidia vkd3d"
fi
fi
if [[ "${swapmode}" == "3" || "${swapmode}" == "4" ]]; then
sleep 0.2
RED "
--------------------------------------------
### ${yellow}Incompatible Swap setting detected ${red}###
--------------------------------------------"
CYAN "
(*) ${nc}Nvidia's ${yellowl}'Suspend/Resume' ${nc}feature needs a valid ${yellowl}swapping ${nc}mechanism to work
"
reload
until ask_swap; do : ; done
return 1
fi
fi
sleep 0.2
YELLOW "
### ${vendor} Graphics will be automatically configured
"
elif [[ "${vgaconf}" == "n" ]]; then
if [[ "${vendor}" == "nvidia" ]]; then
vgapkgs="vulkan-nouveau"
fi
echo
skip
fi
vga_slct="yes"
ok
}
###################################################################################################
slct_dsktp() {
local prompt="Desktop Setup"
custompkgs=""
sleep 0.2
NC "
${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Desktop Setup${nc} ${magenta}]${nc}--------------------------------------${magenta}###
"
YELLOW "
> Make a selection: "
NC "
[1] Plasma
[2] Minimal Plasma & Desktop Apps & System Optimizations
[3] Gnome
[4] Minimal Gnome & Desktop Apps & System Optimizations
[5] Xfce
[6] Cinnamon
[7] Deepin
[8] Budgie
[9] Lxqt
[10] Mate
[11] Basic Arch Linux (No GUI)
[12] Custom Arch Linux ${red}### ${yellow}EXPERTS ONLY ${red}### "
BLUE "
Enter a number: "
read -r -p "
==> " packages
echo
case "${packages}" in
1)
desktopname="Plasma" ;;
2)
desktopname="Minimal Plasma (System Optimized)" ;;
3)
desktopname="Gnome" ;;
4)
desktopname="Minimal Gnome (System Optimized)" ;;
5)
desktopname="Xfce" ;;
6)
desktopname="Cinnamon"
sleep 0.2
YELLOW "
### NOTE: Cinnamon desktop lacks a native Terminal emulator by design
### You can use linux console (ctrl+alt+F3) for shell access
> Install ${nc}'gnome-terminal' ${yellow}for convenience ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " console
console="${console:-y}"
console="${console,,}"
case "${console}" in
y)
terminal="gnome-terminal"
sleep 0.2
NC "
==> [${green}Terminal OK${nc}] " ;;
n)
echo
skip ;;
*)
invalid
return 1 ;;
esac ;;
7)
desktopname="Deepin" ;;
8)
desktopname="Budgie"
sleep 0.2
YELLOW "
### NOTE: Budgie desktop lacks a native Terminal emulator by design
### You can use linux console (ctrl+alt+F3) for shell access
> Install ${nc}'gnome-terminal' ${yellow}for convenience ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " console
console="${console:-y}"
console="${console,,}"
case "${console}" in
y)
terminal="gnome-terminal"
sleep 0.2
NC "
==> [${green}Terminal OK${nc}] " ;;
n)
echo
skip ;;
*)
invalid
return 1 ;;
esac ;;
9)
desktopname="Lxqt" ;;
10)
desktopname="Mate" ;;
11)
desktopname="Basic Arch Linux" ;;
12)
desktopname="Custom Arch Linux"
until cust_sys; do :; done
return 0 ;;
"")
choice
return 1 ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### ${desktopname} has been selected
### NOTE: 'base' meta-package does not include the tools needed for building packages
> Install ${nc}'base-devel' ${yellow}meta-package ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " dev
dev="${dev:-y}"
dev="${dev,,}"
case "${dev}" in
y)
devel="base-devel"
sleep 0.2
NC "
==> [${green}base-devel OK${nc}] " ;;
n)
echo
skip ;;
*)
invalid
return 1 ;;
esac
sleep 0.2
YELLOW "
### NOTE: Custom Kernel Parameters can be set at boot time
> Enter your own Kernel Parameters ? [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)
add_prmtrs ;;
n)
echo
skip ;;
*)
invalid
return 1 ;;
esac
ok
}
###################################################################################################
cust_sys() {
local prompt="Custom Arch Linux"
until add_pkgs; do : ; done
until add_services; do : ; done
until add_prmtrs; 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 "
---------------------------------------------
### ${yellow}Please enter package(s) to continue ${red}###
---------------------------------------------"
reload
return 1
elif [[ "${custompkgs}" =~ "lightdm" ]]; then
echo
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
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
echo
skip
else
ok
fi
}
###################################################################################################
add_prmtrs() {
local prompt="Kernel Parameters"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Add Your Kernel Parameters${nc} ${magenta}]${nc}-------------------------------${magenta}###
"
YELLOW "
### Empty to skip
"
BLUE "
Enter your Kernel parameters to be set at boot ${bwhite}(space-seperated)${blue}: "
read -r -p "
==> " cust_bootopts
if [[ -z "${cust_bootopts}" ]]; then
echo
skip
else
ok
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: ${yellow}${entrnmbr} "
read -r -p "
==> " boot_entry
echo
if [[ -n "${boot_entry}" ]]; then
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${yellow}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"
}
###################################################################################################
wireless_rgd() {
if [[ "${hypervisor}" != "none" ]]; then
wrlss_rgd="yes"
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 "
> 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
if [[ -z "${REGDOM}" ]]; then
echo
skip
elif [[ "${REGDOM}" == "l" ]]; then
sed 's|^#WIRELESS_REGDOM=||g' /etc/conf.d/wireless-regdom |sed 's|"||g'| more
return 1
elif [[ "${REGDOM}" =~ [[:lower:]] ]]; then
sleep 0.2
RED "
------------------------------------------------------
### ${yellow}Lowercase is not allowed. Please try again.. ${red}###
------------------------------------------------------"
reload
return 1
elif ! grep \""${REGDOM}"\" /etc/conf.d/wireless-regdom > /dev/null 2>&1 ; then
invalid
return 1
else
wireless_reg="wireless-regdb"
sleep 0.2
YELLOW "
### ${REGDOM} Country Code has been selected
"
fi
ok
wrlss_rgd="yes"
}
###################################################################################################
dsks_submn() {
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Disk Management${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
YELLOW "
> Select a Submenu: "
NC "
[1] Disk 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 disk_mngr; do : ; done ;;
"")
until main_menu; do : ; done ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
gpt_mngr() {
local prompt="Disk GPT"
sleep 0.2
NC "
${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Disk GPT Manager${nc} ${magenta}]${nc}------------------------------------${magenta}###
"
gpt_dsk_nmbr=" "
while [[ -n "${gpt_dsk_nmbr}" ]]; do
YELLOW "
> Select a disk to manage its GPT:
### Select disk and:
### Type ${nc}'?'${yellow} for help, ${nc}'x'${yellow} for extra functionality or ${nc}'q'${yellow} to quit "
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}")"
if [[ -e "${gptdrive}" ]]; then
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${yellow}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
fi
NC "
______________________________________________
"
gdisk "${gptdrive}"
sleep 0.2
NC "
==> [${green}${gptdrive} OK${nc}]
"
else
invalid
return 1
fi
else
skip
ok
if [[ "${install}" == "yes" ]]; then
until instl_dsk; do : ; done
else
until dsks_submn; do : ; done
fi
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 ${nc}Dual/Multi-Booting ${yellow}with other OS's ? [y/n]"
BLUE "
Enter [y/n]: "
read -r -p "
==> " 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
}
###################################################################################################
disk_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 "
------------------------------
### ${yellow}Please select a Mode ${red}###
------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
}
###################################################################################################
man_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
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
YELLOW "
> Select a Partition Layout Preset: "
NC "
${cyan}* Ext4${nc} compatible Layout
${magenta}* Btrfs${nc} compatible Layout
[1] Create '/ESP' and '/Root' (${cyan}Ext4${nc},${magenta}Btrfs${nc})
[2] Create '/ESP', '/Root' and '/Swap' (${cyan}Ext4${nc},${magenta}Btrfs${nc})
[3] Create '/ESP', '/Root' and '/Home' (${cyan}Ext4${nc})
[4] Create '/ESP', '/Root', '/Home' and '/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"
fi
}
###################################################################################################
auto_part() {
slct_autoprt="yes"
smartpart=""
presetpart=""
local prompt="Disk Partitions"
local stage_prompt="Auto-Partitioning"
sleep 0.2
NC "
${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}Automatic Partitioning${nc} ${magenta}]${nc}---------------------------------${magenta}###
"
sleep 0.2
line2
REDBG " ------------------------------------------------------------ "
REDBG " [!] WARNING: All data on selected disk will be destroyed [!] "
REDBG " ------------------------------------------------------------ "
line2
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
if [[ -e "${instl_drive}" && "${use_manpreset}" != "yes" ]]; then
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
if [[ "${smartpart}" == "y" ]]; then
sgdsk_nmbr="${instl_dsk_nmbr}"
elif [[ "${smartpart}" == "n" ]]; then
sgdsk_nmbr="${instl_dsk_nmbr}"
use_manpreset="yes"
process
until man_preset; do : ; done
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
fi
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 "
-----------------------------------
### ${yellow}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
fi
if [[ -z "${use_manpreset}" ]]; then
if [[ "${fs}" == "2" ]]; then
if [[ "${swapmode}" == "1" ]]; then
preset="2"
elif [[ "${swapmode}" != "1" ]]; then
preset="1"
fi
elif [[ "${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
else
until man_preset; do : ; done
fi
elif [[ -z "${preset}" ]] ; then
process
until manual_part; do : ; done
return 0
fi
if [[ "${preset}" == "3" || "${preset}" == "4" ]] ; then
sleep 0.2
YELLOW "
### Total detected capacity of disk ${nc}${sgdrive} ${yellow}is ${nc}${cap_gib} GiB${yellow}
### Default ${nc}/Root${yellow} Partition's size is aprox. ${nc}25%${yellow} of total disk capacity ${nc}[${rootsize} GiB]${yellow}
> Set /Root Partition's Percentage to a custom value ? "
BLUE "
Enter a Custom Percentage number ${nc}e.g. 30 ${bwhite}(empty to skip)${blue}: "
read -r -p "
==> " prcnt
echo
fi
if [[ "${preset}" == "3" || "${preset}" == "4" ]] ; then
if [[ "${prcnt}" == [[:alpha:]] ]]; then
sleep 0.2
RED "
-------------------------------------------
### ${yellow}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 "
-----------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}No space left for other partitions ${red}###
-----------------------------------------------------"
reload
return 1
else
invalid
return 1
fi
fi
case "${preset}" in
1)
sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n2:0:0 -t2:8304 -c2:ROOT "${sgdrive}" > /dev/null 2>&1 || stage_fail
partprobe -s "${sgdrive}" > /dev/null 2>&1 || stage_fail
if [[ "${install}" == "yes" ]]; then
until sanity_check; do : ; done
else
ok
fi ;;
2)
until set_swapsize; do : ; done
sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n3:0:0 -t3:8304 -c3:ROOT "${sgdrive}" > /dev/null 2>&1 || stage_fail
partprobe -s "${sgdrive}" > /dev/null 2>&1 || stage_fail
if [[ "${install}" == "yes" ]]; then
until sanity_check; do : ; done
else
ok
fi ;;
3)
sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n2:0:+"${rootsize}"G -t2:8304 -c2:ROOT "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n3:0:0 -t3:8302 -c3:HOME "${sgdrive}" > /dev/null 2>&1 || stage_fail
partprobe -s "${sgdrive}" > /dev/null 2>&1 || stage_fail
if [[ "${install}" == "yes" ]]; then
until sanity_check; do : ; done
else
ok
fi ;;
4)
until set_swapsize; do : ; done
sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n3:0:+"${rootsize}"G -t3:8304 -c3:ROOT "${sgdrive}" > /dev/null 2>&1 || stage_fail
sgdisk -I -n4:0:0 -t4:8302 -c4:HOME "${sgdrive}" > /dev/null 2>&1 || stage_fail
partprobe -s "${sgdrive}" > /dev/null 2>&1 || stage_fail
if [[ "${install}" == "yes" ]]; then
until sanity_check; do : ; done
else
ok
fi ;;
"")
if [[ "${smartpart}" == "n" ]]; then
reload
until disk_mngr; do : ; done
return 0
fi
if [[ "${slct_autoprt}" == "yes" ]]; then
reload
until dsks_submn; do : ; done
return 0
fi
sleep 0.2
RED "
--------------------------------
### ${yellow}Please select a Preset ${red}###
--------------------------------"
reload
return 1 ;;
*)
invalid
return 1 ;;
esac
if [[ "${install}" == "yes" ]]; then
return 0
fi
until dsks_submn; do : ; done
else
invalid
return 1
fi
else
skip
reload
if [[ -z "${sanity}" ]]; then
until dsks_submn; do : ; done
elif [[ "${sanity}" == "no" ]]; then
until sanity_check; do : ; done
elif [[ "${revision}" == "yes" ]]; then
return 0
elif [[ "${sanity}" == "ok" ]]; then
if [[ "${install}" == "yes" ]]; then
return 0
fi
until dsks_submn; do : ; done
fi
fi
}
###################################################################################################
manual_part() {
local prompt="Disks"
stage_prompt="Partitioning"
sleep 0.2
NC "
${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Manual Partitioning${nc} ${magenta}]${nc}-----------------------------------${magenta}###
"
cgdsk_nmbr=" "
while [[ -n "${cgdsk_nmbr}" ]]; do
line3
NC " SUPPORTED PARTITION TYPES & MOUNTPOINTS: "
line2
REDBG " ------------------------------------------------------------------------------------------- "
REDBG " ### Linux Root x86-64 Partition [ GUID Code: 8304 ] Mountpoint: / ### "
REDBG " ------------------------------------------------------------------------------------------- "
echo
BLUEBG " ------------------------------------------------------------------------------------------- "
BLUEBG " ### EFI System Partition [ GUID Code: ef00 ] Mountpoint: /efi or /boot ### "
BLUEBG " ------------------------------------------------------------------------------------------- "
echo
GREENBG " ------------------------------------------------------------------------------------------- "
GREENBG " ### Linux Home Partition [ GUID Code: 8302 ] Mountpoint: /home ### "
GREENBG " ------------------------------------------------------------------------------------------- "
echo
YELLOWBG " ------------------------------------------------------------------------------------------- "
YELLOWBG " ### Linux Swap Partition [ GUID Code: 8200 ] Mountpoint: /swap ### "
YELLOWBG " ------------------------------------------------------------------------------------------- "
echo
MAGENTABG " ------------------------------------------------------------------------------------------- "
MAGENTABG " ### Linux Extended Boot Partition [ GUID Code: ea00 ] Mountpoint: /boot ### "
MAGENTABG " ------------------------------------------------------------------------------------------- "
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
if [[ "${run_as}" != "root" ]]; then
sleep 0.2
RED "
-----------------------------------
### ${yellow}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
fi
cgdisk "${cgdrive}"
clear
sleep 0.2
NC "
==> [${green}Disk ${cgdrive} OK${nc}] "
partprobe -s "${cgdrive}"
return 1
else
invalid
return 1
fi
else
skip
if [[ "${partok}" == "n" ]]; then
until sanity_check; do : ; done
elif [[ -z "${sanity}" ]]; then
until dsks_submn; do : ; done
elif [[ "${sanity}" == "no" ]]; then
until sanity_check; do : ; done
elif [[ "${revision}" == "yes" ]]; then
return 0
elif [[ "${sanity}" == "ok" ]]; then
if [[ "${install}" == "yes" ]]; then
return 0
fi
until dsks_submn; do : ; done
fi
fi
done
}
###################################################################################################
instl_dsk() {
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
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 "
-----------------------------------
### ${yellow}Root Privileges Missing.. ${red}###
-----------------------------------"
reload
until dsks_submn; do : ; done
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" ]]; then
sleep 0.2
RED "
---------------------------------------
### ${yellow}No GPT found 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
else
invalid
return 1
fi
else
choice
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
RED "
----------------------------------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux x86-64 /Root Partitions have been detected ${red}###
----------------------------------------------------------------------------
"
sleep 0.2
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
NC "
Linux x86-64 /Root Partitions:
------------------------------
${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
stage_fail
else
y_n
return 1
fi
fi
if [[ "${espcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
RED "
--------------------------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}Multiple EFI System Partitions have been detected ${red}###
--------------------------------------------------------------------
"
sleep 0.2
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
NC "
Linux EFI System Partitions:
----------------------------
${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
stage_fail
else
y_n
return 1
fi
fi
if [[ "${xbootcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
RED "
-----------------------------------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux Extended Boot Partitions have been detected ${red}###
-----------------------------------------------------------------------------
"
sleep 0.2
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
NC "
Linux Extended Boot Partitions:
----------------------------
${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
stage_fail
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
RED "
---------------------------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux /Home Partitions have been detected ${red}###
---------------------------------------------------------------------
"
sleep 0.2
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
NC "
Linux /Home Partitions:
-----------------------
${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
stage_fail
else
y_n
return 1
fi
fi
if [[ ${swapmode} == "1" && "${swapcount}" -gt "1" ]]; then
local stage_prompt="Selecting Partition"
sleep 0.2
RED "
---------------------------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux /Swap Partitions have been detected ${red}###
---------------------------------------------------------------------
"
sleep 0.2
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
NC "
Linux /Swap Partitions:
------------------------
${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
stage_fail
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 "
-----------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}/Root's size might not be adequate ${red}###
-----------------------------------------------------"
sleep 0.2
RED "
------------------------------------------------------------------------
### ${yellow}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 Partition not detected ${red}###
---------------------------------------------------"
fi
#..................................................................................................
if [[ ! -e "${esp_dev}" ]]; then
espprt="fail"
sleep 0.2
RED "
-------------------------------------------
### ${yellow}EFI System 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 "
---------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}ESP's size is not adequate ${red}###
---------------------------------------------"
sleep 0.2
RED "
----------------------------------------------------
### ${yellow}Linux Extended Boot Partition not detected ${red}###
----------------------------------------------------"
fi
elif [[ "${multibooting}" == "n" ]]; then
espprt="fail"
xbootloader="no"
sleep 0.2
RED "
---------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}ESP's size is not adequate ${red}###
---------------------------------------------"
fi
elif [[ "${bootloader}" == "2" ]]; then
if [[ "${espmnt}" == "2" ]]; then
espprt="fail"
xbootloader="no"
sleep 0.2
RED "
---------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}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 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 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
YELLOW "
###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------### "
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
if [[ "${smartpart}" == "y" ]]; then
process
until manual_part; do : ; done
else
process
if [[ "${slct_autoprt}" != "yes" && "${xbootloader}" != "yes" ]]; then
until auto_part; do : ; done
else
until manual_part; do : ; done
fi
fi
elif [[ "${multibooting}" == "y" ]]; then
process
until manual_part; do : ; done
fi
else
y_n
return 1
fi
#--------------------------------------------------------------------------------------------------
elif [[ "${sanity}" == "no" ]]; then
sleep 0.2
RED "
-----------------------------
### ${yellow}SANITY CHECK FAILED${red} ###
-----------------------------"
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: Not all prerequisites are satisfied ${nc}${cyan}###
---------------------------------------------------"
if [[ "${espmnt}" == "2" ]]; then
sleep 0.2
NC "
----------------------------------------------------
>>> ${cyan}Select ${yellowl}/mnt/efi ${nc}${cyan}as the mountpoint for your ${yellowl}/ESP ${nc}${nc}
----------------------------------------------------"
fi
if [[ "${xbootprt}" == "fail" ]]; then
sleep 0.2
NC "
------------------------------------------------------------------------------------------
>>> ${cyan}Systemd-boot:${nc}
>>> ${cyan}Create a ${yellowl}300M ${nc}${cyan}(at minimum) Linux Extended Boot Partition ${nc}(XBOOTLDR) ${yellowl}[GUID CODE: ea00] ${nc}${nc}
------------------------------------------------------------------------------------------"
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
if [[ "${smartpart}" == "n" && -z "${preset}" ]] ; then
process
until manual_part; do : ; done
elif [[ "${smartpart}" == "n" && -n "${preset}" ]] ; then
local stage_prompt="Partitioning"
line2
stage_fail
else
process
until auto_part; do : ; done
fi
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 "
-----------------------------------------
### ${yellow}Incompatible Selection detected ${red}###
-----------------------------------------"
YELLOW "
### ESP cannot be mounted at ${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 "
> Enter a name for your Encrypted ${roottype} Partition: "
BLUE "
Enter a name: "
read -r -p "
==> " ENCROOT
echo
if [[ -z "${ENCROOT}" ]]; then
sleep 0.2
RED "
-----------------------------------------
### ${yellow}Please enter a name to continue ${red}###
-----------------------------------------"
reload
return 1
elif [[ "${ENCROOT}" =~ [[:upper:]] ]]; then
sleep 0.2
RED "
------------------------------------------------------
### ${yellow}Uppercase is not allowed. Please try again.. ${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
echo
if [[ -z "${ENCRHOME}" ]]; then
sleep 0.2
RED "
-----------------------------------------
### ${yellow}Please enter a name to continue ${red}###
-----------------------------------------"
reload
return 1
elif [[ "${ENCRHOME}" =~ [[:upper:]] ]]; then
sleep 0.2
RED "
------------------------------------------------------
### ${yellow}Uppercase is not allowed. Please try again.. ${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 ${yellowl}'Locale & Keyboard Layout Selection'${nc} to continue
"| pv -qL 70
else
sleep 0.2
CYAN "
(*) ${nc}Please complete ${yellowl}'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 Setup"
completion_err
until user_setup; do : ; done
until rootuser_setup; do : ; done
until slct_hostname; do : ; done
fi
if [[ -z "${kernelnmbr}" ]]; then
local stage_prompt="Kernel, Bootloader, ESP Mountpoint & Secure Signing"
completion_err
until dtct_hyper; do : ; done
until slct_krnl; do : ; done
until ask_bootldr; do : ; done
until slct_espmnt; do : ; done
until ask_sign; do : ; done
fi
if [[ -z "${fs}" ]]; then
local stage_prompt="Filesystem & Swap Setup"
completion_err
until ask_fs; do : ; done
until ask_swap; do : ; done
fi
if [[ "${hypervisor}" == "none" ]]; then
local stage_prompt="Graphics Setup"
completion_err
until dtct_vga; do : ; done
fi
if [[ -z "${packages}" ]]; then
local stage_prompt="Desktop Setup"
completion_err
until slct_dsktp; do : ; done
fi
if [[ "${hypervisor}" == "none" ]]; then
if [[ -z "${efi_entr_del}" ]]; then
local stage_prompt="EFI Boot Entries Deletion"
completion_err
until boot_entr; do : ; done
fi
fi
if [[ "${hypervisor}" == "none" ]]; then
if [[ -z "${wrlss_rgd}" ]]; then
local stage_prompt="Wireless Regulatory Domain Setup"
completion_err
until wireless_rgd; 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 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}" > /dev/null 2>&1 ; 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
YELLOW "
###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
echo
sleep 0.2
return 0
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 "
------------------------------------------
### ${yellow}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
YELLOW "
###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###"
echo
sleep 0.2
}
###################################################################################################
auto_mode() {
sleep 0.2
NC "
${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Auto Mode${nc} ${magenta}]${nc}----------------------------------------${magenta}###
"
sleep 0.2
YELLOW "
> Auto Mode Selected
"
sleep 0.2
espfs="$(lsblk -dno FSTYPE "${esp_dev}")"
if [[ "${fs}" == "1" ]]; then
if mkfs.ext4 -F -L Root "${root_dev}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${root_dev}" > /dev/null 2>&1 || err_abort
mount "${root_dev}" /mnt > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount "${root_dev}" /mnt > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort
fi
umount /mnt > /dev/null 2>&1 || err_abort
mount -o "${sbvl_mnt_opts}",subvol=@ "${root_dev}" /mnt > /dev/null 2>&1 || err_abort
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap "${root_dev}" /mnt/swap > /dev/null 2>&1 || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${root_dev}" /mnt/var/cache > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${root_dev}" /mnt/home > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${root_dev}" /mnt/var/log > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${root_dev}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${root_dev}" /mnt/var/tmp > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; 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}" > /dev/null 2>&1 ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount --mkdir "${xboot_dev}" /mnt/boot > /dev/null 2>&1 || 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" || "${preset}" == "4" || "${preset}" == "7" || "${preset}" == "8" ]]; 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}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${home_dev}" > /dev/null 2>&1 || err_abort
mount --mkdir "${home_dev}" /mnt/home > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; 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}" > /dev/null 2>&1 ; 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 "
---------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}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}" > /dev/null 2>&1 ; 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 "
---------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}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}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${rootpart}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount "${rootpart}" /mnt > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort
fi
umount /mnt > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; 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}" > /dev/null 2>&1 || err_abort
umount /mnt || err_abort
sleep 0.2
NC "
==> [${green}Label ${roottype} OK${nc}] "
return 0
fi
fi
skip
return 0
else
RED "
---------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}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" || "${preset}" == "4" || "${preset}" == "7" || "${preset}" == "8" ]]; 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}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${home_dev}" > /dev/null 2>&1 || err_abort
mount --mkdir "${home_dev}" /mnt/home > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${homepart}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ;then
sleep 0.2
NC "
==> [${green}Label /Home OK${nc}] "
return 0
else
err_try
return 1
fi
fi
skip
return 0
else
RED "
---------------------------------------------------
### ${yellowl}WARNING: ${nc}${yellow}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 > /dev/null 2>&1 ; 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 > /dev/null 2>&1 ; then
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap "${rootpart}" /mnt/swap > /dev/null 2>&1 || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${rootpart}" /mnt/var/cache > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${rootpart}" /mnt/home > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${rootpart}" /mnt/var/log > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${rootpart}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${rootpart}" /mnt/var/tmp > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; 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 > /dev/null 2>&1 ; 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 > /dev/null 2>&1 ; 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 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() {
revision="yes"
reset=(xbootloader="" vgaconf="" vendor_slct="" packages="" custompkgs="" customservices="" cust_bootopts="" REGDOM="" preset="" autoroot="" autoxboot="" autohome="" autoswap="")
export "${reset[@]}"
until dtct_hyper; do : ; done
until slct_krnl; do : ; done
until ask_bootldr; do : ; done
until slct_espmnt; do : ; done
until ask_sign; do : ; done
until ask_fs; do : ; done
until ask_swap; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until dtct_vga; do : ; done
fi
until slct_dsktp; do : ; done
if [[ "${hypervisor}" == "none" ]]; then
until boot_entr; do : ; done
until wireless_rgd; 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 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 "
--------------------------------------------------------------------------
### ${yellow}A reboot is ${nc}mandatory ${yellow}and will take effect ${nc}immediately ${yellow}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}###
"
if cryptsetup -y -v luksFormat --label CRYPTROOT "${root_dev}"; then
if [[ "${rota}" == "0" ]]; then
cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${root_dev}" "${ENCROOT}" || err_abort
else
cryptsetup luksOpen "${root_dev}" "${ENCROOT}" || err_abort
fi
#------------------------------------------------------------------------------------------
if [[ "${fs}" == "1" ]]; then
mkfs.ext4 -F -L Root /dev/mapper/"${ENCROOT}" > /dev/null 2>&1 || err_abort
tune2fs -O fast_commit /dev/mapper/"${ENCROOT}" > /dev/null 2>&1 || err_abort
mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Root OK${nc}]
"
#------------------------------------------------------------------------------------------
elif [[ "${fs}" == "2" ]]; then
mkfs.btrfs -f -L Root /dev/mapper/"${ENCROOT}" > /dev/null 2>&1 || err_abort
mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort
btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort
if [[ "${swapmode}" == "2" ]]; then
btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort
fi
umount /mnt > /dev/null 2>&1 || err_abort
mount -o "${sbvl_mnt_opts}",subvol=@ /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort
if [[ "${swapmode}" == "2" ]]; then
mount --mkdir -o rw,nodatacow,subvol=@swap /dev/mapper/"${ENCROOT}" /mnt/swap > /dev/null 2>&1 || err_abort
fi
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache /dev/mapper/"${ENCROOT}" /mnt/var/cache > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home /dev/mapper/"${ENCROOT}" /mnt/home > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log /dev/mapper/"${ENCROOT}" /mnt/var/log > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots /dev/mapper/"${ENCROOT}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort
mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp /dev/mapper/"${ENCROOT}" /mnt/var/tmp > /dev/null 2>&1 || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /@ OK${nc}]
"
fi
else
line2
err_try
do_umount
return 1
fi
#--------------------------------------------------------------------------------------------------
if [[ -e "${swap_dev}" && "${swapmode}" == "1" ]]; then
line2
if cryptsetup -y -v luksFormat --label CRYPTSWAP "${swap_dev}"; then
if [[ "${rota}" == "0" ]]; then
cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${swap_dev}" swap || err_abort
else
cryptsetup luksOpen "${swap_dev}" swap || err_abort
fi
mkswap /dev/mapper/swap > /dev/null 2>&1 || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Swap OK${nc}]
"
else
line2
err_try
do_umount
return 1
fi
fi
#--------------------------------------------------------------------------------------------------
if [[ "${homecrypt}" == "yes" ]]; then
line2
if cryptsetup -y -v luksFormat --label CRYPTHOME "${home_dev}"; then
if [[ "${rota}" == "0" ]]; then
cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${home_dev}" "${ENCRHOME}" || err_abort
else
cryptsetup luksOpen "${home_dev}" "${ENCRHOME}" || err_abort
fi
mkfs.ext4 -F -L Home /dev/mapper/"${ENCRHOME}" > /dev/null 2>&1 || err_abort
tune2fs -O fast_commit /dev/mapper/"${ENCRHOME}" > /dev/null 2>&1 || err_abort
mount --mkdir /dev/mapper/"${ENCRHOME}" /mnt/home > /dev/null 2>&1 || err_abort
sleep 0.2
NC "
==> [${green}Encrypted /Home OK${nc}]
"
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}" > /dev/null 2>&1 ; then
tune2fs -O fast_commit "${home_dev}" > /dev/null 2>&1 || err_abort
mount --mkdir "${home_dev}" /mnt/home > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; 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}" > /dev/null 2>&1 ; then
mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2>&1 || 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}" > /dev/null 2>&1 ; then
mount --mkdir "${xboot_dev}" /mnt/boot > /dev/null 2>&1 || 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 OK${nc}]"
luks_encrypt="ok"
sleep 0.2
NC "
==> [${green}Filesystems OK${nc}]
"
sleep 0.2
YELLOW "
###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------###
"
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|$'
YELLOW "
###-----------------------------------------------------------------------------------------------------------------###
"
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 | more
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 Pacman's ${nc}'Parallel Downloads' ${yellow}feature ? [Y/n] "
BLUE "
Enter [Y/n]: "
read -r -p "
==> " parallel
echo
parallel="${parallel:-y}"
parallel="${parallel,,}"
if [[ "${parallel}" == "y" ]]; then
sleep 0.2
YELLOW "
> Select number of Parallel Downloads [Default: 3] "
NC "
${green}**${nc} [2]
${cyan}***${nc} ${bwhite}[3]
${nc}${yellow}****${nc} [4]
${red}*****${nc} [5] "
BLUE "
Enter a number: "
read -r -p "
==> " parallelnmbr
echo
parallelnmbr="${parallelnmbr:-3}"
parallelnmbr="${parallelnmbr,,}"
if [[ "${parallelnmbr}" =~ ^(2|3|4|5)$ ]]; then
sed -i "s|#ParallelDownloads = 5|ParallelDownloads = ${parallelnmbr}|g" /etc/pacman.conf > /dev/null 2>&1 || err_abort
else
invalid
return 1
fi
sleep 0.2
NC "
==> [${green}${parallelnmbr} Parallel Downloads OK${nc}]"
elif [[ "${parallel}" == "n" ]]; then
skip
else
y_n
return 1
fi
ok
}
###################################################################################################
pacstrap_system() {
basepkgs=(base efibootmgr nano pkgstats sudo vim "${fstools}" "${kernel}" "${microcode}")
local prompt="Pacstrap System"
sleep 0.2
NC "
${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Pacstrap System${nc} ${magenta}]${nc}-------------------------------------${magenta}###
"
cnfg
if [[ "${bootloader}" == "2" ]]; then
if [[ "${fs}" == "1" ]]; then
bootldr_pkgs="grub os-prober"
elif [[ "${fs}" == "2" ]]; then
bootldr_pkgs="grub-btrfs os-prober"
fi
fi
if [[ "${vendor}" == "Virtual Machine" ]]; then
basepkgs+=("${vmpkgs}")
else
basepkgs+=(linux-firmware)
fi
if [[ -n "${bootldr_pkgs}" ]]; then
basepkgs+=("${bootldr_pkgs}")
fi
if [[ -n "${ukify}" ]]; then
basepkgs+=("${ukify}")
fi
if [[ -n "${zram}" ]]; then
basepkgs+=("${zram}")
fi
if [[ -n "${vgapkgs}" ]]; then
basepkgs+=("${vgapkgs}")
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
case "${packages}" in
1) # Plasma Desktop:
deskpkgs="${basepkgs[*]} plasma konsole"
displaymanager="sddm"
bluetooth="bluetooth"
network="NetworkManager" ;;
2) # Minimal Plasma & Apps:
deskpkgs="${basepkgs[*]} alsa-firmware alsa-utils arj ark bluedevil breeze-gtk ccache cups-pdf cups-pk-helper dolphin-plugins exfatprogs fdkaac ffmpegthumbs git glibc-locales gst-libav gst-plugin-libcamera gst-plugin-msdk gst-plugin-opencv gst-plugin-pipewire gst-plugin-qmlgl gst-plugin-va gst-plugin-wpe gst-plugins-ugly gstreamer-vaapi htop icoutils ipp-usb kamera kamoso kate kcalc kde-gtk-config kdegraphics-mobipocket kdegraphics-thumbnailers kdenetwork-filesharing kdeplasma-addons kdesdk-kio kdesdk-thumbnailers kdialog keditbookmarks kget kimageformats kinit kio-admin kio-gdrive kio-zeroconf kompare konsole kscreen kvantum kwrited libappimage libfido2 libktorrent libmms libnfs libva-utils lirc lrzip lua52-socket lzop mac man-db man-pages mesa-demos mesa-utils mold nano-syntax-highlighting nss-mdns ntfs-3g okular opus-tools p7zip packagekit-qt6 pacman-contrib partitionmanager pbzip2 pigz pipewire-alsa pipewire-jack pipewire-pulse plasma-browser-integration plasma-desktop plasma-disks plasma-firewall plasma-nm plasma-pa plasma-wayland-protocols power-profiles-daemon powerdevil powerline powerline-fonts print-manager python-pyqt6 python-reportlab qbittorrent qt6-imageformats qt6-scxml qt6-virtualkeyboard realtime-privileges reflector rng-tools sddm-kcm skanlite sof-firmware sox spectacle sshfs system-config-printer terminus-font timidity++ ttf-ubuntu-font-family unarchiver unrar unzip usb_modeswitch usbutils vdpauinfo vlc vorbis-tools wget xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-kde zip zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting ${nrg_plc}" ;;
3) # Gnome Desktop:
deskpkgs="${basepkgs[*]} gnome networkmanager"
displaymanager="gdm"
bluetooth="bluetooth"
network="NetworkManager" ;;
4) # Minimal Gnome & Apps:
deskpkgs="${basepkgs[*]} dconf-editor evince file-roller gdm gnome-calculator gnome-clocks gnome-console gnome-control-center gnome-disk-utility gnome-keyring gnome-menus gnome-session gnome-shell-extensions gnome-system-monitor gnome-text-editor gnome-tweaks gvfs gvfs-afc gvfs-mtp loupe malcontent nautilus networkmanager power-profiles-daemon simple-scan sushi system-config-printer xdg-desktop-portal-gnome xdg-user-dirs-gtk alsa-firmware alsa-utils ccache cups-pdf exfatprogs fdkaac git glib2-devel glibc-locales gnome-browser-connector gparted gst-libav gst-plugin-libcamera gst-plugin-msdk gst-plugin-opencv gst-plugin-pipewire gst-plugin-qmlgl gst-plugin-va gst-plugin-wpe gst-plugins-ugly gstreamer-vaapi htop icoutils ipp-usb libfido2 libva-utils lrzip mac man-db man-pages meld mesa-utils nano-syntax-highlighting nss-mdns ntfs-3g p7zip pacman-contrib pbzip2 pigz pipewire-alsa pipewire-jack pipewire-pulse powerline powerline-fonts qbittorrent realtime-privileges reflector rng-tools sof-firmware sox terminus-font ttf-ubuntu-font-family unrar unzip usb_modeswitch usbutils vdpauinfo vlc wget zip zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting ${nrg_plc}" ;;
5) # Xfce Desktop:
deskpkgs="${basepkgs[*]} xfce4 lightdm-gtk-greeter network-manager-applet"
displaymanager="lightdm"
network="NetworkManager" ;;
6) # Cinnamon Desktop:
deskpkgs="${basepkgs[*]} cinnamon blueberry lightdm-slick-greeter system-config-printer gnome-keyring ${terminal}"
displaymanager="lightdm"
bluetooth="bluetooth"
network="NetworkManager" ;;
7) # Deepin Desktop:
deskpkgs="${basepkgs[*]} deepin deepin-terminal deepin-kwin networkmanager"
displaymanager="lightdm"
network="NetworkManager" ;;
8) # Budgie Desktop:
deskpkgs="${basepkgs[*]} budgie lightdm-gtk-greeter arc-gtk-theme papirus-icon-theme network-manager-applet ${terminal}"
displaymanager="lightdm"
network="NetworkManager" ;;
9) # Lxqt Desktop:
deskpkgs="${basepkgs[*]} lxqt lxqt-wayland-session breeze-icons network-manager-applet sddm xscreensaver"
displaymanager="sddm"
network="NetworkManager" ;;
10) # Mate Desktop:
deskpkgs="${basepkgs[*]} mate mate-terminal mate-media blueman network-manager-applet mate-power-manager system-config-printer lightdm-gtk-greeter"
displaymanager="lightdm"
bluetooth="bluetooth"
network="NetworkManager" ;;
11) # Base System:
deskpkgs="${basepkgs[*]} networkmanager"
network="NetworkManager" ;;
12) # Custom System:
custarray=(base sudo "${custompkgs}" "${fstools}" "${kernel}" "${microcode}")
if [[ "${vendor}" == "Virtual Machine" ]]; then
custarray+=("${vmpkgs}")
else
custarray+=(linux-firmware)
fi
if [[ -n "${bootldr_pkgs}" ]]; then
custarray+=("${bootldr_pkgs}")
fi
if [[ -n "${ukify}" ]]; then
custarray+=("${ukify}")
fi
if [[ -n "${zram}" ]]; then
custarray+=("${zram}")
fi
if [[ -n "${vgapkgs}" ]]; then
custarray+=("${vgapkgs}")
fi
if [[ "${greeternmbr}" =~ ^(1|2|3|)$ ]]; then
custarray+=("${greeter}")
fi
if [[ -n "${wireless_reg}" ]]; then
custarray+=("${wireless_reg}")
fi
deskpkgs="${custarray[*]}" ;;
esac
pkg_displ
NC "
${bwhite}Press any key to continue${nc}
"
read -r -s -n 1
if pacstrap -K /mnt ${deskpkgs} ; then
if [[ "${fs}" == "2" ]]; then
genfstab -t PARTUUID /mnt >> /mnt/etc/fstab || err_abort
sleep 0.2
NC "
==> [${green}Fstab OK${nc}] "
fi
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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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
}
###################################################################################################
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() {
stage_prompt="Base-System Configuration"
if arch-chroot /mnt <<-CONF > /dev/null 2>&1 2> error_log.txt ; 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_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
useradd -m -G wheel -s /bin/bash ${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 > /dev/null 2>&1 2> error_log.txt ; then
bootctl install || exit
systemctl enable systemd-boot-update || exit
BOOTCTL
stage_ok
else
stage_fail
fi
elif [[ "${xbootloader}" == "yes" ]]; then
if arch-chroot /mnt <<-XBOOTCTL > /dev/null 2>&1 2> error_log.txt ; then
bootctl --esp-path=/efi --boot-path=/boot install || 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; then
systemctl enable grub-btrfsd || exit
GRUB_BTRFSD
stage_ok
else
stage_fail
fi
fi
if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then
local stage_prompt="Grub/Nvidia Configuration"
if arch-chroot /mnt <<-NVGRUB > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then
if [[ "${nvname}" == "nvidia-open" ]] || [[ "${nvname}" == "nvidia" ]] || [[ "${nvname}" == "nvidia-lts" ]]; then
local stage_prompt="Nvidia Hook Creation"
if arch-chroot /mnt <<-NVIDIAHOOK > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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_kver="/boot/vmlinuz-${kernel}"
PRESETS=('default')
default_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf"
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 > /dev/null 2>&1 2> error_log.txt ; then
cp /etc/mkinitcpio.d/${kernel}.preset /etc/mkinitcpio.d/${kernel}.preset.bak || exit
cat <<-MKINITPRESET > /etc/mkinitcpio.d/${kernel}.preset || exit
ALL_kver="/boot/vmlinuz-${kernel}"
PRESETS=('default' 'fallback')
default_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf"
default_image="/boot/initramfs-${kernel}.img"
fallback_image="/boot/initramfs-${kernel}-fallback.img"
fallback_options="-S autodetect"
MKINITPRESET
mkinitcpio -P || exit
NOUKI
stage_ok
else
stage_fail
fi
fi
}
###################################################################################################
secboot_sign() {
if [[ ${sb_sign} == "y" ]]; then
local stage_prompt="Secure-Boot Signing"
if [[ ${bootloader} == "1" ]]; then
if arch-chroot /mnt <<-SECSIGN > /dev/null 2>&1 2> error_log.txt ; 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
elif [[ ${bootloader} == "2" ]]; then
if arch-chroot /mnt <<-SECSIGN > /dev/null 2>&1 2> error_log.txt ; 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() {
#### Encrypted Setup Vars
if [[ "${encrypt}" == "yes" ]]; then
# 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} "
### Encrypted Swap Setup
## 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
if [[ "${fs}" == "1" ]]; then
offst="$(filefrag -v /mnt/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}')"
# Btrfs Offset
elif [[ "${fs}" == "2" ]]; then
offst="$(btrfs inspect-internal map-swapfile -r /mnt/swap/swapfile)"
fi
# Encrypted Swapfile Kernel Parameters
encr_swap_bootopts="resume=${encr_root_dev} resume_offset=${offst} "
## Zram Swap
elif [[ "${swapmode}" == "3" ]]; then
# Zram Swap Kernel Parameters
zram_bootopts="zswap.enabled=0 "
## No Swap
elif [[ "${swapmode}" == "4" ]]; then
# No Swap Kernel Parameters
encr_swap_bootopts=""
fi
### Graphics Setup (Encryption)
## Configuration = 'Yes'
if [[ "${vgaconf}" == "y" ]]; then
# Intel
if [[ "${vendor}" == "Intel" ]]; then
# Mkinitcpio Modules (Encryption)
mkinitcpio_mods="MODULES=(${fs_mod})"
# Mkinitcpio Hooks (Encryption)
mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms sd-vconsole block sd-encrypt filesystems fsck)"
# Nvidia
elif [[ "${vendor}" == "Nvidia" ]]; then
# Mkinitcpio Modules (Encryption) [Nvidia KMS]
mkinitcpio_mods="MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm ${fs_mod})"
# Mkinitcpio Hooks (Encryption)
mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf sd-vconsole block sd-encrypt filesystems fsck)"
# Graphics Kernel Parameters
vga_bootopts="nvidia.NVreg_UsePageAttributeTable=1 "
# Amd
elif [[ "${vendor}" == "AMD" ]]; then
# Mkinitcpio Hooks (Encryption)
mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms sd-vconsole block sd-encrypt filesystems fsck)"
# 'Southern Islands' support
if [[ "${islands}" == "1" ]]; then
# Mkinitcpio Modules (Encryption)
mkinitcpio_mods="MODULES=(amdgpu ${fs_mod})"
# Graphics Kernel Parameters
vga_bootopts="radeon.si_support=0 amdgpu.si_support=1 amdgpu.dc=1 "
# 'Sea Islands' support
elif [[ "${islands}" == "2" ]]; then
# Mkinitcpio Modules (Encryption)
mkinitcpio_mods="MODULES=(amdgpu ${fs_mod})"
# Graphics Kernel Parameters
vga_bootopts="radeon.cik_support=0 amdgpu.cik_support=1 amdgpu.dc=1 "
elif [[ -z "${islands}" ]]; then
# Mkinitcpio Modules (Encryption)
mkinitcpio_mods="MODULES=(${fs_mod})"
# Graphics Kernel Parameters
vga_bootopts="amdgpu.dc=1 "
fi
fi
## Configuration = 'No'
elif [[ "${vgaconf}" == "n" ]]; then
# Mkinitcpio Modules (Encryption)
mkinitcpio_mods="MODULES=(${fs_mod})"
# Mkinitcpio Hooks (Encryption)
mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms sd-vconsole block sd-encrypt filesystems fsck)"
# Graphics Kernel Parameters
vga_bootopts="amdgpu.dc=1 "
fi
### Kernel Parameters (Encryption)
boot_opts="${encr_root_bootopts}${encr_swap_bootopts}${vga_bootopts}${cust_bootopts}${btrfs_bootopts}${zram_bootopts}"
#-------------------------------------------------------------------------------------------------------------
#### Unencrypted Setup Vars
elif [[ "${encrypt}" == "no" ]]; then
### Swap Setup
## Zram Swap
if [[ "${swapmode}" == "3" ]]; then
# Zram Swap Kernel Parameters
zram_bootopts="zswap.enabled=0 "
fi
### Graphics Setup
## Configuration = 'Yes'
if [[ "${vgaconf}" == "y" ]]; then
# Intel
if [[ "${vendor}" == "Intel" ]]; then
# Mkinitcpio Modules
mkinitcpio_mods="MODULES=()"
# Mkinitcpio Hooks
mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)"
# Nvidia
elif [[ "${vendor}" == "Nvidia" ]]; then
# Mkinitcpio Modules [Nvidia KMS]
mkinitcpio_mods="MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)"
# Mkinitcpio Hooks
mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf keyboard sd-vconsole block filesystems fsck)"
# Graphics Kernel Parameters
vga_bootopts="nvidia.NVreg_UsePageAttributeTable=1 "
# Amd
elif [[ "${vendor}" == "AMD" ]]; then
# Mkinitcpio Hooks
mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)"
# 'Southern Islands' support
if [[ "${islands}" == "1" ]]; then
# Mkinitcpio Modules
mkinitcpio_mods="MODULES=(amdgpu)"
# Graphics Kernel Parameters
vga_bootopts="radeon.si_support=0 amdgpu.si_support=1 amdgpu.dc=1 "
# 'Sea Islands' support
elif [[ "${islands}" == "2" ]]; then
# Mkinitcpio Modules
mkinitcpio_mods="MODULES=(amdgpu)"
# Graphics Kernel Parameters
vga_bootopts="radeon.cik_support=0 amdgpu.cik_support=1 amdgpu.dc=1 "
elif [[ -z "${islands}" ]]; then
# Mkinitcpio Modules
mkinitcpio_mods="MODULES=()"
# Graphics Kernel Parameters
vga_bootopts="amdgpu.dc=1 "
fi
fi
## Configuration = 'No'
elif [[ "${vgaconf}" == "n" ]]; then
# Mkinitcpio Modules
mkinitcpio_mods="MODULES=()"
# Mkinitcpio Hooks
mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck)"
# Graphics Kernel Parameters
vga_bootopts="amdgpu.dc=1 "
fi
if [[ "${autoroot}" == "y" ]]; then
### Multi-Root Disk Kernel Parameters (No Encryption)
boot_opts="${multiroot_bootopts}${vga_bootopts}${cust_bootopts}${btrfs_bootopts}${zram_bootopts}"
else
### Single-Root Disk Kernel Parameters (No Encryption)
boot_opts="${vga_bootopts}${cust_bootopts}${btrfs_bootopts}${zram_bootopts}"
fi
fi
}
###################################################################################################
chroot_conf() {
sleep 0.2
NC "
${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Chroot & Configure System${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc}
"
# 'Vanilla' Configuration:
if [[ "${packages}" =~ ^(1|3|5|6|7|8|9|10|11)$ ]]; then
cnfg
main_chroot
if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then
if [[ "${packages}" == "7" ]]; then
local stage_prompt="Deepin Greeter Configuration"
if arch-chroot /mnt <<-DEEPIN > /dev/null 2>&1 2> error_log.txt ; 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 [[ "${packages}" == "5" || "${packages}" == "8" || "${packages}" == "10" ]]; then
local stage_prompt="GTK Greeter Configuration"
if arch-chroot /mnt <<-GTK > /dev/null 2>&1 2> error_log.txt ; 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 [[ "${packages}" == "6" ]]; then
local stage_prompt="Slick Greeter Configuration"
if arch-chroot /mnt <<-SLICK > /dev/null 2>&1 2> error_log.txt ; 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 [[ -n "${bluetooth}" ]]; then
local stage_prompt="Bluetooth Service Activation"
if arch-chroot /mnt <<-BLUETOOTH > /dev/null 2>&1 2> error_log.txt ; then
systemctl enable ${bluetooth} || exit
BLUETOOTH
stage_ok
else
stage_fail
fi
fi
if [[ -n "${displaymanager}" ]]; then
local stage_prompt="Display Manager Service Activation"
if arch-chroot /mnt <<-DMSERVICE > /dev/null 2>&1 2> error_log.txt ; then
systemctl enable ${displaymanager} || exit
DMSERVICE
stage_ok
else
stage_fail
fi
fi
if [[ -n "${network}" ]]; then
local stage_prompt="Network Manager Service Activation"
if arch-chroot /mnt <<-NETWORK > /dev/null 2>&1 2> error_log.txt ; then
systemctl enable ${network} || exit
NETWORK
stage_ok
else
stage_fail
fi
fi
btldrcfg
trimcfg
vm_serv
zramcfg
nvidia_hook
mkinitcpio_preset
secboot_sign
completion
fi
#--------------------------------------------------------------------------------------------------
# 'Custom System' Configuration:
if [[ "${packages}" == "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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; 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 > /dev/null 2>&1 2> error_log.txt ; then
systemctl enable ${customservices} || exit
CUSTOMSERV
stage_ok
else
stage_fail
fi
fi
btldrcfg
trimcfg
vm_serv
zramcfg
nvidia_hook
mkinitcpio_preset
secboot_sign
completion
fi
#--------------------------------------------------------------------------------------------------
# Minimal Plasma/Gnome Optimized System Configuration:
if [[ "${packages}" == "2" || "${packages}" == "4" ]]; then
local stage_prompt="Optimized System Configuration"
cnfg
if [[ "${packages}" == "2" ]]; then
displaymanager="sddm"
elif [[ "${packages}" == "4" ]]; then
displaymanager="gdm"
fi
if [[ -n "${nrg_plc}" ]]; then
arch-chroot /mnt <<-NRG > /dev/null 2>&1
${nrg_plc} performance
NRG
fi
if arch-chroot /mnt <<-OPTIMIZED > /dev/null 2>&1 2> error_log.txt ; 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
sed -i 's/^#Color/Color\nILoveCandy/' /etc/pacman.conf || exit
sed -i "/^#ParallelDownloads = 5/s/^#//" /etc/pacman.conf || exit
update-pciids || exit
cat <<-MKINITCPIO > /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit
${mkinitcpio_mods}
${mkinitcpio_hooks}
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
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
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
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 <<-UDISKS2 > /etc/udisks2/mount_options.conf || exit
[defaults]
ntfs_drivers=ntfs,ntfs3
ntfs:ntfs_defaults=windows_names
ntfs:ntfs3_defaults=windows_names
UDISKS2
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 > /dev/null 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 > /dev/null 2>&1 || exit
cat <<-USER > /etc/systemd/user.conf.d/00-userd.conf || exit
[Manager]
DefaultTimeoutStopSec=5s
DefaultTimeoutAbortSec=5s
USER
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
sed -i "/# set linenumbers/"'s/^#//' /etc/nanorc || exit
sed -i "/# set minibar/"'s/^#//' /etc/nanorc || exit
sed -i "/# 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 <<-SUPPLICANT > /etc/wpa_supplicant/wpa_supplicant.conf || exit
country=${REGDOM}
wps_cred_add_sae=1
pmf=2
SUPPLICANT
echo root:${ROOTPASSWD2} | chpasswd || exit
chsh -s /bin/zsh || exit
useradd -m -G wheel,realtime -s /bin/zsh ${USERNAME} || exit
echo ${USERNAME}:${USERPASSWD2} | chpasswd || 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
systemctl enable avahi-daemon bluetooth cups ipp-usb NetworkManager rngd ${displaymanager} ${trim} ${vm_services} || exit
OPTIMIZED
stage_ok
else
stage_fail
fi
btldrcfg
zramcfg
nvidia_hook
mkinitcpio_preset
secboot_sign
completion
fi
umount -R /mnt
reboot
exit
}
# END FUNCTIONS
###################################################################################################
run_as="$(whoami)"
tty="$(tty)"
disks="$(lsblk --nodeps --paths --noheadings --output=name,size,model | cat --number)"
trg=""
vars=(LOCALESET="" SETLOCALE="" lcl_slct="" USERNAME="" kernelnmbr="" fs="" vgapkgs="" vgacount="" vgacard="" intelcount="" intelcards="" nvidiacount="" nvidiacards="" amdcount="" amdcards="" vgaconf="" vga_conf="" vga_setup="" vendor="" vendor1="" vendor2="" vendor3="" vendor_slct="" packages="" efi_entr_del="" wrlss_rgd="" sanity="" install="" bootldr_pkgs="" devel="" REGDOM="" vga_bootopts="" btrfs_bootopts="" trim="" swapmode="" homecrypt="" greeter="" revision="" greeternmbr="" cust_bootopts="" bluetooth="" vmpkgs="" vm_services="" perf_stream="" displaymanager="" wireless_reg="" bitness="" bootloader="" vga_slct="" espsize="" autoroot="" autoesp="" autoxboot="" autohome="" autoswap="" rootprt="" espprt="" xbootprt="" homeprt="" swapprt="" partok="" use_manpreset="" 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="" uki="" ukify="" slct_autoprt="" cng_espmnt="" sep_home="" encr_swap_bootopts="" uefimode="" luks_encrypt="")
export "${vars[@]}"
clear
first_check
sleep 0.2
line3
CYANBG "************************************************************************************************* "
CYANBG " "
CYANBG " ### Amelia Installer ### "
CYANBG " "
CYANBG "************************************************************************************************* "
NC "
${bwhite}Press any key to start${nc} "
read -r -s -n 1
clear
arch
uefi_check
connection_check
upd_clock
machine_dtct
until main_menu; do : ; done