Files
ArchSetupScripts/archSetupScript.sh
Till Dieminger 650b0435a5 Minor update
2025-08-31 21:32:52 +02:00

230 lines
6.8 KiB
Bash

#!/bin/sh
### LOGGING SETUP ###
LOGFILE="/tmp/larbs-install-$(date +%Y%m%d-%H%M%S).log"
exec > >(tee -a "$LOGFILE") 2>&1
echo "Logging installation to $LOGFILE"
### CONFIGURABLE OPTIONS ###
dotfilesrepo="https://git.dieminger.ch/TRAAL/dotfiles"
cwd=$(pwd)
progsfile="$cwd/progs.csv"
echo $progsfile
break
aurhelper="paru"
repobranch="master"
export TERM=ansi
### VALIDATE ARGUMENTS ###
if [ $# -ne 2 ]; then
echo "Usage: $0 <username> <password>"
exit 1
fi
name="$1"
pass1="$2"
### FUNCTIONS ###
installpkg() {
pacman --noconfirm --needed -S "$1"
}
error() {
printf "%s\n" "$1" >&2
exit 1
}
adduserandpass() {
echo "Adding user \"$name\"..."
useradd -m -g wheel -s /bin/zsh "$name" 2>/dev/null || {
echo "User already exists. Adding to wheel group and continuing..."
usermod -a -G wheel "$name"
mkdir -p /home/"$name"
chown "$name":wheel /home/"$name"
}
export repodir="/home/$name/.local/src"
mkdir -p "$repodir"
chown -R "$name":wheel "$(dirname "$repodir")"
echo "$name:$pass1" | chpasswd
}
refreshkeys() {
case "$(readlink -f /sbin/init)" in
*systemd*)
pacman --noconfirm -S archlinux-keyring
;;
*)
pacman --noconfirm --needed -S \
artix-keyring artix-archlinux-support
grep -q "^\[extra\]" /etc/pacman.conf || echo "[extra]
Include = /etc/pacman.d/mirrorlist-arch" >> /etc/pacman.conf
pacman -Sy --noconfirm
pacman-key --populate archlinux
;;
esac
}
manualinstall() {
pacman -Qq "$1" && return 0
sudo -u "$name" mkdir -p "$repodir/$1"
sudo -u "$name" git -C "$repodir" clone --depth 1 --single-branch --no-tags -q "https://aur.archlinux.org/$1.git" "$repodir/$1" || {
cd "$repodir/$1" || return 1
sudo -u "$name" git pull --force origin master
}
cd "$repodir/$1" || exit 1
sudo -u "$name" -D "$repodir/$1" makepkg --noconfirm -si || return 1
}
maininstall() {
installpkg "$1"
}
gitmakeinstall() {
progname="${1##*/}"
progname="${progname%.git}"
dir="$repodir/$progname"
sudo -u "$name" git -C "$repodir" clone --depth 1 --single-branch --no-tags -q "$1" "$dir" || {
cd "$dir" || return 1
sudo -u "$name" git pull --force origin master
}
cd "$dir" || exit 1
make
make install
cd /tmp || return 1
}
gitaurinstall(){
git clone "https://aur.archlinux.org/$1.git" "/tmp/$1"
cd "/tmp/$1" || return 1
chown -R "$name":wheel "/tmp/$1"
sudo -u "$name" makepkg --noconfirm -si
cd /tmp || return 1
rm -rf "/tmp/$1"
}
aurinstall() {
echo "$aurinstalled" | grep -q "^$1$" && return 1
sudo -u "$name" $aurhelper -S --noconfirm "$1"
}
pipinstall() {
[ -x "$(command -v "pip")" ] || installpkg python-pip
yes | pip install "$1"
}
installationloop() {
cp $progsfile /tmp/progs.csv
total=$(wc -l </tmp/progs.csv)
aurinstalled=$(pacman -Qqm)
while IFS=, read -r tag program comment; do
n=$((n + 1))
comment="$(echo "$comment" | sed -E 's/^"(.*)"$/\1/')"
case "$tag" in
"A") aurinstall "$program" "$comment" ;;
"G") gitmakeinstall "$program" "$comment" ;;
"P") pipinstall "$program" "$comment" ;;
*) maininstall "$program" "$comment" ;;
esac
done < /tmp/progs.csv
}
putgitrepo() {
[ -z "$3" ] && branch="master" || branch="$repobranch"
dir=$(mktemp -d)
[ ! -d "$2" ] && mkdir -p "$2"
chown "$name":wheel "$dir" "$2"
sudo -u "$name" git -C "$repodir" clone --depth 1 --single-branch --no-tags -q --recursive -b "$branch" --recurse-submodules "$1" "$dir"
sudo -u "$name" cp -rfT "$dir" "$2"
}
vimplugininstall() {
mkdir -p "/home/$name/.config/nvim/autoload"
curl -Ls "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > "/home/$name/.config/nvim/autoload/plug.vim"
chown -R "$name:wheel" "/home/$name/.config/nvim"
sudo -u "$name" nvim -c "PlugInstall|q|q"
}
### START INSTALLATION ###
pacman --noconfirm --needed -Sy libnewt || error "Must be run as root on an Arch-based system with internet access."
refreshkeys || error "Failed to refresh keys."
# Required base packages
for x in curl ca-certificates base-devel git ntp zsh; do
installpkg "$x"
done
ntpd -q -g
adduserandpass || error "Could not add user."
[ -f /etc/sudoers.pacnew ] && cp /etc/sudoers.pacnew /etc/sudoers
# Allow passwordless sudo for wheel
trap 'rm -f /etc/sudoers.d/larbs-temp' HUP INT QUIT TERM PWR EXIT
echo "%wheel ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/larbs-temp
# Pacman config
grep -q "ILoveCandy" /etc/pacman.conf || sed -i "/#VerbosePkgLists/a ILoveCandy" /etc/pacman.conf
sed -Ei "s/^#(ParallelDownloads).*/\1 = 5/;/^#Color$/s/#//" /etc/pacman.conf
sed -i "s/-j2/-j$(nproc)/;/^#MAKEFLAGS/s/^#//" /etc/makepkg.conf
# Install AUR helper
gitaurinstall "$aurhelper" || error "Failed to install AUR helper."
$aurhelper -Y --save --devel
# Main install
installationloop
# Dotfiles
putgitrepo "$dotfilesrepo" "/home/$name" "$repobranch"
rm -rf "/home/$name/.git/" "/home/$name/README.md" "/home/$name/LICENSE" "/home/$name/FUNDING.yml"
# Neovim plugins
[ ! -f "/home/$name/.config/nvim/autoload/plug.vim" ] && vimplugininstall
rmmod pcspkr
echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf
chsh -s /bin/zsh "$name"
sudo -u "$name" mkdir -p "/home/$name/.cache/zsh/"
dbus-uuidgen > /var/lib/dbus/machine-id
echo "export \$(dbus-launch)" > /etc/profile.d/dbus.sh
# Enable touchpad tap
[ ! -f /etc/X11/xorg.conf.d/40-libinput.conf ] && cat > /etc/X11/xorg.conf.d/40-libinput.conf <<EOF
Section "InputClass"
Identifier "libinput touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "Tapping" "on"
EndSection
EOF
# Enable essential services
systemctl enable --now bluetooth.service
systemctl enable --now cronie.service
systemctl enable --now chronyd.service
# Install vi-increment Zsh plugin
git clone https://github.com/zsh-vi-more/vi-increment /home/$name/.local/src/vi-increment
# sudoers configuration
echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/00-larbs-wheel-can-sudo
echo "%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/shutdown,/usr/bin/reboot,/usr/bin/systemctl suspend,/usr/bin/wifi-menu,/usr/bin/mount,/usr/bin/umount,/usr/bin/pacman -Syu,/usr/bin/pacman -Syyu,/usr/bin/pacman -Syyu --noconfirm,/usr/bin/loadkeys,/usr/bin/pacman -Syyuw --noconfirm,/usr/bin/pacman -S -u -y --config /etc/pacman.conf --,/usr/bin/pacman -S -y -u --config /etc/pacman.conf --" > /etc/sudoers.d/01-larbs-cmds-without-password
echo "Defaults editor=/usr/bin/nvim" > /etc/sudoers.d/02-larbs-visudo-editor
mkdir -p /etc/sysctl.d
echo "kernel.dmesg_restrict = 0" > /etc/sysctl.d/dmesg.conf
# Final message
echo "ASS installation completed successfully for user '$name'."
echo "Log in as '$name' and run 'startx' to start your graphical environment."
echo "Full log saved to: $LOGFILE"