summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzachir <zachir@librem.one>2023-10-10 08:40:30 -0500
committerzachir <zachir@librem.one>2023-10-10 08:40:30 -0500
commitdc560ffec94b0c7cb35eb87206da19617c9c923b (patch)
treebe24791fa4aca394e31f6cd96bbf52d3f5dcb69e
parent4e9f1e8fd3529d55ccea8dacac7f2ea642cb79da (diff)
Way too many fixes to document. I'm sorry.
-rwxr-xr-xzirless.sh370
1 files changed, 187 insertions, 183 deletions
diff --git a/zirless.sh b/zirless.sh
index fdcb273..2eaa2b5 100755
--- a/zirless.sh
+++ b/zirless.sh
@@ -6,17 +6,18 @@
### OPTIONS AND VARIABLES ###
-while getopts ":a:b:B:r:R:p:s:h" o; do case "${o}" in
- h) printf "Optional arguments for custom use:\\n -r: Dotfiles repository (local file or url)\\n -R: Dotfiles repository branch\\n -b: User bin repository (local file or url)\\n -B: User bin repository branch\\n -p: Dependencies and programs csv (local file or url)\\n -s: Root command (sudo implied)\\n -a: AUR helper (must have pacman-like syntax)\\n -h: Show this message\\n" && exit 1 ;;
- r) dotfilesrepo=${OPTARG} && git ls-remote "$dotfilesrepo" || exit 1 ;;
- R) repobranch=${OPTARG} ;;
- p) progsfile=${OPTARG} ;;
- a) aurhelper=${OPTARG} ;;
- b) binrepo=${OPTARG} && git ls-remote "$binrepo" || exit 1 ;;
- B) binrepobranch=${OPTARG} ;;
- s) rootcmd=${OPTARG} ;;
-
- *) printf "Invalid option: -%s\\n" "$OPTARG" && exit 1 ;;
+while getopts ":a:b:B:i:r:R:p:s:uh" o; do case "${o}" in
+ h) printf "Optional arguments for custom use:\\n -r: Dotfiles repository (local file or url)\\n -R: Dotfiles repository branch\\n -b: User bin repository (local file or url)\\n -B: User bin repository branch\\n -p: Dependencies and programs csv (local file or url)\\n -s: Root command (sudo implied)\\n -a: AUR helper (must have pacman-like syntax)\\n -i: Specify init (for Artix)\\n -u: Don't overwrite user dir\\n -h: Show this message\\n" && exit 1 ;;
+ r) dotfilesrepo=${OPTARG} && git ls-remote "$dotfilesrepo" || exit 1 ;;
+ R) repobranch=${OPTARG} ;;
+ p) progsfile=${OPTARG} ;;
+ a) aurhelper=${OPTARG} ;;
+ i) init="${OPTARG}" ;;
+ b) binrepo=${OPTARG} && git ls-remote "$binrepo" || exit 1 ;;
+ B) binrepobranch=${OPTARG} ;;
+ s) rootcmd=${OPTARG} ;;
+ u) nonewhome="y" ;;
+ *) printf "Invalid option: -%s\\n" "$OPTARG" && exit 1 ;;
esac done
[ -z "$dotfilesrepo" ] && dotfilesrepo="https://git.zachir.xyz/dotfiles.git"
@@ -26,6 +27,8 @@ esac done
[ -z "$binrepo" ] && binrepo="https://git.zachir.xyz/bin.git"
[ -z "$binrepobranch" ] && binrepobranch="master"
[ -z "$rootcmd" ] && rootcmd="sudo"
+# Specifying init only matters when installing Artix, as it will determine which service files get installed
+[ -z "$init" ] && init="runit"
### FUNCTIONS ###
@@ -34,67 +37,67 @@ installpkg(){ pacman --noconfirm --needed -S "$1" >/dev/null 2>&1 ;}
error() { printf "%s\n" "$1" >&2; exit 1; }
welcomemsg() { \
- dialog --title "Welcome!" --msgbox "Welcome to ZachIR's LARBS Equivalent Setup Script!\\n\\nThis script will automatically install a fully-featured Linux desktop, which I use as my main machine.\\n\\n-Zach" 10 60
+ dialog --title "Welcome!" --msgbox "Welcome to ZachIR's LARBS Equivalent Setup Script!\\n\\nThis script will automatically install a fully-featured Linux desktop, which I use as my main machine.\\n\\n-Zach" 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 and refreshed Arch keyrings.\\n\\nIf it does not, the installation of some programs might fail." 8 70
- }
+ dialog --colors --title "Important Note!" --yes-label "All ready!" --no-label "Return..." --yesno "Be sure the computer you are using has current pacman updates and refreshed Arch keyrings.\\n\\nIf it does not, the installation of some programs might fail." 8 70
+ }
getuserandpass() { \
- # Prompts user for new username an password.
- name=$(dialog --inputbox "First, please enter a name for the user account." 10 60 3>&1 1>&2 2>&3 3>&1) || exit 1
- while ! echo "$name" | grep -q "^[a-z_][a-z0-9_-]*$"; 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)
- 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)
- 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)
- done ;}
+ # Prompts user for new username an password.
+ name=$(dialog --inputbox "First, please enter a name for the user account." 10 60 3>&1 1>&2 2>&3 3>&1) || exit 1
+ while ! echo "$name" | grep -q "^[a-z_][a-z0-9_-]*$"; 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)
+ 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)
+ 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)
+ done ;}
usercheck() { \
- ! { 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. ZIRLESS can install for a user already existing, but it will \\Zboverwrite\\Zn any conflicting settings/dotfiles on the user account.\\n\\nZIRLESS 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 ZIRLESS will change $name's password to the one you just gave." 14 70
- }
+ ! { 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. ZIRLESS can install for a user already existing, but it will \\Zboverwrite\\Zn any conflicting settings/dotfiles on the user account.\\n\\nZIRLESS 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 ZIRLESS will change $name's password to the one you just gave." 14 70
+ }
preinstallmsg() { \
- dialog --title "Let's get this party started!" --yes-label "Let's go!" --no-label "No, nevermind!" --yesno "The rest of the installation will now be totally automated, so you can sit back and relax.\\n\\nIt will take some time, but when done, you can relax even more with your complete system.\\n\\nNow just press <Let's go!> and the system will begin installation!" 13 60 || { clear; exit 1; }
- }
+ dialog --title "Let's get this party started!" --yes-label "Let's go!" --no-label "No, nevermind!" --yesno "The rest of the installation will now be totally automated, so you can sit back and relax.\\n\\nIt will take some time, but when done, you can relax even more with your complete system.\\n\\nNow just press <Let's go!> and the system will begin installation!" 13 60 || { clear; exit 1; }
+ }
adduserandpass() { \
- # Adds user `$name` with password $pass1.
- dialog --infobox "Adding user \"$name\"..." 4 50
- useradd -m -s /bin/zsh "$name" >/dev/null 2>&1
- usermod -a -G wheel "$name" && mkdir -p /home/"$name" && chown "$name:$name" /home/"$name"
- repodir="/home/$name/.local/src"; mkdir -p "$repodir"; chown -R "$name:$name" "$(dirname "$repodir")"
- echo "$name:$pass1" | chpasswd
- unset pass1 pass2 ;}
+ # Adds user `$name` with password $pass1.
+ dialog --infobox "Adding user \"$name\"..." 4 50
+ useradd -m -s /bin/zsh "$name" >/dev/null 2>&1
+ usermod -a -G wheel "$name" && mkdir -p /home/"$name" && chown "$name:$name" /home/"$name"
+ repodir="/home/$name/.local/src"; mkdir -p "$repodir"; chown -R "$name:$name" "$(dirname "$repodir")"
+ echo "$name:$pass1" | chpasswd
+ unset pass1 pass2 ;}
refreshkeys() { \
-# dialog --infobox "Refreshing Arch Keyring..." 4 40
-# pacman -Q artix-keyring >/dev/null 2>&1 && pacman --noconfirm -S artix-keyring artix-archlinux-support >/dev/null 2>&1
-# pacman --noconfirm -S archlinux-keyring >/dev/null 2>&1
- pacman-key --refresh-keys
- }
+ dialog --infobox "Refreshing Arch Keyring..." 4 40
+ [ "$DISTRO" = "ARTIX" ] && pacman -Q artix-keyring >/dev/null 2>&1 && pacman --noconfirm -S artix-keyring artix-archlinux-support >/dev/null 2>&1
+ pacman --noconfirm -S archlinux-keyring >/dev/null 2>&1
+ pacman-key --refresh-keys
+ }
newperms() { # Set special sudoers settings for install (or after).
- if [ "$rootcmd" = "sudo" ]; then
- if [ "$1" = "allnopass" ]; then
- sed -i "/#ZIRLESS/d" /etc/sudoers
- echo "%wheel ALL=(ALL) NOPASSWD: ALL #ZIRLESS" >> /etc/sudoers
- elif [ "$1" = "newpass" ]; then
- sed -i "/#ZIRLESS/d" /etc/sudoers
- echo "%wheel ALL=(ALL) ALL #ZIRLESS
+ if [ "$rootcmd" = "sudo" ]; then
+ if [ "$1" = "allnopass" ]; then
+ sed -i "/#ZIRLESS/d" /etc/sudoers
+ echo "%wheel ALL=(ALL) NOPASSWD: ALL #ZIRLESS" >> /etc/sudoers
+ elif [ "$1" = "newpass" ]; then
+ sed -i "/#ZIRLESS/d" /etc/sudoers
+ echo "%wheel ALL=(ALL) ALL #ZIRLESS
%wheel ALL=(ALL) NOPASSWD: /usr/bin/shutdown,/usr/bin/reboot,/usr/bin/mount,/usr/bin/umount,/usr/bin/pacman -Syu,/usr/bin/pacman -Syyu,/usr/bin/systemctl,/usr/bin/rc-service,/usr/bin/rc-update,/usr/bin/rsm,/usr/bin/sv,/usr/bin/s6-rc,/usr/bin/s6-rc-bundle-update,/usr/bin/pacman -Syyu --noconfirm,/usr/bin/loadkeys,/usr/bin/pacman -Syyuw --noconfirm #ZIRLESS" >> /etc/sudoers
- fi
- elif [ "$rootcmd" = "doas" ]; then
- if [ "$1" = "allnopass" ]; then
- sed -i "/#ZIRLESS/d" /etc/doas.conf
- echo "permit :wheel nopass #ZIRLESS" >> /etc/doas.conf
- elif [ "$1" = "newpass" ]; then
- sed -i "/#ZIRLESS/d" /etc/doas.conf
- echo "permit :wheel persist #ZIRLESS
+ fi
+ elif [ "$rootcmd" = "doas" ]; then
+ if [ "$1" = "allnopass" ]; then
+ sed -i "/#ZIRLESS/d" /etc/doas.conf
+ echo "permit :wheel nopass #ZIRLESS" >> /etc/doas.conf
+ elif [ "$1" = "newpass" ]; then
+ sed -i "/#ZIRLESS/d" /etc/doas.conf
+ echo "permit :wheel persist #ZIRLESS
permit :wheel nopass cmd shutdown #ZIRLESS
permit :wheel nopass cmd reboot #ZIRLESS
permit :wheel nopass cmd mount #ZIRLESS
@@ -112,37 +115,35 @@ permit :wheel nopass cmd rc-update #ZIRLESS
permit :wheel nopass cmd s6-rc #ZIRLESS
permit :wheel nopass cmd s6-rc-bundle-update #ZIRLESS
permit :wheel nopass cmd loadkeys #ZIRLESS" >> /etc/doas.conf
- fi
- fi ;}
-
-artixaddlib32repo() { # Enables the lib32 Artix repo
- dialog --infobox "Adding lib32 repo to Artix..." 4 50
- sed -E "s/^#(\[lib32\])/\\1/;/^#Include/d;/#[.*-gremlins]/d;/\[lib32\]/a Include = /etc/pacman.d/mirrorlist" -i /etc/pacman.conf
- pacman -Syy ;}
-
-artixadduniverserepo() { # Enables the universe repo (necessary to add Arch repos)
- dialog --infobox "Adding universe repo to Artix..." 4 50
- echo 'Server = https://universe.artixlinux.org/$arch
-Server = https://mirror1.artixlinux.org/universe/$arch
-Server = https://mirror.pascalpuffke.de/artix-universe/$arch
-Server = https://artixlinux.qontinuum.space/artixlinux/universe/os/$arch
-Server = https://mirror1.cl.netactuate.com/artix/universe/$arch
-Server = https://ftp.crifo.org/artix-universe/' >> /etc/pacman.d/mirrorlist-universe
- echo '
-[universe]
-Include = /etc/pacman.d/mirrorlist-universe
-' >> /etc/pacman.conf
- pacman -Syy ;}
-
-artixremoveuniverserepo() { # Disables the universe repo (after adding Arch repos)
- dialog --infobox "Adding universe repo to Artix..." 4 50
- sed -iE "s_(^\[universe\])_#\\1_g;s_(^Include = [A-Za-z./]*-universe)_#\\1_g" /etc/pacman.conf
- pacman -Syy ;}
-
-artixaddarchrepos() { # Adds the Arch repos to Artix Linux (some ZIRLESS packages require it)
- dialog --infobox "Adding arch repos to Artix..." 4 50
- pacman -S --noconfirm artix-archlinux-support archlinux-mirrorlist archlinux-keyring >/dev/null 2>&1 || exit 3
- echo "
+ fi
+ fi ;}
+
+detectartix () { # Detects if using Artix or Arch
+ grep -q "\[system\]" /etc/pacman.conf && DISTRO="ARTIX" || DISTRO="ARCH" ;}
+
+addlib32repo() { # Enables the multilib repo for Arch or Artix
+ if [ "$DISTRO" = "ARTIX" ] && grep -qv "^\[lib32\]"; then
+ if grep -q "^#\[lib32\]"; then
+ dialog --infobox "Adding lib32 repo to Artix..." 4 50
+ sed -E "{N; s/^#?(\[lib32\])\n#?(Include = )/\1\n\2/;}" -i /etc/pacman.conf
+ else
+ echo "\n[lib32]\nInclude = /etc/pacman.d/mirrorlist\n" >> /etc/pacman.conf
+ fi
+ pacman -Syy
+ elif [ "$DISTRO" = "ARCH" ] && grep -qv "^\[multilib\]"; then
+ if grep -q "^#\[multilib\]"; then
+ dialog --infobox "Adding multilib repo to Arch..." 4 50
+ sed -E "{N; s/^#?(\[multilib\])\n#?(Include = )/\1\n\2/;}" -i /etc/pacman.conf
+ else
+ echo "\n[multilib]\nInclude = /etc/pacman.d/mirrorlist\n" >> /etc/pacman.conf
+ fi
+ pacman -Syy
+ fi ;}
+
+artixaddarchrepos() { # Adds the Arch repos to Artix Linux (some ZIRLESS packages require them)
+ dialog --infobox "Adding Arch repos to Artix..." 4 50
+ pacman -S --noconfirm artix-archlinux-support archlinux-mirrorlist archlinux-keyring >/dev/null 2>&1 || exit 3
+ echo "
[extra]
Include = /etc/pacman.d/mirrorlist-arch
@@ -152,86 +153,92 @@ Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch
" >> /etc/pacman.conf
- pacman -Syy ;}
+ pacman -Syy ;}
manualinstall() { # Installs $1 manually if not installed. Used only for AUR helper here.
- [ -f "/usr/bin/$1" ] || (
- dialog --infobox "Installing \"$1\", an AUR helper..." 4 50
- cd /tmp || exit 1
- rm -rf /tmp/"$1"*
- curl -sO https://aur.archlinux.org/cgit/aur.git/snapshot/"$1".tar.gz &&
- $rootcmd -u "$name" tar -xvf "$1".tar.gz >/dev/null 2>&1 &&
- cd "$1" &&
- $rootcmd -u "$name" makepkg --noconfirm -si >/dev/null 2>&1 || return 1
- cd /tmp || return 1) ;}
+ [ -f "/usr/bin/$1" ] || (
+ dialog --infobox "Installing \"$1\", an AUR helper..." 4 50
+ cd /tmp || exit 1
+ rm -rf /tmp/"$1"*
+ curl -sO https://aur.archlinux.org/cgit/aur.git/snapshot/"$1".tar.gz &&
+ $rootcmd -u "$name" tar -xvf "$1".tar.gz >/dev/null 2>&1 &&
+ cd "$1" &&
+ $rootcmd -u "$name" makepkg --noconfirm -si >/dev/null 2>&1 || return 1
+ cd /tmp || return 1) ;}
maininstall() { # Installs all needed programs from main repo.
- dialog --title "ZIRLESS Installation" --infobox "Installing \`$1\` ($n of $total). $1 $2" 5 70
- installpkg "$1"
- }
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$1\` ($n of $total). $1 $2" 5 70
+ installpkg "$1"
+ }
+
+serviceinstall() { # Installs service files in addition, for Artix packages
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$1\` ($n of $total). $1 $2" 5 70
+ installpkg "$1" "$1-$init"
+ }
gitmakeinstall() {
- progname="$(basename "$1" .git)"
- dir="$repodir/$progname"
- dialog --title "ZIRLESS Installation" --infobox "Installing \`$progname\` ($n of $total) via \`git\` and \`make\`. $(basename "$1") $2" 5 70
- $rootcmd -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; $rootcmd -u "$name" git pull --force origin master;}
- cd "$dir" || exit 1
- $rootcmd -u "$name" make >/dev/null 2>&1
- make install >/dev/null 2>&1
- cd /tmp || return 1 ;}
+ progname="$(basename "$1" .git)"
+ dir="$repodir/$progname"
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$progname\` ($n of $total) via \`git\` and \`make\`. $(basename "$1") $2" 5 70
+ $rootcmd -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; $rootcmd -u "$name" git pull --force origin master;}
+ cd "$dir" || exit 1
+ $rootcmd -u "$name" make >/dev/null 2>&1
+ make install >/dev/null 2>&1
+ cd /tmp || return 1 ;}
gitmakepkginstall() {
- pkgname="$(basename "$1" .git)"
- dir="$repodir/$progname"
- dialog --title "ZIRLESS Installation" --infobox "Installing \`$progname\` ($n of $total) via \`git\` and \`makepkg\`. $(basename "$1") $2" 5 70
- $rootcmd -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; $rootcmd -u "$name" git pull --force origin master;}
- cd "$dir" || exit 1
- $rootcmd -u "$name" makepkg -sc
- pacman -U *.pkg.tar.*
- cd /tmp || return 1 ;}
+ pkgname="$(basename "$1" .git)"
+ dir="$repodir/$progname"
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$progname\` ($n of $total) via \`git\` and \`makepkg\`. $(basename "$1") $2" 5 70
+ $rootcmd -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; $rootcmd -u "$name" git pull --force origin master;}
+ cd "$dir" || exit 1
+ $rootcmd -u "$name" makepkg -sc
+ pacman -U *.pkg.tar.*
+ cd /tmp || return 1 ;}
aurinstall() { \
- dialog --title "ZIRLESS Installation" --infobox "Installing \`$1\` ($n of $total) from the AUR. $1 $2" 5 70
- echo "$aurinstalled" | grep -q "^$1$" && return 1
- $rootcmd -u "$name" $aurhelper -S --noconfirm "$1" >/dev/null 2>&1
- }
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$1\` ($n of $total) from the AUR. $1 $2" 5 70
+ echo "$aurinstalled" | grep -q "^$1$" && return 1
+ $rootcmd -u "$name" $aurhelper -S --noconfirm "$1" >/dev/null 2>&1
+ }
installationloop() { \
- ([ -f "$progsfile" ] && cp "$progsfile" /tmp/progs.csv) || curl -Ls "$progsfile" | sed '/^#/d' > /tmp/progs.csv
- total=$(wc -l < /tmp/progs.csv)
- aurinstalled=$(pacman -Qqm)
- while IFS=, read -r tag program comment; do
- n=$((n+1))
- echo "$comment" | grep -q "^\".*\"$" && comment="$(echo "$comment" | sed "s/\(^\"\|\"$\)//g")"
- case "$tag" in
- "A") aurinstall "$program" "$comment" ;;
- "G") gitmakeinstall "$program" "$comment" ;;
- "M") gitmakepkginstall "$program" "$comment" ;;
- *) maininstall "$program" "$comment" ;;
- esac
- done < /tmp/progs.csv ;}
+ ([ -f "$progsfile" ] && cp "$progsfile" /tmp/progs.csv) || curl -Ls "$progsfile" | sed '/^#/d' > /tmp/progs.csv
+ total=$(wc -l < /tmp/progs.csv)
+ aurinstalled=$(pacman -Qqm)
+ while IFS=, read -r tag program comment; do
+ n=$((n+1))
+ echo "$comment" | grep -q "^\".*\"$" && comment="$(echo "$comment" | sed "s/\(^\"\|\"$\)//g")"
+ case "$tag" in
+ "A") aurinstall "$program" "$comment" ;;
+ "G") gitmakeinstall "$program" "$comment" ;;
+ "M") gitmakepkginstall "$program" "$comment" ;;
+ "S") serviceinstall "$program" "$comment" ;;
+ *) maininstall "$program" "$comment" ;;
+ esac
+ done < /tmp/progs.csv ;}
putgitrepo() { # Downloads a gitrepo $1 and places the files in $2 only overwriting conflicts
- dialog --infobox "Downloading and installing config files..." 4 60
- [ -z "$3" ] && branch="master" || branch="$repobranch"
- dir=$(mktemp -d)
- [ ! -d "$2" ] && mkdir -p "$2"
- chown "$name":"$name" "$dir" "$2"
- sudo -u "$name" git clone --recursive -b "$branch" --depth 1 --recurse-submodules "$1" "$dir" >/dev/null 2>&1
- sudo -u "$name" cp -rfT "$dir" "$2"
- pushd "$2"
- sudo -u "$name" make install
- popd
- }
-
-systembeepoff() { dialog --infobox "Getting rid of that retarded error beep sound..." 10 50
- rmmod pcspkr
- echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf ;}
+ dialog --infobox "Downloading and installing config files..." 4 60
+ [ -z "$3" ] && branch="master" || branch="$repobranch"
+ dir=$(mktemp -d)
+ [ ! -d "$2" ] && mkdir -p "$2"
+ chown "$name":"$name" "$dir" "$2"
+ sudo -u "$name" git clone --recursive -b "$branch" --depth 1 --recurse-submodules "$1" "$dir" >/dev/null 2>&1
+ sudo -u "$name" cp -rfT "$dir" "$2"
+ pushd "$2"
+ sudo -u "$name" make install
+ popd
+ }
+
+systembeepoff() { dialog --infobox "Getting rid of that annoying error beep sound..." 10 50
+ rmmod pcspkr
+ echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf ;}
finalize(){ \
- dialog --infobox "Preparing welcome message..." 4 50
- dialog --title "All done!" --msgbox "Congrats! Provided there were no hidden errors, the script completed successfully and all the programs and configuration files should be in place.\\n\\nTo run the new graphical environment, log out and log back in as your new user, then run the command \"startx\" to start the graphical environment (it will start automatically in tty1).\\n\\n.t Luke" 12 80
- }
+ dialog --infobox "Preparing welcome message..." 4 50
+ dialog --title "All done!" --msgbox "Congrats! Provided there were no hidden errors, the script completed successfully and all the programs and configuration files should be in place.\\n\\nTo run the new graphical environment, log out and log back in as your new user, then run the command \"startx\" to start the graphical environment (it will start automatically in tty1).\\n\\n.t Luke" 12 80
+ }
### THE ACTUAL SCRIPT ###
@@ -258,8 +265,8 @@ preinstallmsg || error "User exited."
refreshkeys || error "Error automatically refreshing Arch keyring. Consider doing so manually."
for x in curl base-devel git ntp zsh; do
- dialog --title "ZIRLESS Installation" --infobox "Installing \`$x\` which is required to install and configure other programs." 5 70
- installpkg "$x"
+ dialog --title "ZIRLESS Installation" --infobox "Installing \`$x\` which is required to install and configure other programs." 5 70
+ installpkg "$x"
done
dialog --title "ZIRLESS Installation" --infobox "Synchronizing system time to ensure successful and secure installation of software..." 4 70
@@ -282,18 +289,16 @@ grep -q "^#ParallelDownloads" /etc/pacman.conf && sed -i "s/^#ParallelDownloads/
# Use all cores for compilation.
sed -i "s/-j2/-j$(nproc)/;s/^#MAKEFLAGS/MAKEFLAGS/" /etc/makepkg.conf
-manualinstall yay-bin || error "Failed to install AUR helper."
-
-grep -q '^\[lib32\]' /etc/pacman.conf || artixaddlib32repo || error "Failed to add lib32 repo"
+manualinstall "$aurhelper" || error "Failed to install AUR helper."
-grep -q '^\[universe\]' /etc/pacman.conf || artixadduniverserepo || error "Failed to add universe repo"
+grep -q '^\[lib32\]\|^\[multilib\]' /etc/pacman.conf || addlib32repo || error "Failed to add multilib/lib32 repo"
-grep -q '^\[extra\]' /etc/pacman.conf || artixaddarchrepos || error "Failed to add Arch Linux repos."
+if [ "$DISRO" = "ARTIX" ]; then
+ grep -q '^\[extra\]' /etc/pacman.conf || artixaddarchrepos || error "Failed to add Arch Linux repos."
+fi
refreshkeys || error "Error automatically refreshing Arch keyring. Consider doing so manually."
-grep -q '^\[universe\]' /etc/pacman.conf && artixremoveuniverserepo || error "Failed to remove universe repo; some packages may not install properly."
-
# The command that does all the installing. Reads the progs.csv file and
# installs each needed program the way required. Be sure to run this only after
# the user has been created and has priviledges to run $rootcmd without a password
@@ -304,16 +309,10 @@ dialog --title "ZIRLESS Installation" --infobox "Finally, installing \`libxft-bg
yes | $rootcmd -u "$name" $aurhelper -S libxft-bgra-git >/dev/null 2>&1
# Install the dotfiles in the user's home directory
-putgitrepo "$dotfilesrepo" "/home/$name/.config" "$repobranch"
-putgitrepo "$binrepo" "/home/$name/.local/bin" "$binrepobranch"
-rm -f "/home/$name/README.md" "/home/$name/LICENSE" "/home/$name/FUNDING.yml"
-# Create default urls file if none exists.
-[ ! -f "/home/$name/.config/newsboat/urls" ] && echo "http://lukesmith.xyz/rss.xml
-https://notrelated.libsyn.com/rss
-https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA \"~Luke Smith (YouTube)\"
-https://www.archlinux.org/feeds/news/" > "/home/$name/.config/newsboat/urls"
-# make git ignore deleted LICENSE & README.md files
-git update-index --assume-unchanged "/home/$name/README.md" "/home/$name/LICENSE" "/home/$name/FUNDING.yml"
+if [ -z "$nonewhome" ]; then
+ putgitrepo "$dotfilesrepo" "/home/$name/.config" "$repobranch"
+ putgitrepo "$binrepo" "/home/$name/.local/bin" "$binrepobranch"
+fi
# Most important command! Get rid of the beep!
systembeepoff
@@ -322,28 +321,33 @@ systembeepoff
chsh -s /bin/zsh "$name" >/dev/null 2>&1
$rootcmd -u "$name" mkdir -p "/home/$name/.cache/zsh/"
-# dbus UUID must be generated for Artix runit.
-dbus-uuidgen > /var/lib/dbus/machine-id
+if [ \( "$DISTRO" = "Artix" \) -a \( "$init" = "runit" \) ]; then
+ # dbus UUID must be generated for Artix runit.
+ dbus-uuidgen > /var/lib/dbus/machine-id
+fi
# Use system notifications for Brave on Artix
echo "export \$(dbus-launch)" > /etc/profile.d/dbus.sh
# Tap to click
[ ! -f /etc/X11/xorg.conf.d/40-libinput.conf ] && printf 'Section "InputClass"
- Identifier "libinput touchpad catchall"
- MatchIsTouchpad "on"
- MatchDevicePath "/dev/input/event*"
- Driver "libinput"
- # Enable left mouse button by tapping
- Option "Tapping" "on"
+ Identifier "libinput touchpad catchall"
+ MatchIsTouchpad "on"
+ MatchDevicePath "/dev/input/event*"
+ Driver "libinput"
+ # Enable left mouse button by tapping
+ Option "Tapping" "on"
EndSection' > /etc/X11/xorg.conf.d/40-libinput.conf
# Fix fluidsynth/pulseaudio issue.
grep -q "OTHER_OPTS='-a pulseaudio -m alsa_seq -r 48000'" /etc/conf.d/fluidsynth ||
- echo "OTHER_OPTS='-a pulseaudio -m alsa_seq -r 48000'" >> /etc/conf.d/fluidsynth
+ echo "OTHER_OPTS='-a pulseaudio -m alsa_seq -r 48000'" >> /etc/conf.d/fluidsynth
-# Start/restart PulseAudio.
-pkill -15 -x 'pulseaudio'; $rootcmd -u "$name" pulseaudio --start
+# Stop/restart PipeWire
+pkill -15 -x 'pipewire' 'pipewire-pulse' 'pipewire-media-session' 'wireplumber'
+if [ "$DISTRO" = "Arch" ]; then
+ $rootcmd -u "$name" systemctl --user enable --now pipewire.socket
+fi
# This line, overwriting the `newperms` command above will allow the user to run
# serveral important commands, `shutdown`, `reboot`, updating, etc. without a password.