root / bin / zfs-replica @ 58
Historique | Voir | Annoter | Télécharger (9,29 ko)
1 |
#!/bin/bash |
---|---|
2 |
# $Id: zfs-replica 58 2013-10-12 05:53:03Z kreverch $ |
3 |
# Copyright (C) 2013 Kevin Reverchon, Loïs Taulelle |
4 |
# This file/program is part of gZFS free software |
5 |
# See COPYING file for details |
6 |
# |
7 |
|
8 |
#--- Define variables ---# |
9 |
DIR_CONF_REPLICA="/opt/gZFS/replicas/" |
10 |
getConfigSnapshotTool="/sbin/get-conf-snapshot" |
11 |
zfsSnapshot="/sbin/zfs-snapshot" |
12 |
FILE_NAME=$1 |
13 |
BINZFS="/sbin/zfs" |
14 |
BINZPOOL="/sbin/zpool" |
15 |
|
16 |
#******************************** |
17 |
#* function initenv |
18 |
#******************************* |
19 |
function initenv { |
20 |
if [[ -z $FILE_NAME ]] |
21 |
then |
22 |
echo "/!\\ Replica Configuration file missing /!\\" 1>&2 |
23 |
exit 1 |
24 |
fi |
25 |
|
26 |
if [ ! -f $1 ] |
27 |
then |
28 |
echo "/!\\ Replica Configuration file missing /!\\" 1>&2 |
29 |
exit 1 |
30 |
fi |
31 |
|
32 |
if [ ! -e $FILE_NAME ] |
33 |
then |
34 |
echo "Replica Configuration file not found" 1>&2 |
35 |
exit 1; |
36 |
fi |
37 |
echo $FILE_NAME |
38 |
lastsnapshotReplicated=$(cat $FILE_NAME|grep lastsnapshotreplicated|cut -d "=" -f2) |
39 |
server=$(cat $FILE_NAME|grep server|cut -d "=" -f2) |
40 |
nbreplica=$(cat $FILE_NAME|grep nbreplica|cut -d "=" -f2) |
41 |
namereplica=$(cat $FILE_NAME|grep namereplica|cut -d "=" -f2) |
42 |
namevolfs=$(cat $FILE_NAME|grep "name="|cut -d "=" -f2) |
43 |
|
44 |
if [[ -z $namereplica ]] || [[ -z $nbreplica ]] || [[ -z $namevolfs ]] |
45 |
then |
46 |
echo "Incoherence data in $FILE_NAME" 1>&2 |
47 |
exit 1 |
48 |
fi |
49 |
|
50 |
echo "$getConfigSnapshotTool $namevolfs" |
51 |
getlistSnapshot=$($getConfigSnapshotTool $namevolfs) |
52 |
if [[ "$getlistSnapshot" == "" ]] |
53 |
then |
54 |
echo "Please, enable a snapshot configuration for $namevolfs" 1>&2 |
55 |
exit 1 |
56 |
fi |
57 |
} |
58 |
|
59 |
#**************************************** |
60 |
#* function check server ssh connection |
61 |
#*************************************** |
62 |
function checkServerConnection { |
63 |
|
64 |
ssh -o BatchMode=yes root@$server ls |
65 |
|
66 |
if [ "$?" != "0" ] |
67 |
then |
68 |
echo "SSH Connection server $server failed, please check the private/public key" 1>&2 |
69 |
exit 1 |
70 |
fi |
71 |
|
72 |
} |
73 |
|
74 |
function checkCoherence { |
75 |
ssh -o BatchMode=yes root@$server $BINZFS list $namereplica |
76 |
if [ "$?" != "0" ] |
77 |
then |
78 |
return false |
79 |
fi |
80 |
|
81 |
} |
82 |
|
83 |
function del_old_snapshot { |
84 |
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***# |
85 |
if [[ "$server" == "" ]] |
86 |
then |
87 |
echo "" |
88 |
CPT_SNAP=$($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l) |
89 |
echo "*** Number of snapshots for $namereplica is : $CPT_SNAP" |
90 |
$BINZFS list -t snapshot -r $namereplica |
91 |
|
92 |
if [ $CPT_SNAP -gt $nbreplica ] |
93 |
then |
94 |
echo "*** Detection of the oldest snapshot" |
95 |
for ID_SNAP_OLDER in $($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@) |
96 |
do |
97 |
echo "*** The oldest snapshot is : $ID_SNAP_OLDER" |
98 |
break |
99 |
done |
100 |
$BINZFS destroy $ID_SNAP_OLDER |
101 |
if [ $? -eq 0 ] |
102 |
then |
103 |
echo "*** Remove the snapshot $ID_SNAP_OLDER [OK]" |
104 |
else |
105 |
echo "/!\\ Remove the snapshot $ID_SNAP_OLDER [ERROR]." |
106 |
fi |
107 |
fi |
108 |
|
109 |
else |
110 |
echo "" |
111 |
CPT_SNAP=$(ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l) |
112 |
echo "*** Number of snapshots for $namereplica is : $CPT_SNAP" |
113 |
ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |
114 |
|
115 |
if [ $CPT_SNAP -gt $nbreplica ] |
116 |
then |
117 |
echo "*** Detection of the oldest snapshot" |
118 |
for ID_SNAP_OLDER in $(ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@) |
119 |
do |
120 |
echo "*** The oldest snapshot is : $ID_SNAP_OLDER" |
121 |
break |
122 |
done |
123 |
ssh -o BatchMode=yes root@$server $BINZFS destroy $ID_SNAP_OLDER |
124 |
if [ $? -eq 0 ] |
125 |
then |
126 |
echo "*** Remove the snapshot $ID_SNAP_OLDER [OK]" |
127 |
else |
128 |
echo "/!\\ Remove the snapshot $ID_SNAP_OLDER [ERROR]." |
129 |
fi |
130 |
fi |
131 |
|
132 |
fi |
133 |
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***# |
134 |
} |
135 |
|
136 |
|
137 |
#************************************* |
138 |
#* function FULL REPLICATION |
139 |
#************************************* |
140 |
function fullreplication { |
141 |
|
142 |
parentdataset=$(awk '{ |
143 |
n = split($0, t, "/") |
144 |
for (i = 0; ++i <= n-1;) |
145 |
if (i == 1) |
146 |
printf t[i] |
147 |
else |
148 |
printf "/"t[i] |
149 |
}' <<< $(echo $namereplica)) |
150 |
|
151 |
if [[ "$server" == "" ]] |
152 |
then |
153 |
|
154 |
$BINZFS list $parentdataset |
155 |
if [[ "?" != "0" ]] |
156 |
then |
157 |
$BINZFS create -p $parentdataset |
158 |
fi |
159 |
|
160 |
$BINZFS send $snapshot2replicate | $BINZFS recv $namereplica |
161 |
if [[ "$?" == "0" ]] |
162 |
then |
163 |
cpt=0 |
164 |
while read line |
165 |
do |
166 |
if [ $cpt -eq 0 ] |
167 |
then |
168 |
echo $line |
169 |
$(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME) |
170 |
cpt=1 |
171 |
else |
172 |
$(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME) |
173 |
fi |
174 |
done <<< "$(cat $FILE_NAME)" |
175 |
del_old_snapshot |
176 |
fi |
177 |
|
178 |
else |
179 |
checkServerConnection |
180 |
if [[ "$snapshot2replicate" != "" ]] |
181 |
then |
182 |
ssh -o BatchMode=yes root@$server $BINZFS list $parentdataset |
183 |
if [[ "?" != "0" ]] |
184 |
then |
185 |
ssh -o BatchMode=yes root@$server $BINZFS create -p $parentdataset |
186 |
fi |
187 |
|
188 |
$BINZFS send $snapshot2replicate |ssh -o BatchMode=yes root@$server $BINZFS recv $namereplica |
189 |
if [[ "$?" == "0" ]] |
190 |
then |
191 |
cpt=0 |
192 |
while read line |
193 |
do |
194 |
if [ $cpt -eq 0 ] |
195 |
then |
196 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME |
197 |
cpt=1 |
198 |
else |
199 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME |
200 |
fi |
201 |
done <<< "$(cat $FILE_NAME)" |
202 |
del_old_snapshot |
203 |
fi |
204 |
fi |
205 |
exit 0 |
206 |
fi |
207 |
|
208 |
} |
209 |
|
210 |
|
211 |
|
212 |
function incremental_replication { |
213 |
|
214 |
echo "Start incremental replication" |
215 |
if [[ "$server" == "" ]] |
216 |
then |
217 |
cmd="$BINZFS send -i $lastsnapshotReplicated $namevolfs@$lastsnaphot | ssh -o BatchMode=yes root@$server $BINZFS recv $namereplica" |
218 |
echo $cmd |
219 |
if [[ "$?" == "0" ]] |
220 |
then |
221 |
cpt=0 |
222 |
while read line |
223 |
do |
224 |
if [ $cpt -eq 0 ] |
225 |
then |
226 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME |
227 |
cpt=1 |
228 |
else |
229 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME |
230 |
fi |
231 |
done <<< "$(cat $FILE_NAME)" |
232 |
del_old_snapshot |
233 |
fi |
234 |
|
235 |
else |
236 |
checkServerConnection |
237 |
if [ "$snaphot2replicate" == "" ] |
238 |
then |
239 |
exit 1 |
240 |
else |
241 |
$BINZFS send -i $lastsnapshotReplicated $namevolfs@$snaphot2replicate | ssh -o BatchMode=yes root@$server $BINZFS recv $namereplica |
242 |
if [[ "$?" == "0" ]] |
243 |
then |
244 |
cpt=0 |
245 |
while read line |
246 |
do |
247 |
echo $line |
248 |
if [ $cpt -eq 0 ] |
249 |
then |
250 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >$FILE_NAME |
251 |
cpt=1 |
252 |
else |
253 |
echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >>$FILE_NAME |
254 |
fi |
255 |
done <<< "$(cat $FILE_NAME)" |
256 |
del_old_snapshot |
257 |
fi |
258 |
fi |
259 |
fi |
260 |
|
261 |
} |
262 |
|
263 |
|
264 |
#**************************************** |
265 |
#* NO INTERACTIVE MODE |
266 |
#**************************************** |
267 |
function nointeractive { |
268 |
|
269 |
#--- check and init env ---# |
270 |
initenv |
271 |
|
272 |
fileconf=$($getConfigSnapshotTool $namevolfs|grep fileconf|cut -d "=" -f2) |
273 |
NBsnapshot=$($BINZFS list -H -r -t snapshot $namevolfs|wc -l) |
274 |
|
275 |
if [[ $NBsnapshot -eq 0 ]] |
276 |
then |
277 |
echo "no snapshot, start snapshoting ..." |
278 |
$zfsSnapshot $fileconf |
279 |
fi |
280 |
|
281 |
valchk=checkCoherence |
282 |
if [[ "$valchk" == "false" ]] && [[ "$lastsnapshotReplicated" != "" ]] |
283 |
then |
284 |
echo "Replication by incremental snapshot is not possible : checkcoherence return false " |
285 |
echo "Start FULL Replication ..." |
286 |
while read line |
287 |
do |
288 |
snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1) |
289 |
done <<< "$($BINZFS list -H -r -t snapshot $namevolfs)" |
290 |
fullreplication |
291 |
fi |
292 |
|
293 |
|
294 |
#--- FULL REPLICATION ---# |
295 |
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]] |
296 |
then |
297 |
echo "Replication by incremental snapshot is not possible" |
298 |
echo "Start FULL Replication ..." |
299 |
while read line |
300 |
do |
301 |
snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1) |
302 |
done <<< "$($BINZFS list -H -r -t snapshot $namevolfs)" |
303 |
fullreplication |
304 |
fi |
305 |
|
306 |
#-- INCREMENTAL REPLICATION ---# |
307 |
if [[ $NBsnapshot -gt 1 ]] |
308 |
then |
309 |
cpt=1 |
310 |
while read line |
311 |
do |
312 |
|
313 |
if [[ $cpt -eq 1 ]] |
314 |
then |
315 |
snaphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) |
316 |
echo $lastsnaphot |
317 |
echo $snaphot2replicate |
318 |
break |
319 |
fi |
320 |
cpt=$cpt+1 |
321 |
done <<< "$($BINZFS list -H -r -t snapshot $namevolfs|tac)" |
322 |
lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) |
323 |
|
324 |
if [ "$snaphot2replicate" == "$lastsnapshot" ] |
325 |
then |
326 |
echo "Nothing to replicate" 1>&2 |
327 |
exit 1 |
328 |
|
329 |
fi |
330 |
check_lastsnapshotReplica=$(ssh -o BatchMode=yes root@$server $BINZFS list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l) |
331 |
check_currentsnapshotReplica=$(ssh -o BatchMode=yes root@$server $BINZFS list -H -r -t snapshot $namereplica |grep $snaphot2replicate=|wc -l) |
332 |
if [[ $check_lastsnapshotReplica -eq 0 ]] |
333 |
then |
334 |
echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing" 1>&2 |
335 |
exit 1 |
336 |
fi |
337 |
|
338 |
if [[ $check_currentsnapshotReplica -eq 1 ]] |
339 |
then |
340 |
echo "No replica to do, $lastSnapshot already exists" 1>&2 |
341 |
exit 1 |
342 |
fi |
343 |
fi |
344 |
echo $snaphot2replicate |
345 |
incremental_replication |
346 |
} |
347 |
|
348 |
nointeractive |
349 |
|