Statistiques
| Révision :

root / bin / zfs-replica @ 31

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

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