54 lines
990 B
Plaintext
54 lines
990 B
Plaintext
|
#!/bin/sh
|
||
|
#
|
||
|
# BTRFS delta snapshots with incomplete send handling
|
||
|
# CC0 ~caskd
|
||
|
|
||
|
: ${SRC:?'Source not defined'}
|
||
|
: ${SNAPDIR:?'Snapdir not defined'}
|
||
|
: ${DEST:?'Destination not defined'}
|
||
|
|
||
|
CDATE="$(date '+%s')"
|
||
|
SNAPSRC="$SRC"
|
||
|
SNAPPATH="$SNAPSRC/$SNAPDIR"
|
||
|
PREV="$SRC/prev"
|
||
|
CUR="$SRC/cur"
|
||
|
TMP="$SRC/tmp"
|
||
|
SNAPDEST="$SNAPPATH/$CDATE"
|
||
|
|
||
|
msg() {
|
||
|
echo "$1" >&2
|
||
|
}
|
||
|
|
||
|
delta() {
|
||
|
[ -d "$(realpath "$CUR")" ] || return 1
|
||
|
msg "Attempting to send delta"
|
||
|
btrfs -v send --compressed-data -p "$CUR" "$TMP" | btrfs -v receive "$DEST"
|
||
|
}
|
||
|
|
||
|
full() {
|
||
|
msg "Attempting to send full"
|
||
|
btrfs -v send --compressed-data "$TMP" | btrfs -v receive "$DEST"
|
||
|
}
|
||
|
|
||
|
symdel() {
|
||
|
if [ -L "$1" ]; then
|
||
|
btrfs subvolume delete "$1" >&2 || true
|
||
|
rm -v "$1" >&2
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
mkdir -vp "$SNAPPATH" >&2
|
||
|
|
||
|
symdel "$TMP"
|
||
|
symdel "$PREV"
|
||
|
|
||
|
ln -sv "$CDATE" "$TMP" >&2
|
||
|
btrfs subvolume snapshot -r "$SNAPSRC" "$SNAPDEST" >&2
|
||
|
|
||
|
delta || full
|
||
|
|
||
|
# Mark snapshot transmission as complete
|
||
|
[ -L "$CUR" ] && \
|
||
|
mv -v "$CUR" "$PREV" >&2
|
||
|
mv -v "$TMP" "$CUR" >&2
|