diff options
Diffstat (limited to 'gohan.sh')
| -rwxr-xr-x | gohan.sh | 160 |
1 files changed, 44 insertions, 116 deletions
@@ -6,143 +6,71 @@ ### OPTIONS AND VARIABLES ### -while getopts ":p:h" o; do case "${o}" in - h) printf "Optional arguments for custom use:\\n -p: Dependencies and programs csv (local file or url)\\n -h: Show this message\\n" && exit ;; - p) packages=${OPTARG} ;; - *) printf "Invalid option: -%s\\n" "$OPTARG" && exit ;; -esac done +### FUNCTIONS ### -[ -z "$packages" ] && packages="https://git.davidtsadler.com/gohan/plain/packages.csv" +read_password() { + PASSWORD="$( + # always read from the tty even when redirected: + exec < /dev/tty || exit # || exit only needed for bash -### FUNCTIONS ### + # save current tty settings: + tty_settings=$(stty -g) || exit -install_from_pacman() { - pacman --noconfirm --needed -S "$1" >/dev/null 2>&1 -} + # schedule restore of the settings on exit of that subshell + # or on receiving SIGINT or SIGTERM: + trap 'stty "$tty_settings"' EXIT INT TERM -error() { - clear - printf "ERROR:\\n%s\\n" "$1" - exit -} + # disable terminal local echo + stty -echo || exit + + # prompt on tty + printf "$1" > /dev/tty -welcome_msg() { - dialog --title "Welcome!" --msgbox "Welcome to my Arch Linux installation script!\\n\\nThis script will automatically install a fully-featured Linux desktop, which I use as my main machine.\\n\\n-David" 10 60 - dialog --colors --title "Important Note!" --yes-label "All ready!" --no-label "Return..." --yesno "Be sure the computer you are using has current pacman updates.\\n\\nIf it does not, the installation of some programs might fail." 8 70 + # read password as one line, record exit status + IFS= read -r password; ret=$? + + # display a newline to visually acknowledge the entered password + echo > /dev/tty + + # return the password for $REPLY + printf '%s\n' "$password" + exit "$ret" + )" } get_username_and_password() { - # Prompts user for new username and password. - name=$(dialog --inputbox "First, please enter a name for the user account." 10 60 3>&1 1>&2 2>&3 3>&1) || exit + printf "Enter a name for the user account: " + read name while ! echo "$name" | grep "^[a-z_][a-z0-9_-]*$" >/dev/null 2>&1; do - name=$(dialog --no-cancel --inputbox "Username not valid. Give a username beginning with a letter, with only lowercase letters, - or _." 10 60 3>&1 1>&2 2>&3 3>&1) + unset name + printf "Username not valid. Give a username beginning with a letter, with only lowercase letters, - or _.\n\n" + printf "Enter a name for the user account: " + read name done - pass1=$(dialog --no-cancel --passwordbox "Enter a password for that user." 10 60 3>&1 1>&2 2>&3 3>&1) - pass2=$(dialog --no-cancel --passwordbox "Retype password." 10 60 3>&1 1>&2 2>&3 3>&1) + read_password "Enter a password for that user: " + pass1=$PASSWORD + read_password "Retype password: " + pass2=$PASSWORD while ! [ "$pass1" = "$pass2" ]; do unset pass2 - pass1=$(dialog --no-cancel --passwordbox "Passwords do not match.\\n\\nEnter password again." 10 60 3>&1 1>&2 2>&3 3>&1) - pass2=$(dialog --no-cancel --passwordbox "Retype password." 10 60 3>&1 1>&2 2>&3 3>&1) + echo "Passwords do not match." + read_password "Enter a password again: " + pass1=$PASSWORD + read_password "Retype password: " + pass2=$PASSWORD done } -user_check() { - ! (id -u "$name" >/dev/null) 2>&1 || dialog --colors --title "WARNING!" --yes-label "CONTINUE" --no-label "No wait..." --yesno "The user \`$name\` already exists on this system. GOHAN can install for a user already existing, but it will \\Zboverwrite\\Zn any conflicting settings/dotfiles on the user account.\\n\\nGOHAN will \\Zbnot\\Zn overwrite your user files, documents, videos, etc., so don't worry about that, but only click <CONTINUE> if you don't mind your settings being overwritten.\\n\\nNote also that GOHAN will change $name's password to the one you just gave." 14 70 -} - -preinstall_msg() { - dialog --title "Last chance!" --yes-label "Let's go!" --no-label "No, nevermind!" --yesno "Just press <Let's go!> and the system will begin installation!" 13 60 || { clear; exit; } -} - add_user() { - # Adds user `$name` with password $pass1. - dialog --infobox "Adding user \"$name\"..." 4 50 + get_username_and_password + [ -d "/home/$name" ] && echo "Skipping adding of user as $name already exists" && return + useradd -m -s /bin/zsh "$name" >/dev/null 2>&1 || mkdir -p /home/"$name" && chown "$name":"$name" /home/"$name" usermod -aG wheel "$name" - [ ! -d "/home/$name/.local/src" ] && mkdir -p "/home/$name/.local/src" && chown -R "$name":"$name" /home/"$name/.local" - # Remove these files as they will be installed as part of the dotfiles. -# [ -f "/home/$name/.bash_history" ] && rm /home/$name/.bash_history -# [ -f "/home/$name/.bash_logout" ] && rm /home/$name/.bash_logout -# [ -f "/home/$name/.bash_profile" ] && rm /home/$name/.bash_profile -# [ -f "/home/$name/.bashrc" ] && rm /home/$name/.bashrc echo "$name:$pass1" | chpasswd unset pass1 pass2 } -install_packages() { - ([ -f "$packages" ] && cp "$packages" /tmp/packages.csv) || curl -Ls "$packages" > /tmp/packages.csv - total=$(wc -l < /tmp/packages.csv) - while IFS=, read -r tag program comment; do - n=$((n+1)) - echo "$comment" | grep "^\".*\"$" >/dev/null 2>&1 && comment="$(echo "$comment" | sed "s/\(^\"\|\"$\)//g")" - case "$tag" in - "A") install_from_aur "$program" "$comment" ;; - "G") install_from_github "$program" "$comment" ;; - *) install_package "$program" "$comment" ;; - esac - done < /tmp/packages.csv -} - -install_package() { - dialog --title "GOHAN Installation" --infobox "Installing \`$1\` ($n of $total). $1 $2" 5 70 - install_from_pacman "$1" -} - -install_from_aur() { - dialog --title "GOHAN Installation" --infobox "Installing \`$1\` ($n of $total) from the AUR. $1 $2" 5 70 - sudo -u "$name" yay -S --noconfirm "$1" >/dev/null 2>&1 -} - -install_from_github() { - progname="$(basename "$1" .git)" - repodir="/home/$name/.local/src" - dir="$repodir/$progname" - dialog --title "GOHAN Installation" --infobox "Installing \`$progname\` ($n of $total) via \`git\` and \`make\`. $(basename "$1") $2" 5 70 - sudo -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 - cd "$dir" || exit - sudo -u "$name" make clean install >/dev/null 2>&1 -} - -configure_sudo() { - install_from_pacman sudo - [ -f /etc/sudoers ] && sed -i "s/# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers -} - -install_yay() { - [ -f "/usr/bin/yay" ] || ( - dialog --infobox "Installing \"yay\", an AUR helper..." 4 50 - install_from_pacman base-devel - install_from_pacman git - # Use all cores for compilation. - sed -i "s/-j2/-j$(nproc)/;s/^#MAKEFLAGS/MAKEFLAGS/" /etc/makepkg.conf - cd /tmp || exit - rm -rf /tmp/yay* - git clone "https://aur.archlinux.org/yay.git" - cd yay - makepkg --noconfirm -si >/dev/null 2>&1 - cd /tmp - rm -rf yay - ); -} - ### THE ACTUAL SCRIPT ### -install_from_pacman dialog || error "Are you sure you're running this as the root user and have an internet connection?" - -welcome_msg || error "User exited." - -get_username_and_password || error "User exited." - -user_check || error "User exited." - -preinstall_msg || error "User exited." - -add_user || error "Error adding username and/or password." - -configure_sudo - -install_yay - -install_packages - -clear +add_user |
