From cf00dabeb022ae6fcf36a5ee01331297db8860fc Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Mon, 11 Mar 2019 20:24:06 +0000 Subject: [PATCH] Allow Choice of package group presets when provisioning Choice is presented at beginning of provisioning and can choose from 3 different package groups (desktop, laptop, headless) with emphasis on different deployment functionality. Additional packages to run installation against can also be passed in as command option with -f "/path/to/packages.csv /path/to/more.csv" which will get installed alongside the selected package group. When choosing -F the packages will get installed as the only packages instead. --- .config/bootstrap/install.sh | 76 ++++++++++++++++++++++++------ .config/bootstrap/packages.csv | 34 ------------- .config/bootstrap/pkg/dev.csv | 5 ++ .config/bootstrap/pkg/fs.csv | 2 + .config/bootstrap/pkg/media.csv | 11 +++++ .config/bootstrap/pkg/network.csv | 2 + .config/bootstrap/pkg/shell.csv | 8 ++++ .config/bootstrap/pkg/untested.csv | 3 ++ .config/bootstrap/pkg/x.csv | 13 +++++ 9 files changed, 105 insertions(+), 49 deletions(-) delete mode 100644 .config/bootstrap/packages.csv create mode 100644 .config/bootstrap/pkg/dev.csv create mode 100644 .config/bootstrap/pkg/fs.csv create mode 100644 .config/bootstrap/pkg/media.csv create mode 100644 .config/bootstrap/pkg/network.csv create mode 100644 .config/bootstrap/pkg/shell.csv create mode 100644 .config/bootstrap/pkg/untested.csv create mode 100644 .config/bootstrap/pkg/x.csv diff --git a/.config/bootstrap/install.sh b/.config/bootstrap/install.sh index 799228d..a2be8e5 100644 --- a/.config/bootstrap/install.sh +++ b/.config/bootstrap/install.sh @@ -5,17 +5,22 @@ ### OPTIONS AND VARIABLES ### -while getopts ":a:r:p:h" o; do case "${o}" in +# unset our temp variables, just in case they were used for something else in shell +unset pkgfiles dotfilesrepo targetuser targetpassword targetdeployment quietmode aurhelper + +while getopts ":a:r:p:u:U:f:F:hq" o; do case "${o}" in h) printf "Optional arguments for custom use:\\n -r: Dotfiles repository (local file or url)\\n -p: Dependencies and programs csv (local file or url)\\n -a: AUR helper (must have pacman-like syntax)\\n -h: Show this message\\n" && exit ;; r) dotfilesrepo=${OPTARG} && git ls-remote "$dotfilesrepo" || exit ;; - p) progsfile=${OPTARG} ;; a) aurhelper=${OPTARG} ;; + f) pkgfiles=${OPTARG} ;; + F) pkgfiles=${OPTARG} && exclusivepkgfiles=true ;; + t) targetdeployment=${OPTARG} ;; *) printf "Invalid option: -%s\\n" "$OPTARG" && exit ;; esac done # DEFAULTS: [ -z "$dotfilesrepo" ] && dotfilesrepo="https://gitlab.com/marty-oehme/dotfiles.git" -[ -z "$progsfile" ] && progsfile="https://gitlab.com/marty-oehme/dotfiles/snippets/1828258/raw" +[ -z "$pkgfiles" ] && pkgfiles="" [ -z "$aurhelper" ] && aurhelper="yay" ### FUNCTIONS ### @@ -57,6 +62,10 @@ adduserandpass() { \ echo "$name:$pass1" | chpasswd unset pass1 pass2 ;} +deploydialog() { + targetdeployment=$(dialog --title "Deployment Configuration" --radiolist "Select a target package configuration." 0 0 5 desktop "base, network, shell, gui, multimedia, development" on laptop "base, network, shell, gui, multimedia, development, battery, touchpad" off headless "base, network, shell" off none "Installs no packages." off 3>&1 1>&2 2>&3 3>&1) +} + refreshkeys() { \ dialog --infobox "Refreshing Arch Keyring..." 4 40 pacman --noconfirm -Sy archlinux-keyring >/dev/null 2>&1 @@ -97,9 +106,29 @@ aurinstall() { \ sudo -u "$name" $aurhelper -S --noconfirm "$1" >/dev/null 2>&1 } +# get the link to the package collection +getpackagegrouplink() { + case "$1" in + "none") pkggroup="";; + "desktop") pkggroup="https://gitlab.com/marty-oehme/dotfiles/snippets/1828258/raw" ;; + "laptop") pkggroup="https://gitlab.com/marty-oehme/dotfiles/snippets/1834307/raw" ;; + "headless") pkggroup="https://gitlab.com/marty-oehme/dotfiles/snippets/1834308/raw" ;; + esac +} + +# can be called with as many csv files filled with packages as necessary +# appends them all to one temporary file for the installation +gatherpackages() { + concfile=$1 + shift + touch $concfile + for progs in "$@"; do + ([ -f "$progs" ] && cat "$progs" >> $concfile) || curl -Ls "$progs" | sed '/^#/d' >> $concfile + done +} + installationloop() { \ - ([ -f "$progsfile" ] && cp "$progsfile" /tmp/progs.csv) || curl -Ls "$progsfile" | sed '/^#/d' > /tmp/progs.csv - total=$(wc -l < /tmp/progs.csv) + total=$(wc -l < $1) aurinstalled=$(pacman -Qm | awk '{print $1}') while IFS=, read -r tag program comment; do n=$((n+1)) @@ -109,7 +138,7 @@ installationloop() { \ "A") aurinstall "$program" "$comment" ;; "G") gitmakeinstall "$program" "$comment" ;; esac - done < /tmp/progs.csv ;} + done < $1 ;} dotfiles() { \ gpath=$1 @@ -144,7 +173,7 @@ serviceinit() { for service in "$@"; do systemctl start "$service" done ;} -systembeepoff() { dialog --infobox "Getting rid of that retarded error beep sound..." 10 50 +systembeepoff() { dialog --infobox "Getting rid of error beep sound..." 10 50 rmmod pcspkr echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf ;} @@ -173,6 +202,11 @@ getuserandpass || error "User exited." # Give warning if user already exists. usercheck || error "User exited." +# Let user select groups of packages to pre-install. +if [ -z "$targetdeployment" ]; then + deploydialog || error "User exited." +fi + # Last chance for user to back out before install. preinstallmsg || error "User exited." @@ -199,11 +233,23 @@ sed -i "s/-j2/-j$(nproc)/;s/^#MAKEFLAGS/MAKEFLAGS/" /etc/makepkg.conf manualinstall $aurhelper || error "Failed to install AUR helper." +# the command that sets the correct link to gather our package files from +# correct link depends on target deployment: desktop, laptop, server,.. +getpackagegrouplink $targetdeployment + +# append the default packages to whatever custom package csv links were passed in or +# only use the custom packages if forced with -F +[ ! "$exclusivepkgfiles" ] && pkgfiles="$(curl -Ls $pkggroup | cat ) $pkgfiles" + +tmpfile=/tmp/pkgs.csv +# actually gather the individual package installation lines from the various links and files +gatherpackages $tmpfile $pkgfiles + # 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 sudo without a password +# the user has been created and has privileges to run sudo without a password # and all build dependencies are installed. -installationloop +installationloop $tmpfile # Install the dotfiles in the user's home directory putgitrepo "$dotfilesrepo" "/home/$name" @@ -212,11 +258,6 @@ rm "/home/$name/README.md" # Pulseaudio, if/when initially installed, often needs a restart to work immediately. [ -f /usr/bin/pulseaudio ] && resetpulse -# Install vim `plugged` plugins. -dialog --infobox "Installing (neo)vim plugins..." 4 50 -(sleep 30 && killall nvim) & -sudo -u "$name" nvim -E -c "PlugUpdate|visual|q|q" >/dev/null 2>&1 - # Enable services here. serviceinit NetworkManager cronie @@ -228,6 +269,11 @@ systembeepoff newperms "%wheel ALL=(ALL) ALL #LARBS %wheel 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/packer -Syu,/usr/bin/packer -Syyu,/usr/bin/systemctl restart NetworkManager,/usr/bin/rc-service NetworkManager restart,/usr/bin/pacman -Syyu --noconfirm,/usr/bin/loadkeys,/usr/bin/yay,/usr/bin/pacman -Syyuw --noconfirm" +# Install vim `plugged` plugins. +dialog --infobox "Installing (neo)vim plugins..." 4 50 +(sleep 30 && killall nvim) & +sudo -u "$name" nvim -E -c "PlugUpdate|visual|q|q" >/dev/null 2>&1 + # Last message! Install complete! finalize -clear \ No newline at end of file +clear diff --git a/.config/bootstrap/packages.csv b/.config/bootstrap/packages.csv deleted file mode 100644 index a3b9a49..0000000 --- a/.config/bootstrap/packages.csv +++ /dev/null @@ -1,34 +0,0 @@ -#TAG,NAME IN REPO (or git url),PURPOSE (should be a verb phrase to sound right while installing) -,i3-gaps,"is the main graphical user interface and window manager." -,i3blocks,"is the status bar block provider for i3." -,xorg-server,"is the graphical server." -,xorg-xinit,"starts the graphical server." -,ranger,"is an extensive terminal file manager that everyone likes." -,dosfstools,"allows your computer to access dos-like filesystems." -,neovim,"a tidier vim with some useful features" -,i3blocks,"is the status bar." -,i3lock,"is the screen lock." -,mpv,"is the patrician's choice video/gif player." -,networkmanager,"does exactly what it sounds like." -,ntfs-3g,"allows accessing NTFS partitions." -,pulseaudio,"is the audio system (>inb4 bloat)." -,pulseaudio-alsa,"is an audio interface with ALSA." -,pulsemixer,"is an intuitive ncurses audio controller." -,tmux,"is a terminal multiplexer and the dropdown window in LARBS." -,unrar,"extracts rar's." -,unzip,"unzips zips." -,xclip,"allows for copying and pasting from the command line." -,xdotool,"provides window action utilities on the command line." -,youtube-dl,"can download any YouTube video (or playlist or channel) when given the link." -,atool,"manages and gives information about archives." -,fzf,"is a fuzzy finder tool." -,zsh,"is a shell alternative to bash." -A,nerd-fonts-fira-code,"is the mono-space font of choice, patched with embedded icon symbols." -,qutebrowser,"is a keyboard focused browser with vim-keys enabled." -,mopidy,"is an extensible music server written in python." -A,mopidy-spotify,"is a mopidy extension to play music from spotify." -A,mopidy-scrobbler,"is a mopidy extension to scrobble to last.fm." -A,mopidy-spotify-tunigo,"is a mopidy extension to enable spotify browsing." -A,mopidy-podcast,"is a mopidy extension to search and browse podcasts." -,rxvt-unicode,"is a simple and efficient terminal emulator." - diff --git a/.config/bootstrap/pkg/dev.csv b/.config/bootstrap/pkg/dev.csv new file mode 100644 index 0000000..418002d --- /dev/null +++ b/.config/bootstrap/pkg/dev.csv @@ -0,0 +1,5 @@ +,code,"is an open source gui code editor in the style of atom/sublime - but better." +,vagrant,"is a development environment provisioning system which easily spins up virtual machines for you." +,virtualbox,"is a virtual machine framework which is mainly used by vagrant." +,docker,"should need no introduction, but allows you to run everything in a container." +,docker-compose,"allows you to run many, many containers much more easily." diff --git a/.config/bootstrap/pkg/fs.csv b/.config/bootstrap/pkg/fs.csv new file mode 100644 index 0000000..77db957 --- /dev/null +++ b/.config/bootstrap/pkg/fs.csv @@ -0,0 +1,2 @@ +,ntfs-3g,"allows accessing NTFS partitions." +,dosfstools,"allows your computer to access dos-like filesystems." diff --git a/.config/bootstrap/pkg/media.csv b/.config/bootstrap/pkg/media.csv new file mode 100644 index 0000000..980f135 --- /dev/null +++ b/.config/bootstrap/pkg/media.csv @@ -0,0 +1,11 @@ +,pulseaudio,"is the audio system (>inb4 bloat)." +,pulseaudio-alsa,"is an audio interface with ALSA." +,pulsemixer,"is an intuitive ncurses audio controller." +,mopidy,"is an extensible music server written in python." +,ncmpcpp,"is a client for the mopidy music server (or, optionally, for mpd)" +A,mopidy-spotify,"is a mopidy extension to play music from spotify." +A,mopidy-scrobbler,"is a mopidy extension to scrobble to last.fm." +A,mopidy-spotify-tunigo,"is a mopidy extension to enable spotify browsing." +A,mopidy-podcast,"is a mopidy extension to search and browse podcasts." +,mpv,"is the patrician's choice video/gif player." +,youtube-dl,"can download any YouTube video (or playlist or channel) when given the link." diff --git a/.config/bootstrap/pkg/network.csv b/.config/bootstrap/pkg/network.csv new file mode 100644 index 0000000..ea62e26 --- /dev/null +++ b/.config/bootstrap/pkg/network.csv @@ -0,0 +1,2 @@ +,networkmanager,"does exactly what it sounds like." +,openssh,"allows using ssh connections to connect to others or be connected to." diff --git a/.config/bootstrap/pkg/shell.csv b/.config/bootstrap/pkg/shell.csv new file mode 100644 index 0000000..19deaff --- /dev/null +++ b/.config/bootstrap/pkg/shell.csv @@ -0,0 +1,8 @@ +,zsh,"is a shell alternative to bash." +,tmux,"is a terminal multiplexer and the dropdown window in LARBS." +,neovim,"a tidier vim with some useful features" +,ranger,"is an extensive terminal file manager that everyone likes." +,fzf,"is a fuzzy finder tool." +,unrar,"extracts rar's." +,unzip,"unzips zips." +,atool,"manages and gives information about archives." diff --git a/.config/bootstrap/pkg/untested.csv b/.config/bootstrap/pkg/untested.csv new file mode 100644 index 0000000..0a22a67 --- /dev/null +++ b/.config/bootstrap/pkg/untested.csv @@ -0,0 +1,3 @@ +#TAG,NAME IN REPO (or git url),PURPOSE (should be a verb phrase to sound right while installing) +A,enpass-bin,"is a cross-platform personal password manager with gui." +,gtk3,"is a gui toolkit, necessary for enpass-bin to work. (enpass forgets to install it)" diff --git a/.config/bootstrap/pkg/x.csv b/.config/bootstrap/pkg/x.csv new file mode 100644 index 0000000..d809914 --- /dev/null +++ b/.config/bootstrap/pkg/x.csv @@ -0,0 +1,13 @@ +,xorg-server,"is the graphical server." +,xorg-xinit,"starts the graphical server." +,xorg-xauth,"manages X authentication settings." +,xclip,"allows for copying and pasting from the command line." +,xdotool,"provides window action utilities on the command line." +,i3-gaps,"is the main graphical user interface and window manager." +,i3blocks,"is the status bar block provider for i3." +,i3status,"is the status bar for i3." +,i3lock,"is the i3 screen lock provider." +A,j4-dmenu-desktop,"is a faster dmenu replacement, the application launcher of the i3 suite." +A,nerd-fonts-fira-code,"is the mono-space font of choice, patched with embedded icon symbols." +,rxvt-unicode,"is a simple and efficient terminal emulator." +,qutebrowser,"is a keyboard focused browser with vim-keys enabled."