Statistiques
| Révision :

root / bin / zfs-replica @ 27

Historique | Voir | Annoter | Télécharger (9,08 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 27 kreverch
                printf "/"t[i]
139 27 kreverch
              }' <<< $(echo $namereplica))
140 27 kreverch
141 1 kreverch
if [[ "$server" == "" ]]
142 1 kreverch
then
143 27 kreverch
144 27 kreverch
    /sbin/zfs list $parentdataset
145 27 kreverch
    if [[ "?" != "0" ]]
146 27 kreverch
    then
147 27 kreverch
      /sbin/zfs create -p $parentdataset
148 27 kreverch
    fi
149 27 kreverch
150 1 kreverch
    /sbin/zfs send $snapshot2replicate | /sbin/zfs recv $namereplica
151 1 kreverch
    if [[ "$?" == "0" ]]
152 1 kreverch
    then
153 1 kreverch
       cpt=0
154 1 kreverch
       while read line
155 1 kreverch
       do
156 1 kreverch
         if [ $cpt -eq 0 ]
157 1 kreverch
         then
158 1 kreverch
            echo $line
159 5 kreverch
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME)
160 1 kreverch
            cpt=1
161 1 kreverch
         else
162 5 kreverch
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:astsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME)
163 1 kreverch
         fi
164 1 kreverch
       done <<< "$(cat $FILE_NAME)"
165 1 kreverch
       del_old_snapshot
166 1 kreverch
    fi
167 1 kreverch
168 1 kreverch
else
169 1 kreverch
  checkServerConnection
170 1 kreverch
  if [[ "$snapshot2replicate" != "" ]]
171 1 kreverch
  then
172 27 kreverch
    ssh -o BatchMode=yes root@$server /sbin/zfs list $parentdataset
173 27 kreverch
    if [[ "?" != "0" ]]
174 27 kreverch
    then
175 27 kreverch
      ssh -o BatchMode=yes root@$server /sbin/zfs create -p $parentdataset
176 27 kreverch
    fi
177 27 kreverch
178 9 kreverch
    /sbin/zfs send $snapshot2replicate |ssh -o BatchMode=yes root@$server /sbin/zfs recv $namereplica
179 1 kreverch
    if [[ "$?" == "0" ]]
180 1 kreverch
    then
181 1 kreverch
       cpt=0
182 1 kreverch
       while read line
183 1 kreverch
       do
184 1 kreverch
         if [ $cpt -eq 0 ]
185 1 kreverch
         then
186 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
187 1 kreverch
            cpt=1
188 1 kreverch
         else
189 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME
190 1 kreverch
         fi
191 1 kreverch
       done <<< "$(cat $FILE_NAME)"
192 1 kreverch
       del_old_snapshot
193 1 kreverch
    fi
194 1 kreverch
  fi
195 1 kreverch
exit 0
196 1 kreverch
fi
197 1 kreverch
198 1 kreverch
}
199 1 kreverch
200 1 kreverch
201 1 kreverch
202 1 kreverch
function incremental_replication {
203 1 kreverch
204 1 kreverch
echo "Start incremental replication"
205 1 kreverch
if [[ "$server" == "" ]]
206 1 kreverch
then
207 9 kreverch
    cmd="zfs send -i $lastsnapshotReplicated $namevolfs@$lastsnaphot | ssh -o BatchMode=yes root@$server zfs recv $namereplica"
208 1 kreverch
    echo $cmd
209 1 kreverch
    if [[ "$?" == "0" ]]
210 1 kreverch
    then
211 1 kreverch
       cpt=0
212 1 kreverch
       while read line
213 1 kreverch
       do
214 1 kreverch
         if [ $cpt -eq 0 ]
215 1 kreverch
         then
216 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
217 1 kreverch
            cpt=1
218 1 kreverch
         else
219 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
220 1 kreverch
         fi
221 1 kreverch
       done <<< "$(cat $FILE_NAME)"
222 1 kreverch
       del_old_snapshot
223 1 kreverch
    fi
224 1 kreverch
225 1 kreverch
else
226 1 kreverch
  checkServerConnection
227 1 kreverch
if [ "$snaphot2replicate" == "" ]
228 1 kreverch
then
229 1 kreverch
   exit 1
230 1 kreverch
else
231 9 kreverch
    zfs send -i $lastsnapshotReplicated $namevolfs@$snaphot2replicate | ssh -o BatchMode=yes root@$server zfs recv $namereplica
232 1 kreverch
    if [[ "$?" == "0" ]]
233 1 kreverch
    then
234 1 kreverch
       cpt=0
235 1 kreverch
       while read line
236 1 kreverch
       do
237 1 kreverch
         echo $line
238 1 kreverch
         if [ $cpt -eq 0 ]
239 1 kreverch
         then
240 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >$FILE_NAME
241 1 kreverch
            cpt=1
242 1 kreverch
         else
243 5 kreverch
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >>$FILE_NAME
244 1 kreverch
         fi
245 1 kreverch
       done <<< "$(cat $FILE_NAME)"
246 1 kreverch
       del_old_snapshot
247 1 kreverch
    fi
248 1 kreverch
  fi
249 1 kreverch
fi
250 1 kreverch
251 1 kreverch
}
252 1 kreverch
253 1 kreverch
254 1 kreverch
#****************************************
255 1 kreverch
#* NO INTERACTIVE MODE
256 1 kreverch
#****************************************
257 1 kreverch
function nointeractive {
258 1 kreverch
259 1 kreverch
#--- check and init env ---#
260 1 kreverch
initenv
261 1 kreverch
262 1 kreverch
fileconf=$($getConfigSnapshotTool $namevolfs|grep fileconf|cut -d "=" -f2)
263 1 kreverch
NBsnapshot=$(/sbin/zfs list -H -r -t snapshot $namevolfs|wc -l)
264 1 kreverch
265 1 kreverch
if [[ $NBsnapshot -eq 0 ]]
266 1 kreverch
then
267 1 kreverch
   echo "no snapshot, start snapshoting ..."
268 1 kreverch
   echo "$zfsSnapshot $fileconf"
269 1 kreverch
fi
270 1 kreverch
271 12 kreverch
valchk=checkCoherence
272 12 kreverch
if [[ "$valchk" == "false" ]] || [[ "$lastsnapshotReplicated" != "" ]]
273 12 kreverch
then
274 12 kreverch
   echo "Replication by incremental snapshot is not possible"
275 12 kreverch
   echo "Start FULL Replication ..."
276 12 kreverch
   while read line
277 12 kreverch
   do
278 12 kreverch
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
279 12 kreverch
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
280 12 kreverch
   fullreplication
281 12 kreverch
fi
282 12 kreverch
283 12 kreverch
284 1 kreverch
#--- FULL REPLICATION ---#
285 1 kreverch
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
286 1 kreverch
then
287 1 kreverch
   echo "Replication by incremental snapshot is not possible"
288 1 kreverch
   echo "Start FULL Replication ..."
289 1 kreverch
   while read line
290 1 kreverch
   do
291 1 kreverch
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
292 1 kreverch
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
293 1 kreverch
   fullreplication
294 1 kreverch
fi
295 1 kreverch
296 1 kreverch
#-- INCREMENTAL REPLICATION ---#
297 1 kreverch
if [[ $NBsnapshot -gt 1 ]]
298 1 kreverch
then
299 1 kreverch
  cpt=1
300 1 kreverch
  while read line
301 1 kreverch
  do
302 1 kreverch
303 1 kreverch
    if [[ $cpt -eq 1 ]]
304 1 kreverch
    then
305 1 kreverch
       snaphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
306 1 kreverch
       echo $lastsnaphot
307 1 kreverch
       echo $snaphot2replicate
308 1 kreverch
       break
309 1 kreverch
    fi
310 1 kreverch
    cpt=$cpt+1
311 1 kreverch
  done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs|tac)"
312 1 kreverch
  lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
313 1 kreverch
314 1 kreverch
  if [ "$snaphot2replicate" == "$lastsnapshot" ]
315 1 kreverch
  then
316 11 kreverch
     echo "Nothing to replicate" 1>&2
317 1 kreverch
     exit 1
318 1 kreverch
319 1 kreverch
  fi
320 9 kreverch
  check_lastsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
321 9 kreverch
  check_currentsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $snaphot2replicate=|wc -l)
322 1 kreverch
  if [[ $check_lastsnapshotReplica -eq 0 ]]
323 1 kreverch
  then
324 11 kreverch
     echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing" 1>&2
325 1 kreverch
     exit 1
326 1 kreverch
  fi
327 1 kreverch
328 1 kreverch
  if [[ $check_currentsnapshotReplica -eq 1 ]]
329 1 kreverch
  then
330 11 kreverch
    echo "No replica to do, $lastSnapshot already exists" 1>&2
331 1 kreverch
    exit 1
332 1 kreverch
  fi
333 1 kreverch
fi
334 1 kreverch
 echo $snaphot2replicate
335 1 kreverch
incremental_replication
336 1 kreverch
}
337 1 kreverch
338 1 kreverch
nointeractive