-
Notifications
You must be signed in to change notification settings - Fork 1
/
zfs-sync-xz-pull
79 lines (65 loc) · 2.37 KB
/
zfs-sync-xz-pull
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/sh
if [ -z "${4}" ]; then
echo "Usage: $0 dataset remote_server:remote_port pool output_folder"
exit 1
fi
#DRYRUN="-n"
DATASET="${1}"
if [ "x-" = "x${2}" ]; then
REMOTE_CONNECTION=""
else
if echo "${2}" | grep ':' >/dev/null 2>&1 ; then
REMOTE_HOST=$( echo "${2}" | cut -f1 -d: )
REMOTE_PORT=$( echo "${2}" | cut -f2 -d: )
else
REMOTE_HOST="${2}"
REMOTE_PORT=22
fi
REMOTE_CONNECTION="ssh -p ${REMOTE_PORT} ${REMOTE_HOST}"
fi
RECVPOOL="${3}"
OUTPUTDIR="${4}"
# pattern to find when using rsync
SAFENAME=$( echo $DATASET | tr -c '[:alnum:]' _ )
if [ ! -d /${DATASET}/.zfs/snapshot/ ]; then
echo "ERROR: ${DATASET} not mounted."
if [ -e /usr/local/www/data/.snapshot.${SAFENAME}.json ]; then
rm /usr/local/www/data/.snapshot.${SAFENAME}.json
stat-json-urep
fi
exit 1
fi
# ALGORITHM: local_last_snapshot
STARTAT=$( ls /${DATASET}/.zfs/snapshot/ | tail -1 )
# ALGORITHM: ssh remote remote_last_snapshot
ENDAT=$( $REMOTE_CONNECTION "ls /${DATASET}/.zfs/snapshot/" | grep -A999 ${STARTAT} | tail -1 )
if [ -e /usr/local/www/data ]; then
cat >/usr/local/www/data/.snapshot.${SAFENAME}.json <<EOF
{"name":"${DATASET}","local":"${STARTAT}","remote":"${ENDAT}"},
EOF
stat-json-urep
fi
if [ "$STARTAT" = "$ENDAT" ]; then
echo "local $STARTAT = remote $ENDAT"
else
# ALGORITHM: if file exists in output dir, then we weren't done rsync and import, skip the multi-export
if ! ls ${OUTPUTDIR} | grep "${SAFENAME}" >/dev/null 2>&1 ; then
# ALGORITHM: ssh remote zfs-xz-multi-export local_last_snapshot to remote_last_snapshot
# limit to 5 so we don't run out of room
$REMOTE_CONNECTION "zfs-xz-multi-export ${DATASET}@${STARTAT} ${OUTPUTDIR} 5"
fi
# ALGORITHM: zfs-xz-rsync-pull
zfs-xz-rsync-pull ${2} ${OUTPUTDIR} ${SAFENAME}
# ALGORITHM: zfs-xz-multi-import /scratch/urep tank
echo "zfs rollback ${DATASET}@${STARTAT}"
zfs rollback ${DATASET}@${STARTAT}
echo "zfs-xz-multi-import ${OUTPUTDIR} ${RECVPOOL} ${SAFENAME}"
zfs-xz-multi-import ${OUTPUTDIR} ${RECVPOOL} ${SAFENAME}
fi
if [ -e /usr/local/www/data ]; then
STARTAT=$( ls /${DATASET}/.zfs/snapshot/ | tail -1 )
cat >/usr/local/www/data/.snapshot.${SAFENAME}.json <<EOF
{"name":"${DATASET}","local":"${STARTAT}","remote":"${ENDAT}"},
EOF
stat-json-urep
fi