#!/bin/bash echo -ne " ------------------------------------------------------------------------- █████╗ ██████╗ ██████╗██╗ ██╗████████╗██╗████████╗██╗ ██╗███████╗ ██╔══██╗██╔══██╗██╔════╝██║ ██║╚══██╔══╝██║╚══██╔══╝██║ ██║██╔════╝ ███████║██████╔╝██║ ███████║ ██║ ██║ ██║ ██║ ██║███████╗ ██╔══██║██╔══██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║╚════██║ ██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ------------------------------------------------------------------------- Automated Arch Linux Installer ------------------------------------------------------------------------- Verifying Arch Linux ISO is Booted " if [ ! -f /usr/bin/pacstrap ]; then echo "This script must be run from an Arch Linux ISO environment." exit 1 fi set_password() { read -rs -p "Please enter password: " PASSWORD1 echo -ne "\n" read -rs -p "Please re-enter password: " PASSWORD2 echo -ne "\n" if [[ "$PASSWORD1" == "$PASSWORD2" ]]; then export PASSWORD=$PASSWORD1 else echo -ne "ERROR! Passwords do not match. \n" set_password fi } root_check() { if [[ "$(id -u)" != "0" ]]; then echo -ne "ERROR! This script must be run under the 'root' user!\n" exit 0 fi } docker_check() { if awk -F/ '$2 == "docker"' /proc/self/cgroup | read -r; then echo -ne "ERROR! Docker container is not supported (at the moment)\n" exit 0 elif [[ -f /.dockerenv ]]; then echo -ne "ERROR! Docker container is not supported (at the moment)\n" exit 0 fi } arch_check() { if [[ ! -e /etc/arch-release ]]; then echo -ne "ERROR! This script must be run in Arch Linux!\n" exit 0 fi } pacman_check() { if [[ -f /var/lib/pacman/db.lck ]]; then echo "ERROR! Pacman is blocked." echo -ne "If not running remove /var/lib/pacman/db.lck.\n" exit 0 fi } background_checks() { root_check arch_check pacman_check docker_check } # 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 lastrow=$(get_cursor_row) local startrow=$(($lastrow - $#)) local cols=$(tput cols) # Calculate the maximum number of columns based on screen width and option length local max_option_length=0 for opt in "$@"; do if [ ${#opt} -gt $max_option_length ]; then max_option_length=${#opt} fi done local colmax=$(( $cols / (max_option_length + 4) )) if [ $colmax -lt 1 ]; then colmax=1; fi local offset=$(( $cols / $colmax )) 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 )) } # @description Displays ArchTitus logo # @noargs logo () { # This will be shown on every set as user is progressing echo -ne " ------------------------------------------------------------------------- █████╗ ██████╗ ██████╗██╗ ██╗████████╗██╗████████╗██╗ ██╗███████╗ ██╔══██╗██╔══██╗██╔════╝██║ ██║╚══██╔══╝██║╚══██╔══╝██║ ██║██╔════╝ ███████║██████╔╝██║ ███████║ ██║ ██║ ██║ ██║ ██║███████╗ ██╔══██║██╔══██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║╚════██║ ██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ------------------------------------------------------------------------ Please select presetup settings for your system ------------------------------------------------------------------------ " } # @description This function will handle file systems. At this movement we are handling only # btrfs and ext4. Others will be added in future. filesystem () { echo -ne " Please Select your file system for both boot and root " options=("btrfs" "ext4" "luks" "exit") select_option $? 1 "${options[@]}" case $? in 0) export FS=btrfs;; 1) export FS=ext4;; 2) set_password "LUKS_PASSWORD" export FS=luks ;; 3) exit ;; *) echo "Wrong option please select again"; filesystem;; esac } # @description Detects and sets timezone. timezone () { # Added this from arch wiki https://wiki.archlinux.org/title/System_time 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" export 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" export TIMEZONE=$new_timezone;; *) echo "Wrong option. Try again";timezone;; esac } # @description Set user's keyboard mapping. keymap () { 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" export KEYMAP=$keymap } # @description Choose whether drive is 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) export MOUNT_OPTIONS="noatime,compress=zstd,ssd,commit=120";; n|N|no|NO|No) export MOUNT_OPTIONS="noatime,compress=zstd,commit=120";; *) echo "Wrong option. Try again";drivessd;; esac } # @description Disk selection for drive to be used with installation. diskpart () { 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 *****BACKUP YOUR DATA BEFORE CONTINUING***** ***I AM NOT RESPONSIBLE FOR ANY DATA LOSS*** ------------------------------------------------------------------------ " 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" export DISK=${disk%|*} drivessd } # @description Gather username and password to be used for installation. userinfo () { read -p "Please enter your username: " username export USERNAME=${username,,} # convert to lower case as in issue #109 set_password "PASSWORD" read -rep "Please enter your hostname: " nameofmachine export NAME_OF_MACHINE=$nameofmachine } # Starting functions background_checks clear logo userinfo clear logo diskpart clear logo filesystem clear logo timezone clear logo keymap echo "Setting up mirrors for optimal download" iso=$(curl -4 ifconfig.co/country-iso) timedatectl set-ntp true pacman -S --noconfirm archlinux-keyring #update keyrings to latest to prevent packages failing to install pacman -S --noconfirm --needed pacman-contrib terminus-font setfont ter-v22b sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.conf pacman -S --noconfirm --needed reflector rsync grub cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup echo -ne " ------------------------------------------------------------------------- Setting up $iso mirrors for faster downloads ------------------------------------------------------------------------- " reflector -a 48 -c $iso -f 5 -l 20 --sort rate --save /etc/pacman.d/mirrorlist mkdir /mnt &>/dev/null # Hiding error message if any echo -ne " ------------------------------------------------------------------------- Installing Prerequisites ------------------------------------------------------------------------- " pacman -S --noconfirm --needed gptfdisk btrfs-progs glibc echo -ne " ------------------------------------------------------------------------- Formating Disk ------------------------------------------------------------------------- " umount -A --recursive /mnt # make sure everything is unmounted before we start # disk prep sgdisk -Z ${DISK} # zap all on disk sgdisk -a 2048 -o ${DISK} # new gpt disk 2048 alignment # create partitions sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition) sgdisk -n 2::+300M --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition) sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system sgdisk -A 1:set:2 ${DISK} fi partprobe ${DISK} # reread partition table to ensure it is correct # make filesystems echo -ne " ------------------------------------------------------------------------- Creating Filesystems ------------------------------------------------------------------------- " # @description Creates the btrfs subvolumes. createsubvolumes () { btrfs subvolume create /mnt/@ btrfs subvolume create /mnt/@home btrfs subvolume create /mnt/@var btrfs subvolume create /mnt/@tmp btrfs subvolume create /mnt/@.snapshots } # @description Mount all btrfs subvolumes after root has been mounted. mountallsubvol () { mount -o ${MOUNT_OPTIONS},subvol=@home ${partition3} /mnt/home mount -o ${MOUNT_OPTIONS},subvol=@tmp ${partition3} /mnt/tmp mount -o ${MOUNT_OPTIONS},subvol=@var ${partition3} /mnt/var mount -o ${MOUNT_OPTIONS},subvol=@.snapshots ${partition3} /mnt/.snapshots } # @description BTRFS subvolulme creation and mounting. subvolumesetup () { # create nonroot subvolumes createsubvolumes # unmount root to remount with subvolume umount /mnt # mount @ subvolume mount -o ${MOUNT_OPTIONS},subvol=@ ${partition3} /mnt # make directories home, .snapshots, var, tmp mkdir -p /mnt/{home,var,tmp,.snapshots} # mount subvolumes mountallsubvol } if [[ "${DISK}" =~ "nvme" ]]; then partition2=${DISK}p2 partition3=${DISK}p3 else partition2=${DISK}2 partition3=${DISK}3 fi if [[ "${FS}" == "btrfs" ]]; then mkfs.vfat -F32 -n "EFIBOOT" ${partition2} mkfs.btrfs -L ROOT ${partition3} -f mount -t btrfs ${partition3} /mnt subvolumesetup elif [[ "${FS}" == "ext4" ]]; then mkfs.vfat -F32 -n "EFIBOOT" ${partition2} mkfs.ext4 -L ROOT ${partition3} mount -t ext4 ${partition3} /mnt elif [[ "${FS}" == "luks" ]]; then mkfs.vfat -F32 -n "EFIBOOT" ${partition2} # enter luks password to cryptsetup and format root partition echo -n "${LUKS_PASSWORD}" | cryptsetup -y -v luksFormat ${partition3} - # open luks container and ROOT will be place holder echo -n "${LUKS_PASSWORD}" | cryptsetup open ${partition3} ROOT - # now format that container mkfs.btrfs -L ROOT ${partition3} # create subvolumes for btrfs mount -t btrfs ${partition3} /mnt subvolumesetup fi # mount target mkdir -p /mnt/boot/efi mount -t vfat -L EFIBOOT /mnt/boot/ if ! grep -qs '/mnt' /proc/mounts; then echo "Drive is not mounted can not continue" echo "Rebooting in 3 Seconds ..." && sleep 1 echo "Rebooting in 2 Seconds ..." && sleep 1 echo "Rebooting in 1 Second ..." && sleep 1 reboot now fi echo -ne " ------------------------------------------------------------------------- Arch Install on Main Drive ------------------------------------------------------------------------- " pacstrap /mnt base base-devel linux-lts linux-lts-firmware vim nano sudo archlinux-keyring wget libnewt --noconfirm --needed echo "keyserver hkp://keyserver.ubuntu.com" >> /mnt/etc/pacman.d/gnupg/gpg.conf cp -R ${SCRIPT_DIR} /mnt/root/ArchTitus cp /etc/pacman.d/mirrorlist /mnt/etc/pacman.d/mirrorlist genfstab -L /mnt >> /mnt/etc/fstab echo " Generated /etc/fstab: " cat /mnt/etc/fstab echo -ne " ------------------------------------------------------------------------- GRUB BIOS Bootloader Install & Check ------------------------------------------------------------------------- " if [[ ! -d "/sys/firmware/efi" ]]; then grub-install --boot-directory=/mnt/boot ${DISK} else pacstrap /mnt efibootmgr --noconfirm --needed fi echo -ne " ------------------------------------------------------------------------- Checking for low memory systems <8G ------------------------------------------------------------------------- " TOTAL_MEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*') if [[ $TOTAL_MEM -lt 8000000 ]]; then # Put swap into the actual system, not into RAM disk, otherwise there is no point in it, it'll cache RAM into RAM. So, /mnt/ everything. mkdir -p /mnt/opt/swap # make a dir that we can apply NOCOW to to make it btrfs-friendly. if findmnt -n -o FSTYPE /mnt | grep -q btrfs; then chattr +C /mnt/opt/swap # apply NOCOW, btrfs needs that. fi dd if=/dev/zero of=/mnt/opt/swap/swapfile bs=1M count=2048 status=progress chmod 600 /mnt/opt/swap/swapfile # set permissions. chown root /mnt/opt/swap/swapfile mkswap /mnt/opt/swap/swapfile swapon /mnt/opt/swap/swapfile # The line below is written to /mnt/ but doesn't contain /mnt/, since it's just / for the system itself. echo "/opt/swap/swapfile none swap sw 0 0" >> /mnt/etc/fstab # Add swap to fstab, so it KEEPS working after installation. fi echo -ne " ------------------------------------------------------------------------- Network Setup ------------------------------------------------------------------------- " pacman -S --noconfirm --needed networkmanager dhclient systemctl enable --now NetworkManager echo -ne " ------------------------------------------------------------------------- Setting up mirrors for optimal download ------------------------------------------------------------------------- " pacman -S --noconfirm --needed pacman-contrib curl pacman -S --noconfirm --needed reflector rsync grub arch-install-scripts git cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak nc=$(grep -c ^processor /proc/cpuinfo) echo -ne " ------------------------------------------------------------------------- You have " $nc" cores. And changing the makeflags for "$nc" cores. Aswell as changing the compression settings. ------------------------------------------------------------------------- " TOTAL_MEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*') if [[ $TOTAL_MEM -gt 8000000 ]]; then sed -i "s/#MAKEFLAGS=\"-j2\"/MAKEFLAGS=\"-j$nc\"/g" /etc/makepkg.conf sed -i "s/COMPRESSXZ=(xz -c -z -)/COMPRESSXZ=(xz -c -T $nc -z -)/g" /etc/makepkg.conf fi echo -ne " ------------------------------------------------------------------------- Setup Language to US and set locale ------------------------------------------------------------------------- " sed -i 's/^#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen locale-gen timedatectl --no-ask-password set-timezone ${TIMEZONE} timedatectl --no-ask-password set-ntp 1 localectl --no-ask-password set-locale LANG="en_US.UTF-8" LC_TIME="en_US.UTF-8" ln -s /usr/share/zoneinfo/${TIMEZONE} /etc/localtime # Set keymaps localectl --no-ask-password set-keymap ${KEYMAP} # Add sudo no password rights sed -i 's/^# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers sed -i 's/^# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers #Add parallel downloading sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.conf #Enable multilib sed -i "/\[multilib\]/,/Include/"'s/^#//' /etc/pacman.conf pacman -Sy --noconfirm --needed echo -ne " ------------------------------------------------------------------------- Installing Microcode ------------------------------------------------------------------------- " # determine processor type and install microcode proc_type=$(lscpu) if grep -E "GenuineIntel" <<< ${proc_type}; then echo "Installing Intel microcode" pacman -S --noconfirm --needed intel-ucode proc_ucode=intel-ucode.img elif grep -E "AuthenticAMD" <<< ${proc_type}; then echo "Installing AMD microcode" pacman -S --noconfirm --needed amd-ucode proc_ucode=amd-ucode.img fi echo -ne " ------------------------------------------------------------------------- Installing Graphics Drivers ------------------------------------------------------------------------- " # Graphics Drivers find and install gpu_type=$(lspci) if grep -E "NVIDIA|GeForce" <<< ${gpu_type}; then pacman -S --noconfirm --needed nvidia-lts nvidia-xconfig elif lspci | grep 'VGA' | grep -E "Radeon|AMD"; then pacman -S --noconfirm --needed xf86-video-amdgpu elif grep -E "Integrated Graphics Controller" <<< ${gpu_type}; then pacman -S --noconfirm --needed libva-intel-driver libvdpau-va-gl lib32-vulkan-intel vulkan-intel libva-intel-driver libva-utils lib32-mesa elif grep -E "Intel Corporation UHD" <<< ${gpu_type}; then pacman -S --needed --noconfirm libva-intel-driver libvdpau-va-gl lib32-vulkan-intel vulkan-intel libva-intel-driver libva-utils lib32-mesa fi # Loop through user input until the user gives a valid username while true do read -p "Please enter username:" username # username regex per response here https://unix.stackexchange.com/questions/157426/what-is-the-regex-to-validate-linux-users # lowercase the username to test regex if [[ "${username,,}" =~ ^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$ ]] then break fi echo "Incorrect username." done #Set Password read -p "Please enter password:" password # Loop through user input until the user gives a valid hostname, but allow the user to force save while true do read -p "Please name your machine:" name_of_machine # hostname regex (!!couldn't find spec for computer name!!) if [[ "${name_of_machine,,}" =~ ^[a-z][a-z0-9_.-]{0,62}[a-z0-9]$ ]] then break fi # if validation fails allow the user to force saving of the hostname read -p "Hostname doesn't seem correct. Do you still want to save it? (y/n)" force if [[ "${force,,}" = "y" ]] then break fi done echo -ne " ------------------------------------------------------------------------- Adding User ------------------------------------------------------------------------- " if [ $(whoami) = "root" ]; then groupadd libvirt useradd -m -G wheel,libvirt -s /bin/bash $USERNAME echo "$USERNAME created, home directory created, added to wheel and libvirt group, default shell set to /bin/bash" # use chpasswd to enter $USERNAME:$password echo "$USERNAME:$PASSWORD" | chpasswd echo "$USERNAME password set" cp -R $HOME/ArchTitus /home/$USERNAME/ chown -R $USERNAME: /home/$USERNAME/ArchTitus echo "ArchTitus copied to home directory" # enter $NAME_OF_MACHINE to /etc/hostname echo $NAME_OF_MACHINE > /etc/hostname else echo "You are already a user proceed with aur installs" fi if [[ ${FS} == "luks" ]]; then # Making sure to edit mkinitcpio conf if luks is selected # add encrypt in mkinitcpio.conf before filesystems in hooks sed -i 's/filesystems/encrypt filesystems/g' /etc/mkinitcpio.conf # making mkinitcpio with linux kernel mkinitcpio -p linux-lts fi export PATH=$PATH:~/.local/bin echo -ne " ------------------------------------------------------------------------- █████╗ ██████╗ ██████╗██╗ ██╗████████╗██╗████████╗██╗ ██╗███████╗ ██╔══██╗██╔══██╗██╔════╝██║ ██║╚══██╔══╝██║╚══██╔══╝██║ ██║██╔════╝ ███████║██████╔╝██║ ███████║ ██║ ██║ ██║ ██║ ██║███████╗ ██╔══██║██╔══██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║╚════██║ ██║ ██║██║ ██║╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝███████║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ------------------------------------------------------------------------- Automated Arch Linux Installer SCRIPTHOME: ArchTitus ------------------------------------------------------------------------- Final Setup and Configurations GRUB EFI Bootloader Install & Check " if [[ -d "/sys/firmware/efi" ]]; then grub-install --efi-directory=/boot ${DISK} fi echo -ne " ------------------------------------------------------------------------- Creating (and Theming) Grub Boot Menu ------------------------------------------------------------------------- " # set kernel parameter for decrypting the drive if [[ "${FS}" == "luks" ]]; then sed -i "s%GRUB_CMDLINE_LINUX_DEFAULT=\"%GRUB_CMDLINE_LINUX_DEFAULT=\"cryptdevice=UUID=${ENCRYPTED_PARTITION_UUID}:ROOT root=/dev/mapper/ROOT %g" /etc/default/grub fi # set kernel parameter for adding splash screen sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& splash /' /etc/default/grub echo -e "Installing CyberRe Grub theme..." THEME_DIR="/boot/grub/themes" THEME_NAME=CyberRe echo -e "Creating the theme directory..." mkdir -p "${THEME_DIR}/${THEME_NAME}" echo -e "Copying the theme..." cd "${HOME}/ArchTitus" || exit cp -a configs${THEME_DIR}/${THEME_NAME}/* ${THEME_DIR}/${THEME_NAME} echo -e "Backing up Grub config..." cp -an /etc/default/grub /etc/default/grub.bak echo -e "Setting the theme as the default..." # shellcheck disable=SC2069 grep "GRUB_THEME=" /etc/default/grub 2>&1 >/dev/null && sed -i '/GRUB_THEME=/d' /etc/default/grub echo "GRUB_THEME=\"${THEME_DIR}/${THEME_NAME}/theme.txt\"" >> /etc/default/grub echo -e "Updating grub..." grub-mkconfig -o /boot/grub/grub.cfg echo -e "All set!" echo -ne " ------------------------------------------------------------------------- Enabling (and Theming) Login Display Manager ------------------------------------------------------------------------- " systemctl enable sddm.service echo "[Theme]" >> /etc/sddm.conf echo "Current=Nordic" >> /etc/sddm.conf echo -ne " ------------------------------------------------------------------------- Enabling Essential Services ------------------------------------------------------------------------- " ntpd -qg systemctl enable ntpd.service echo " NTP enabled" systemctl disable dhcpcd.service echo " DHCP disabled" systemctl stop dhcpcd.service echo " DHCP stopped" systemctl enable NetworkManager.service echo " NetworkManager enabled" echo -ne " ------------------------------------------------------------------------- Enabling (and Theming) Plymouth Boot Splash ------------------------------------------------------------------------- " PLYMOUTH_THEMES_DIR="$HOME/ArchTitus/configs/usr/share/plymouth/themes" PLYMOUTH_THEME="arch-glow" # can grab from config later if we allow selection mkdir -p /usr/share/plymouth/themes echo 'Installing Plymouth theme...' cp -rf "${PLYMOUTH_THEMES_DIR}"/${PLYMOUTH_THEME} /usr/share/plymouth/themes if [[ $FS == "luks" ]]; then sed -i 's/HOOKS=(base udev*/& plymouth/' /etc/mkinitcpio.conf # add plymouth after base udev sed -i 's/HOOKS=(base udev \(.*block\) /&plymouth-/' /etc/mkinitcpio.conf # create plymouth-encrypt after block hook else sed -i 's/HOOKS=(base udev*/& plymouth/' /etc/mkinitcpio.conf # add plymouth after base udev fi plymouth-set-default-theme -R arch-glow # sets the theme and runs mkinitcpio echo 'Plymouth theme installed' echo -ne " ------------------------------------------------------------------------- Cleaning ------------------------------------------------------------------------- " # Remove no password sudo rights sed -i 's/^%wheel ALL=(ALL) NOPASSWD: ALL/# %wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers sed -i 's/^%wheel ALL=(ALL:ALL) NOPASSWD: ALL/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers # Add sudo rights sed -i 's/^# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers sed -i 's/^# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers rm -r $HOME/ArchTitus rm -r /home/$USERNAME/ArchTitus # Replace in the same state cd "$(pwd)" || exit