root / bin / zfs-replica @ 2
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 |
|