Statistiques
| Révision :

root / bin / zfs-replica @ 58

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