#!/bin/sh pool="tank/vol1" destination="tank" remote_pool="tank/vol1" host="192.168.0.10" today=`date +"%Y-%m-%d"` yesterday=`date -v -1d +"$type%Y-%m-%d"` #yesterday="2017-01-07" # create today snapshot snapshot_today="${pool}@${today}" # look for a snapshot with this name if zfs list -H -o name -t snapshot | sort | grep "${snapshot_today}" > /dev/null; then echo " snapshot, ${snapshot_today}, already exists" # exit 1 else echo " taking todays snapshot, ${snapshot_today}" zfs snapshot -r ${snapshot_today} fi # look for yesterday snapshot snapshot_yesterday="$pool@$yesterday" snapshot_yesterday_r="$remote_pool@$yesterday" snapshot_today_r="$remote_pool@${today}" snapshot_start="" snapshot_end="" ss_list_local="`zfs list -H -o name -t snapshot | grep ${pool} | cut -d \"@\" -f2 | sort -r`" ss_list_remote="`ssh root@${host} \"zfs list -H -o name -t snapshot | grep ${remote_pool} | cut -d \"@\" -f2 | sort -r\"`" #echo $snapshot_yesterday if ssh root@$host "zfs list -H -o name -t filesystem | sort | grep \"${remote_pool}\"" > /dev/null; then echo " Pool found on remote" else echo " Pool missing on remote, aborting" exit 1; fi if zfs list -H -o name -t snapshot | sort | grep "${snapshot_yesterday}" > /dev/null; then echo " yesterday snapshot, ${snapshot_yesterday}, exists locally" for l in $ss_list_local do for r in $ss_list_remote do if [ "$l" == $r ]; then snapshot_start="$l" fi done if [ "$snapshot_start" != "" ]; then break fi done if [ "$snapshot_start" != "" ]; then echo " found common ss at: ${snapshot_start}" if ssh root@$host "zfs list -H -o name -t snapshot | sort | grep \"${snapshot_today_r}\"" > /dev/null; then echo " Remote already has today's snapshot aborting sync" exit 2 else echo " proceeding with incremental sync" echo "zfs send -R -i ${pool}@${snapshot_start} ${snapshot_today} | lzop | ssh root@$host \"lzop -d | zfs receive -Fduv ${destination}\"" zfs send -R -i ${pool}@${snapshot_start} ${snapshot_today} | lzop | ssh root@$host "lzop -d | zfs receive -Fduv ${destination}" echo " sync complete" exit 0; fi else echo " yesterday snapshot, ${snapshot_yesterday_r}, missing on destination" if ssh root@$host "zfs list -H -o name -t snapshot | sort | grep \"${snapshot_today_r}\"" > /dev/null; then echo " Remote already has today's snapshot aborting sync" exit 2 else echo " proceeding with full sync" zfs send ${snapshot_today} | ssh root@$host "zfs receive -Fduv ${destination}" echo " sync complete" exit 0; fi fi else echo " missing yesterday snapshot aborting, ${snapshot_yesterday}" exit 1 fi