677 lines
24 KiB
Bash
Executable File
677 lines
24 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
setDelimiters() {
|
|
delimiters=("$@")
|
|
}
|
|
|
|
formatOptions() {
|
|
options=()
|
|
while read -r item; do
|
|
options+=("${item}" "${delimiters[@]}")
|
|
done < "$1"
|
|
}
|
|
|
|
# TODO: Add support for MBR boot mode
|
|
checkUefi() {
|
|
ls /sys/firmware/efi/efivars > /dev/null 2>&1
|
|
[ $? -ge 1 ] && printAndExit "This scripts supports only UEFI boot mode."
|
|
}
|
|
|
|
updateSystemClock() {
|
|
timedatectl set-ntp true
|
|
}
|
|
|
|
printAndExit() {
|
|
str="${1} Therefore, the installation process will stop, but you can continue where you left off by running:\n\nsh calsais"
|
|
calcAndRun dialog --msgbox "\"\n${str}\"" HEIGHT 59
|
|
exit 1
|
|
}
|
|
|
|
exitIfCancel() {
|
|
[ $? -eq 1 ] && printAndExit "$@"
|
|
}
|
|
|
|
printWaitBox() {
|
|
dialog --infobox "\nPlease wait..." 5 18
|
|
}
|
|
|
|
partDisks() {
|
|
dialog --yesno "\nDo you want me to automatically partition and format a disk for you?" 8 59
|
|
whipStatus=$?
|
|
|
|
local IFS=$'\n'
|
|
setDelimiters ""
|
|
formatOptions <(lsblk -dpnlo NAME,SIZE -e 7,11)
|
|
disks=$(lsblk -dpnl -e 7,11 | wc -l)
|
|
result=$(dialog --menu "\nSelect the disk." 0 30 "$disks" "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a disk."
|
|
disk=$(echo "$result" | cut -d' ' -f1)
|
|
|
|
if [ $whipStatus -eq 1 ]; then
|
|
autoSelection=false
|
|
msg="\nYou will partition the disk yourself and then, when finished, you will continue with the installation."
|
|
dialog --msgbox "$msg" 8 56
|
|
partPrograms=("fdisk" "" "sfdisk" "" "cfdisk" "" "gdisk" "" "cgdisk" "" "sgdisk" "")
|
|
partTool=$(dialog --menu "\nSelect the partitioning tool." 14 35 6 "${partPrograms[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a partitioning tool."
|
|
$partTool "$disk"
|
|
parts=$(lsblk "$disk" -pnl | sed -n '2~1p' | wc -l)
|
|
[ "$parts" -lt 2 ] && printAndExit "You must at least create boot and root partitions."
|
|
|
|
# TODO: Ask if the user wants a home partition
|
|
formatOptions <(lsblk "${disk}" -pnlo NAME,SIZE,MOUNTPOINTS | sed -n '2~1p')
|
|
result=$(dialog --menu "\nSelect the boot partition." 0 30 "$parts" "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select the boot partition."
|
|
bootPart=$(echo "$result" | cut -d' ' -f1)
|
|
formatOptions <(lsblk "${disk}" -pnlo NAME,SIZE,MOUNTPOINTS | sed -n '2~1p' | awk '$0!~v' v="$bootPart")
|
|
result=$(dialog --menu "\nSelect the root partition." 0 30 "$parts" "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select the root partition."
|
|
rootPart=$(echo "$result" | cut -d' ' -f1)
|
|
|
|
remainingParts=$(lsblk "$disk" -pnl | sed -n '2~1p' | awk '$0!~v' v="$bootPart|$rootPart" | wc -l)
|
|
if [ "$remainingParts" -gt 0 ]; then
|
|
dialog --yesno "\nDo you have a swap partition?" 7 34
|
|
if [ $? -eq 0 ]; then
|
|
formatOptions <(lsblk "${disk}" -pnlo NAME,SIZE,MOUNTPOINTS | sed -n '2~1p' | awk '$0!~v' v="$bootPart|$rootPart")
|
|
result=$(dialog --menu "\nSelect the swap partition." 0 30 "$parts" "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select the swap partition."
|
|
swapPart=$(echo "$result" | cut -d' ' -f1)
|
|
else
|
|
dialog --yesno "\nDo you want to create a swapfile?" 7 37
|
|
if [ $? -eq 0 ]; then
|
|
size=$(getSize "swapfile")
|
|
swapfile=/mnt/swapfile
|
|
fi
|
|
fi
|
|
else
|
|
dialog --yesno "\nDo you want to create a swapfile?" 7 37
|
|
if [ $? -eq 0 ]; then
|
|
size=$(getSize "swapfile")
|
|
swapfile=/mnt/swapfile
|
|
fi
|
|
fi
|
|
else
|
|
autoSelection=true
|
|
bootPart=${disk}1
|
|
rootPart=${disk}2
|
|
|
|
dialog --yesno "\nDo you want to create a swap space?" 7 39
|
|
if [ $? -eq 0 ]; then
|
|
result=$(dialog --menu "\nSelect the swap space." 0 26 2 "Partition" "" "Swapfile" "" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a swap space."
|
|
size=$(getSize "${result,,}")
|
|
if [ "$result" = "Partition" ]; then
|
|
swapPart=${disk}2
|
|
rootPart=${disk}3
|
|
else
|
|
swapfile=/mnt/swapfile
|
|
fi
|
|
fi
|
|
|
|
printWaitBox
|
|
autoPart
|
|
fi
|
|
|
|
printWaitBox
|
|
formatPart
|
|
mountPart
|
|
}
|
|
|
|
getSize() {
|
|
sizeStr=$(dialog --inputbox "\nEnter the size of the ${1} (in GB, for example 1.5GB)." 10 63 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a size."
|
|
size=$(echo "$sizeStr" | grep -Eo '[-]?[0-9]+([.,]?[0-9]+)?' | head -n1 | sed 's/,/./g' | awk '{ print int($1 * 1024) }')
|
|
while [ "$(echo "$size" | awk '{ print $1 <= 0 }')" -eq 1 ]; do
|
|
msg="\nThe size must be a number and cannot be less than or equal to zero. Please enter a new size."
|
|
sizeStr=$(dialog --inputbox "$msg" 11 63 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a size."
|
|
size=$(echo "$sizeStr" | grep -Eo '[-]?[0-9]+([.,]?[0-9]+)?' | head -n1 | sed 's/,/./g' | awk '{ print int($1 * 1024) }')
|
|
done
|
|
echo "$size"
|
|
}
|
|
|
|
createSwapfile() {
|
|
dd if=/dev/zero of=$swapfile bs=1M count="${size}" status=progress 2>&1 | debug
|
|
chmod 600 $swapfile 2>&1 | debug
|
|
mkswap $swapfile 2>&1 | debug
|
|
swapon $swapfile 2>&1 | debug
|
|
}
|
|
|
|
autoPart() {
|
|
parted -s "$disk" mklabel gpt 2>&1 | debug
|
|
|
|
sgdisk "$disk" -n=1:0:+300M -t=1:ef00 2>&1 | debug
|
|
if [ -n "$swapPart" ]; then
|
|
sgdisk "$disk" -n=2:0:+"${size}"M -t=2:8200 2>&1 | debug
|
|
sgdisk "$disk" -n=3:0:0 2>&1 | debug
|
|
else
|
|
sgdisk "$disk" -n=2:0:0 2>&1 | debug
|
|
fi
|
|
}
|
|
|
|
# TODO: Let the user choose the file system (and add encryption support)
|
|
formatPart() {
|
|
mkfs.fat -F 32 "$bootPart" 2>&1 | debug
|
|
[ -n "$swapPart" ] && mkswap "$swapPart" 2>&1 | debug
|
|
mkfs.ext4 "$rootPart" 2>&1 | debug
|
|
}
|
|
|
|
mountPart() {
|
|
mount "$rootPart" /mnt 2>&1 | debug
|
|
if [ $autoSelection = false ]; then
|
|
mountOptions=("/boot/efi" "" "/boot" "" "==OTHER==" "")
|
|
result=$(dialog --menu "\nSelect where to mount the boot partition." 0 30 4 "${mountOptions[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a path."
|
|
bootPath=$(echo "$result" | sed 's/^\///g')
|
|
if [ "$result" = "OTHER" ]; then
|
|
local IFS=' '
|
|
result=$(dialog --inputbox "\nEnter the absolute path." 10 35 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a path."
|
|
bootPath=$(echo "$result" | sed 's/^\///g')
|
|
mkdir -p "/mnt/$bootPath"
|
|
while [[ ! -d "/mnt/$bootPath" ]]; do
|
|
result=$(dialog --inputbox "\nPath isn't valid. Please try again." 10 40 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a path."
|
|
bootPath=$(echo "$result" | sed 's/^\///g')
|
|
mkdir -p "/mnt/$bootPath"
|
|
done
|
|
else
|
|
mkdir -p "/mnt/$bootPath"
|
|
fi
|
|
mount "$bootPart" "/mnt/$bootPath" 2>&1 | debug
|
|
else
|
|
bootPath="boot/efi"
|
|
mkdir -p /mnt/$bootPath
|
|
mount "$bootPart" /mnt/$bootPath 2>&1 | debug
|
|
fi
|
|
printWaitBox
|
|
[ -n "$swapPart" ] && swapon "$swapPart" 2>&1 | debug
|
|
[ -n "$swapfile" ] && createSwapfile
|
|
saveVar "bootPath" "/$bootPath"
|
|
}
|
|
|
|
debug() {
|
|
if [ "$debugFlagToStdout" = true ]; then
|
|
tee
|
|
elif [ "$debugFlagToFile" = true ]; then
|
|
tee -a calsais.log > /dev/null
|
|
elif [ "$debugFlag" = true ]; then
|
|
tee -a calsais.log
|
|
else
|
|
tee > /dev/null
|
|
fi
|
|
}
|
|
|
|
installPackage() {
|
|
calcAndRun dialog --infobox "\"\nInstalling '$1'.\"" 5 WIDTH
|
|
case ${3} in
|
|
A)
|
|
if [ "$debugFlagToStdout" = true ] || [ "$debugFlag" = true ]; then
|
|
script -qec "pacstrap /mnt --needed ${1}" /dev/null 2>&1 | debug
|
|
else
|
|
pacstrap /mnt --needed "${1}" 2>&1 | debug
|
|
fi
|
|
;;
|
|
B)
|
|
flag=""
|
|
if [ "$2" != "R" ]; then
|
|
runInChroot "pacman -Q ${1}" 2>&1 | debug
|
|
[ $? -eq 0 ] && return
|
|
flag="--needed"
|
|
fi
|
|
if [ "$debugFlagToStdout" = true ] || [ "$debugFlag" = true ]; then
|
|
runInChroot "script -qec \"pacman -S $flag --noconfirm ${1}\" /dev/null" 2>&1 | debug
|
|
else
|
|
runInChroot "pacman -S $flag --noconfirm ${1}" 2>&1 | debug
|
|
fi
|
|
;;
|
|
C)
|
|
flag=""
|
|
if [ "$2" != "R" ]; then
|
|
runInChroot "sudo -u $username paru -Q ${1}" 2>&1 | debug
|
|
[ $? -eq 0 ] && return
|
|
flag="--needed"
|
|
fi
|
|
if [ "$debugFlagToStdout" = true ] || [ "$debugFlag" = true ]; then
|
|
runInChroot "script -qec \"sudo -u $username paru -S $flag --noconfirm --skipreview ${1}\" /dev/null" 2>&1 | debug
|
|
else
|
|
runInChroot "sudo -u $username paru -S $flag --noconfirm --skipreview ${1}" 2>&1 | debug
|
|
fi
|
|
;;
|
|
?)
|
|
printAndExit "INSTALL must be A, B or C in packages.csv file."
|
|
;;
|
|
esac
|
|
exitIfCancel "Package installation failed."
|
|
}
|
|
|
|
checkForParu() {
|
|
commOutput=$(runInChroot "command -v paru > /dev/null 2>&1 || echo 1")
|
|
if [ "$commOutput" = "1" ]; then
|
|
runInChroot "sed -i 's/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers"
|
|
checkSudoers
|
|
printWaitBox
|
|
runInChroot "cd /tmp; sudo -u $username git clone https://aur.archlinux.org/paru-bin.git; cd paru-bin; sudo -u $username makepkg -si --noconfirm" 2>&1 | debug
|
|
fi
|
|
}
|
|
|
|
getThePackages() {
|
|
set -o pipefail
|
|
if [ ! -f "packages.csv" ]; then
|
|
printWaitBox
|
|
curl -LO "https://git.slc.ar/slococo/calsais/raw/branch/master/packages.csv" 2>&1 | debug
|
|
shasum="$(sha256sum packages.csv | cut -d' ' -f1)"
|
|
if [ ! "$shasum" = "8df3fb4189235980e992a4921d3eacf837162e029366d44e564b03b6e13ee788" ]; then
|
|
dialog --yesno "\nThe package checksum verification failed. Do you still want to continue?" 7 39
|
|
if [ $? -ne 0 ]; then
|
|
printAndExit "The package checksum verification failed."
|
|
fi
|
|
fi
|
|
fi
|
|
if [ "${1}" = "N" ]; then
|
|
dialog --msgbox "\nA menu will appear where you can deselect the packages you don't want to be installed." 8 59
|
|
local IFS=$'\n'
|
|
setDelimiters "" "ON"
|
|
formatOptions <(grep "N" packages.csv | sed -n '2~1p' | cut -d',' -f1)
|
|
msg="\nIf you don't want to install any packages, press Cancel."
|
|
packages=$(dialog --separate-output --checklist "$msg" 28 46 19 "${options[@]}" 3>&1 1>&2 2>&3)
|
|
tempFile=$(mktemp)
|
|
for package in $packages; do
|
|
grep "^$package," packages.csv >> "$tempFile"
|
|
done
|
|
header=$(head -n1 packages.csv)
|
|
packages=$(sort <(sed -n '2~1p' packages.csv) <(cat "$tempFile") | uniq -d)
|
|
printf '%s\n%s' "$header" "$packages" > packages.csv
|
|
fi
|
|
local IFS=,
|
|
while read -r NAME IMPORTANT INSTALLER; do
|
|
if [ "$IMPORTANT" = "${1}" ]; then
|
|
installPackage "$NAME" "$IMPORTANT" "$INSTALLER" "${2}" < /dev/null
|
|
fi
|
|
done < packages.csv
|
|
set +o pipefail
|
|
}
|
|
|
|
installImportantPackages() {
|
|
msg="\nWe will continue with the installation of some important packages in the background. Please press OK and wait."
|
|
dialog --msgbox "$msg" 8 60
|
|
dialog --infobox "\nUpgrading archlinux-keyring." 5 32
|
|
pacman -Sy --noconfirm archlinux-keyring 2>&1 | debug
|
|
getThePackages "Y" "installImportantPackages"
|
|
runInChroot "systemctl enable NetworkManager; systemctl enable fstrim.timer" 2>&1 | debug
|
|
}
|
|
|
|
generateFstab() {
|
|
printWaitBox
|
|
genfstab -U /mnt >> /mnt/etc/fstab
|
|
}
|
|
|
|
setTimeZone() {
|
|
dialog --msgbox "\nNow, we will set the timezone." 7 34
|
|
setDelimiters ""
|
|
formatOptions <(find -H /usr/share/zoneinfo -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort | awk '!/posix/ && !/right/')
|
|
region=$(dialog --menu "Select a region." 0 26 15 "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a region."
|
|
formatOptions <(find -H "/usr/share/zoneinfo/${region}" -maxdepth 1 -mindepth 1 -type f -printf '%f\n' | sort)
|
|
city=$(dialog --menu "Select a city." 0 26 15 "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must select a city."
|
|
|
|
runInChroot "ln -sf \"/usr/share/zoneinfo/${region}/${city}\" /etc/localtime"
|
|
printWaitBox
|
|
runInChroot "hwclock --systohc"
|
|
}
|
|
|
|
setLocale() {
|
|
# TODO: Let the user choose a locale
|
|
sed 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' -i /mnt/etc/locale.gen
|
|
printWaitBox
|
|
runInChroot "locale-gen" 2>&1 | debug
|
|
echo "LANG=en_US.UTF-8" > /mnt/etc/locale.conf
|
|
}
|
|
|
|
networkConf() {
|
|
hostname=$(dialog --inputbox "\nEnter the hostname." 10 28 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a hostname."
|
|
echo "${hostname}" > /mnt/etc/hostname
|
|
echo "
|
|
127.0.0.1 localhost
|
|
::1 localhost
|
|
127.0.1.1 ${hostname}.localdomain ${hostname}" >> /mnt/etc/hosts
|
|
unset hostname
|
|
}
|
|
|
|
calcAndRun() {
|
|
argc="$#"; local i=1
|
|
for item in "$@"; do
|
|
[ $i -eq $((argc-2)) ] && str="$item"
|
|
[ "$item" = "WIDTH" ] && { function="calcWidth"; dimName="width"; }
|
|
[ "$item" = "HEIGHT" ] && { function="calcHeight"; dimName="height"; }
|
|
((i++))
|
|
done
|
|
dim=$($function "$str")
|
|
comm=$(sed "s/${dimName^^}/$dim/g" <(echo "$@"))
|
|
if [[ $comm != *"3>&1 1>&2 2>&3" ]]; then
|
|
comm="${comm} 3>&1 1>&2 2>&3"
|
|
fi
|
|
commOutput=$(eval "$comm")
|
|
exitStatus=$?
|
|
[ -n "$commOutput" ] && echo "$commOutput"
|
|
return $exitStatus
|
|
}
|
|
|
|
calcWidth() {
|
|
count=1; found=false; option=1
|
|
while IFS= read -r -N 1 c; do
|
|
if [[ "$c" == $'\n' ]]; then
|
|
[ $count -ge $option ] && option=$count
|
|
found=true
|
|
count=-1
|
|
fi
|
|
((count++))
|
|
done < <(echo -ne "$1")
|
|
[ $option -ge "$count" ] && count=option
|
|
echo $((count+4))
|
|
}
|
|
|
|
calcHeight() {
|
|
newlines=$(echo -ne "$1" | grep -c $'\n')
|
|
height=$(echo "${#1}" "$newlines" | awk '{
|
|
x = (($1 - $2 + ($2 * 60)) / 60)
|
|
printf "%d", (x == int(x)) ? x : int(x) + 1
|
|
}')
|
|
echo $((4+height))
|
|
}
|
|
|
|
askForPassword() {
|
|
password=$(calcAndRun dialog --insecure --passwordbox "\"\nNow, enter the password for $1.\"" 10 WIDTH)
|
|
exitIfCancel "You must enter a password."
|
|
passwordRep=$(dialog --insecure --passwordbox "\nReenter password." 10 30 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a password."
|
|
while ! [ "$password" = "$passwordRep" ]; do
|
|
password=$(dialog --insecure --passwordbox "\nPasswords do not match! Please enter the password again." 10 60 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a password."
|
|
passwordRep=$(dialog --insecure --passwordbox "\nReenter password." 10 30 3>&1 1>&2 2>&3)
|
|
exitIfCancel "You must enter a password."
|
|
done
|
|
unset passwordRep
|
|
}
|
|
|
|
setRootPassword() {
|
|
askForPassword "root" "setRootPassword"
|
|
runInChroot "echo \"root:${password}\" | chpasswd" 2>&1 | debug
|
|
unset password
|
|
}
|
|
|
|
updateMirrors() {
|
|
msg="\nNow, we will update the mirror list by taking the most recently synchronized HTTPS mirrors sorted by download rate."
|
|
dialog --msgbox "$msg" 9 59
|
|
dialog --yesno "\nWould you like to choose your closest countries to narrow the search?" 8 55
|
|
if [ $? -eq 0 ]; then
|
|
printWaitBox
|
|
systemctl stop reflector.service
|
|
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
|
|
curl -o /etc/pacman.d/mirrorlist.pacnew https://archlinux.org/mirrorlist/all/ 2>&1 | debug
|
|
local IFS=$'\n'
|
|
setDelimiters "" "OFF"
|
|
formatOptions <(grep '^##' /etc/pacman.d/mirrorlist.pacnew | cut -d' ' -f2- | sed -n '5~1p')
|
|
countries=$(dialog --checklist "\nSelect your closest countries." 25 38 19 "${options[@]}" 3>&1 1>&2 2>&3)
|
|
[ -z "$countries" ] && printAndExit "You must select at least one country."
|
|
countriesFmt=$(echo "$countries" | sed -r 's/" "/,/g')
|
|
printWaitBox
|
|
reflector --country "${countriesFmt//\"/}" --protocol https --sort rate --save /etc/pacman.d/mirrorlist 2>&1 | debug
|
|
else
|
|
checkForSystemdUnit "mirrors update" "reflector.service" "oneshot"
|
|
fi
|
|
}
|
|
|
|
grubSetUp() {
|
|
printWaitBox
|
|
[ -z $bootPath ] && tryLoadVar "bootPath"
|
|
runInChroot "grub-install --target=x86_64-efi --efi-directory=${bootPath} --bootloader-id=GRUB"
|
|
runInChroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>&1 | debug
|
|
}
|
|
|
|
saveVar() {
|
|
[ ! -f "calsais.vars" ] && touch calsais.vars
|
|
if ! grep -q "$1" calsais.vars; then
|
|
echo "$1=$2" >> calsais.vars
|
|
else
|
|
sed -i "s|$1=.*|$1=$2|" calsais.vars
|
|
fi
|
|
}
|
|
|
|
loadVar() {
|
|
[ -f "calsais.vars" ] && var=$(grep "$1=" calsais.vars | cut -d= -f2) || var=""
|
|
export "$1"="$var"
|
|
}
|
|
|
|
tryLoadVar() {
|
|
loadVar "$1"
|
|
if [ -z "${!1}" ]; then
|
|
calcAndRun dialog --msgbox "\"\nCouldn't load '$1'. Try to run the script again.\"" 7 WIDTH
|
|
rm -f calsais.vars
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
userSetUp() {
|
|
username=$(dialog --inputbox "Enter the new username." 10 30 3>&1 1>&2 2>&3) && saveVar "username" "$username"
|
|
exitIfCancel "You must enter an username."
|
|
askForPassword "${username}" "userSetUp"
|
|
runInChroot "useradd -m ${username};echo \"${username}:${password}\" | chpasswd; usermod -aG wheel ${username}"
|
|
runInChroot "sed -i 's/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers"
|
|
checkSudoers
|
|
unset password
|
|
}
|
|
|
|
runInChroot() {
|
|
cat << EOF > /mnt/cocoScript
|
|
${1}
|
|
EOF
|
|
chmod 755 /mnt/cocoScript
|
|
arch-chroot /mnt /cocoScript
|
|
return $?
|
|
}
|
|
|
|
checkSudoers() {
|
|
runInChroot "visudo -c" 2>&1 | debug
|
|
if [ $? -ne 0 ]; then
|
|
dialog --msgbox "\nSudoers check failed. Try to run the script again." 7 54
|
|
cp /etc/sudoers /mnt/etc/sudoers
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
installOtherPackages() {
|
|
msg="\nNow, we will install a few more packages (in the background). Press OK and wait (it may take some time)."
|
|
dialog --msgbox "$msg" 8 59
|
|
[ -z "$username" ] && tryLoadVar "username"
|
|
getThePackages "S" "installOtherPackages"
|
|
checkForParu
|
|
getThePackages "N" "installOtherPackages"
|
|
getThePackages "R" "installOtherPackages"
|
|
runInChroot "sed -i 's/^%wheel ALL=(ALL:ALL) NOPASSWD: ALL/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers"
|
|
checkSudoers
|
|
}
|
|
|
|
finishInstallation() {
|
|
if [ "$cdotfisInstall" = true ]; then
|
|
[ -z "$username" ] && tryLoadVar "username"
|
|
cp calsais /mnt/usr/bin/calsais
|
|
echo "sh /usr/bin/calsais && logout" >> "/mnt/home/$username/.bashrc"
|
|
fi
|
|
rm -f /mnt/cocoScript
|
|
umount -R /mnt
|
|
dialog --yesno "\nFinally, the PC needs to restart, would you like to restart now?" 8 47
|
|
if [ $? -eq 0 ]; then
|
|
reboot
|
|
else
|
|
clear
|
|
fi
|
|
}
|
|
|
|
getDotfiles() {
|
|
lastFolder=$(pwd -P)
|
|
cd "$HOME/Documents" || printAndExit "Couldn't cd into $HOME/Documents"
|
|
git clone --recursive "https://git.slc.ar/slococo/cdotfis.git" 2>&1 | debug
|
|
cd cdotfis || printAndExit "Couldn't cd into ./cdotfis"
|
|
sh sadedot/scripts/bootstrap.sh -p
|
|
cd "$lastFolder" || printAndExit "Couldn't cd into $lastFolder"
|
|
|
|
sudo rm -f ~/.bashrc /usr/bin/calsais
|
|
mkdir -p "$HOME/.cache/zsh"
|
|
touch "$HOME/.cache/zsh/.histfile"
|
|
chsh -s "$(which zsh)"
|
|
}
|
|
|
|
checkForSystemdUnit() {
|
|
if [ "${3}" = "oneshot" ]; then
|
|
[ "$(systemctl show -p ActiveState --value "${2}")" = "inactive" ] && return
|
|
else
|
|
systemctl is-active --quiet "${2}" && return
|
|
fi
|
|
trapBackup=$(trap)
|
|
trap 'systemctl stop ${2}; forceExit=true' INT
|
|
forceExit=false
|
|
commOutput=$(command -v paru > /dev/null 2>&1 && echo 0)
|
|
if [ "$commOutput" = "0" ]; then
|
|
calcAndRun dialog --infobox "\"\nWaiting for the ${1} to finish. Please wait.\"" 5 WIDTH
|
|
fi
|
|
if [ "${3}" = "oneshot" ]; then
|
|
while [ $forceExit = false ]; do
|
|
result=$(systemctl show -p ActiveState --value "${2}")
|
|
[ "$result" = "inactive" ] && break
|
|
sleep 1
|
|
done
|
|
else
|
|
systemctl is-active --quiet "${2}"
|
|
while [ $? -ne 0 ] && [ $forceExit = false ]; do
|
|
sleep 1
|
|
systemctl is-active --quiet "${2}"
|
|
done
|
|
fi
|
|
eval "$trapBackup"
|
|
}
|
|
|
|
printStepIfDebug() {
|
|
if [ "$debugFlagToFile" = true ] || [ "$debugFlag" = true ]; then
|
|
printf '\n%s\n%s\n%s\n' "============================================================" "$step" \
|
|
"============================================================" >> calsais.log
|
|
fi
|
|
}
|
|
|
|
steps=(
|
|
checkUefi
|
|
updateSystemClock
|
|
partDisks
|
|
updateMirrors
|
|
installImportantPackages
|
|
generateFstab
|
|
setTimeZone
|
|
setLocale
|
|
networkConf
|
|
setRootPassword
|
|
grubSetUp
|
|
userSetUp
|
|
installOtherPackages
|
|
finishInstallation
|
|
)
|
|
|
|
usage() {
|
|
cat << EOF
|
|
usage: ${0##*/} [command]
|
|
-h Print this help message.
|
|
-d Print log to STDOUT and calsais.log file.
|
|
-f Print log to calsais.log file.
|
|
-s Print log to STDOUT.
|
|
-p Install cdotfis (personal dotfiles).
|
|
EOF
|
|
}
|
|
|
|
printLogo() {
|
|
tput bold
|
|
tput setaf 2
|
|
cat << END
|
|
,, ,,
|
|
\`7MM db
|
|
MM
|
|
,p6"bo ,6"Yb. MM ,pP"Ybd ,6"Yb. \`7MM ,pP"Ybd
|
|
6M' OO 8) MM MM 8I \`" 8) MM MM 8I \`"
|
|
8M ,pm9MM MM \`YMMMa. ,pm9MM MM \`YMMMa.
|
|
YM. , 8M MM MM L. I8 8M MM MM L. I8
|
|
YMbmd' \`Moo9^Yo JMML M9mmmP' \`Moo9^Yo JMML M9mmmP'
|
|
======================================================
|
|
END
|
|
tput sgr0
|
|
printf '\n\n\n%s\n' "Please wait..."
|
|
}
|
|
|
|
runScript() {
|
|
debugFlag=false; debugFlagToFile=false; debugFlagToStdout=false; cdotfisInstall=false
|
|
while getopts ':hdfsp' flag; do
|
|
case $flag in
|
|
h) usage && exit 0 ;;
|
|
d) debugFlag=true ;;
|
|
f) debugFlagToFile=true ;;
|
|
s) debugFlagToStdout=true ;;
|
|
p) cdotfisInstall=true ;;
|
|
?) printf '%s: invalid option -''%s'\\n "${0##*/}" "$OPTARG" && exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
clear
|
|
if [ -d "$HOME/Documents" ]; then
|
|
dialog --title "calsais" --msgbox "\nNow, we will finish the installation. Press OK and wait." 7 60
|
|
getDotfiles
|
|
dialog --title "calsais" --msgbox "\nAll done!" 7 15
|
|
exit 0
|
|
fi
|
|
|
|
local i=0; found=false
|
|
loadVar "lastStep"
|
|
if [ -n "$lastStep" ]; then
|
|
for item in "${steps[@]}"; do
|
|
if [ "$item" = "$lastStep" ]; then
|
|
found=true
|
|
break
|
|
fi
|
|
((i++))
|
|
done
|
|
if [ $found = false ]; then
|
|
i=0
|
|
fi
|
|
fi
|
|
|
|
if [ $i -gt 0 ]; then
|
|
welcomeMsg="Welcome back to calsais!"
|
|
else
|
|
systemctl stop reflector.service
|
|
checkForSystemdUnit "systemd units" "graphical.target"
|
|
systemctl --no-block start reflector.service
|
|
welcomeMsg="Welcome to calsais!"
|
|
printLogo
|
|
sed -i -e '/^\[extra\]/,/^Include/ s/^/#/' -e '/^\[community\]/,/^Include/ s/^/#/' /etc/pacman.conf
|
|
pacman -Sy --needed --noconfirm dialog 2>&1 | debug
|
|
sed -i -e '/\[extra\]/,/Include/ s/^#//' -e '/\[community\]/,/Include/ s/^#//' /etc/pacman.conf
|
|
fi
|
|
|
|
if [ ! -f "/etc/dialogrc" ]; then
|
|
curl -LO "https://git.slc.ar/slococo/cdotfis/raw/branch/master/dotfiles/.dialogrc" 2>&1 | debug
|
|
mv .dialogrc /etc/dialogrc
|
|
fi
|
|
|
|
tput reset
|
|
trap 'printAndExit "Received SIGINT signal."' INT
|
|
calcAndRun dialog --title "calsais" --msgbox "\"\n${welcomeMsg}\"" 7 WIDTH
|
|
|
|
while [ $i -lt "${#steps[@]}" ]; do
|
|
step=${steps[$i]}
|
|
printStepIfDebug
|
|
saveVar "lastStep" "$step"
|
|
$step
|
|
((i++))
|
|
done
|
|
}
|
|
|
|
runScript "$@"
|