Statistiques
| Révision :

root / bin / enable-replica @ 49

Historique | Voir | Annoter | Télécharger (6,37 ko)

1
#!/bin/bash
2
# $Id: enable-replica 49 2013-10-10 08:59:11Z kreverch $
3

    
4
DIR_CONF_REPLICA="/opt/gZFS/replicas/"
5
DIR_CRON="/etc/cron.d/"
6
BIN_ZFS_REPLICA="/sbin/zfs-replica"
7
BINZFS="/sbin/zfs"
8
BINZPOOL="/sbin/zpool"
9

    
10
# TODO: traduire les msg
11

    
12
function usage {
13
  echo "USAGE :"
14
  echo "$0 -o volume_fs_to_replicate -r volume_fs_destination -n number_replicas_to_keep -m minute_cron -H hour_cron -D Day_of_Month_cron -M month_cron -d day_of_week_cron [-s server destination]" 1>&2
15
  echo "or" 1>&2
16
  echo "$0 -i : for a interactive mode" 1>&2
17
  echo "" 1>&2
18
  echo "OPTIONS : " 1>&2
19
  echo "  -o : origin volume or a filesystem to replicate" 1>&2
20
  echo "  -r : volume or filesystem replicated" 1>&2
21
  echo "  -n : number replicas to keep" 1>&2
22
  echo "  -s : if replica destination is on another zfs server, you need to specify this option with the name of server." 1>&2
23
  echo "      Warning ! Remote replication use ssh. So please, generate a ssh private/public key and the public key in /root/.ssh/authorized_key" 1>&2
24
  echo "      on remote server" 1>&2
25
  echo "  -m : minute field for cron replication" 1>&2
26
  echo "  -H : hour field for cron replication" 1>&2
27
  echo "  -D : Day of Month field for cron replication" 1>&2
28
  echo "  -M : Month field for cron replication" 1>&2
29
  echo "  -d : Day of week for cron replication" 1>&2
30
  echo "  -h : display this message"
31

    
32
}
33

    
34
function checkField4Cron {
35
  if [[ $OPTARG =~ [a-zA-Z] ]]
36
  then
37
     echo "-$OPTION contain a bad value" 1>&2
38
     exit 1
39
  fi
40
}
41

    
42
function createCronFile4Snapshot {
43
FILE_NAME=$(echo "replica-"${volfs//\//-})
44
echo "$MINUTE $HOUR $MONTH $DAYMONTH $DAYWEEK root $BIN_ZFS_REPLICA $DIR_CONF_REPLICA$FILE_NAME.conf" > $DIR_CRON$FILE_NAME
45
}
46

    
47
function interactive {
48
$BINZFS list
49
echo "*** Select the ZFS volume/filesystem to replicate : ***" 
50

    
51
while read inputline
52
do
53
   volfs=$inputline
54
   if [ "$volfs" = "" ]
55
   then
56
      echo "*** Select the ZFS volume/filesystem to replicate : ***" 
57
   else
58

    
59
      echo "*** Are you sur : $inputline ? (y/n) ***"
60

    
61

    
62
      while read inputConfirm
63
      do
64
        if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
65
         then
66
            break
67
         fi
68
         echo "*** Are you sur  : $inputline ? (y/n) ***"
69
      done
70
      if [ "$inputConfirm" = "y" ]
71
      then
72
         $BINZFS list $volfs
73
         if [ $? -eq 0 ]
74
         then
75
            echo "*** The ZFS volume/filesystem selected $volfs exists ***"
76
            break
77
         else
78
            echo "*** The ZFS volume/filesystem selected $volfs does not exist ***"    
79
            echo "*** Select the ZFS volume/filesystem to replicate : ***"
80
         fi
81
      fi
82
      if [ "$inputConfirm" != "y" ]
83
      then
84
         echo "*** Select the ZFS volume/filesystem to replicate : ***"
85
      fi
86
   fi
87
done
88

    
89
echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***" 
90
echo "*** /!\ This program does not check if the replica name is valid /!\***" 
91
while read inputline
92
do
93
   volfsdestination=$inputline
94
   if [ "$volfsdestination" = "" ]
95
   then
96
      echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***" 
97
      echo "*** /!\ This program does not check if the replica name is valid /!\***" 
98
   else
99

    
100
      echo "*** Are you sur : $inputline ? (y/n) ***"
101

    
102

    
103
      while read inputConfirm
104
      do
105
        if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
106
         then
107
            break
108
         fi
109
         echo "*** Are you sur : $inputline ? (y/n) ***"
110
      done
111
      if [ "$inputConfirm" != "y" ]
112
      then
113
         echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***" 
114
         echo "*** /!\ This program does not check if the replica name is valid /!\***" 
115
      else
116
        break
117
      fi
118
   fi
119
done
120

    
121
echo "*** Replicate to a remote server (y/n)?"
122
while read inputConfirm
123
do
124
   if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
125
   then
126
      break
127
   fi
128
   echo "*** Are you sur : $inputline ? (y/n) ***"
129
done
130
if [ "$inputConfirm" = "y" ]
131
then
132
   echo "*** Enter server name : "
133
   while read inputserver
134
   do
135
      if [ "$inputserver" != "" ]
136
      then
137
         server=$inputserver
138
         break
139
      fi
140
      echo "*** Enter server name : "
141
   done
142
else
143
   server=""
144
fi
145
   
146
echo "*** Enter the replica number to keep : ***"
147
while read inputline
148
do
149
   nbreplica=$inputline
150
   if [ "$nbreplica" = "" ]
151
   then
152
     echo "*** Enter the replica number to keep : ***"
153
   else
154
     echo "*** Creation of configuration file ***"
155
     FILE_NAME=$(echo "replica-"${volfs//\//-})
156
     >$DIR_CONF_REPLICA$FILE_NAME.conf
157
      echo "name=$volfs" >> $DIR_CONF_REPLICA$FILE_NAME.conf
158
      echo "namereplica=$volfsdestination-replica">> $DIR_CONF_REPLICA$FILE_NAME.conf
159
      echo "nbreplica=$nbreplica" >> $DIR_CONF_REPLICA$FILE_NAME.conf
160
      echo "lastsnapshotreplicated=" >> $DIR_CONF_REPLICA$FILE_NAME.conf
161
      echo "server=$server">> $DIR_CONF_REPLICA$FILE_NAME.conf
162
     break
163
   fi
164
done
165

    
166
}
167

    
168

    
169

    
170
function nointeractive {
171
  FILE_NAME=$(echo "replica-"${volfs//\//-})
172
  >$DIR_CONF_REPLICA$FILE_NAME.conf
173
  echo "name=$volfs" >> $DIR_CONF_REPLICA$FILE_NAME.conf
174
  echo "namereplica=$volfsdestination-replica">> $DIR_CONF_REPLICA$FILE_NAME.conf
175
  echo "nbreplica=$nbreplica" >> $DIR_CONF_REPLICA$FILE_NAME.conf
176
  echo "lastsnapshotreplicated=" >> $DIR_CONF_REPLICA$FILE_NAME.conf
177
  echo "server=$server">> $DIR_CONF_REPLICA$FILE_NAME.conf
178
}
179

    
180

    
181
while getopts "is:r:o:n:m:H::D:M:d:h" OPTION
182
do
183
     case $OPTION in
184
         h)
185
             usage
186
             exit 1
187
             ;;
188
         r)
189
            volfsdestination=$OPTARG
190
            ;;
191
         o)
192
            volfs=$OPTARG
193
            ;;
194
         n)
195
            nbreplica=$OPTARG
196
            ;;
197
         s)
198
            server=$OPTARG
199
            ;;
200
         m)
201
            checkField4Cron
202
            MINUTE=$OPTARG
203
            ;;
204
         H)
205
            checkField4Cron
206
            HOUR=$OPTARG
207
            ;;
208
         D)
209
            checkField4Cron
210
            DAYMONTH=$OPTARG
211
            ;;
212
         M)
213
            checkField4Cron
214
            MONTH=$OPTARG
215
            ;;
216
         d)
217
            checkField4Cron
218
            DAYWEEK=$OPTARG
219
            ;;
220
         i)
221
            interactive
222
            exit 0
223
            ;;
224
     esac
225
done
226
if [[ -z $volfsdestination ]] || [[ -z $volfs ]] || [[ -z $nbreplica ]] || [[ -z $MINUTE ]] || [[ -z $HOUR ]] || [[ -z $DAYMONTH ]] || [[ -z $MONTH ]] || [[ -z $DAYWEEK ]] 
227
then
228
     usage
229
     exit 1
230
fi
231

    
232
nointeractive
233
createCronFile4Snapshot
234

    
235
/etc/init.d/cron restart