1 # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
3 HELPERS="$HELPERS rdiff:incremental_remote_filesystem_backup"
5 declare -a rdiff_includes
6 declare -a rdiff_excludes
7 declare -a rdiff_vsincludes
8 declare -a rdiff_vsexcludes
12 do_rdiff_host_includes() {
14 # choose the files to backup
16 while [ -z "$REPLY" ]; do
17 formBegin "$rdiff_title - host system: includes"
18 for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
19 formItem include ${rdiff_includes[$i]}
27 rdiff_includes=($REPLY)
33 # choose the vservers to backup (into $selected_vservers)
34 choose_one_or_more_vservers "$rdiff_title"
35 [ $? = 0 ] || return 1
38 # choose the files to backup
41 while [ -z "$REPLY" ]; do
42 formBegin "$rdiff_title - vsincludes (backup these directories from every vserver)"
43 [ -z "$rdiff_vsincludes" ] && rdiff_vsincludes="$rdiff_default_includes"
45 for i in $rdiff_vsincludes; do
52 [ $? = 0 ] || return 1
53 rdiff_vsincludes=($REPLY)
61 formBegin "$rdiff_title: excludes"
62 for ((i=0; i < ${#rdiff_excludes[@]} ; i++))
64 formItem exclude ${rdiff_excludes[$i]}
71 rdiff_excludes=($REPLY)
76 choose_host_or_vservers_or_both "$rdiff_title"
77 [ $? = 0 ] || return 1
78 case $host_or_vservers in
80 do_rdiff_host_includes
81 [ $? = 0 ] || return 1
85 [ $? = 0 ] || return 1
88 do_rdiff_host_includes
89 [ $? = 0 ] || return 1
91 [ $? = 0 ] || return 1
98 [ $? = 0 ] || return 1
108 while [ -z "$REPLY" -o -z "$rdiff_directory" -o -z "$rdiff_host" -o -z "$rdiff_user" ]
110 formBegin "$rdiff_title - destination: last three items are required"
111 formItem "keep" "$rdiff_keep"
112 formItem "dest_directory" "$rdiff_directory"
113 formItem "dest_host" "$rdiff_host"
114 formItem "dest_user" "$rdiff_user"
118 rdiff_keep=${tmp_array[0]}
119 rdiff_directory=${tmp_array[1]}
120 rdiff_host=${tmp_array[2]}
121 rdiff_user=${tmp_array[3]}
130 local remote_status="ok"
133 if [ "$_dest_done" = "" ]; then
134 msgBox "$rdiff_title: error" "You must first configure the destination."
136 elif [ "$rdiff_user" = "" ]; then
137 msgBox "$rdiff_title: error" "You must first configure the destination user."
139 elif [ "$rdiff_host" = "" ]; then
140 msgBox "$rdiff_title: error" "You must first configure the destination host."
143 booleanBox "$rdiff_title" "This step will create a ssh key for the local root user with no passphrase (if one does not already exist), and attempt to copy root's public ssh key to authorized_keys file of $rdiff_user@$rdiff_host. This will allow the local root to make unattended backups to $rdiff_user@$rdiff_host.\n\n\nAre you sure you want to continue?"
147 if [ ! -f /root/.ssh/id_dsa.pub -a ! -f /root/.ssh/id_rsa.pub ]; then
148 echo "Creating local root's ssh key"
149 ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
150 echo "Done. hit return to continue"
154 ssh -o PreferredAuthentications=publickey $rdiff_host -l $rdiff_user "exit" 2> /dev/null
155 if [ $? -ne 0 ]; then
156 echo "Copying root's public ssh key to authorized_keys of $rdiff_user@$rdiff_host. When prompted, specify the password for user $rdiff_user@$rdiff_host."
157 ssh-copy-id -i /root/.ssh/id_[rd]sa.pub $rdiff_user@$rdiff_host
158 if [ $? -ne 0 ]; then
159 echo "FAILED: Couldn't copy root's public ssh key to authorized_keys of $rdiff_user@$rdiff_host."
160 ssh $rdiff_user@$rdiff_host 'test -w .ssh || test -w .'
162 echo "Hit return to continue."
165 0 ) msgBox "$rdiff_title: error" "Directories are writable: Probably just a typo the first time." ;;
166 1 ) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but unable to write. Check ownership and modes of ~$rdiff_user on $rdiff_host." ;;
167 255 ) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." ;;
168 * ) msgBox "$rdiff_title: error" "Unexpected error." ;;
172 echo "Done. hit return to continue"
176 echo "root@localhost is already in authorized_keys of $rdiff_user@$rdiff_host."
177 echo "Hit return to continue."
181 # test to see if the remote rdiff backup directory exists and is writable
182 echo "Testing to see if remote rdiff backup directory exists and is writable"
183 ssh $rdiff_user@$rdiff_host "test -d ${rdiff_directory}"
185 ssh $rdiff_user@$rdiff_host "test -w $rdiff_directory"
187 msgBox "destination directory is not writable!" "The remote destination directory is not writable by the user you specified. Please fix the permissions on the directory and then try again."
191 booleanBox "Remote directory does not exist" "The destination backup directory does not exist, do you want me to create it for you?"
193 ssh $rdiff_user@$rdiff_host "mkdir -p ${rdiff_directory}"
196 0) msgBox "$rdiff_title: success" "Creation of the remote destination directory was a success!";;
197 1) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions."
198 remote_status=failed;;
199 255) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host."
200 remote_status=failed;;
201 *) msgBox "$rdiff_title: error" "Unexpected error."
202 remote_status=failed;;
207 if [ "$remote_status" = "ok" ]; then
213 echo "Checking for local install of rdiff-backup"
214 require_packages rdiff-backup
216 echo "Testing to make sure destination has rdiff-backup installed and is compatible."
217 remote_result=`/usr/bin/rdiff-backup --test-server $rdiff_user@$rdiff_host::/ 2>&1 >&-`
218 if [ $? -ne 0 ]; then
219 echo $remote_result | grep -q "command not found"
220 if [ $? -eq 0 ]; then
221 if [ "$rdiff_user" = "root" ]; then
222 booleanBox "install rdiff-backup?" "It seems like the remote machine does not have rdiff-backup installed, I can attempt to install rdiff-backup on the remote machine.\n\n\nDo you want me to attempt this now?"
224 ssh $rdiff_user@$rdiff_host 'apt-get install rdiff-backup'
226 echo "Hit return to continue."
229 0) msgBox "$rdiff_title: success" "Installation of rdiff-backup was a success!"
231 1) msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to install the package for some reason.";;
232 255) msgBox "$rdiff_title: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host.";;
233 *) msgBox "$rdiff_title: error" "Unexpected error.";;
238 booleanBox "install rdiff-backup" "Please install rdiff-backup on the remote machine, this cannot be done automatically, as the remote user in your configuration is not root. \n\nIf you have installed rdiff-backup on the remote machine and you are getting this error, then there is a version incompatibility between that version and the local version.\n\nPlease resolve this problem and then try connecting again.\n\n\n\nTry connecting again?"
246 msgBox "incompatible versions of rdiff-backup" "It looks like rdiff-backup is installed on the remote machine, but it may be an incompatible version with the one installed locally, or something else is amiss.\n\nPlease resolve this problem and then try connecting again.\n\n\nTry connecting again?"
254 echo "SUCCESS: Everything looks good!"
255 echo "Hit return to continue."
264 get_next_filename $configdirectory/90.rdiff
265 cat > $next_filename <<EOF
267 # when = everyday at 02
274 if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]; then
276 for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
277 echo "include = ${rdiff_includes[$i]}" >> $next_filename
282 if [ "$host_or_vservers" == vservers -o "$host_or_vservers" == both ]; then
283 cat >> $next_filename <<EOF
285 # If vservers = yes in /etc/backupninja.conf then the following variables can
287 # vsnames = all | <vserver1> <vserver2> ... (default = all)
291 # Any path specified in vsinclude is added to the include list for each vserver
292 # listed in vsnames (or all if vsnames = all, which is the default).
294 # For example, vsinclude = /home will backup the /home directory in every
295 # vserver listed in vsnames. If you have 'vsnames = foo bar baz', this
296 # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home
297 # and /vservers/baz/home.
298 # Vservers paths are derived from $VROOTDIR.
299 # vsinclude supports globbing with '*'.
303 echo -e "vsnames = $selected_vservers\n" >> $next_filename
304 for i in $rdiff_vsincludes; do
305 echo "vsinclude = $i" >> $next_filename
312 for ((i=0; i < ${#rdiff_excludes[@]} ; i++)); do
313 echo exclude = ${rdiff_excludes[$i]} >> $next_filename
316 cat >> $next_filename <<EOF
318 ######################################################
319 ## destination section
320 ## (where the files are copied to)
324 directory = $rdiff_directory
329 chmod 600 $next_filename
334 srcitem="choose files to include & exclude $_src_done"
335 destitem="configure backup destination $_dest_done"
336 conitem="set up ssh keys and test remote connection $_con_done"
337 advitem="edit advanced settings $_adv_done"
338 menuBox "$rdiff_title" "choose a step:" \
342 finish "finish and create config file"
346 "src") do_rdiff_src;;
347 "dest") do_rdiff_dest;;
348 "conn") do_rdiff_ssh_con;;
349 "adv") do_rdiff_adv;;
351 if [[ "$_con_done$_dest_done$_src_done" != "(DONE)(DONE)(DONE)" ]]; then
352 msgBox "$rdiff_title" "You cannot create the configuration file until the other steps are completed."
365 rdiff_title="rdiff-backup action wizard"
371 rdiff_directory=/backup/`hostname`
375 # Global variables whose '*' shall not be expanded
377 rdiff_includes=(/var/spool/cron/crontabs /var/backups /etc /root /home /usr/local/*bin /var/lib/dpkg/status*)
378 rdiff_excludes=(/home/*/.gnupg)