Statistiques
| Révision :

root / bin / zfs-replica @ 66

Historique | Voir | Annoter | Télécharger (10,15 ko)

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