snaprep

git mirror of https://ccx.te2000.cz/bzr/snaprep
git clone https://ccx.te2000.cz/git/snaprep
Log | Files | Refs

commit 8d8ce8e508960ef554947fb1fa71618667b4e386
parent f19fb2a9e112392ea14e3e51f5cdf38fd32d331c
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Tue, 18 Feb 2014 11:33:38 +0100

support local snapshot directories
Diffstat:
Mpost | 16+---------------
Mpre | 10----------
Msnap.push.single | 36++++++++++++++++++++++++++++++++----
Msnapshot.lvm2 | 3+++
4 files changed, 36 insertions(+), 29 deletions(-)

diff --git a/post b/post @@ -2,12 +2,6 @@ exec 1>&2 env | grep RSYNC -# for n in $(seq 5); do -# print $n... -# sleep 1 -# done -# print 'Done!' - set -x [[ $RSYNC_MODULE_NAME != 'snaprep_new' ]] && exit 0 @@ -23,15 +17,7 @@ else if [[ -a $d/.snapshot.$ts ]]; then rm -rf $f || exit $? else - rsync -a --exclude=/.snapshot.\* --link-dest=$RSYNC_MODULE_PATH/ $RSYNC_MODULE_PATH/ $d/$ts/ || exit $? + rsync -aA --exclude=/.snapshot.\* --link-dest=$RSYNC_MODULE_PATH/ $RSYNC_MODULE_PATH/ $d/$ts/ || exit $? mv $f $d/ || exit $? fi fi - -#marks=( $RSYNC_MODULE_PATH/.snapshot.[1-9]*(N) ) -#if (($#marks)); then -# mark=$marks[1] -# dst=${RSYNC_MODULE_PATH:h}/${mark##*.snapshot.} -# [[ -e $dst ]] && exit 1 -# mv -v $RSYNC_MODULE_PATH $dst -#fi diff --git a/pre b/pre @@ -7,13 +7,3 @@ set -x f=( $RSYNC_MODULE_PATH/.snapshot.[0-9]*(N) ) if (($#f)); then $0:h/post; fi - -#if ! [[ -d $RSYNC_MODULE_PATH ]]; then -# snapshots=( ${RSYNC_MODULE_PATH:h}/[1-9]*(N) ) -# if (($#snapshots)); then -# src=$snapshots[-1] -# rsync -a --exclude=/.snapshot.\* --link-dest=$src $src/ $RSYNC_MODULE_PATH/ || exit $? -# else -# mkdir -p $RSYNC_MODULE_PATH/ || exit $? -# fi -#fi diff --git a/snap.push.single b/snap.push.single @@ -1,5 +1,33 @@ #!/bin/zsh -src=$1;shift -dst=$1;shift -rsync -a --delete "$@" --exclude=/.snapshot.\* $src/ $dst/ && \ -rsync -a --delete "$@" $src/ $dst/ +die() { + print -r - "$@" + exit 1 +} + +if [[ -z $SNAP_SRC ]]; then + SNAP_SRC=$1;shift +fi +if [[ -z $SNAP_DST ]]; then + SNAP_DST=$1;shift +fi + +marks=( $SNAP_SRC/.snapshot.[0-9]*(N) ) +(( $#marks != 1 )) && die invalid marks ${(qqq)marks} + +if [[ $SNAP_DST == *:* ]]; then + # remote + rsync -aA --delete "$@" --exclude=/.snapshot.\* $SNAP_SRC/ $SNAP_DST/ && \ + rsync -aA --delete "$@" $SNAP_SRC/ $SNAP_DST/ +else + # local + [[ -d $SNAP_DST ]] || die destination not a directory: ${(qqq)SNAP_DST} + ts=${f##*.} + snapshots=( ${SNAP_DST}/.snapshot.[1-9]*(N) ) + if (($#snapshots)); then + link=${SNAP_DST}/${${snapshots[-1]}##*.} + rsync -aA --link-dest=$link "$@" $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? + else + rsync -aA "$@" $SNAP_SRC/ $SNAP_DST/$ts/ || exit $? + fi + touch ${SNAP_DST}/$marks:t +fi diff --git a/snapshot.lvm2 b/snapshot.lvm2 @@ -30,6 +30,9 @@ die_lvremove() { exit $? } mount "$S_DEV" "$SNAPSHOT" || die_lvremove $? +SNAP_SRC=$SNAPSHOT +export SNAP_SRC +touch $SNAP_SRC/.snapshot.$(date +%s) "$@" RETCODE=$? umount "$SNAPSHOT"