Statistiques
| Révision :

root / bin / zfs-replica @ 12

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