Statistiques
| Révision :

root / bin / zfs-replica @ 39

Historique | Voir | Annoter | Télécharger (9,16 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 12 kreverch
if [[ "$valchk" == "false" ]] || [[ "$lastsnapshotReplicated" != "" ]]
277 12 kreverch
then
278 12 kreverch
   echo "Replication by incremental snapshot is not possible"
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