Statistiques
| Révision :

root / bin / zfs-replica @ 66

Historique | Voir | Annoter | Télécharger (10,15 ko)

1
#!/bin/bash
2
# $Id: zfs-replica 66 2013-11-19 11:06:38Z ltaulell $
3
# Copyright (C) 2013 Kevin Reverchon, Loïs Taulelle
4
# This file/program is part of gZFS free software
5
# See COPYING file for details
6
#
7

    
8
#--- Define variables ---#
9
DIR_CONF_REPLICA="/opt/gZFS/replicas/"
10
getConfigSnapshotTool="/sbin/get-conf-snapshot"
11
zfsSnapshot="/sbin/zfs-snapshot"
12
FILE_NAME=$1
13
TEMP_FILE_NAME="$1-tmp"
14
>$TEMP_FILE_NAME
15
BINZFS="/sbin/zfs"
16
BINZPOOL="/sbin/zpool"
17
BINMBUFFER="mbuffer -4 -v 0 -q -s 128k -m 1G"
18
LOCALHOST=$(hostname -s)
19

    
20
#********************************
21
#* function initenv
22
#*******************************
23
function initenv {
24
if [[ -z $FILE_NAME ]]
25
then
26
   echo "/!\\ Replica Configuration file missing /!\\" 1>&2
27
   exit 1
28
fi
29

    
30
if [ ! -f $1 ]
31
then
32
   echo "/!\\ Replica Configuration file missing /!\\" 1>&2
33
   exit 1
34
fi
35

    
36
if [ ! -e $FILE_NAME ]
37
then
38
   echo "Replica Configuration file not found" 1>&2
39
   exit 1;
40
fi
41
echo $FILE_NAME
42
lastsnapshotReplicated=$(cat $FILE_NAME|grep lastsnapshotreplicated|cut -d "=" -f2)
43
server=$(cat $FILE_NAME|grep server|cut -d "=" -f2)
44
nbreplica=$(cat $FILE_NAME|grep nbreplica|cut -d "=" -f2)
45
namereplica=$(cat $FILE_NAME|grep namereplica|cut -d "=" -f2)
46
namevolfs=$(cat $FILE_NAME|grep "name="|cut -d "=" -f2)
47

    
48
if [[ -z $namereplica ]] || [[ -z $nbreplica ]] || [[ -z $namevolfs ]]
49
then
50
   echo "Incoherence data in $FILE_NAME" 1>&2
51
   exit 1
52
fi
53

    
54
echo "$getConfigSnapshotTool $namevolfs"
55
getlistSnapshot=$($getConfigSnapshotTool $namevolfs)
56
if [[ "$getlistSnapshot" == "" ]]
57
then
58
  echo "Please, enable a snapshot configuration for $namevolfs" 1>&2
59
  exit 1
60
fi
61
}
62

    
63
#****************************************
64
#* function check server ssh connection
65
#***************************************
66
function checkServerConnection {
67

    
68
ssh -o BatchMode=yes root@$server ls
69

    
70
if [ "$?" != "0" ]
71
then
72
  echo "SSH Connection server $server failed, please check the private/public key" 1>&2
73
  exit 1
74
fi
75

    
76
}
77

    
78
function computePort {
79
# add a number, based on replica name, to mbuffer base port.
80
# This try to avoid problems, on multiple replicas cases, such as reception of 
81
# different replicas on same mbuffer port: yeah, epic fail!
82
  BasePORT="1030"
83
  #for i in $(echo $snapshot2replicate| od -An -t u1); do j=$(($j+$i)); echo $j; done
84
  SumChar=0
85
  BaseChars=$(echo $snapshot2replicate | od -An -t u1)
86
  for i in $BaseChars
87
  do
88
    SumChar=$(($SumChar+$i))
89
  done
90
  PORT=$(($BasePORT+$SumChar))
91
}
92

    
93

    
94
function checkCoherence {
95
  ssh -o BatchMode=yes root@$server $BINZFS list $namereplica
96
  if [ "$?" != "0" ]
97
  then
98
     return false
99
  fi
100

    
101
}
102

    
103
function del_old_snapshot {
104
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
105
if [[ "$server" == "" ]]
106
then
107
  echo ""
108
  CPT_SNAP=$($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
109
  echo "*** Number of snapshots for $namereplica is : $CPT_SNAP"
110
  $BINZFS list -t snapshot -r $namereplica
111

    
112
  if [ $CPT_SNAP -gt $nbreplica ]
113
  then
114
    echo "*** Detection of the oldest snapshot"
115
    for ID_SNAP_OLDER in $($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@)
116
    do
117
      echo "*** The oldest snapshot is : $ID_SNAP_OLDER"
118
      break
119
    done
120
    $BINZFS destroy $ID_SNAP_OLDER
121
    if [ $? -eq 0 ]
122
    then
123
       echo "*** Remove the snapshot $ID_SNAP_OLDER [OK]"
124
    else
125
      echo "/!\\ Remove the snapshot $ID_SNAP_OLDER [ERROR]."
126
    fi
127
  fi
128

    
129
else
130
  echo ""
131
  CPT_SNAP=$(ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
132
  echo "*** Number of snapshots for $namereplica is : $CPT_SNAP"
133
  ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica
134

    
135
  if [ $CPT_SNAP -gt $nbreplica ]
136
  then
137
    echo "*** Detection of the oldest snapshot"
138
    for ID_SNAP_OLDER in $(ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@)
139
    do
140
      echo "*** The oldest snapshot is : $ID_SNAP_OLDER"
141
      break
142
    done
143
    ssh -o BatchMode=yes root@$server $BINZFS destroy $ID_SNAP_OLDER
144
    if [ $? -eq 0 ]
145
    then
146
       echo "*** Remove the snapshot $ID_SNAP_OLDER [OK]"
147
    else
148
      echo "/!\\ Remove the snapshot $ID_SNAP_OLDER [ERROR]."
149
    fi
150
  fi
151

    
152
fi
153
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
154
}
155

    
156

    
157
#*************************************
158
#* function FULL REPLICATION
159
#*************************************
160
function fullreplication {
161

    
162
parentdataset=$(awk '{
163
              n = split($0, t, "/")
164
              for (i = 0; ++i <= n-1;)
165
                if (i == 1)
166
                  printf t[i]
167
                else
168
                  printf "/"t[i]
169
              }' <<< $(echo $namereplica))
170

    
171
if [[ "$server" == "" ]]
172
then
173

    
174
    $BINZFS list $parentdataset
175
    if [[ "?" != "0" ]]
176
    then
177
      $BINZFS create -p $parentdataset
178
    fi
179

    
180
    $BINZFS send $snapshot2replicate | $BINZFS recv $namereplica
181
    if [[ "$?" == "0" ]]
182
    then
183
       while read line
184
       do 
185
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$TEMP_FILE_NAME)
186
       done <<< "$(cat $FILE_NAME)"
187
       /bin/rm $FILE_NAME
188
       /bin/mv $TEMP_FILE_NAME $FILE_NAME
189
       del_old_snapshot
190
       exit 0
191
    fi 
192
   
193
else
194
  checkServerConnection
195
  if [[ "$snapshot2replicate" != "" ]]
196
  then
197
    ssh -o BatchMode=yes root@$server $BINZFS list $parentdataset
198
    if [[ "?" != "0" ]]
199
    then
200
      ssh -o BatchMode=yes root@$server $BINZFS create -p $parentdataset
201
    fi
202

    
203
#    $BINZFS send $snapshot2replicate |ssh -o BatchMode=yes root@$server $BINZFS recv $namereplica
204
    computePort
205
    ssh -o BatchMode=yes root@$server "$BINMBUFFER -I $LOCALHOST:$PORT | $BINZFS recv $namereplica " &
206
    sleep 5s # allow server to be ready
207
    $BINZFS send $snapshot2replicate | $BINMBUFFER -O $server:$PORT
208
    if [[ "$?" == "0" ]]
209
    then
210
       while read line
211
       do 
212
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$TEMP_FILE_NAME)
213
       done <<< "$(cat $FILE_NAME)"
214
       /bin/rm $FILE_NAME
215
       /bin/mv $TEMP_FILE_NAME $FILE_NAME
216
       del_old_snapshot
217
       exit 0
218
    fi 
219
  fi
220
fi
221

    
222
}
223

    
224

    
225

    
226
function incremental_replication {
227

    
228
echo "Start incremental replication for : $snasphot2replicate"
229
if [[ "$server" == "" ]]
230
then
231
    $BINZFS send -i $lastsnapshotReplicated $namevolfs@$snasphot2replicate | $BINZFS recv $namereplica
232
    snapshot2replicate="$namevolfs@$snasphot2replicate"
233
    if [[ "$?" == "0" ]]
234
    then
235
       while read line
236
       do
237
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$TEMP_FILE_NAME
238
       done <<< "$(cat $FILE_NAME)"
239
       /bin/rm $FILE_NAME
240
       /bin/mv $TEMP_FILE_NAME $FILE_NAME
241
       del_old_snapshot
242
       exit 0
243
    fi 
244
else
245
  checkServerConnection
246
if [ "$snasphot2replicate" == "" ]
247
then
248
   exit 1
249
else
250
    #$BINZFS send -i $lastsnapshotReplicated $namevolfs@$snasphot2replicate | ssh -o BatchMode=yes root@$server $BINZFS recv $namereplica
251
    computePort
252
    ssh -o BatchMode=yes root@$server "$BINMBUFFER -I $LOCALHOST:$PORT | $BINZFS recv $namereplica " &
253
    sleep 5s # allow server to be ready
254
    $BINZFS send -i $lastsnapshotReplicated $namevolfs@$snasphot2replicate | $BINMBUFFER -O $server:$PORT
255
    snapshot2replicate="$namevolfs@$snasphot2replicate"
256
    if [[ "$?" == "0" ]]
257
    then
258
       while read line
259
       do 
260
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$TEMP_FILE_NAME)
261
       done <<< "$(cat $FILE_NAME)"
262
       /bin/rm $FILE_NAME
263
       /bin/mv $TEMP_FILE_NAME $FILE_NAME
264
       del_old_snapshot
265
       exit 0
266
    fi 
267
  fi
268
fi
269

    
270
}
271

    
272

    
273
#****************************************
274
#* NO INTERACTIVE MODE
275
#****************************************
276
function nointeractive {
277

    
278
#--- check and init env ---#
279
initenv
280

    
281
fileconf=$($getConfigSnapshotTool $namevolfs|grep fileconf|cut -d "=" -f2)
282
NBsnapshot=$($BINZFS list -H -r -t snapshot $namevolfs|wc -l)
283

    
284
if [[ $NBsnapshot -eq 0 ]]
285
then
286
   echo "no snapshot, start snapshoting ..."  
287
   $zfsSnapshot $fileconf
288
fi
289

    
290
valchk=checkCoherence
291
if [[ "$valchk" == "false" ]] && [[ "$lastsnapshotReplicated" != "" ]]
292
then
293
   echo "Replication by incremental snapshot is not possible : checkcoherence return false "
294
   echo "Start FULL Replication ..."
295
   while read line
296
   do
297
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
298
   done <<< "$($BINZFS list -H -r -t snapshot $namevolfs)"
299
   fullreplication
300
fi
301

    
302

    
303
#--- FULL REPLICATION ---#
304
if [[ $NBsnasphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
305
then
306
   echo "Replication by incremental snapshot is not possible"
307
   echo "Start FULL Replication ..."
308
   while read line
309
   do 
310
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
311
   done <<< "$($BINZFS list -H -r -t snapshot $namevolfs)"
312
   fullreplication
313
fi
314

    
315
#-- INCREMENTAL REPLICATION ---#
316
if [[ $NBsnapshot -gt 1 ]]
317
then
318
  cpt=1
319
  while read line
320
  do
321

    
322
    if [[ $cpt -eq 1 ]]
323
    then
324
       snasphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
325
       echo $lastsnasphot
326
       echo $snasphot2replicate
327
       break
328
    fi
329
    cpt=$cpt+1
330
  done <<< "$($BINZFS list -H -r -t snapshot $namevolfs|tac)"
331
  lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) 
332
 
333
  if [ "$snasphot2replicate" == "$lastsnapshot" ]
334
  then
335
     echo "Nothing to replicate" 1>&2
336
     exit 1
337
 
338
  fi
339
  if [ "$server" == "" ]
340
  then
341
     check_lastsnapshotReplica=$($BINZFS list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
342
     check_currentsnapshotReplica=$($BINZFS list -H -r -t snapshot $namereplica |grep $snasphot2replicate=|wc -l)
343
  else
344
     check_lastsnapshotReplica=$(ssh -o BatchMode=yes root@$server $BINZFS list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
345
     check_currentsnapshotReplica=$(ssh -o BatchMode=yes root@$server $BINZFS list -H -r -t snapshot $namereplica |grep $snasphot2replicate=|wc -l)
346
  fi
347
  if [[ $check_lastsnapshotReplica -eq 0 ]]
348
  then
349
     echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing" 1>&2
350
     exit 1
351
  fi
352
  
353
  if [[ $check_currentsnapshotReplica -eq 1 ]]
354
  then
355
    echo "No replica to do, $lastSnapshot already exists" 1>&2
356
    exit 1
357
  fi  
358
fi
359
 echo $snasphot2replicate
360
incremental_replication
361
}
362

    
363
nointeractive
364