Statistiques
| Révision :

root / bin / zfs-replica @ 12

Historique | Voir | Annoter | Télécharger (8,62 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
if [[ "$server" == "" ]]
135
then
136
    /sbin/zfs send $snapshot2replicate | /sbin/zfs recv $namereplica
137
    if [[ "$?" == "0" ]]
138
    then
139
       cpt=0
140
       while read line
141
       do 
142
         if [ $cpt -eq 0 ]
143
         then
144
            echo $line
145
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME)
146
            cpt=1
147
         else
148
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:astsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME)
149
         fi 
150
       done <<< "$(cat $FILE_NAME)"
151
       del_old_snapshot
152
    fi 
153
   
154
else
155
  checkServerConnection
156
  if [[ "$snapshot2replicate" != "" ]]
157
  then
158
    /sbin/zfs send $snapshot2replicate |ssh -o BatchMode=yes root@$server /sbin/zfs recv $namereplica
159
    if [[ "$?" == "0" ]]
160
    then
161
       cpt=0
162
       while read line
163
       do 
164
         if [ $cpt -eq 0 ]
165
         then
166
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
167
            cpt=1
168
         else
169
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME
170
         fi
171
       done <<< "$(cat $FILE_NAME)"
172
       del_old_snapshot
173
    fi 
174
  fi
175
exit 0
176
fi
177

    
178
}
179

    
180

    
181

    
182
function incremental_replication {
183

    
184
echo "Start incremental replication"
185
if [[ "$server" == "" ]]
186
then
187
    cmd="zfs send -i $lastsnapshotReplicated $namevolfs@$lastsnaphot | ssh -o BatchMode=yes root@$server zfs recv $namereplica"
188
    echo $cmd
189
    if [[ "$?" == "0" ]]
190
    then
191
       cpt=0
192
       while read line
193
       do 
194
         if [ $cpt -eq 0 ]
195
         then
196
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
197
            cpt=1
198
         else
199
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
200
         fi
201
       done <<< "$(cat $FILE_NAME)"
202
       del_old_snapshot
203
    fi 
204
   
205
else
206
  checkServerConnection
207
if [ "$snaphot2replicate" == "" ]
208
then
209
   exit 1
210
else
211
    zfs send -i $lastsnapshotReplicated $namevolfs@$snaphot2replicate | ssh -o BatchMode=yes root@$server zfs recv $namereplica
212
    if [[ "$?" == "0" ]]
213
    then
214
       cpt=0
215
       while read line
216
       do 
217
         echo $line
218
         if [ $cpt -eq 0 ]
219
         then
220
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >$FILE_NAME
221
            cpt=1
222
         else
223
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >>$FILE_NAME
224
         fi
225
       done <<< "$(cat $FILE_NAME)"
226
       del_old_snapshot
227
    fi 
228
  fi
229
fi
230

    
231
}
232

    
233

    
234
#****************************************
235
#* NO INTERACTIVE MODE
236
#****************************************
237
function nointeractive {
238

    
239
#--- check and init env ---#
240
initenv
241

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

    
245
if [[ $NBsnapshot -eq 0 ]]
246
then
247
   echo "no snapshot, start snapshoting ..."  
248
   echo "$zfsSnapshot $fileconf"
249
fi
250

    
251
valchk=checkCoherence
252
if [[ "$valchk" == "false" ]] || [[ "$lastsnapshotReplicated" != "" ]]
253
then
254
   echo "Replication by incremental snapshot is not possible"
255
   echo "Start FULL Replication ..."
256
   while read line
257
   do
258
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
259
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
260
   fullreplication
261
fi
262

    
263

    
264
#--- FULL REPLICATION ---#
265
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
266
then
267
   echo "Replication by incremental snapshot is not possible"
268
   echo "Start FULL Replication ..."
269
   while read line
270
   do 
271
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
272
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
273
   fullreplication
274
fi
275

    
276
#-- INCREMENTAL REPLICATION ---#
277
if [[ $NBsnapshot -gt 1 ]]
278
then
279
  cpt=1
280
  while read line
281
  do
282

    
283
    if [[ $cpt -eq 1 ]]
284
    then
285
       snaphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
286
       echo $lastsnaphot
287
       echo $snaphot2replicate
288
       break
289
    fi
290
    cpt=$cpt+1
291
  done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs|tac)"
292
  lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) 
293
 
294
  if [ "$snaphot2replicate" == "$lastsnapshot" ]
295
  then
296
     echo "Nothing to replicate" 1>&2
297
     exit 1
298
 
299
  fi
300
  check_lastsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
301
  check_currentsnapshotReplica=$(ssh -o BatchMode=yes root@$server /sbin/zfs list -H -r -t snapshot $namereplica |grep $snaphot2replicate=|wc -l)
302
  if [[ $check_lastsnapshotReplica -eq 0 ]]
303
  then
304
     echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing" 1>&2
305
     exit 1
306
  fi
307
  
308
  if [[ $check_currentsnapshotReplica -eq 1 ]]
309
  then
310
    echo "No replica to do, $lastSnapshot already exists" 1>&2
311
    exit 1
312
  fi  
313
fi
314
 echo $snaphot2replicate
315
incremental_replication
316
}
317

    
318
nointeractive
319