Statistiques
| Révision :

root / bin / zfs-replica @ 31

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

1
#!/bin/bash
2

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

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

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

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

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

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

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

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

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

    
65
}
66

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

    
74
}
75

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

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

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

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

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

    
129

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

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

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

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

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

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

    
201
}
202

    
203

    
204

    
205
function incremental_replication {
206

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

    
254
}
255

    
256

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

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

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

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

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

    
286

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

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

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

    
341
nointeractive
342