Statistiques
| Révision :

root / bin / zfs-replica @ 41

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

1
#!/bin/bash
2
# $Id: zfs-replica 41 2013-10-09 08:44:10Z kreverch $
3

    
4
#--- Define variables ---#
5
DIR_CONF_REPLICA="/opt/gZFS/replicas/"
6
getConfigSnapshotTool="/sbin/get-conf-snapshot"
7
zfsSnapshot="/sbin/zfs-snapshot"
8
FILE_NAME=$1
9

    
10
#********************************
11
#* function initenv
12
#*******************************
13
function initenv {
14
if [[ -z $FILE_NAME ]]
15
then
16
   echo "/!\\ Replica Configuration file missing /!\\" 1>&2
17
   exit 1
18
fi
19

    
20
if [ ! -f $1 ]
21
then
22
   echo "/!\\ Replica Configuration file missing /!\\" 1>&2
23
   exit 1
24
fi
25

    
26
if [ ! -e $FILE_NAME ]
27
then
28
   echo "Replica Configuration file not found" 1>&2
29
   exit 1;
30
fi
31
echo $FILE_NAME
32
lastsnapshotReplicated=$(cat $FILE_NAME|grep lastsnapshotreplicated|cut -d "=" -f2)
33
server=$(cat $FILE_NAME|grep server|cut -d "=" -f2)
34
nbreplica=$(cat $FILE_NAME|grep nbreplica|cut -d "=" -f2)
35
namereplica=$(cat $FILE_NAME|grep namereplica|cut -d "=" -f2)
36
namevolfs=$(cat $FILE_NAME|grep "name="|cut -d "=" -f2)
37

    
38
if [[ -z $namereplica ]] || [[ -z $nbreplica ]] || [[ -z $namevolfs ]]
39
then
40
   echo "Incoherence data in $FILE_NAME" 1>&2
41
   exit 1
42
fi
43

    
44
echo "$getConfigSnapshotTool $namevolfs"
45
getlistSnapshot=$($getConfigSnapshotTool $namevolfs)
46
if [[ "$getlistSnapshot" == "" ]]
47
then
48
  echo "Please, enable a snapshot configuration for $namevolfs" 1>&2
49
  exit 1
50
fi
51
}
52

    
53
#****************************************
54
#* function check server ssh connection
55
#***************************************
56
function checkServerConnection {
57

    
58
ssh -o BatchMode=yes root@$server ls
59

    
60
if [ "$?" != "0" ]
61
then
62
  echo "SSH Connection server $server failed, please check the private/public key" 1>&2
63
  exit 1
64
fi
65

    
66
}
67

    
68
function checkCoherence {
69
  ssh -o BatchMode=yes root@$server zfs list $namereplica
70
  if [ "$?" != "0" ]
71
  then
72
     return false
73
  fi
74

    
75
}
76

    
77
function del_old_snapshot {
78
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
79
if [[ "$server" == "" ]]
80
then
81
  echo ""
82
  CPT_SNAP=$(/sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
83
  echo "*** Le nombre de snapshot pour $namereplica est : $CPT_SNAP"
84
  /sbin/zfs list -t snapshot -r $namereplica
85

    
86
  if [ $CPT_SNAP -gt $nbreplica ]
87
  then
88
    echo "*** Detection du snapshot le plus ancien"
89
    for ID_SNAP_OLDER in $(/sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@)
90
    do
91
      echo "*** Le snapshot le plus ancien est : $ID_SNAP_OLDER"
92
      break
93
    done
94
    /sbin/zfs destroy $ID_SNAP_OLDER
95
    if [ $? -eq 0 ]
96
    then
97
       echo "*** Suppression du snapshot $ID_SNAP_OLDER [OK]"
98
    else
99
      echo "/!\\ Suppression du snapshot $ID_SNAP_OLDER [ERROR]."
100
    fi
101
  fi
102

    
103
else
104
  echo ""
105
  CPT_SNAP=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
106
  echo "*** Le nombre de snapshot pour $namereplica est : $CPT_SNAP"
107
  ssh -o BatchMode=yes root@$server /sbin/zfs list -t snapshot -r $namereplica
108

    
109
  if [ $CPT_SNAP -gt $nbreplica ]
110
  then
111
    echo "*** Detection du snapshot le plus ancien"
112
    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
    do
114
      echo "*** Le snapshot le plus ancien est : $ID_SNAP_OLDER"
115
      break
116
    done
117
    ssh -o BatchMode=yes root@$server /sbin/zfs destroy $ID_SNAP_OLDER
118
    if [ $? -eq 0 ]
119
    then
120
       echo "*** Suppression du snapshot $ID_SNAP_OLDER [OK]"
121
    else
122
      echo "/!\\ Suppression du snapshot $ID_SNAP_OLDER [ERROR]."
123
    fi
124
  fi
125

    
126
fi
127
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
128
}
129

    
130

    
131
#*************************************
132
#* function FULL REPLICATION
133
#*************************************
134
function fullreplication {
135

    
136
parentdataset=$(awk '{
137
              n = split($0, t, "/")
138
              for (i = 0; ++i <= n-1;)
139
                if (i == 1)
140
                  printf t[i]
141
                else
142
                  printf "/"t[i]
143
              }' <<< $(echo $namereplica))
144

    
145
if [[ "$server" == "" ]]
146
then
147

    
148
    /sbin/zfs list $parentdataset
149
    if [[ "?" != "0" ]]
150
    then
151
      /sbin/zfs create -p $parentdataset
152
    fi
153

    
154
    /sbin/zfs send $snapshot2replicate | /sbin/zfs recv $namereplica
155
    if [[ "$?" == "0" ]]
156
    then
157
       cpt=0
158
       while read line
159
       do 
160
         if [ $cpt -eq 0 ]
161
         then
162
            echo $line
163
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME)
164
            cpt=1
165
         else
166
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:astsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME)
167
         fi 
168
       done <<< "$(cat $FILE_NAME)"
169
       del_old_snapshot
170
    fi 
171
   
172
else
173
  checkServerConnection
174
  if [[ "$snapshot2replicate" != "" ]]
175
  then
176
    ssh -o BatchMode=yes root@$server /sbin/zfs list $parentdataset
177
    if [[ "?" != "0" ]]
178
    then
179
      ssh -o BatchMode=yes root@$server /sbin/zfs create -p $parentdataset
180
    fi
181

    
182
    /sbin/zfs send $snapshot2replicate |ssh -o BatchMode=yes root@$server /sbin/zfs recv $namereplica
183
    if [[ "$?" == "0" ]]
184
    then
185
       cpt=0
186
       while read line
187
       do 
188
         if [ $cpt -eq 0 ]
189
         then
190
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
191
            cpt=1
192
         else
193
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME
194
         fi
195
       done <<< "$(cat $FILE_NAME)"
196
       del_old_snapshot
197
    fi 
198
  fi
199
exit 0
200
fi
201

    
202
}
203

    
204

    
205

    
206
function incremental_replication {
207

    
208
echo "Start incremental replication"
209
if [[ "$server" == "" ]]
210
then
211
    cmd="zfs send -i $lastsnapshotReplicated $namevolfs@$lastsnaphot | ssh -o BatchMode=yes root@$server zfs recv $namereplica"
212
    echo $cmd
213
    if [[ "$?" == "0" ]]
214
    then
215
       cpt=0
216
       while read line
217
       do 
218
         if [ $cpt -eq 0 ]
219
         then
220
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
221
            cpt=1
222
         else
223
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
224
         fi
225
       done <<< "$(cat $FILE_NAME)"
226
       del_old_snapshot
227
    fi 
228
   
229
else
230
  checkServerConnection
231
if [ "$snaphot2replicate" == "" ]
232
then
233
   exit 1
234
else
235
    zfs send -i $lastsnapshotReplicated $namevolfs@$snaphot2replicate | ssh -o BatchMode=yes root@$server zfs recv $namereplica
236
    if [[ "$?" == "0" ]]
237
    then
238
       cpt=0
239
       while read line
240
       do 
241
         echo $line
242
         if [ $cpt -eq 0 ]
243
         then
244
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >$FILE_NAME
245
            cpt=1
246
         else
247
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >>$FILE_NAME
248
         fi
249
       done <<< "$(cat $FILE_NAME)"
250
       del_old_snapshot
251
    fi 
252
  fi
253
fi
254

    
255
}
256

    
257

    
258
#****************************************
259
#* NO INTERACTIVE MODE
260
#****************************************
261
function nointeractive {
262

    
263
#--- check and init env ---#
264
initenv
265

    
266
fileconf=$($getConfigSnapshotTool $namevolfs|grep fileconf|cut -d "=" -f2)
267
NBsnapshot=$(/sbin/zfs list -H -r -t snapshot $namevolfs|wc -l)
268

    
269
if [[ $NBsnapshot -eq 0 ]]
270
then
271
   echo "no snapshot, start snapshoting ..."  
272
   $zfsSnapshot $fileconf
273
fi
274

    
275
valchk=checkCoherence
276
if [[ "$valchk" == "false" ]] && [[ "$lastsnapshotReplicated" != "" ]]
277
then
278
   echo "Replication by incremental snapshot is not possible : checkcoherence return false "
279
   echo "Start FULL Replication ..."
280
   while read line
281
   do
282
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
283
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
284
   fullreplication
285
fi
286

    
287

    
288
#--- FULL REPLICATION ---#
289
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
290
then
291
   echo "Replication by incremental snapshot is not possible"
292
   echo "Start FULL Replication ..."
293
   while read line
294
   do 
295
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
296
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
297
   fullreplication
298
fi
299

    
300
#-- INCREMENTAL REPLICATION ---#
301
if [[ $NBsnapshot -gt 1 ]]
302
then
303
  cpt=1
304
  while read line
305
  do
306

    
307
    if [[ $cpt -eq 1 ]]
308
    then
309
       snaphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
310
       echo $lastsnaphot
311
       echo $snaphot2replicate
312
       break
313
    fi
314
    cpt=$cpt+1
315
  done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs|tac)"
316
  lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) 
317
 
318
  if [ "$snaphot2replicate" == "$lastsnapshot" ]
319
  then
320
     echo "Nothing to replicate" 1>&2
321
     exit 1
322
 
323
  fi
324
  check_lastsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
325
  check_currentsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $snaphot2replicate=|wc -l)
326
  if [[ $check_lastsnapshotReplica -eq 0 ]]
327
  then
328
     echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing" 1>&2
329
     exit 1
330
  fi
331
  
332
  if [[ $check_currentsnapshotReplica -eq 1 ]]
333
  then
334
    echo "No replica to do, $lastSnapshot already exists" 1>&2
335
    exit 1
336
  fi  
337
fi
338
 echo $snaphot2replicate
339
incremental_replication
340
}
341

    
342
nointeractive
343