ArchTitus/startup.sh

367 lines
12 KiB
Bash

#!/usr/bin/env bash
# This script will ask users about their prefrences
# like disk, file system, timezone, keyboard layout,
# user name, password, etc.
# shellcheck disable=SC2207
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# set up a config file
CONFIG_FILE=$SCRIPT_DIR/setup.conf
# check if file exists
if [ ! -f "$CONFIG_FILE" ]; then
# create file if not exists
touch -f "$CONFIG_FILE"
fi
# set options in setup.conf
set_option() {
# check if option exists
if grep -Eq "^${1}.*" "$CONFIG_FILE"; then
# delete option if exists
sed -i -e "/^${1}.*/d" "$CONFIG_FILE"
fi
# else add option
echo "${1}=${2}" >> "$CONFIG_FILE"
}
# Adding global functions and variables to use in this script
check_root() {
if [[ "$(id -u)" != "0" ]]; then
echo -ne "Error: This script has to be run under the 'root' user!"
exit 1
fi
}
elements_present() {
# check if an element exists
for e in "${@:2}"; do [[ "$e" == "$1" ]] && break; done
}
invalid_option() {
# invalid option message
echo -ne "Please select a valid option: \n"
}
set_password() {
# password helper function
# read password without echoing (-s)
read -prs "Please enter password: " PASSWORD1
echo -ne "\n"
read -prs "Please re-enter password: " PASSWORD2
echo -ne "\n"
if [ "$PASSWORD1" == "$PASSWORD2" ]; then
set_option "$1" "$PASSWORD1"
else
echo -ne "Passwords do not match \n"
return
fi
}
# make a title
title () {
echo -ne "\n"
echo -ne "------------------------------------------------------------------------\n"
echo -ne "\t\t\t$1\n"
echo -ne "------------------------------------------------------------------------\n"
}
# ask user for option
PROMPT="Please enter your option: "
logo () {
# This will be shown on every set as user is progressing
echo -ne "
-------------------------------------------------------------------------
█████╗ ██████╗ ██████╗██╗ ██╗████████╗██╗████████╗██╗ ██╗███████╗
██╔══██╗██╔══██╗██╔════╝██║ ██║╚══██╔══╝██║╚══██╔══╝██║ ██║██╔════╝
███████║██████╔╝██║ ███████║ ██║ ██║ ██║ ██║ ██║███████╗
██╔══██║██╔══██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║╚════██║
██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
------------------------------------------------------------------------
Please select presetup settings for your system
------------------------------------------------------------------------
"
}
setpartionlayout() {
# Set partioning layouts
title "Partioning Layout"
LAYOUTS=("Default" "LVM" "LVM+LUKS" "Maintain Current")
PS3="$PROMPT"
select OPT in "${LAYOUTS[@]}"; do
if elements_present "$OPT" "${LAYOUTS[@]}"; then
case "$REPLY" in
1)
set_option "LAYOUT" 1
break
;;
2)
set_option "LAYOUT" "$OPT"
set_option "LVM" 1
set_option "LUKS" 0
break
;;
3)
set_option "LAYOUT" "$OPT"
set_password "LUKS_PASSWORD"
set_option "LUKS" 1
set_option "LVM" 1
break
;;
4)
echo -ne "Maintaining current settings"
set_option "LAYOUT" 0
break
;;
*)
invalid_option
setpartionlayout
;;
esac
else
invalid_option
filesystem
fi
done
}
filesystem () {
# This function will handle file systems. At this movement we are handling only
# btrfs and ext4. Others will be added in future.
title "File System"
FILESYS=("btrfs" "ext2" "ext3" "ext4" "f2fs" "jfs" "nilfs2" "ntfs" "reiserfs" "vfat" "xfs")
PS3="$PROMPT"
select OPT in "${FILESYS[@]}"; do
if elements_present "$OPT" "${FILESYS[@]}"; then
if [ "$OPT" == "btrfs" ]; then
# used -a to get more than one argument
echo -ne "Please enter your btrfs subvolume names separated by space\n"
echo -ne "usualy they are @, @home, @root etc. Defaults are @, @home, @var, @tmp, @.snapshots \n"
read -pr "or press enter to use defaults: " -a ARR
if [[ "${ARR[*]}" -eq 0 ]]; then
set_option "BTRFS_SUBVOLUME" "(@ @home @var @tmp @.snapshots)"
break
else
# An array is a list of values.
NAMES=()
for i in "${ARR[@]}"; do
# push values to array
NAMES+=("$i")
done
# set to config file
set_option "BTRFS_SUBVOLUMES" "(${NAMES[*]})"
break
fi
fi
set_option "FS" "$OPT"
break
else
invalid_option
break
fi
done
}
timezone () {
# Added this from arch wiki https://wiki.archlinux.org/title/System_time
_TIMEZONE="$(curl --fail https://ipapi.co/timezone)"
_ZONE=($(timedatectl list-timezones | sed 's/\/.*$//' | uniq))
echo -ne "System detected your timezone to be '$_TIMEZONE'"
echo -ne "\n"
read -pr "Is this correct? yes/no: " ANSWER
case "$ANSWER" in
y|Y|yes|Yes|YES)
set_option TIMEZONE "$_TIMEZONE"
;;
n|N|no|NO|No)
title "Manually setting timezone"
PS3="$PROMPT"
echo -ne "Please select your zone: \n"
select ZONE in "${_ZONE[@]}"; do
if elements_present "$ZONE" "${_ZONE[@]}"; then
_SUBZONE=($(timedatectl list-timezones | grep "${ZONE}" | sed 's/^.*\///'))
PS3="$PROMPT"
echo -ne "Please select your subzone: \n"
select SUBZONE in "${_SUBZONE[@]}"; do
if elements_present "$SUBZONE" "${_SUBZONE[@]}"; then
set_option TIMEZONE "${ZONE}/${SUBZONE}"
break
else
invalid_option
break
fi
done
break
else
invalid_option
break
fi
done
;;
*) echo "Wrong option. Try again";timezone;;
esac
}
keymap () {
# These are default key maps as presented in official arch repo archinstall
KEYMAPS=("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" "us")
PS3="$PROMPT"
select OPT in "${KEYMAPS[@]}"; do
if elements_present "$OPT" "${KEYMAPS[@]}"; then
set_option KEYMAP "$OPT"
break
else
invalid_option
keymap
fi
done
}
drivessd () {
# confirm if ssd is present
read -pr "Is this system using an SSD? yes/no: " _SSD
case "$_SSD" in
y|Y|yes|Yes|YES)
set_option "SSD" 1
set_option "MOUNTOPTION" "noatime,compress=zstd,ssd,commit=120"
;;
n|N|no|NO|No)
set_option "SSD" 0
set_option "MOUNTOPTION" "noatime,compress=zstd,commit=120"
;;
*) echo "Wrong option. Try again";drivessd;;
esac
}
diskselection () {
# selection for disk type
# show disks present on system
DISKLIST="$(lsblk -n --output TYPE,KNAME,SIZE | awk '$1=="disk"{print "/dev/"$2" - "$3}')" # show disks with /dev/ prefix and size
PS3="$PROMPT"
select _DISK in "${DISKLIST[@]}"; do
if elements_present "$_DISK" "${DISKLIST[@]}"; then
# remove size from string
DISK=$(echo "$_DISK" | awk '{print $1}')
set_option DISK "$DISK"
break
else
invalid_option
break
fi
done
}
userinfo () {
read -pr "Please enter your username: " USERNAME
set_option USERNAME "${USERNAME,,}" # convert to lower case as in issue #109
set_password "PASSWORD"
read -pr "Please enter your hostname: " HOSTNAME
set_option HOSTNAME "$HOSTNAME"
}
setlocale (){
# set locale
locale_list=($(grep UTF-8 /etc/locale.gen | sed 's/\..*$//' | sed '/@/d' | awk '{print $1}' | uniq | sed 's/#//g'))
PS3="$PROMPT"
select LOCALE in "${locale_list[@]}"; do
if elements_present "$LOCALE" "${locale_list[@]}"; then
set_option LOCALE "${LOCALE}.UTF-8 UTF-8"
break
else
invalid_option
break
fi
done
}
setdisktop() {
title "Select either Disktop Environment or Window Manager"
selections=("KDE" "Gnome" "XFCE" "Mate" "LXQT" "Minimal" "Awesome" "OpenBox" "i3" "i3-Gaps")
PS3="$PROMPT"
select OPT in "${selections[@]}"; do
if elements_present "$OPT" "${selections[@]}"; then
case "$OPT" in
1)
# more packages can be added here
set_option "DE" "('plasma')"
set_option "DM" "sddm"
break
;;
2)
set_option "DE" "('gnome')"
set_option "DM" "gdm"
break
;;
3)
set_option "DE" "('xfce4')"
set_option "DM" "lightdm"
break
;;
4)
set_option "DE" "('mate')"
set_option "DM" "lightdm"
break
;;
5)
set_option "DE" "('lxqt')"
set_option "DM" "lightdm"
break
;;
6)
set_option "DE" 0
set_option "DM" 0
break
;;
7)
set_option "DE" 0
set_option "WM" "awesome"
break
;;
8) # openbox
set_option "DE" 0
set_option "WM" "openbox"
break
;;
9) # i3
set_option "DE" 0
set_option "WM" "i3"
break
;;
10) # i3-gaps
set_option "DE" 0
set_option "WM" "i3-gaps"
break
;;
*) echo "Wrong option. Try again"
break
;;
esac
else
invalid_option
break
fi
done
}
# Starting functions
clear
logo
userinfo
clear
logo
diskpart
clear
logo
filesystem
clear
logo
timezone
clear
logo
keymap