#!/bin/sh

export BORG_REPO=ssh://Caret/home/ninewise/borg
export BORG_PASSPHRASE="$(pass show borg)"

info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM

info "Starting backup"

case "$(hostname)" in
mantle)
	borg create                           \
		--verbose                         \
		--filter AME                      \
		--list                            \
		--stats                           \
		--show-rc                         \
		--compression lz4                 \
		--exclude-caches                  \
		--exclude '/etc/sv/*/supervise'   \
		--exclude '/etc/sudoers'          \
		--exclude '/etc/securetty'        \
		--exclude '/etc/wpa_supplicant/wpa_supplicant.conf' \
		--exclude '/etc/sudoers.dist'     \
		--exclude '/etc/kernel.d/post-install/50-grub' \
		--exclude '/etc/kernel.d/post-remove/50-grub' \
		--exclude '/etc/mumble/mumble-server.ini' \
		--exclude '/etc/.pwd.lock'        \
		--exclude '/etc/gshadow-'         \
		--exclude '/etc/passwd-'          \
		--exclude '/etc/shadow-'          \
		--exclude '/etc/shadow'           \
		--exclude '/etc/ssh/ssh_*_key'    \
		--exclude '/etc/tcsd.conf'        \
		--exclude '/etc/gshadow'          \
		--exclude '/var/tmp/*'            \
		--exclude '/var/db/*'             \
		--exclude '/var/cache'            \
		--exclude '/var/lib/alsa'         \
		--exclude '/var/lib/dkms/mok.key' \
		--exclude '/var/lib/tor'          \
		--exclude '/var/lib/random-seed'  \
		--exclude '/var/lib/seedrng'      \
		--exclude '/var/lib/tpm'          \
		--exclude '/var/log/tallylog'     \
		--exclude '/var/log/btmp'         \
		--exclude '/var/log/dmesg.log'    \
		--exclude '/var/log/faillog'      \
		--exclude '/data/homes/*'         \
		--exclude '/data/mail/*/.uidvalidity' \
		--exclude '/data/music/*'         \
		--exclude '/data/pictures/*'      \
		--exclude '/data/torrents/*'      \
		--exclude '/home/*/.ssh/control*' \
		--exclude '/home/*/services/*/supervise' \
		--exclude '/home/*/.config/transmission*/resume' \
		--exclude '*/.git/*'              \
		--exclude '*/.stack-work/*'       \
		--exclude '*/lock'                \
		--exclude '*/.mbsyncstate*'       \
		--exclude '*/target/*'            \
		--exclude '*/build/*'             \
		--exclude '/data/programming/void-packages/*' \
		--exclude '/data/programming/SP-Flash-Tool-src/*' \
		--exclude '/data/programming/obs-v4l2sink/*' \
		--exclude '/data/programming/obs-studio/*' \
		\
		::'{hostname}-{now}'              \
		/etc                              \
		/var                              \
		/home/ninewise/dotfiles           \
		/home/ninewise/.gnupg             \
		/home/ninewise/.password-store    \
		/home/ninewise/.ssh               \
		/home/ninewise/.xmonad/src/       \
		/home/ninewise/.zsh_history       \
		/data ;;
abysm)
	borg create                           \
		--verbose                         \
		--filter AME                      \
		--list                            \
		--stats                           \
		--show-rc                         \
		--compression lz4                 \
		--exclude-caches                  \
		--exclude '/etc/dhcpcd.secret'    \
		--exclude '/etc/dracut.conf.d/*'  \
		--exclude '/etc/iwd/main.conf'    \
		--exclude '/etc/sv/*/supervise'   \
		--exclude '/etc/sv/*/log/run'     \
		--exclude '/etc/sudoers'          \
		--exclude '/etc/securetty'        \
		--exclude '/etc/wpa_supplicant/wpa_supplicant.conf' \
		--exclude '/etc/sv/wpa_supplicant/conf' \
		--exclude '/etc/sudoers.*'        \
		--exclude '/etc/kernel.d/post-install/50-grub' \
		--exclude '/etc/kernel.d/post-remove/50-grub' \
		--exclude '/etc/gshadow-'         \
		--exclude '/etc/gshadow'          \
		--exclude '/etc/passwd-'          \
		--exclude '/etc/shadow-'          \
		--exclude '/etc/shadow'           \
		--exclude '/etc/ssh/ssh_host_*_key' \
		--exclude '/etc/udev/rules.d/*'   \
		--exclude '/etc/X11/xorg.conf.d/*' \
		--exclude '/var/tmp/*'            \
		--exclude '/var/db/*'             \
		--exclude '/var/cache'            \
		--exclude '/var/lib/alsa'         \
		--exclude '/var/lib/ead'          \
		--exclude '/var/lib/iwd'          \
		--exclude '/var/lib/tor'          \
		--exclude '/var/lib/random-seed'  \
		--exclude '/var/log/tallylog'     \
		--exclude '/var/log/btmp'         \
		--exclude '/var/log/dmesg.log'    \
		--exclude '/var/log/faillog'      \
		--exclude '/var/log/lastlog'      \
		--exclude '/home/*/.ssh/control*' \
		--exclude '/home/*/services/*/supervise' \
		--exclude '/home/*/dotfiles'      \
		--exclude '/home/*/.local/share'  \
		--exclude '/home/*/.local/lib'    \
		--exclude '/home/*/.cache'        \
		--exclude '/home/*/.dbus'         \
		--exclude '/home/*/.hoogle'       \
		--exclude '/home/*/.config/microbrowser/data' \
		--exclude '/home/*/.config/googlebrowser/data' \
		--exclude '*/.git/*'              \
		--exclude '*/.stack-work/*'       \
		--exclude '*/lock'                \
		--exclude '*.lock'                \
		--exclude '*/.mbsyncstate*'       \
		--exclude '*/target/*'            \
		--exclude '*/build/*'             \
		::'{hostname}-{now}'              \
		/etc                              \
		/var                              \
		/home/noctua/.password-store      \
		/home/noctua/.zsh_history         \
		/home/noctua/.ssh                 \
		/home/noctua/ ;;
esac

backup_exit=$?

info "Pruning repository"

# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:

borg prune                          \
	--list                          \
	--glob-archives '{hostname}-*'  \
	--show-rc                       \
	--keep-daily    7               \
	--keep-weekly   4               \
	--keep-monthly  6

prune_exit=$?

global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))

if [ ${global_exit} -eq 0 ]; then
	info "Backup and Prune finished successfully"
elif [ ${global_exit} -eq 1 ]; then
	info "Backup and/or Prune finished with warnings"
else
	info "Backup and/or Prune finished with errors"
fi

exit ${global_exit}