Statistiques
| Révision :

root / bin / zfs-replica @ 49

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

1
#!/bin/bash
2
# $Id: zfs-replica 49 2013-10-10 08:59:11Z 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
BINZFS="/sbin/zfs"
10
BINZPOOL="/sbin/zpool"
11

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

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

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

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

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

    
55
#****************************************
56
#* function check server ssh connection
57
#***************************************
58
function checkServerConnection {
59

    
60
ssh -o BatchMode=yes root@$server ls
61

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

    
68
}
69

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

    
77
}
78

    
79
function del_old_snapshot {
80
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
81
if [[ "$server" == "" ]]
82
then
83
  echo ""
84
  CPT_SNAP=$($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
85
  echo "*** Number of snapshots for $namereplica is : $CPT_SNAP"
86
  $BINZFS list -t snapshot -r $namereplica
87

    
88
  if [ $CPT_SNAP -gt $nbreplica ]
89
  then
90
    echo "*** Detection of the oldest snapshot"
91
    for ID_SNAP_OLDER in $($BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@)
92
    do
93
      echo "*** The oldest snapshot is : $ID_SNAP_OLDER"
94
      break
95
    done
96
    $BINZFS destroy $ID_SNAP_OLDER
97
    if [ $? -eq 0 ]
98
    then
99
       echo "*** Remove the snapshot $ID_SNAP_OLDER [OK]"
100
    else
101
      echo "/!\\ Remove the snapshot $ID_SNAP_OLDER [ERROR]."
102
    fi
103
  fi
104

    
105
else
106
  echo ""
107
  CPT_SNAP=$(ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
108
  echo "*** Number of snapshots for $namereplica is : $CPT_SNAP"
109
  ssh -o BatchMode=yes root@$server $BINZFS list -t snapshot -r $namereplica
110

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

    
128
fi
129
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
130
}
131

    
132

    
133
#*************************************
134
#* function FULL REPLICATION
135
#*************************************
136
function fullreplication {
137

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

    
147
if [[ "$server" == "" ]]
148
then
149

    
150
    $BINZFS list $parentdataset
151
    if [[ "?" != "0" ]]
152
    then
153
      $BINZFS create -p $parentdataset
154
    fi
155

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

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

    
204
}
205

    
206

    
207

    
208
function incremental_replication {
209

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

    
257
}
258

    
259

    
260
#****************************************
261
#* NO INTERACTIVE MODE
262
#****************************************
263
function nointeractive {
264

    
265
#--- check and init env ---#
266
initenv
267

    
268
fileconf=$($getConfigSnapshotTool $namevolfs|grep fileconf|cut -d "=" -f2)
269
NBsnapshot=$($BINZFS list -H -r -t snapshot $namevolfs|wc -l)
270

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

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

    
289

    
290
#--- FULL REPLICATION ---#
291
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
292
then
293
   echo "Replication by incremental snapshot is not possible"
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
#-- INCREMENTAL REPLICATION ---#
303
if [[ $NBsnapshot -gt 1 ]]
304
then
305
  cpt=1
306
  while read line
307
  do
308

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

    
344
nointeractive
345