Statistiques
| Révision :

root / bin / zfs-replica @ 65

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