summaryrefslogtreecommitdiff
path: root/archsetup.sh
diff options
context:
space:
mode:
authorCraig Jennings <craigmartinjennings@gmail.com>2023-05-27 15:52:07 -0500
committerCraig Jennings <craigmartinjennings@gmail.com>2023-05-27 15:52:07 -0500
commitca99bbccbb7ce4099d042cfc891ed3bdce192c03 (patch)
tree995e9d01f9b55376bbe78818d940879e3805e5c6 /archsetup.sh
parent7c27fb829afe21ea63d977ee54f53827acb4a8ce (diff)
fixing init; making zfssetup a single file; archsetup no extension
Diffstat (limited to 'archsetup.sh')
-rwxr-xr-xarchsetup.sh859
1 files changed, 0 insertions, 859 deletions
diff --git a/archsetup.sh b/archsetup.sh
deleted file mode 100755
index 489ffe3..0000000
--- a/archsetup.sh
+++ /dev/null
@@ -1,859 +0,0 @@
-#!/bin/sh
-# ArchSetup - Craig Jennings <craigmartinjennings@gmail.com>
-# License: GNU GPLv3
-
-# Commentary
-: '
-
-Notes:
-
-There are two levels of errors:
-* CRASH: Issues that will halt forward progress, aborting this script.
-* ERROR: Issues not serious enough to halt the script.
-Both are printed on screen and in the $logfile.
-Stderr is also printed to the $logfile for all relevant info.
-
-This script creates a tmpfs RAM disk for all compilation. This speeds up
-building and installing, and all source code no longer exists after reboot.
-'
-# Code
-
-# uncomment to stop on any error
-# set -e
-
-### Constants
-
-username="cjennings"
-password="welcome" # will be changed on first login. :)
-
-dwm_repo="https://git.cjennings.net/dwm.git"
-dmenu_repo="https://git.cjennings.net/dmenu.git"
-st_repo="https://git.cjennings.net/st.git"
-dotfiles_repo="https://git.cjennings.net/dotfiles"
-dotemacs_repo="https://git.cjennings.net/dotemacs.git"
-dotfiles_home="/home/$username/.dotfiles"
-
-logfile="/var/log/archsetup-$(date +'%Y-%m-%d-%H-%M-%S').log" # logfile location
-source_dir="/home/$username/.local/src" # aur/git source goes here
-packages_before="/var/log/archsetup-preexisting-package-list.txt"
-packages_after="/var/log/archsetup-post-install-package-list.txt"
-archsetup_packages="/var/log/archsetup-installed-packages.txt"
-
-### Intro
-
-intro() {
- printf "\n\nArchSetup launched @ %s\n" "$(date +'%D %T')"| tee -a "$logfile"
- STARTTIME=$(date +%s)
- errors_encountered=0
-
- # begin with a clean logfile
- [ -f "$logfile" ] && rm -f "$logfile"
- touch "$logfile"
-
- # count the arch packages before install
- pacman -Q > "$packages_before" || \
- error "crash" "generating pre-install package list" "$?"
-}
-
-### General Functions
-# Error
-error () {
- # $1 = type ERROR, noted but the script will continue to run.
- # anything else will produce CRASH, which halts the script
- # $2 = what was happening (e.g., "adding $username to group $groupname", etc.)
- # $3 = the error code (i.e., "$?")
-
- errors_encountered=$((errors_encountered+1))
- case "$1" in
- "error")
- printf "ERROR: %s failed with error code %s @ %s\n" \
- "$2" "$3" "$(date +'%T')" | tee -a "$logfile"
- return 1;
- ;;
- *)
- printf "CRASH: %s failed with error code: %s @ %s. Script halted.\n" \
- "$2" "$3" "$(date +'%T')" | tee -a "$logfile"
- exit 1;
- ;;
- esac
-}
-
-# Display
-display () {
- # $1 = type (TITLE, ACTION)
- # $2 = description (answers: "what are you trying to do?")
-
- case "$1" in
- "title")
- printf "\n##### %s\n" "$2" | tee -a "$logfile"
- return 1;
- ;;
- "subtitle")
- printf "\n%s\n" "$2" | tee -a "$logfile"
- ;;
- "task")
- printf "...%s @ %s\n" "$2" "$(date +'%T')" | tee -a "$logfile"
- return 1;
- ;;
- *)
- printf "CRASH: display () called with incorrect arguments.\n"
- printf "...called %s type, %s action @ %s\n" \
- "$1" "$2" "$(date +'%T')" | tee -a "$logfile"
- exit 1;
- ;;
- esac
-
-}
-
-# Pacman Install
-
-pacman_install() {
- action="installing $1 via pacman" && display "task" "$action"
- if ! (pacman --noconfirm --needed -S "$1" >> "$logfile" 2>&1); then
- action="retrying $1" && display "task" "$action"
- if ! (pacman --noconfirm --needed -S "$1" >> "$logfile" 2>&1); then
- action="retrying $1 once more" && display "task" "$action"
- (pacman --noconfirm --needed -S "$1" >> "$logfile" 2>&1) ||
- error "error" "$action" "$?"
- fi
- fi
-
-}
-
-# Git Install
-git_install() {
- prog_name="$(basename "$1" .git)"
- build_dir="$source_dir/$prog_name"
- action="building & installing $prog_name from source"
- display "task" "$action"
-
- if ! (sudo -u "$username" git clone --depth 1 "$1" "$build_dir" >> "$logfile" 2>&1); then
- error "error" "cloning source code for $prog_name" "$?"
- (cd "$build_dir" && sudo -u "$username" git pull --force origin master >> "$logfile" 2>&1) || \
- error "error" "pulling source code for $prog_name" "$?"
- fi
-
- (cd "$build_dir" && make install >> "$logfile" 2>&1) || \
- error "error" "building $prog_name from source code" "$?"
-}
-
-# Aur Install
-aur_install() {
- action="installing $1 via the AUR" && display "task" "$action"
- if ! (sudo -u "$username" yay -S --noconfirm "$1" >> "$logfile" 2>&1); then
- action="retrying $1" && display "task" "$action"
- if ! (sudo -u "$username" yay -S --noconfirm "$1" >> "$logfile" 2>&1); then
- action="retrying $1 once more" && display "task" "$action"
- (sudo -u "$username" yay -S --noconfirm "$1" >> "$logfile" 2>&1) ||
- error "error" "$action" "$?"
- fi
- fi
-}
-
-# Pip Install
-pip_install() {
- [ -x "$(command -v "pip")" ] || pacman_install python-pip
- action="installing $1 via PIP" && display "task" "$action"
- (yes | sudo -u "$username" pip install "$1" >> "$logfile" 2>&1) || \
- error "error" "$action" "$?"
-}
-
-### Prerequisites
-
-prerequisites() {
- # why these software packages are 'required'
- # base_devel - required tools to compile
- # ca_certificates - for validation of keyrings, etc.
- # coreutils - comparing package lists
- # curl - to transfer source code
- # git - tools required to work with git source respositories
- # go - required to build yay, the aur installer
- # ntp - must communicate with other servers in ordered manner
- # python - required for python pip installs
- # stow - places the dotfiles (see: https://bit.ly/41GmysO)
- # tar - extract unix archives
- # vi - should things go wrong, we'll need an editor
- # zsh - we'll need a shell interpreter for yay; this is mine
-
- display "title" "Prerequisites"
-
- display "subtitle" "Bootstrapping"
-
- action="ensuring current Arch Linux keyring" && display "task" "$action"
- (pacman -S --noconfirm archlinux-keyring) >> $logfile 2>&1 || \
- error "crash" "$action" "$?"
-
- display "task" "verifying Arch Linux keys"
- (pacman-key --populate archlinux >> "$logfile" 2>&1) || \
- error "crash" "verifying Arch Linux keys" "$?"
-
- action="refreshing the package cache" && display "task" "$action"
- (pacman -Syu --noconfirm >> "$logfile" 2>&1) || error "crash" "$action" "$?"
-
- display "subtitle" "Required Software"
-
- for software in base-devel ca-certificates coreutils curl git go ntp openssh \
- python stow tar vi zsh; do
- pacman_install "$software"
- done
-
- display "subtitle" "Environment Configuration"
-
- # sync the time on this machine
- action="synchronizing system time" && display "task" "$action"
- (ntpdate 0.us.pool.ntp.org >> "$logfile" 2>&1) || error "error" "$action" "$?"
-
- action="configuring compiler to use all processor cores" && display "task" "$action"
- sed -i "s/-j2/-j$(nproc)/;s/^#MAKEFLAGS/MAKEFLAGS/" /etc/makepkg.conf >> "$logfile" 2>&1
-
- # enable pacman concurrent downloads and color
- action="enabling concurrent downloads" && display "task" "$action"
- sed -i "s/^#ParallelDownloads.*$/ParallelDownloads = 5/;s/^#Color$/Color/" /etc/pacman.conf
-
- action="Package Mirrors" && display "subtitle" "$action"
- pacman_install reflector
-
- action="configuring reflector" && display "task" "$action"
- (printf '
- --connection-timeout 3 \
- --download-timeout 3 \
- --protocol https \
- --age 12 \
- --latest 20 \
- --score 10 \
- --fastest 5 \
- --sort score \
- --save /etc/pacman.d/mirrorlist
- ' > /etc/xdg/reflector/reflector.conf >> "$logfile" 2>&1) || \
- error "error" "$action" "$?"
-
- action="updating repository mirrors" && display "task" "$action"
- (reflector --connection-timeout 3 \
- --download-timeout 3 \
- --protocol https \
- --age 12 \
- --latest 20 \
- --score 10 \
- --fastest 5 \
- --sort score \
- --save /etc/pacman.d/mirrorlist > /dev/null 2>&1)
-
- action="enabling the reflector timer" && display "task" "$action"
- (systemctl enable reflector.timer >> "$logfile" 2>&1) || \
- error "error" "$action" "$?"
-
- action="replacing sudoers file if new package version exists" && display "task" "$action"
- [ -f /etc/sudoers.pacnew ] && cp /etc/sudoers.pacnew /etc/sudoers >> "$logfile" 2>&1
-
- action="creating a directory to build/install software from git/AUR."
- (mkdir -p $source_dir) || error "crash" "creating the directory $source_dir"
-
-}
-
-### Create User
-create_user () {
- display "title" "User Creation"
-
- display "task" "checking if user exists"
- # halt if $username exists
- ( id -u "$username" >/dev/null 2>&1; ) && \
- error "crash" "user '$username' already exists!"
-
- # create $username with home, group, shell, password
- action="creating user and home directory" && display "task" "$action"
- (useradd -m -G wheel -s /bin/zsh "$username" >> "$logfile" 2>&1) || \
- error "crash" "adding user '$username" "$?"
-
- display "task" "assigning the password"
- echo "$username:$password" | chpasswd # any text is allowable! be careful!
-
- display "task" "configuring shell"
- # zsh cache required: $username will install via yay; zsh will run those commands
- mkdir -p "/home/$username/.cache/zsh/" | tee -a "$logfile"
-
- # give $username sudo nopasswd rights (required for aur installs)
- display "task" "granting permissions"
- (echo "%$username ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers) \
- || error "error" "$action" "$?"
-
- # mount as ramdisk to speed aur/git build/installs
- (sudo mount -t tmpfs -o size=4G archsetup $source_dir >> "$logfile" 2>&1) || \
- error "crash" "mounting the RAM disk for archsetup" "$?"
-
- (chown -R "$username":wheel "$(dirname "$source_dir")" >> "$logfile" 2>&1) || \
- error "crash" "changing ownership of $source_dir" "$?"
-}
-
-### User Customizations
-
-user_customizations() {
- action="User Customizations" && display "title" "$action"
-
- action="cloning dotfiles" && display "task" "$action"
- (git clone --depth 1 $dotfiles_repo "$dotfiles_home" \
- >> "$logfile" 2>&1) || error "error" "$action" "$?"
-
- action="moving dotfiles into place" && display "task" "$action"
- (cd "$dotfiles_home" && stow --no-folding --adopt * \
- >> "$logfile" 2>&1 ) || error "error" "$action" "$?"
-
- action="restoring dotfile versions" && display "task" "$action"
- (cd "$dotfiles_home" && git restore . \
- >> "$logfile" 2>&1 ) || error "error" "$action" "$?"
-
- action="creating common directories" && display "task" "$action"
- # Create default directories and grant permissions
- {
- mkdir -p -m 751 /home/$username/code
- mkdir -p -m 751 /home/$username/documents
- mkdir -p -m 751 /home/$username/downloads/torrents/complete
- mkdir -p -m 751 /home/$username/downloads/torrents/incomplete
- mkdir -p -m 751 /home/$username/downloads/torrents/files
- mkdir -p -m 751 /home/$username/downloads/ebooks
- mkdir -p -m 751 /home/$username/music
- mkdir -p -m 751 /home/$username/projects
- mkdir -p -m 751 /home/$username/pictures/screenshots
- mkdir -p -m 751 /home/$username/videos
- mkdir -p -m 751 /home/$username/vms
- chown -R $username: /home/$username
-
- mkdir -p -m 751 /media/backup
- mkdir -p -m 751 /media/remote0
- mkdir -p -m 751 /media/remote1
- mkdir -p -m 751 /media/remote2
- chown -R $username: /media
- } >> "$logfile" 2>&1
-
-}
-
-### AUR Installer
-aur_installer () {
- display "title" "AUR Installer"
-
- yay_repo="https://aur.archlinux.org/yay.git"
- build_dir="$source_dir/yay"
-
- display "task" "fetching source code for yay"
- if ! (sudo -u "$username" git clone --depth 1 "$yay_repo" "$build_dir" >> "$logfile" 2>&1); then
- error "error" "cloning source code for Yay"
- (sudo -u "$username" -D "$build_dir" git pull --force origin master >> "$logfile" 2>&1) || \
- error "crash" "changing directories to $build_dir and pulling source code" "$?"
- fi
-
- action="packaging and installing yay"; display "task" "$action"
- (cd "$build_dir" && sudo -u "$username" makepkg --noconfirm -si >> "$logfile" 2>&1) || \
- error "crash" "$action" "$?"
-}
-
-### Essential Services
-essential_services() {
- display "title" "Essential Services"
-
- # Networking
-
- display "subtitle" "Networking"
- pacman_install networkmanager
-
- # Secure Shell
-
- display "subtitle" "Secure Shell"
- pacman_install openssh
- action="enabling the openssh service to run at boot" && display "task" "$action"
- systemctl enable sshd >> "$logfile" 2>&1 || error "error" "$action" "$?"
- action="starting the openssh service" && display "task" "$action"
- systemctl start sshd >> "$logfile" 2>&1 || error "error" "$action" "$?"
-
- # Firewall
-
- # deny by default, then allow the following:
- # http/s : 80/tcp, 443/tcp
- # tor : 9040,9050,9051,9053,9119/tcp
- # email : IMAP, IMAPS
- # mDNS printer discovery : 5353/udp
- # ssh : ssh
- # syncthing : 22000/tcp, 22000/udp, 21027/udp
- # torrents : transmission
- # calibre content server : 8080/tcp
-
- display "subtitle" "Firewall"
- pacman_install ufw
-
- action="configuring ufw to deny by default" && display "task" "$action"
- ufw default deny incoming >> "$logfile" 2>&1 || error "error" "$action"
-
- for protocol in \
- "80/tcp" "443/tcp" "9040,9050,9051,9053,9119/tcp" "IMAP" "IMAPS" "55353/udp" \
- "ssh" "22000/tcp" "22000/udp" "21027/udp" "transmission" "8080/tcp"; do
- action="adding ufw rule to allow $protocol" && display "task" "$action"
- (ufw allow $protocol >> "$logfile" 2>&1) || error "error" "$action" "$?"
- done
-
- action="adding limits to protect from brute force attacks" && display "task" "$action"
- (ufw limit 22/tcp >> "$logfile" 2>&1 && \
- ufw limit 443/tcp >> "$logfile" 2>&1) || \
- error "error" "action"
-
- action="enabling firewall service to launch on boot" && display "task" "$action"
- systemctl enable ufw.service >> "$logfile" 2>&1 || error "error" "$action" "$?"
-
- action="starting firewall service" && display "task" "$action"
- systemctl start ufw.service >> "$logfile" 2>&1 || error "error" "$action" "$?"
-
- # Service Discovery
-
- display "subtitle" "Network Service Discovery"
- pacman_install avahi
-
- action="configuring avahi" && display "task" "$action"
- systemctl disable systemd-resolved.service >> "$logfile" 2>&1 || error "error" "$action" "$?"
- systemctl enable avahi-daemon.service >> "$logfile" 2>&1 || error "error" "$action" "$?"
-
- # Job Scheduling
-
- display "subtitle" "Job Scheduling"
- pacman_install cronie
- action="enabling cronie to launch at boot" && display "task" "$action"
- systemctl enable cronie >> "$logfile" 2>&1 || error "error" "$action" "$?"
-}
-
-### Desktop Environment
-desktop_environment() {
- display "title" "Desktop Environment"
-
- # Display Server
-
- action="Display Server Dependencies" && display "subtitle" "$action"
- pacman_install libglvnd
-
- action="Display Server" && display "subtitle" "$action"
- for software in xorg-server xorg-xinit xorg-xsetroot xf86-video-intel \
- xsel xorg-xbacklight xf86-input-libinput \
- xorg-xdpyinfo xorg-xprop xorg-xwininfo \
- xorg-xinput xorg-xkill ; do
- pacman_install $software
- done
-
- # Window Managers
-
- action="Window Manager Dependencies" && display "subtitle" "$action"
- for software in coreutils fontconfig freetype2 glibc libx11 libxft libxinerama; do
- pacman_install $software
- done;
-
- action="DWM Window Manager" && display "subtitle" "$action"
-
- git_install $dwm_repo
- git_install $dmenu_repo
- git_install $st_repo
- aur_install pinentry-dmenu # password entry that leverages dmenu
-
- # Core Fonts
-
- action="Core Fonts" && display "subtitle" "$action"
- pacman_install ttf-firacode-nerd
- pacman_install ttf-hack-nerd
- pacman_install noto-fonts-emoji
- aur_install ttf-all-the-icons
- aur_install ttf-ms-fonts
-
- # System Utilities
-
- action="System Utilities" && display "subtitle" "$action"
- pacman_install sshfs
- pacman_install dosfstools
- pacman_install exfat-utils
- pacman_install testdisk
- pacman_install ntfs-3g
- pacman_install udisks2
- pacman_install dmidecode
- aur_install inxi
-
- # File Associations
-
- action="File/Application Associations" && display "subtitle" "$action"
- pacman_install perl-file-mimeinfo
- pacman_install xdg-utils
-
- # File Associations
-
- action="Authentication Tools" && display "subtitle" "$action"
- pacman_install gnupg
- pacman_install polkit
- pacman_install gnome-keyring
-
- # ensure correct permissions on .gpg directory
- # the colon means the user's group will have perms
- [ -d /home/"$username"/.gnupg ] || mkdir /home/"$username"/.gnupg
- chown -R "$username": /home/"$username"/.gnupg
- find /home/"$username"/.gnupg -type f -exec chmod 600 {} \;
- find /home/"$username"/.gnupg -type d -exec chmod 700 {} \;
-
- # Power Management
-
- action="Power Management" && display "subtitle" "$action"
- pacman_install acpi
- pacman_install powertop
-
- # Audio System
-
- action="Audio System" && display "subtitle" "$action"
- for software in alsa-utils pipewire wireplumber pipewire-pulse \
- pipewire-docs pamixer pulsemixer ffmpeg; do
- pacman_install $software
- done;
- # disable the pc speaker beep
- rmmod pcspkr >> "$logfile" 2>&1
- echo "blacklist pcspkr" >/etc/modprobe.d/nobeep.conf >> "$logfile" 2>&1
-
- # Keyboard Shortcut Manager
-
- action="Keyboard Shortcut Manager" && display "subtitle" "$action"
- pacman_install sxhkd
-
- # Notifications
-
- action="Notification System" && display "subtitle" "$action"
- pacman_install libnotify
- pacman_install dunst
-
- # Bluetooth Devices
-
- action="Bluetooth System" && display "subtitle" "$action"
- for software in bluez bluez-utils blueman; do
- pacman_install $software
- done
- action="enabling bluetooth to launch at boot" && display "task" "$action"
- systemctl enable bluetooth.service >> "$logfile" 2>&1 ||e || error "error" "$action" "$?"
-
- # Command Line Utilities
-
- action="Command Line Utilities" && display "subtitle" "$action"
- for software in htop mc ncdu tmux fzf zip unzip atool wget detox \
- lsof usbutils speedtest-cli moreutils; do
- pacman_install "$software"
- done;
-
- for software in lf-git task-spooler rar; do
- aur_install "$software"
- done;
-
- pip_install glances
-
- # Help And Documentation
-
- action="Help and Documentation" && display "subtitle" "$action"
- for software in man arch-wiki-docs arch-wiki-lite; do
- pacman_install $software
- done;
-
- aur_install cht.sh-git
- pip_install tldr
-
- # Desktop Environment Utilities
-
- action="Desktop Environment Utilities" && display "subtitle" "$action"
-
- for software in brightnessctl network-manager-applet xclip bc nitrogen; do
- pacman_install $software
- done;
-
- pip_install pulsectl
- aur_install caffeine-ng
- aur_install colorpicker
-
- # Theme and Cursor
-
- action="UI Theme" && display "subtitle" "$action"
-
- for software in vimix-icon-theme vimix-cursors vimix-gtk-themes; do
- aur_install $software
- done;
-
- # Browsers
-
- action="Browsers" && display "subtitle" "$action"
- pacman_install firefox
- aur_install tor-browser
-
- # Install Printing
-
- action="Print System" && display "subtitle" "$action"
- for software in cups cups-pdf foomatic-db-engine foomatic-db-ppds foomatic-db-nonfree-ppds \
- gutenprint foomatic-db-gutenprint-ppds nss-mdns; do
- pacman_install "$software"
- done
- action="enabling printing service to launch at boot" && display "task" "$action"
- (systemctl enable cups.service >> "$logfile" 2>&1) || error "error" "$action" "$?"
-}
-
-### Developer Workstation
-developer_workstation () {
-
- action="Developer Workstation" && display "title" "$action"
-
- action="Programming Languages and Utilities" && display "subtitle" "$action"
- pacman_install clang # C/C++ compiler
- pacman_install cmake # make system
- pacman_install gdb # the gnu debugger
- pacman_install splint # C programming static analysis
- pacman_install valgrind # memory management utility
-
- pacman_install rust # Rust programming language
-
- pacman_install pyright # Python language server
-
- pacman_install shellcheck # Shell script linter
- pacman_install shfmt # Shell script formatter
-
- pacman_install go-tools # Go language utilities
- pacman_install gopls # Go language server
- pacman_install delve # Go programming language debugger
- pacman_install staticcheck # Go programming language linter
-
- pacman_install typescript # Typescript programming language
- pacman_install npm # Node-js package manager
- aur_install nvm # Node-js version manager
- pacman_install jq # JSON processor
-
- pacman_install meld # Visual diff
- pacman_install ripgrep # Fast grep utility
-
- action="Programming Editors" && display "subtitle" "$action"
- pacman_install mg
- pacman_install neovim
-
- action="Emacs and Dependencies" && display "subtitle" "$action"
- pacman_install emacs
-
- # supporting utilities used by my emacs configuration
- pacman_install aspell # spell check system
- pacman_install aspell-en # spell check english files
- aur_install multimarkdown # markdown conversion
- pacman_install sdcv # stardict dictionary system
- pacman_install fd # a faster find for dired/dirvish
- pacman_install imagemagick # image previews for dired/dirvish
- pacman_install mediainfo # generating media info in dired/dirvish
- pacman_install ffmpegthumbnailer # video previews in dired/dirvish
- aur_install mu # email indexer and utilities
- aur_install isync # email sync
- pip_install yt-dlp # video download
- pacman_install mpv # video viewer
- pip_install proselint # grammar checker
- aur_install exercism # command line tool for exercism.io
-
-
- action="setting up emacs configuration files" && display "task" "$action"
- (sudo -u "$username" git clone $dotemacs_repo /home/$username/.emacs.d >> "$logfile" 2>&1) || \
- error "error" "$action" "$?"
-
- # DevOps Utilities
-
- action="installing devops virtualization and automation tools" && display "task" "$action"
- pacman_install virtualbox >> "$logfile" 2>&1 || error "error" "$action" "$?"
- pacman_install virtualbox-guest-iso >> "$logfile" 2>&1 || error "error" "$action" "$?"
- pacman_install virtualbox-host-modules-arch >> "$logfile" 2>&1 || error "error" "$action" "$?"
- pacman_install linux-headers >> "$logfile" 2>&1 || error "error" "$action" "$?"
- action="adding user to vboxusers group" && display "task" "$action"
- (gpasswd -a $username vboxusers >> "$logfile" 2>&1) || error "error" "$action" "$?"
- pacman_install docker
- pacman_install docker-compose
- action="adding user to docker group" && display "task" "$action"
- (gpasswd -a $username docker >> "$logfile" 2>&1) || error "error" "$action" "$?"
- action="enabling docker service to launch on boot" && display "task" "$action"
- systemctl enable docker.service >> "$logfile" 2>&1 || error "error" "$action" "$?"
- pacman_install vagrant >> "$logfile" 2>&1 || error "error" "$action" "$?"
- pip_install ansible >> "$logfile" 2>&1 || error "error" "$action" "$?"
-
-}
-
-### Supplemental Software
-
-supplemental_software() {
-
- display "title" "Supplemental Software"
-
- # pacman installs
- pacman_install arandr # xrandr gui for monitor settings
- pacman_install arch-install-scripts # for making arch installers
- pacman_install archinstall # the archinstall python program
- pacman_install aria2 # fast downloader
- pacman_install dash # posix compliant /bin/sh
- pacman_install docx2txt # recovers text from docx files
- pacman_install entr # run arbitrary commands when files change
- pacman_install faac # open source mpeg 3 and aac encoder
- pacman_install faad2 # processes an aac stream
- pacman_install filezilla # ftp gui
- pacman_install gparted # disk partition utility
- pacman_install gst-plugin-pipewire # gstreamer audio plugin for pipewire
- pacman_install gst-plugins-base # gstreamer base audio plugins
- pacman_install gst-plugins-good # gstreamer extra audio plugins
- pacman_install gstreamer # pipeline based multimedia framework
- pacman_install gucharmap # gui display of character maps
- pacman_install gzip # compression tool
- pacman_install handbrake # video transcoder
- pacman_install libconfig # library for processing structured config files
- pacman_install libmad # mpeg audio decoder
- pacman_install libmpeg2 # library for decoding mpeg video streams
- pacman_install maim # screenshot utility
- pacman_install mediainfo # technical and tag information about media files
- pacman_install mosh # alt SSH terminal with roaming and responsiveness support
- pacman_install mpc # command line interface to mpd
- pacman_install mpd # the music player daemon
- pacman_install ncmpcpp # and mpd client to play music
- pacman_install neofetch # cli system information tool
- pacman_install odt2txt # converts from open document to text
- pacman_install p7zip # p7zip compression tool
- pacman_install pandoc # universal document converter
- pacman_install perl-image-exiftool # reads/writes exif info for raw photo files
- pacman_install pv # monitor progress of data through pipeline
- pacman_install rclone # syncs files from gdrive, s3, dropbox, etc.
- pacman_install smartmontools # monitors hard drives
- pacman_install syncthing # sync utility
- pacman_install texlive-most # latex
- pacman_install thunderbird # email, calendar, rss feeds
- pacman_install transmission-cli # bittorrent client
- pacman_install transmission-remote-gtk # bittorrent client
- pacman_install unclutter # hides mouse cursor when not being used
- pacman_install w3m # text based browser
- pacman_install wavpack # audio compression format
- pacman_install webkit2gtk # web content engine for GTK
- pacman_install xdotool # command line xorg automation tool
- pacman_install xz # general purpose data compression tool
- pacman_install zathura # document viewer
- pacman_install zathura-cb # zathura plugin for comics
- pacman_install zathura-djvu # zathura plugin for djvu books
- pacman_install zathura-pdf-mupdf # zathura plugin for pdf
- pacman_install poppler-glib # poppler-glib document viewer library
- pacman_install zlib # compression library
- aur_install authy # two-factor authenticator
- pip_install dtrx # extraction tool
- aur_install hfsprogs # file system tools for Mac OS
- aur_install mcomix # image viewer for comic books
- aur_install nsxiv # image viewer
- aur_install picom-jonaburg-git # xorg compositor with enhancements
- aur_install plexamp-appimage # music player
- aur_install topgrade # invokes upgrade procedures of various package maangers
- aur_install tremc # curses interface for transmission
- aur_install zsh-fast-syntax-highlighting-git # Optimized and extended zsh-syntax-highlighting
- git_install https://github.com/clamiax/snore.git # sleep with feedback
- pip_install ranger # terminal file manager
- pip_install pydf # better display of available space on mounted filesystems
- pip_install tidal-dl # tidal-dl:tidal as yt-dlp:youtube
- pacman_install lxappearance # GTK+ theme switcher
-
- # some nice fonts
- pacman_install ttf-crimson-pro
- pacman_install ttf-crimson-pro-variable
- pacman_install ttf-sourcecodepro-nerd
- pacman_install otf-cascadia-code-nerd
- pacman_install ttf-go-nerd
- pacman_install ttf-jetbrains-mono-nerd
- pacman_install ttf-meslo-nerd
- aur_install ttf-lato
-
-}
-
-### Silent Boot
-
-silent_boot() {
-
- action="Silent Boot" && display "title" "$action"
-
- action="removing distro and date/time from initial screen" && display "task" "$action"
- (cat /dev/null >/etc/issue) || error "error" "$action" "$?"
-
- action="preventing kernel messages on the console" && display "task" "$action"
- (echo "kernel.printk = 3 3 3 3" >/etc/sysctl.d/20-quiet-printk.conf) || \
- error "error" "$action" "$?"
-
- # action="delegating fsck messages from udev to systemd" && display "task" "$action"
- # sed -i "s/.*HOOKS=(base udev autodetect keyboard keymap modconf block filesystems fsck).*/HOOKS=(base systemd autodetect keyboard keymap modconf block filesystems fsck)/" /etc/mkinitcpio.conf || error "error" "running sed on mkinitcpio.conf to hide fsck messages" "$?"
- # mkinitcpio -P >> "$logfile" 2>&1 || error "error" "running mkinitcpio -P to silence fsck messages" "$?"
-
- # action="instructing systemd to check filesystems" && display "task" "$action"
- # servicefile=/usr/lib/systemd/system/systemd-fsck-root.service
- # [ -f $servicefile ] && echo "StandardOutput=null" >>$servicefile && \
- # echo "StandardError=journal+console" >>$servicefile
-
- # servicefile=/usr/lib/systemd/system/systemd-fsck@.service
- # [ -f $servicefile ] && echo "StandardOutput=null" >>$servicefile && \
- # echo "StandardError=journal+console" >>$servicefile
-
- # action="removing hostname from login prompt" && display "task" "$action"
- # sed -i "s/--noclear/--nohostname --noclear/g" /usr/lib/systemd/system/getty@.service \
- # || error "error" "$action" "$?"
-
- action="silencing the unneeded and chatty watchdog module" && display "task" "$action"
- echo "blacklist iTCO_wdt" >/etc/modprobe.d/nowatchdog.conf || error "error" "$action" "$?"
-
- # # on systemd boot, eliminate timeout and silence boot text
- # if [ -f /boot/loader/loader.conf ]; then
- # action="eliminating timeout and silencing boot test on systemd boot" && display "task" "$action"
- # echo "timeout=0" >/boot/loader/loader.conf
-
- # # the file in this location was named based on the time of the install, so we must use find to identify it.
- # kernelfile=$(find /boot/loader/entries/ -name "*.conf")
- # # hush boot output via kernel parameters
- # sed -i "/.*options root=PARTUUID.*/ s/$/quiet rd.systemd.show_status=auto rd.udev.log_level=2 nvme.noacpi=1 mem_sleep_default=deep nowatchdog/" "$kernelfile"
- # fi
-
- # # if grub, reset timeouts and adjust log levels
- # if [ -f /etc/default/grub ]; then
- # action="resetting timeouts and adjusting log levels on grub boot" && display "task" "$action"
- # sed -i "s/.*GRUB_TIMEOUT=.*/GRUB_TIMEOUT=2/g" /etc/default/grub
- # sed -i "s/.*GRUB_DEFAULT=.*/GRUB_DEFAULT=0/g" /etc/default/grub
- # sed -i "s/.*GRUB_RECORDFAIL_TIMEOUT=.*/GRUB_RECORDFAIL_TIMEOUT=$GRUB_TIMEOUT/g" /etc/default/grub
- # sed -i "s/.*GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"rw quiet loglevel=2 rd.systemd.show_status=auto rd.udev.log_level=2 nvme.noacpi=1 mem_sleep_default=deep nowatchdog\"/g" /etc/default/grub
- # grub-mkconfig -o /boot/grub/grub.cfg >> "$logfile" 2>&1 || error "error" "" "$?"
- # fi
-}
-
-### Outro
-
-outro() {
-
- action="Cleanup" && display "title" "$action"
- action="forcing user password change on first login" && display "task" "$action"
- chage -d 0 "$username" >> $logfile 2>&1 || error "error" "$action" "$?"
-
- display "subtitle" "Statistics"
- action="identifying newly installed packages" && display "task" "$action"
- pacman -Q > "$packages_after" || error "error" "$action" "$?"
- (comm -13 --nocheck-order "$packages_before" "$packages_after" > "$archsetup_packages") || \
- error "error" "$action" "$?"
-
- action="comparing timestamps" && display "task" "$action"
- ENDTIME=$(date +%s)
- totalsecs=$(($ENDTIME - $STARTTIME))
- mins=$(($totalsecs / 60))
- secs=$(($totalsecs % 60))
-
- new_packages=$(cat $archsetup_packages | wc -l)
-
- printf "\n"
- printf "Completion time : %s\n" "$(date +'%D %T')" | tee -a "$logfile"
- printf "Elapsed time : %s minutes, %s seconds\n" $mins $secs | tee -a "$logfile"
- printf "Errors encountered : %s\n" $errors_encountered | tee -a "$logfile"
- printf "Log file location : %s\n" "$logfile"
- printf "Packages installed : %s\n" "$new_packages"
- printf "\n"
- printf "Please reboot before working with your new workstation.\n\n"
-}
-
-### Installation Steps
-
-intro # take start stats
-
-prerequisites # install software required to install software
-create_user # create user in wheel with :nopasswd sudo
-user_customizations # dotfiles
-aur_installer # install yay (comment out if using zfsarch install first)
-essential_services
-desktop_environment
-developer_workstation
-supplemental_software
-silent_boot # make booting a bit less noisy
-
-outro # take end stats; show summary
-
-exit 0