#!/bin/bash function find_device { for DEVICE in /dev/disk/by-partlabel/ext*backup*; do if [ -L "$DEVICE" ]; then ZPOOLNAME="$(basename "$DEVICE")" CRYPTNAME="crypt-$(basename "$DEVICE")" echo "> Found: $ZPOOLNAME -> $(readlink -e "$DEVICE")" return fi done echo "ERROR! Couldn't find a backup device" exit 1 } function pool_import { if ! zpool status "$ZPOOLNAME" &> /dev/null; then echo "> cryptsetup luksOpen $DEVICE $CRYPTNAME" cryptsetup luksOpen "$DEVICE" "$CRYPTNAME" --key-file "/etc/lukskeys/${ZPOOLNAME}" echo "> zpool import $ZPOOLNAME" zpool import "$ZPOOLNAME" fi } function pool_export { echo "> zpool export $ZPOOLNAME" for i in $(seq 10); do zpool export "$ZPOOLNAME" && break done echo "> cryptsetup luksClose $CRYPTNAME" cryptsetup luksClose "$CRYPTNAME" } function cleanup_snapshots { echo "> Cleaning snapshots" sanoid --configdir=/etc/sanoid/ext-backup --verbose --prune-snapshots zfs list -t snapshot -r "$ZPOOLNAME" -H -o name \ | grep -F @syncoid_ \ | grep -Fv "@syncoid_$ZPOOLNAME" \ | xargs -rn1 zfs destroy -v } function syncoidw { syncoid --identifier "$ZPOOLNAME" "$@" } function main { find_device pool_import sync_snapshots cleanup_snapshots pool_export }