Statistiques
| Révision :

root / bin / zfs-replica @ 41

Historique | Voir | Annoter | Télécharger (9,19 ko)

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