From 05f6cae8f841785ba60010dfa8b398e037fb0876 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Fri, 30 May 2014 17:20:01 +0200 Subject: [PATCH] pulling --- zb-cleanup | 13 ++++++++++--- zb-pull | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/zb-cleanup b/zb-cleanup index 825de43..e193fbf 100755 --- a/zb-cleanup +++ b/zb-cleanup @@ -6,16 +6,21 @@ if [[ -z "$1" || -z "$2" ]] ; then fi timestamp () { - t="`echo \"$1\" |sed -e 's/^.*@zb-//' |tr 'p_' '+ '`" + t="`echo \"$1\" |sed -ne 's/^.*@zb-//p' |tr 'p_' '+ '`" + [[ -z "$t" ]] && return 1 date --date="$t" +%s + return $? } density="$2" timenow=`date +%s` lasttime=0 +# list snapshots zfs list -t snapshot -r -d 1 -H "$1" |awk '{print $1;}' | while read l ; do - echo `timestamp "$l"` "$l" + #link unix timestamps + unixtime=`timestamp "$l"` || continue + echo "$unixtime" "$l" done |sort -n | while read l ; do curtime=${l%% *} snapname=${l#* } @@ -24,7 +29,9 @@ done |sort -n | while read l ; do break fi - if [ $(( $density*($curtime-$lasttime)/($timenow-$lasttime) )) -lt 1] ; then + #if it's too dense, delete the closer snapshot + if [ $(( $density*($curtime-$lasttime)/($timenow-$lasttime) )) -lt 1] + then zfs destroy "$snapname" else lasttime="$curtime" diff --git a/zb-pull b/zb-pull index 13f4793..af8f9cd 100755 --- a/zb-pull +++ b/zb-pull @@ -1,2 +1,59 @@ #!/bin/sh +if [[ -z "$1" || -z "$2" || -z "$3" ]] ; then + echo "usage: $0 " >&2 + exit 1 +fi + +timestamp () { + t="`echo \"$1\" |sed -ne 's/^.*@zb-//p' |tr 'p_' '+ '`" + [[ -z "$t" ]] && return 1 + date --date="$t" +%s + return $? +} + + +ssh_remote="$1" +remote_zfs="$2" +local_zfs="$3" + +# find newest available and newest common snapshot +newest="N/A" +newest_common="N/A" + +ssh $ssh_remote "zfs list -t snapshot -r -d 1 -H \"${remote_zfs}\" " | while read l ; do + #link unix timestamps + unixtime=`timestamp "$l"` || continue + echo "$unixtime" "$l" +done | sort -n | while read l ; do + curtime=${l%% *} + snapname=${l#* } + + newest="$snapname" + + if zfs list -t snapshot -H "${local_zfs}@zb-${snapname}" >/dev/null ; then + newest_common="$snapname" + fi +done + +# some checks + +if [ "$newest" = "N/A" ] ; then + echo "$0: no remote snapshots available to pull" >&2 + exit 2 +fi + +if [ "$newest" = "$newest_common" ] ; then + echo "$0: nothing new to pull" >&2 + exit 0 +fi + +if [ "$newest_common" = "N/A" ] ; then + #do a full send + ssh $ssh_remote "zfs send \"${remote_zfs}@zb-${newest}\"" | zfs recv -F "${local_zfs}" + exit $? +else + #do incremental send + ssh $ssh_remote "zfs send -I \"${remote_zfs}@zb-${newest_common}\" \"${remote_zfs}@zb-${$newest}\"" | zfs recv -F "${local_zfs}" + exit $? +fi