ArchTitus/scripts/startup.sh

371 lines
12 KiB
Bash
Executable File

#!/usr/bin/env bash
# This script will ask users about their prefrences
# like disk, file system, timezone, keyboard layout,
# user name, password, etc.
# === set up a config file ===
CONFIG_FILE=$CONFIGS_DIR/setup.conf
if [ ! -f $CONFIG_FILE ]; then # check if file exists
touch -f $CONFIG_FILE # create file if not exists
fi
# === set options in setup.conf ===
set_option() {
if grep -Eq "^${1}.*" $CONFIG_FILE; then # check if option exists
sed -i -e "/^${1}.*/d" $CONFIG_FILE # delete option if exists
fi
echo "${1}=${2}" >>$CONFIG_FILE # add option
}
# === Renders a text based list of options that can be selected by the ===
# === user using up, down and enter keys and returns the chosen option. ===
# Arguments : list of options, maximum of 256
# "opt1" "opt2" ...
# Return value: selected index (0 for opt1, 1 for opt2 ...)
select_option() {
# little helpers for terminal print control and key input
ESC=$( printf "\033")
cursor_blink_on() { printf "$ESC[?25h"; }
cursor_blink_off() { printf "$ESC[?25l"; }
cursor_to() { printf "$ESC[$1;${2:-1}H"; }
print_option() { printf "$2 $1 "; }
print_selected() { printf "$2 $ESC[7m $1 $ESC[27m"; }
get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; }
get_cursor_col() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${COL#*[}; }
key_input() {
local key
IFS= read -rsn1 key 2>/dev/null >&2
if [[ $key = "" ]]; then echo enter; fi;
if [[ $key = $'\x20' ]]; then echo space; fi;
if [[ $key = "k" ]]; then echo up; fi;
if [[ $key = "j" ]]; then echo down; fi;
if [[ $key = "h" ]]; then echo left; fi;
if [[ $key = "l" ]]; then echo right; fi;
if [[ $key = "a" ]]; then echo all; fi;
if [[ $key = "n" ]]; then echo none; fi;
if [[ $key = $'\x1b' ]]; then
read -rsn2 key
if [[ $key = [A || $key = k ]]; then echo up; fi;
if [[ $key = [B || $key = j ]]; then echo down; fi;
if [[ $key = [C || $key = l ]]; then echo right; fi;
if [[ $key = [D || $key = h ]]; then echo left; fi;
fi
}
print_options_multicol() {
# print options by overwriting the last lines
local curr_col=$1
local curr_row=$2
local curr_idx=0
local idx=0
local row=0
local col=0
curr_idx=$(( $curr_col + $curr_row * $colmax ))
for option in "${options[@]}"; do
row=$(( $idx/$colmax ))
col=$(( $idx - $row * $colmax ))
cursor_to $(( $startrow + $row + 1)) $(( $offset * $col + 1))
if [ $idx -eq $curr_idx ]; then
print_selected "$option"
else
print_option "$option"
fi
((idx++))
done
}
# initially print empty new lines (scroll down if at bottom of screen)
for opt; do printf "\n"; done
# determine current screen position for overwriting the options
local return_value=$1
local lastrow=`get_cursor_row`
local lastcol=`get_cursor_col`
local startrow=$(($lastrow - $#))
local startcol=1
local lines=$( tput lines )
local cols=$( tput cols )
local colmax=$2
local offset=$(( $cols / $colmax ))
local size=$4
shift 4
# ensure cursor and input echoing back on upon a ctrl+c during read -s
trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
cursor_blink_off
local active_row=0
local active_col=0
while true; do
print_options_multicol $active_col $active_row
# user key control
case `key_input` in
enter) break;;
up) ((active_row--));
if [ $active_row -lt 0 ]; then active_row=0; fi;;
down) ((active_row++));
if [ $active_row -ge $(( ${#options[@]} / $colmax )) ]; then active_row=$(( ${#options[@]} / $colmax )); fi;;
left) ((active_col=$active_col - 1));
if [ $active_col -lt 0 ]; then active_col=0; fi;;
right) ((active_col=$active_col + 1));
if [ $active_col -ge $colmax ]; then active_col=$(( $colmax - 1 )) ; fi;;
esac
done
# cursor position back to normal
cursor_to $lastrow
printf "\n"
cursor_blink_on
return $(( $active_col + $active_row * $colmax ))
}
# === This will be shown on every set as user is progressing ===
logo () {
echo -ne "
-------------------------------------------------------------------------
█████╗ ██████╗ ██████╗██╗ ██╗████████╗██╗████████╗██╗ ██╗███████╗
██╔══██╗██╔══██╗██╔════╝██║ ██║╚══██╔══╝██║╚══██╔══╝██║ ██║██╔════╝
███████║██████╔╝██║ ███████║ ██║ ██║ ██║ ██║ ██║███████╗
██╔══██║██╔══██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║╚════██║
██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
------------------------------------------------------------------------
Please select presetup settings for your system
------------------------------------------------------------------------
"
}
# === This function will handle file systems. At this movement we are handling only ===
# === btrfs and ext4. Others will be added in future. ===
filesystem () {
clear
logo
echo -ne "
Please Select your file system for both boot and root
"
options=("btrfs" "ext4" "luks" "exit")
select_option $? 1 "${options[@]}"
case $? in
0) set_option FS btrfs;;
1) set_option FS ext4;;
2)
while true; do
echo -ne "Please enter your luks password: \n"
read -s luks_password # read password without echo
echo -ne "Please repeat your luks password: \n"
read -s luks_password2 # read password without echo
if [ "$luks_password" = "$luks_password2" ]; then
set_option LUKS_PASSWORD $luks_password
set_option FS luks
break
else
echo -e "\nPasswords do not match. Please try again. \n"
fi
done
;;
3) exit ;;
*) echo "Wrong option please select again"; filesystem;;
esac
}
# === Added this from arch wiki https://wiki.archlinux.org/title/System_time ===
timezone () {
clear
logo
time_zone="$(curl --fail https://ipapi.co/timezone)"
echo -ne "
System detected your timezone to be '$time_zone' \n"
echo -ne "Is this correct?
"
options=("Yes" "No")
select_option $? 1 "${options[@]}"
case ${options[$?]} in
y|Y|yes|Yes|YES)
echo "${time_zone} set as timezone"
set_option TIMEZONE $time_zone;;
n|N|no|NO|No)
echo "Please enter your desired timezone e.g. Europe/London :"
read new_timezone
echo "${new_timezone} set as timezone"
set_option TIMEZONE $new_timezone;;
*) echo "Wrong option. Try again";timezone;;
esac
}
# === To select the keymap
keymap () {
clear
logo
echo -ne "
Please select key board layout from this list"
# These are default key maps as presented in official arch repo archinstall
options=(us by ca cf cz de dk es et fa fi fr gr hu il it lt lv mk nl no pl ro ru sg ua uk)
select_option $? 4 "${options[@]}"
keymap=${options[$?]}
echo -ne "Your key boards layout: ${keymap} \n"
set_option KEYMAP $keymap
}
# === Select if the drive is an ssd or not===
drivessd () {
echo -ne "
Is this an ssd? yes/no:
"
options=("Yes" "No")
select_option $? 1 "${options[@]}"
case ${options[$?]} in
y|Y|yes|Yes|YES)
set_option MOUNT_OPTIONS "noatime,compress=zstd,ssd,commit=120";;
n|N|no|NO|No)
set_option MOUNT_OPTIONS "noatime,compress=zstd,commit=120";;
*) echo "Wrong option. Try again";drivessd;;
esac
}
# === selection for disk type ===
diskpart () {
clear
logo
echo -ne "
------------------------------------------------------------------------
THIS WILL FORMAT AND DELETE ALL DATA ON THE DISK
Please make sure you know what you are doing because
after formating your disk there is no way to get data back
------------------------------------------------------------------------
"
PS3='
Select the disk to install on: '
options=($(lsblk -n --output TYPE,KNAME,SIZE | awk '$1=="disk"{print "/dev/"$2"|"$3}'))
select_option $? 1 "${options[@]}"
disk=${options[$?]%|*}
echo -e "\n${disk%|*} selected \n"
set_option DISK ${disk%|*}
drivessd
}
# === select userinfo ===
userinfo () {
clear
logo
read -p "Please enter your username: " username
set_option USERNAME ${username,,} # convert to lower case as in issue #109
while true; do
read -s -p "Please enter your password: " password # read password without echo
echo ""
read -s -p "Please repeat your password: " password2 # read password without echo
echo ""
if [ "$password" = "$password2" ]; then
set_option PASSWORD $password
break
else
echo -e "\nPasswords do not match. Please try again. \n"
fi
done
read -rep "Please enter your hostname: " nameofmachine
set_option NAME_OF_MACHINE $nameofmachine
}
# === install grub or not ===
grubInstall () {
echo -ne "Install grub?:\n"
options=(yes no)
select_option $? 4 "${options[@]}"
grub_install=${options[$?]}
set_option GRUB_INSTALL $grub_install
}
# === select grub theme ===
grubTheme () {
clear
logo
grub_install
if ["$GRUB_INSTALL" == "yes"]; then
echo -ne "Select your grub theme:\n"
options=(cyberRE none)
select_option $? 4 "${options[@]}"
grub_theme=${options[$?]}
set_option GRUB_THEME $grub_theme
else
set_option GRUB_THEME none
fi
}
# === Let the user choose AUR helper from predefined list ===
aurhelper () {
clear
logo
echo -ne "Please enter your desired AUR helper:\n"
options=(paru yay picaur aura trizen pacaur none)
select_option $? 4 "${options[@]}"
aur_helper=${options[$?]}
set_option AUR_HELPER $aur_helper
}
# === Let the user choose Desktop Enviroment from predefined list ===
desktopenv () {
clear
logo
echo -ne "Please select your desired Desktop Enviroment:\n"
options=(gnome kde cinnamon xfce mate budgie lxde deepin openbox server)
select_option $? 4 "${options[@]}"
desktop_env=${options[$?]}
set_option DESKTOP_ENV $desktop_env
}
# === select installation type ===
installtype () {
clear
logo
echo -ne "Please select type of installation:\n\n
Full install: Installs full featured desktop enviroment, with added apps and themes needed for everyday use\n
Minimal Install: Installs only apps few selected apps to get you started\n"
options=(FULL MINIMAL)
select_option $? 4 "${options[@]}"
install_type=${options[$?]}
set_option INSTALL_TYPE $install_type
}
# === More features in future ===
# language (){}
# === setup basic options for server installation ===
userinfo
grub_theme
aurhelper
desktopenv
set_option INSTALL_TYPE MINIMAL
# === configure extra options for DE installation ===
if [[ ! $desktop_env == server ]]; then
installtype
fi
# === more basic options ===
diskpart
filesystem
timezone
keymap