Statistiques
| Révision :

root / bin / enable-replica

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

1 1 kreverch
#!/bin/bash
2 39 ltaulell
# $Id$
3 51 ltaulell
# Copyright (C) 2013 Kevin Reverchon, Loïs Taulelle
4 51 ltaulell
# This file/program is part of gZFS free software
5 51 ltaulell
# See COPYING file for details
6 51 ltaulell
#
7 1 kreverch
8 1 kreverch
DIR_CONF_REPLICA="/opt/gZFS/replicas/"
9 1 kreverch
DIR_CRON="/etc/cron.d/"
10 1 kreverch
BIN_ZFS_REPLICA="/sbin/zfs-replica"
11 49 kreverch
BINZFS="/sbin/zfs"
12 49 kreverch
BINZPOOL="/sbin/zpool"
13 1 kreverch
14 40 ltaulell
# TODO: traduire les msg
15 40 ltaulell
16 1 kreverch
function usage {
17 1 kreverch
  echo "USAGE :"
18 1 kreverch
  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
19 1 kreverch
  echo "or" 1>&2
20 1 kreverch
  echo "$0 -i : for a interactive mode" 1>&2
21 1 kreverch
  echo "" 1>&2
22 1 kreverch
  echo "OPTIONS : " 1>&2
23 1 kreverch
  echo "  -o : origin volume or a filesystem to replicate" 1>&2
24 1 kreverch
  echo "  -r : volume or filesystem replicated" 1>&2
25 1 kreverch
  echo "  -n : number replicas to keep" 1>&2
26 40 ltaulell
  echo "  -s : if replica destination is on another zfs server, you need to specify this option with the name of server." 1>&2
27 40 ltaulell
  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
28 40 ltaulell
  echo "      on remote server" 1>&2
29 1 kreverch
  echo "  -m : minute field for cron replication" 1>&2
30 1 kreverch
  echo "  -H : hour field for cron replication" 1>&2
31 1 kreverch
  echo "  -D : Day of Month field for cron replication" 1>&2
32 1 kreverch
  echo "  -M : Month field for cron replication" 1>&2
33 1 kreverch
  echo "  -d : Day of week for cron replication" 1>&2
34 1 kreverch
  echo "  -h : display this message"
35 1 kreverch
36 1 kreverch
}
37 1 kreverch
38 1 kreverch
function checkField4Cron {
39 1 kreverch
  if [[ $OPTARG =~ [a-zA-Z] ]]
40 1 kreverch
  then
41 1 kreverch
     echo "-$OPTION contain a bad value" 1>&2
42 1 kreverch
     exit 1
43 1 kreverch
  fi
44 1 kreverch
}
45 1 kreverch
46 1 kreverch
function createCronFile4Snapshot {
47 20 ltaulell
FILE_NAME=$(echo "replica-"${volfs//\//-})
48 67 ltaulell
echo "$MINUTE $HOUR $MONTH $DAYMONTH $DAYWEEK root $BIN_ZFS_REPLICA $DIR_CONF_REPLICA$FILE_NAME.conf --cronlog" > $DIR_CRON$FILE_NAME
49 1 kreverch
}
50 1 kreverch
51 1 kreverch
function interactive {
52 49 kreverch
$BINZFS list
53 46 kreverch
echo "*** Select the ZFS volume/filesystem to replicate : ***"
54 1 kreverch
55 1 kreverch
while read inputline
56 1 kreverch
do
57 1 kreverch
   volfs=$inputline
58 1 kreverch
   if [ "$volfs" = "" ]
59 1 kreverch
   then
60 46 kreverch
      echo "*** Select the ZFS volume/filesystem to replicate : ***"
61 1 kreverch
   else
62 1 kreverch
63 46 kreverch
      echo "*** Are you sur : $inputline ? (y/n) ***"
64 1 kreverch
65 1 kreverch
66 1 kreverch
      while read inputConfirm
67 1 kreverch
      do
68 1 kreverch
        if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
69 1 kreverch
         then
70 1 kreverch
            break
71 1 kreverch
         fi
72 46 kreverch
         echo "*** Are you sur  : $inputline ? (y/n) ***"
73 1 kreverch
      done
74 1 kreverch
      if [ "$inputConfirm" = "y" ]
75 1 kreverch
      then
76 49 kreverch
         $BINZFS list $volfs
77 1 kreverch
         if [ $? -eq 0 ]
78 1 kreverch
         then
79 46 kreverch
            echo "*** The ZFS volume/filesystem selected $volfs exists ***"
80 1 kreverch
            break
81 1 kreverch
         else
82 46 kreverch
            echo "*** The ZFS volume/filesystem selected $volfs does not exist ***"
83 46 kreverch
            echo "*** Select the ZFS volume/filesystem to replicate : ***"
84 1 kreverch
         fi
85 1 kreverch
      fi
86 1 kreverch
      if [ "$inputConfirm" != "y" ]
87 1 kreverch
      then
88 46 kreverch
         echo "*** Select the ZFS volume/filesystem to replicate : ***"
89 1 kreverch
      fi
90 1 kreverch
   fi
91 1 kreverch
done
92 1 kreverch
93 46 kreverch
echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***"
94 46 kreverch
echo "*** /!\ This program does not check if the replica name is valid /!\***"
95 1 kreverch
while read inputline
96 1 kreverch
do
97 1 kreverch
   volfsdestination=$inputline
98 1 kreverch
   if [ "$volfsdestination" = "" ]
99 1 kreverch
   then
100 46 kreverch
      echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***"
101 46 kreverch
      echo "*** /!\ This program does not check if the replica name is valid /!\***"
102 1 kreverch
   else
103 1 kreverch
104 46 kreverch
      echo "*** Are you sur : $inputline ? (y/n) ***"
105 1 kreverch
106 1 kreverch
107 1 kreverch
      while read inputConfirm
108 1 kreverch
      do
109 1 kreverch
        if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
110 1 kreverch
         then
111 1 kreverch
            break
112 1 kreverch
         fi
113 46 kreverch
         echo "*** Are you sur : $inputline ? (y/n) ***"
114 1 kreverch
      done
115 1 kreverch
      if [ "$inputConfirm" != "y" ]
116 1 kreverch
      then
117 46 kreverch
         echo "*** Enter replica name (syntax pool_name/replica_name, example zpfront/monvolume) ***"
118 46 kreverch
         echo "*** /!\ This program does not check if the replica name is valid /!\***"
119 1 kreverch
      else
120 1 kreverch
        break
121 1 kreverch
      fi
122 1 kreverch
   fi
123 1 kreverch
done
124 1 kreverch
125 46 kreverch
echo "*** Replicate to a remote server (y/n)?"
126 1 kreverch
while read inputConfirm
127 1 kreverch
do
128 1 kreverch
   if [ "$inputConfirm" = "y" ]||[ "$inputConfirm" = "n" ]
129 1 kreverch
   then
130 1 kreverch
      break
131 1 kreverch
   fi
132 46 kreverch
   echo "*** Are you sur : $inputline ? (y/n) ***"
133 1 kreverch
done
134 1 kreverch
if [ "$inputConfirm" = "y" ]
135 1 kreverch
then
136 46 kreverch
   echo "*** Enter server name : "
137 1 kreverch
   while read inputserver
138 1 kreverch
   do
139 1 kreverch
      if [ "$inputserver" != "" ]
140 1 kreverch
      then
141 1 kreverch
         server=$inputserver
142 1 kreverch
         break
143 1 kreverch
      fi
144 46 kreverch
      echo "*** Enter server name : "
145 1 kreverch
   done
146 1 kreverch
else
147 1 kreverch
   server=""
148 1 kreverch
fi
149 1 kreverch
150 46 kreverch
echo "*** Enter the replica number to keep : ***"
151 1 kreverch
while read inputline
152 1 kreverch
do
153 1 kreverch
   nbreplica=$inputline
154 3 kreverch
   if [ "$nbreplica" = "" ]
155 1 kreverch
   then
156 46 kreverch
     echo "*** Enter the replica number to keep : ***"
157 1 kreverch
   else
158 46 kreverch
     echo "*** Creation of configuration file ***"
159 20 ltaulell
     FILE_NAME=$(echo "replica-"${volfs//\//-})
160 1 kreverch
     >$DIR_CONF_REPLICA$FILE_NAME.conf
161 3 kreverch
      echo "name=$volfs" >> $DIR_CONF_REPLICA$FILE_NAME.conf
162 3 kreverch
      echo "namereplica=$volfsdestination-replica">> $DIR_CONF_REPLICA$FILE_NAME.conf
163 3 kreverch
      echo "nbreplica=$nbreplica" >> $DIR_CONF_REPLICA$FILE_NAME.conf
164 5 kreverch
      echo "lastsnapshotreplicated=" >> $DIR_CONF_REPLICA$FILE_NAME.conf
165 3 kreverch
      echo "server=$server">> $DIR_CONF_REPLICA$FILE_NAME.conf
166 1 kreverch
     break
167 1 kreverch
   fi
168 1 kreverch
done
169 1 kreverch
170 1 kreverch
}
171 1 kreverch
172 1 kreverch
173 1 kreverch
174 1 kreverch
function nointeractive {
175 20 ltaulell
  FILE_NAME=$(echo "replica-"${volfs//\//-})
176 1 kreverch
  >$DIR_CONF_REPLICA$FILE_NAME.conf
177 1 kreverch
  echo "name=$volfs" >> $DIR_CONF_REPLICA$FILE_NAME.conf
178 1 kreverch
  echo "namereplica=$volfsdestination-replica">> $DIR_CONF_REPLICA$FILE_NAME.conf
179 1 kreverch
  echo "nbreplica=$nbreplica" >> $DIR_CONF_REPLICA$FILE_NAME.conf
180 5 kreverch
  echo "lastsnapshotreplicated=" >> $DIR_CONF_REPLICA$FILE_NAME.conf
181 1 kreverch
  echo "server=$server">> $DIR_CONF_REPLICA$FILE_NAME.conf
182 1 kreverch
}
183 1 kreverch
184 1 kreverch
185 1 kreverch
while getopts "is:r:o:n:m:H::D:M:d:h" OPTION
186 1 kreverch
do
187 1 kreverch
     case $OPTION in
188 1 kreverch
         h)
189 1 kreverch
             usage
190 1 kreverch
             exit 1
191 1 kreverch
             ;;
192 1 kreverch
         r)
193 1 kreverch
            volfsdestination=$OPTARG
194 1 kreverch
            ;;
195 1 kreverch
         o)
196 1 kreverch
            volfs=$OPTARG
197 1 kreverch
            ;;
198 1 kreverch
         n)
199 1 kreverch
            nbreplica=$OPTARG
200 1 kreverch
            ;;
201 1 kreverch
         s)
202 1 kreverch
            server=$OPTARG
203 1 kreverch
            ;;
204 1 kreverch
         m)
205 1 kreverch
            checkField4Cron
206 1 kreverch
            MINUTE=$OPTARG
207 1 kreverch
            ;;
208 1 kreverch
         H)
209 1 kreverch
            checkField4Cron
210 1 kreverch
            HOUR=$OPTARG
211 1 kreverch
            ;;
212 1 kreverch
         D)
213 1 kreverch
            checkField4Cron
214 1 kreverch
            DAYMONTH=$OPTARG
215 1 kreverch
            ;;
216 1 kreverch
         M)
217 1 kreverch
            checkField4Cron
218 1 kreverch
            MONTH=$OPTARG
219 1 kreverch
            ;;
220 1 kreverch
         d)
221 1 kreverch
            checkField4Cron
222 1 kreverch
            DAYWEEK=$OPTARG
223 1 kreverch
            ;;
224 1 kreverch
         i)
225 1 kreverch
            interactive
226 1 kreverch
            exit 0
227 1 kreverch
            ;;
228 1 kreverch
     esac
229 1 kreverch
done
230 1 kreverch
if [[ -z $volfsdestination ]] || [[ -z $volfs ]] || [[ -z $nbreplica ]] || [[ -z $MINUTE ]] || [[ -z $HOUR ]] || [[ -z $DAYMONTH ]] || [[ -z $MONTH ]] || [[ -z $DAYWEEK ]]
231 1 kreverch
then
232 1 kreverch
     usage
233 1 kreverch
     exit 1
234 1 kreverch
fi
235 1 kreverch
236 1 kreverch
nointeractive
237 1 kreverch
createCronFile4Snapshot
238 1 kreverch
239 1 kreverch
/etc/init.d/cron restart