Statistiques
| Révision :

root / bin / zfs-replica @ 5

Historique | Voir | Annoter | Télécharger (7,93 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
echo "start initenv"
14
if [ "$#" -eq 0 ]
15
then
16
   echo "/!\\ Le fichier de configuration est manquant /!\\"
17
   exit
18
fi
19

    
20
if [ ! -f $1 ]
21
then
22
   echo "/!\\ Le fichier de configuration n'existe pas /!\\" 
23
   exit
24
fi
25

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

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

    
44
echo "$getConfigSnapshotTool $namevolfs"
45
getlistSnapshot=$($getConfigSnapshotTool $namevolfs)
46
if [[ "$getlistSnapshot" == "" ]]
47
then
48
  echo "Please, enable a snapshot configuration for $namevolfs"
49
  exit 1
50
fi
51
echo "End of initenv"
52
}
53

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

    
59
ssh root@$server ls
60

    
61
if [ "$?" == "1" ]
62
then
63
  echo "SSH Connection server $server failed"
64
  exit 1
65
fi
66

    
67
}
68

    
69
function del_old_snapshot {
70
#*** ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
71
if [[ "$server" == "" ]]
72
then
73
  echo ""
74
  CPT_SNAP=$(/sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
75
  echo "*** Le nombre de snapshot pour $namereplica est : $CPT_SNAP"
76
  /sbin/zfs list -t snapshot -r $namereplica
77

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

    
95
else
96
  echo ""
97
  CPT_SNAP=$(ssh root@$server /sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@ |wc -l)
98
  echo "*** Le nombre de snapshot pour $namereplica est : $CPT_SNAP"
99
  ssh root@$server /sbin/zfs list -t snapshot -r $namereplica
100

    
101
  if [ $CPT_SNAP -gt $nbreplica ]
102
  then
103
    echo "*** Detection du snapshot le plus ancien"
104
    for ID_SNAP_OLDER in $(ssh root@$server /sbin/zfs list -t snapshot -r $namereplica |cut -d" " -f1 |grep -i $namereplica\@)
105
    do
106
      echo "*** Le snapshot le plus ancien est : $ID_SNAP_OLDER"
107
      break
108
    done
109
    ssh root@$server /sbin/zfs destroy $ID_SNAP_OLDER
110
    if [ $? -eq 0 ]
111
    then
112
       echo "*** Suppression du snapshot $ID_SNAP_OLDER [OK]"
113
    else
114
      echo "/!\\ Suppression du snapshot $ID_SNAP_OLDER [ERROR]."
115
    fi
116
  fi
117

    
118
fi
119
#*** FIN ETAPE SUPPRESSION DES SNAPSHOTS OBSELETES ***#
120
}
121

    
122

    
123
#*************************************
124
#* function FULL REPLICATION
125
#*************************************
126
function fullreplication {
127
if [[ "$server" == "" ]]
128
then
129
    /sbin/zfs send $snapshot2replicate | /sbin/zfs recv $namereplica
130
    if [[ "$?" == "0" ]]
131
    then
132
       cpt=0
133
       while read line
134
       do 
135
         if [ $cpt -eq 0 ]
136
         then
137
            echo $line
138
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME)
139
            cpt=1
140
         else
141
            $(echo $line|sed -e "s:lastsnapshotreplicated=.*$:astsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME)
142
         fi 
143
       done <<< "$(cat $FILE_NAME)"
144
       del_old_snapshot
145
    fi 
146
   
147
else
148
  checkServerConnection
149
  if [[ "$snapshot2replicate" != "" ]]
150
  then
151
    /sbin/zfs send $snapshot2replicate |ssh root@$server /sbin/zfs recv $namereplica
152
    if [[ "$?" == "0" ]]
153
    then
154
       cpt=0
155
       while read line
156
       do 
157
         if [ $cpt -eq 0 ]
158
         then
159
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >$FILE_NAME
160
            cpt=1
161
         else
162
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$snapshot2replicate:g" >>$FILE_NAME
163
         fi
164
       done <<< "$(cat $FILE_NAME)"
165
       del_old_snapshot
166
    fi 
167
  fi
168
exit 0
169
fi
170

    
171
}
172

    
173

    
174

    
175
function incremental_replication {
176

    
177
echo "Start incremental replication"
178
if [[ "$server" == "" ]]
179
then
180
    cmd="zfs send -i $lastsnapshotReplicated $namevolfs@$lastsnaphot | ssh root@cisticole-test zfs recv $namereplica"
181
    echo $cmd
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
   
198
else
199
  checkServerConnection
200
if [ "$snaphot2replicate" == "" ]
201
then
202
   exit 1
203
else
204
    zfs send -i $lastsnapshotReplicated $namevolfs@$snaphot2replicate | ssh root@cisticole-test zfs recv $namereplica
205
    if [[ "$?" == "0" ]]
206
    then
207
       cpt=0
208
       while read line
209
       do 
210
         echo $line
211
         if [ $cpt -eq 0 ]
212
         then
213
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >$FILE_NAME
214
            cpt=1
215
         else
216
            echo $line|sed -e "s:lastsnapshotreplicated=.*$:lastsnapshotreplicated=$namevolfs@$snaphot2replicate:g" >>$FILE_NAME
217
         fi
218
       done <<< "$(cat $FILE_NAME)"
219
       del_old_snapshot
220
    fi 
221
  fi
222
fi
223

    
224
}
225

    
226

    
227
#****************************************
228
#* NO INTERACTIVE MODE
229
#****************************************
230
function nointeractive {
231

    
232
#--- check and init env ---#
233
initenv
234

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

    
238
if [[ $NBsnapshot -eq 0 ]]
239
then
240
   echo "no snapshot, start snapshoting ..."  
241
   echo "$zfsSnapshot $fileconf"
242
fi
243

    
244
#--- FULL REPLICATION ---#
245
if [[ $NBsnaphot -eq 1 ]] || [[ "$lastsnapshotReplicated" == "" ]]
246
then
247
   echo "Replication by incremental snapshot is not possible"
248
   echo "Start FULL Replication ..."
249
   while read line
250
   do 
251
     snapshot2replicate=$(echo $line |echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1)
252
   done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs)"
253
   fullreplication
254
fi
255

    
256
#-- INCREMENTAL REPLICATION ---#
257
if [[ $NBsnapshot -gt 1 ]]
258
then
259
  cpt=1
260
  while read line
261
  do
262

    
263
    if [[ $cpt -eq 1 ]]
264
    then
265
       snaphot2replicate=$(echo $line |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2)
266
       echo $lastsnaphot
267
       echo $snaphot2replicate
268
       break
269
    fi
270
    cpt=$cpt+1
271
  done <<< "$(/sbin/zfs list -H -r -t snapshot $namevolfs|tac)"
272
  lastsnapshot=$(echo $lastsnapshotReplicated |sed -e "s/ \+/ /g"|cut -d " " -f1|cut -d "@" -f2) 
273
 
274
  if [ "$snaphot2replicate" == "$lastsnapshot" ]
275
  then
276
     echo "Nothing to replicate"
277
     exit 1
278
 
279
  fi
280
  check_lastsnapshotReplica=$(ssh root@cisticole-test /sbin/zfs list -H -r -t snapshot $namereplica |grep $lastsnapshot|wc -l)
281
  check_currentsnapshotReplica=$(ssh root@cisticole-test /sbin/zfs list -H -r -t snapshot $namereplica |grep $snaphot2replicate=|wc -l)
282
  if [[ $check_lastsnapshotReplica -eq 0 ]]
283
  then
284
     echo "Incoherence, incremental replication failed : $lastsnapshotReplicated is missing"
285
     exit 1
286
  fi
287
  
288
  if [[ $check_currentsnapshotReplica -eq 1 ]]
289
  then
290
    echo "No replica to do, $lastSnapshot already exists"
291
    exit 1
292
  fi  
293
fi
294
 echo $snaphot2replicate
295
incremental_replication
296
}
297

    
298
nointeractive
299