Statistiques
| Révision :

root / bin / zfs-replica @ 27

Historique | Voir | Annoter | Télécharger (9,08 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
                printf "/"t[i]
139
              }' <<< $(echo $namereplica))
140

    
141
if [[ "$server" == "" ]]
142
then
143

    
144
    /sbin/zfs list $parentdataset
145
    if [[ "?" != "0" ]]
146
    then
147
      /sbin/zfs create -p $parentdataset
148
    fi
149

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

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

    
198
}
199

    
200

    
201

    
202
function incremental_replication {
203

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

    
251
}
252

    
253

    
254
#****************************************
255
#* NO INTERACTIVE MODE
256
#****************************************
257
function nointeractive {
258

    
259
#--- check and init env ---#
260
initenv
261

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

    
265
if [[ $NBsnapshot -eq 0 ]]
266
then
267
   echo "no snapshot, start snapshoting ..."  
268
   echo "$zfsSnapshot $fileconf"
269
fi
270

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

    
283

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

    
296
#-- INCREMENTAL REPLICATION ---#
297
if [[ $NBsnapshot -gt 1 ]]
298
then
299
  cpt=1
300
  while read line
301
  do
302

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

    
338
nointeractive
339