pulling
This commit is contained in:
parent
b0e495a4e8
commit
05f6cae8f8
13
zb-cleanup
13
zb-cleanup
|
@ -6,16 +6,21 @@ if [[ -z "$1" || -z "$2" ]] ; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
timestamp () {
|
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
|
date --date="$t" +%s
|
||||||
|
return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
density="$2"
|
density="$2"
|
||||||
timenow=`date +%s`
|
timenow=`date +%s`
|
||||||
lasttime=0
|
lasttime=0
|
||||||
|
|
||||||
|
# list snapshots
|
||||||
zfs list -t snapshot -r -d 1 -H "$1" |awk '{print $1;}' | while read l ; do
|
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
|
done |sort -n | while read l ; do
|
||||||
curtime=${l%% *}
|
curtime=${l%% *}
|
||||||
snapname=${l#* }
|
snapname=${l#* }
|
||||||
|
@ -24,7 +29,9 @@ done |sort -n | while read l ; do
|
||||||
break
|
break
|
||||||
fi
|
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"
|
zfs destroy "$snapname"
|
||||||
else
|
else
|
||||||
lasttime="$curtime"
|
lasttime="$curtime"
|
||||||
|
|
57
zb-pull
57
zb-pull
|
@ -1,2 +1,59 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [[ -z "$1" || -z "$2" || -z "$3" ]] ; then
|
||||||
|
echo "usage: $0 <ssh_remote> <remote_zfs_object> <local_zfs_object>" >&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
|
||||||
|
|
Loading…
Reference in a new issue