#! /bin/sh # vim:ts=4:sw=4: set -e HOSTS="backup.niet.verweg.com" POOLS="system" BACKUP_PATH="${1}" for backup_host in $HOSTS; do if nc -w 5 $backup_host 22 2>&1 > /dev/null; then for pool in $POOLS; do last_snapshot=$(zfs list -H -o name -t snap -r -d 1 $pool | tail -1) last_send_snapshot_file="/var/db/backup/last-${backup_host}-${pool}" test -f ${last_send_snapshot_file} && last_send_snapshot=$(cat ${last_send_snapshot_file}) || last_send_snapshot="" if [ "${last_snapshot}" != "${pool}@${last_send_snapshot}" ]; then test -n "${last_send_snapshot}" && incremental_opt="-I ${pool}@${last_send_snapshot}" echo zfs send -n -vR ${incremental_opt} ${last_snapshot} zfs send -n -vR ${incremental_opt} ${last_snapshot} 2>&1 | \ tail -1 | \ tee /var/tmp/backup-${backup_host}-$$.log if [ -n "${BACKUP_PATH}" -a -d "${BACKUP_PATH}" ]; then zfs send -vR ${incremental_opt} ${last_snapshot} | \ zstd -v -6 --long > ${BACKUP_PATH}/${pool}-${backup_host}-${last_snapshot}.zstd | \ tee -a /var/tmp/backup-${backup_host}-$$.log echo "Stored backup in ${BACKUP_PATH}/${pool}-${backup_host}-${last_snapshot}.zstd" echo "rsync this to the other server and use as input" else zfs send -vR ${incremental_opt} ${last_snapshot} | \ zstd -v -6 --long | \ ssh ${backup_host} $pool | \ tee -a /var/tmp/backup-${backup_host}-$$.log fi status=$(tail -1 /var/tmp/backup-${backup_host}-$$.log) echo ${last_snapshot} | sed -e "s/${pool}@//" if [ "${status}" = "OK" ]; then echo ${last_snapshot} | sed -e "s/${pool}@//" > ${last_send_snapshot_file} mv /var/tmp/backup-${backup_host}-$$.log /var/log/zfs-backup-${backup_host}-${pool}-$(date +%a).log fi else echo "Backup for $pool up to date for ${backup_host}" fi done else echo "WARNING: $backup_host not reachable over IPv6" fi done