Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#!/bin/bash
# Recommended steps:
#
# bootstrap before entering chroot
# copy this script into INSTALL_DIR
# rootinit after entering chroot
# x (if installing graphics)
# pkgs
# xpkgs (if installing graphics)
# userinit
# kaitinit (optional)
# grubinit
#
# At this point, log in as the user created above.
#
# yayinit
# yaypkgs
# yayxpkgs (if installing graphics)
# homeinit
# xenvinit (if installing graphics)
# gpginit
# sshinit
# scannerinit
# autologin (for media PCs)
# nmmedia (for media PCs)
INSTALL_DIR=/mnt
bootstrap() {
pacstrap "$INSTALL_DIR" base base-devel linux linux-firmware
genfstab -U "$INSTALL_DIR" >> "$INSTALL_DIR"/etc/fstab
}
rootinit() {
if [ $# != 1 ]; then
echo "Usage: $(basename "$0") rootinit <hostname>" >&2
exit 1
fi
hostname="$1"
ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
hwclock --systohc
sed -i 's/^#\(en_US\.UTF-8 .*\)$/\1/g' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
echo "$hostname" > /etc/hostname
{
echo "127.0.0.1 localhost"
echo "::1 localhost"
echo "127.0.1.1 $hostname.localdomain $hostname"
} >> /etc/hosts
echo 'COMPRESSXZ=(xz -c -z -0 -)' >> /etc/makepkg.conf
echo "set root password:"
passwd
}
x() {
if [ $# != 1 ]; then
echo "Usage: $(basename "$0") x <intel | radeon>" >&2
exit 1
fi
driver="$1"
pacman --noconfirm -S xorg xorg-xinit
case "$driver" in
intel)
pacman --noconfirm -S xf86-video-intel
;;
radeon)
pacman --noconfirm -S xf86-video-ati
;;
*)
echo "unrecognized graphics driver" >&2
exit 1
;;
esac
}
pkgs() {
pacman --noconfirm -S \
zsh \
asp \
sudo \
vi \
alsa-utils \
aspell aspell-en hunspell hunspell-en_US \
python python-pip python-setuptools python-virtualenv bpython \
python2 python2-pip python2-setuptools python2-virtualenv bpython2 \
flake8 \
go go-tools \
rustup \
grub efibootmgr \
iputils inetutils whois bind-tools dhcpcd \
cups \
shellcheck \
pdftk \
cronie openssh openssl sshfs sshuttle gnupg tmux nfs-utils enscript \
docker espeak ffmpeg jq ripgrep youtube-dl fzf \
iotop htop linux-tools pkgfile pwgen pv strace tig time tree valgrind \
vim \
git aws-cli s3cmd colordiff curl wget ctags darkhttpd pass rsync
pkgfile --update
}
xpkgs() {
pacman --noconfirm -Rsn vim
pacman --noconfirm -S \
xterm \
alacritty alacritty-terminfo \
k3b konversation konsole dolphin okular \
qt5 qt5ct oxygen oxygen-icons \
xsane \
xbindkeys \
libnotify \
kmix \
dunst \
i3lock \
mpv \
nitrogen \
numlockx \
xclip \
xdotool \
trayer \
freerdp \
gmrun \
gvim \
noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra \
firefox
}
userinit() {
# Use the same group ID on all machines.
sudo groupmod -n users-old users
sudo groupadd -g 100 users
sudo useradd -g users -u 1000 -m -s /bin/zsh \
-G disk,lp,wheel,log,dbus,network,video,audio,optical,storage,scanner,power \
andrew
echo "set andrew password"
sudo passwd andrew
echo "make sure '%wheel ALL=(ALL) NOPASSWD: ALL' is in sudoers"
}
kaitinit() {
sudo useradd -g users -u 1002 -m -s /bin/bash \
-G disk,lp,wheel,log,dbus,network,video,audio,optical,storage,scanner,power \
kait
echo "set kait password"
sudo passwd kait
echo "make sure '%wheel ALL=(ALL) NOPASSWD: ALL' is in sudoers"
}
grubinit() {
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub
grub-mkconfig -o /boot/grub/grub.cfg
}
yayinit() {
cd /tmp || exit 1
if [ ! -d yay ]; then
git clone https://aur.archlinux.org/yay
fi
cd yay || exit 1
makepkg -fsi --noconfirm
}
yaypkgs() {
yay --noconfirm -S \
brother-dcp7065dn \
brscan4 \
ngrok \
par \
vim-fzf-git vim-go-git vim-ledger-git vim-plug-git \
vim-renamer-git vim-syntastic-git vim-toml-git \
zsh-autosuggestions \
zsh-completions \
zsh-syntax-highlighting \
zsh-fast-syntax-highlighting-git \
dict-wn
}
yayxpkgs() {
yay --noconfirm -S \
dzen2-xft-xpm-xinerama-git \
google-chrome \
mirage \
idesk \
gkrellm \
gkleds \
gkrellsun \
gkrellweather \
nerd-fonts-hack \
ttf-oxygen \
ttf-dejavu \
ttf-fira-mono \
ttf-mononoki-git \
ttf-roboto \
ttf-ubuntu-font-family
}
homeinit() {
cd "$HOME" || exit 1
curl https://burntsushi.net/stuff/setup-home > /tmp/setup-home.sh
sh /tmp/setup-home.sh
git clone andrew@home.burntsushi.net:/m/git/password-store .password-store
mkdir -p .gnupg
{
echo 'default-cache-ttl 86400'
echo 'max-cache-ttl 86400'
} > .gnupg/gpg-agent.conf
}
xenvinit() {
cd "$HOME" || exit 1
. "$HOME/bin/x11-go"
go get -v github.com/BurntSushi/wingo/...
go get -v github.com/BurntSushi/gohead/...
virtualenv2 "$HOME/.pyx11"
. "$HOME/.pyx11/bin/activate"
pip install pywingo
}
gpginit() {
rscp nas:/m/data/andrew/keys/*.key.* /tmp/
gpg --import /tmp/jamslam@gmail.com.key.priv
gpg --import /tmp/kbrady39@gmail.com.key.priv
echo "use 'gpg --edit-key {email}' to trust each key completely"
}
sshinit() {
ssh-extract-key burntsushi
ssh-extract-key feral
}
scannerinit() {
brsaneconfig4 -a name=Brother model=DCP-7065DN ip=192.168.1.150
}
autologin() {
sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
sudo tee /etc/systemd/system/getty@tty1.service.d/override.conf > /dev/null <<EOF
[Service]
ExecStart=
ExecStart=-/usr/bin/agetty --autologin andrew --noclear %I $TERM
EOF
}
nmmedia() {
script="/etc/NetworkManager/dispatcher.d/10-media.sh"
sudo tee "$script" > /dev/null <<EOF
#!/bin/sh
status="\$2"
case "\$status" in
up)
sudo -i -u andrew zsh -c '. ~/.zshrc && media'
;;
down)
sudo -i -u andrew zsh -c '. ~/.zshrc && media down'
;;
esac
EOF
sudo chmod 0755 "$script"
}
case "$1" in
bootstrap) shift ; bootstrap "$@" ;;
rootinit) shift ; rootinit "$@" ;;
x) shift ; x "$@" ;;
pkgs) shift ; pkgs "$@" ;;
xpkgs) shift ; xpkgs "$@" ;;
userinit) shift ; userinit "$@" ;;
kaitinit) shift ; kaitinit "$@" ;;
grubinit) shift ; grubinit "$@" ;;
yayinit) shift ; yayinit "$@" ;;
yaypkgs) shift ; yaypkgs "$@" ;;
yayxpkgs) shift ; yayxpkgs "$@" ;;
homeinit) shift ; homeinit "$@" ;;
xenvinit) shift ; xenvinit "$@" ;;
gpginit) shift ; gpginit "$@" ;;
sshinit) shift ; sshinit "$@" ;;
scannerinit) shift ; scannerinit "$@" ;;
autologin) shift ; autologin "$@" ;;
nmmedia) shift ; nmmedia "$@" ;;
*)
echo "unrecognized command" >&2
exit 1
;;
esac
@murlakatamenka

This comment has been minimized.

Copy link

murlakatamenka commented Jan 28, 2020

yaourt is deprecated for real by now, yay is often recommended instead (I use it myself, and it works; shell completion is present).

https://wiki.archlinux.org/index.php/AUR_helpers#Comparison_tables for actual ones.

@BurntSushi

This comment has been minimized.

Copy link
Owner Author

BurntSushi commented Jan 28, 2020

Ah thanks. And wow, yeah, yaourt isn't even listed there any more! I'll check out yay.

@murlakatamenka

This comment has been minimized.

Copy link

murlakatamenka commented Feb 9, 2020

yay's top contributor Morganamilo is Arch trusted user, so it's like a seal of approval and look no further for me. Should be a drop-in replacement for yauort in this parsticular script and in general.


One more thing I had on my mind after reading your latest blog post.

I very much miss the dedicated volume keys on the ThinkPad. I want to be able to adjust the volume quickly and without looking. Having to use the Fn key does not make that easy. I may wind up just adding some new keybinding for this to work around it.

I also use xbindkeys for hotkeys and for sound I quite like to use Ctrl + Up/Down for global sound control. Really fast and easy. Also, what can be more logical than controlling volume level up and down with Control + Up/Down? 😃

Ctrl + Alt + Up/Down for music player volume control. If it's MPRIS-compatible, then playerctl is a a good helper. Relevant part of my xbindkeysrc:

# ALSA
"amixer -q set Master 5%+"
  control + Up
"amixer -q set Master 5%-"
  control + Down

# Pulse Audio (volume can exceed 100%, so it sucks)
# "pactl set-sink-volume @DEFAULT_SINK@ +5%" # isn't limited to 100%, watch out
#   control + Up
# "pactl set-sink-volume @DEFAULT_SINK@ -5%"
#   control + Down

# Music player
"playerctl play-pause"
  control + alt + space
"playerctl next"
  control + alt + Right
"playerctl previous"
  control + alt + Left
"playerctl volume 0.05+"
  control + alt + Up
"playerctl volume 0.05-"
  control + alt + Down

Hope it helps in a way.

@BurntSushi

This comment has been minimized.

Copy link
Owner Author

BurntSushi commented Feb 9, 2020

Great! Thanks for the ping again. I was finally moved to switch to yay. Overall very happy. I love its diff options.

I've updated this script to use yay as well, so that others passing by will not be inclined to use yaourt just because I hadn't updated yet.

As for volume, I had settled on Super + Tab for volume up and Super + Shift + Tab for volume down and Super + Grave for mute toggle. Not a huge fan. I added your control options as well, and we'll see how it goes. :-)

Also, for changing volume, I use i3-volume. I don't use i3, and despite its name, it works just fine with any WM. (I actually use my own patched version of it that makes it work a little nicer with dunst, and plays a "ding" sound any time the volume changes.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.