1 HELPERS="$HELPERS rdiff:incremental_remote_filesystem_backup"
3 declare -a rdiff_includes
4 declare -a rdiff_excludes
8 do_rdiff_host_includes() {
10 # choose the files to backup
14 formBegin "$rdiff_title - host system: includes"
15 for ((i=0; i < ${#rdiff_includes[@]} ; i++))
17 formItem include ${rdiff_includes[$i]}
25 rdiff_includes="$REPLY"
31 # choose the vservers to backup (into $selected_vservers)
32 choose_one_or_more_vservers "$rdiff_title"
33 [ $? = 0 ] || return 1
36 # choose the files to backup
39 while [ -z "$REPLY" ]; do
40 formBegin "$rdiff_title - vsincludes (backup these directories from every vserver)"
41 [ -z "$rdiff_vsincludes" ] && rdiff_vsincludes="$rdiff_default_includes"
43 for i in $rdiff_vsincludes; do
51 [ $? = 0 ] || return 1
52 rdiff_vsincludes="$REPLY"
60 formBegin "$rdiff_title: excludes"
61 for ((i=0; i < ${#rdiff_excludes[@]} ; i++))
63 formItem exclude ${rdiff_excludes[$i]}
72 rdiff_excludes="$REPLY"
77 choose_host_or_vservers_or_both "$rdiff_title"
78 [ $? = 0 ] || return 1
79 case $host_or_vservers in
81 do_rdiff_host_includes
82 [ $? = 0 ] || return 1
86 [ $? = 0 ] || return 1
89 do_rdiff_host_includes
90 [ $? = 0 ] || return 1
92 [ $? = 0 ] || return 1
99 [ $? = 0 ] || return 1
111 while [ -z "$REPLY" -o -z "$rdiff_directory" -o -z "$rdiff_host" -o -z "$rdiff_user" ]
113 formBegin "$rdiff_title - destination: last three items are required"
114 formItem "keep" "$rdiff_keep"
115 formItem "dest_directory" "$rdiff_directory"
116 formItem "dest_host" "$rdiff_host"
117 formItem "dest_user" "$rdiff_user"
122 replyconverted=`echo $REPLY | tr '\n' :`
124 thereply=($replyconverted)
127 rdiff_keep=${thereply[0]}
128 rdiff_directory=${thereply[1]}
129 rdiff_host=${thereply[2]}
130 rdiff_user=${thereply[3]}
141 if [ "$_dest_done" = "" ]; then
142 msgBox "$rdiff_title: error" "You must first configure the destination."
144 elif [ "$rdiff_user" = "" ]; then
145 msgBox "$rdiff_title: error" "You must first configure the destination user."
147 elif [ "$rdiff_host" = "" ]; then
148 msgBox "$rdiff_title: error" "You must first configure the destination host."
151 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?"
155 if [ ! -f /root/.ssh/id_dsa.pub -a ! -f /root/.ssh/id_rsa.pub ]; then
156 echo "Creating local root's ssh key"
157 ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
158 echo "Done. hit return to continue"
162 ssh -o PreferredAuthentications=publickey $rdiff_host -l $rdiff_user "exit" 2> /dev/null
163 if [ $? -ne 0 ]; then
164 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."
165 ssh-copy-id -i /root/.ssh/id_[rd]sa.pub $rdiff_user@$rdiff_host
166 if [ $? -ne 0 ]; then
167 echo "FAILED: Couldn't copy root's public ssh key to authorized_keys of $rdiff_user@$rdiff_host."
168 ssh $rdiff_user@$rdiff_host 'test -w .ssh || test -w .'
170 echo "Hit return to continue."
173 0 ) msgBox "$rdiff_title: error" "Directories are writable: Probably just a typo the first time." ;;
174 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." ;;
175 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." ;;
176 * ) msgBox "$rdiff_title: error" "Unexpected error." ;;
180 echo "Done. hit return to continue"
184 echo "root@localhost is already in authorized_keys of $rdiff_user@$rdiff_host."
185 echo "Hit return to continue."
188 # test to see if the remote rdiff backup directory exists and is writable
189 echo "Testing to see if remote rdiff backup directory exists and is writable"
190 ssh $rdiff_user@$rdiff_host "test -d ${rdiff_directory}"
193 ssh $rdiff_user@$rdiff_host "test -w $rdiff_directory"
196 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."
202 booleanBox "Remote directory does not exist" "The destination backup directory does not exist, do you want me to create it for you?"
205 ssh $rdiff_user@$rdiff_host "mkdir -p ${rdiff_directory}"
207 echo "Hit return to continue."
211 msgBox "$rdiff_title: success" "Creation of the remote destination directory was a success!"
215 msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions."
219 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."
223 msgBox "$rdiff_title: error" "Unexpected error."
231 if [ $remote_status -ne 1 ]
238 echo "Testing to make sure destination has rdiff-backup installed and is compatible."
239 remote_result=`/usr/bin/rdiff-backup --test-server $rdiff_user@$rdiff_host::/ 2>&1 >&-`
242 echo $remote_result | grep -q "command not found"
245 if [ "$rdiff_user" = "root" ]
247 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?"
250 ssh $rdiff_user@$rdiff_host 'apt-get install rdiff-backup'
252 echo "Hit return to continue."
256 msgBox "$rdiff_title: success" "Installation of rdiff-backup was a success!"
260 msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to install the package for some reason."
263 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."
266 msgBox "$rdiff_title: error" "Unexpected error."
272 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?"
281 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?"
290 echo "SUCCESS: Everything looks good!"
291 echo "Hit return to continue."
300 get_next_filename $configdirectory/90.rdiff
301 cat > $next_filename <<EOF
303 # when = everyday at 02
310 if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]
314 for ((i=0; i < ${#rdiff_includes[@]} ; i++))
316 echo "include = ${rdiff_includes[$i]}" >> $next_filename
322 if [ "$host_or_vservers" == vservers -o "$host_or_vservers" == both ]
324 cat >> $next_filename <<EOF
326 # If vservers = yes in /etc/backupninja.conf then the following variables can
328 # vsnames = all | <vserver1> <vserver2> ... (default = all)
332 # Any path specified in vsinclude is added to the include list for each vserver
333 # listed in vsnames (or all if vsnames = all).
335 # For example, vsinclude = /home will backup the /home partition in every
336 # vserver listed in vsnames. If you have vsnames = "foo bar baz", this
337 # vsinclude will add to the include list /vservers/foo/home,
338 # /vservers/bar/home and /vservers/baz/home.
339 # Vserver paths are derived from $VROOTDIR.
344 echo -e "vsnames = \"$selected_vservers\"\n" >> $next_filename
345 for i in $rdiff_vsincludes; do
346 echo "vsinclude = $i" >> $next_filename
353 for ((i=0; i < ${#rdiff_excludes[@]} ; i++))
355 echo exclude = ${rdiff_excludes[$i]} >> $next_filename
358 cat >> $next_filename <<EOF
360 ######################################################
361 ## destination section
362 ## (where the files are copied to)
366 directory = $rdiff_directory
371 chmod 600 $next_filename
377 srcitem="choose files to include & exclude $_src_done"
378 destitem="configure backup destination $_dest_done"
379 conitem="set up ssh keys and test remote connection $_con_done"
380 advitem="edit advanced settings $_adv_done"
381 menuBox "$rdiff_title" "choose a step:" \
385 finish "finish and create config file"
390 "src") do_rdiff_src;;
391 "dest") do_rdiff_dest;;
392 "conn") do_rdiff_ssh_con;;
393 "adv") do_rdiff_adv;;
395 if [[ "$_con_done$_dest_done$_src_done" != "(DONE)(DONE)(DONE)" ]]; then
396 msgBox "$rdiff_title" "You cannot create the configuration file until the other steps are completed."
408 require_packages rdiff-backup
411 rdiff_title="rdiff-backup action wizard"
417 rdiff_directory=/backup/`hostname`
421 # Global variables whose '*' shall not be expanded
423 rdiff_includes=(/var/spool/cron/crontabs /var/backups /etc /root /home /usr/local/*bin /var/lib/dpkg/status*)
424 rdiff_excludes=(/home/*/.gnupg)