r261@crapouille: intrigeri | 2005-12-28 20:59:01 +0100
[matthijs/upstream/backupninja.git] / handlers / rdiff.helper
index 0bd982c3d415b3b6d79689c13e6f10c273936750..fa61e3f4ee1e3904a3c14f3af011e0cfe74af5cf 100644 (file)
+# -*- mode: sh; sh-basic-offset: 8; indent-tabs-mode: nil; -*-
+
 HELPERS="$HELPERS rdiff:incremental_remote_filesystem_backup"
 
 declare -a rdiff_includes
 declare -a rdiff_excludes
 
-do_rdiff_dest() {
-  set -o noglob
-  formBegin "rdiff action wizard"
-    formItem "keep" "$rdiff_keep"
-    formItem "dest_directory" "$rdiff_directory"
-    formItem "dest_host" "$rdiff_host"
-    formItem "dest_user" "$rdiff_user"
-  formDisplay
-  [ $? = 1 ] && return;
-
-  IFS=$''
-  replyconverted=`echo $REPLY | tr '\n' :`
-  IFS=$':'
-  thereply=($replyconverted)
-  IFS=$' \t\n'
-  
-  rdiff_keep=${thereply[0]}
-  rdiff_directory=${thereply[1]}
-  rdiff_host=${thereply[2]}
-  rdiff_user=${thereply[3]}
+# FUNCTIONS
 
-  _dest_done="(DONE)"
-  setDefault conn
-  set +o noglob
+do_rdiff_host_includes() {
+   set -o noglob
+   # choose the files to backup
+   REPLY=
+   while [ -z "$REPLY" ]
+   do
+     formBegin "$rdiff_title - host system: includes"
+        for ((i=0; i < ${#rdiff_includes[@]} ; i++))
+        do
+          formItem include ${rdiff_includes[$i]}
+        done
+        formItem include 
+        formItem include 
+        formItem include 
+        formDisplay
+     [ $? = 0 ] || return
+     unset rdiff_includes
+     rdiff_includes="$REPLY"
+   done
+ set +o noglob
 }
 
-do_rdiff_src() {
-  #echo ${rdiff_includes[@]}
-  set -o noglob
-  formBegin "rdiff action wizard: includes"
-    for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
-       formItem include ${rdiff_includes[$i]}
-    done
-    formItem include 
-    formItem include 
-    formItem include 
-  formDisplay
-  [ $? = 1 ] && return;
+do_rdiff_vserver() {
+   # choose the vservers to backup (into $selected_vservers)
+   choose_one_or_more_vservers "$rdiff_title"
+   [ $? = 0 ] || return 1
 
-  unset rdiff_includes
-  rdiff_includes=($REPLY)
+   set -o noglob
+   # choose the files to backup
+   REPLY=
 
-  formBegin "rdiff action wizard: excludes" 
-    for ((i=0; i < ${#rdiff_excludes[@]} ; i++)); do
+   while [ -z "$REPLY" ]; do
+      formBegin "$rdiff_title - vsincludes (backup these directories from every vserver)"
+         [ -z "$rdiff_vsincludes" ] && rdiff_vsincludes="$rdiff_default_includes"
+   
+        for i in $rdiff_vsincludes; do
+            formItem include "$i"
+        done
+        
+        formItem include ""
+        formItem include ""
+        formItem include ""
+                formDisplay
+      [ $? = 0 ] || return 1
+      rdiff_vsincludes="$REPLY"
+   done
+   
+   set +o noglob
+}
+
+do_rdiff_excludes() {
+   set -o noglob
+   formBegin "$rdiff_title: excludes" 
+     for ((i=0; i < ${#rdiff_excludes[@]} ; i++))
+     do
        formItem exclude ${rdiff_excludes[$i]}
-    done
-    formItem exclude 
-    formItem exclude 
-  formDisplay
-  [ $? = 1 ] && return;
+     done
+     
+     formItem exclude 
+     formItem exclude 
+     formDisplay
+   
+   [ $? = 0 ] || return
+   unset rdiff_excludes
+   rdiff_excludes="$REPLY"
+   set +o noglob
+}
 
-  unset rdiff_excludes
-  rdiff_excludes=($REPLY)
+do_rdiff_src() {
+   choose_host_or_vservers_or_both "$rdiff_title"
+   [ $? = 0 ] || return 1
+   case $host_or_vservers in
+       'host')
+              do_rdiff_host_includes
+              [ $? = 0 ] || return 1
+              ;;
+       'vservers')
+              do_rdiff_vserver
+              [ $? = 0 ] || return 1
+              ;;
+       'both')
+              do_rdiff_host_includes
+              [ $? = 0 ] || return 1
+              do_rdiff_vserver
+              [ $? = 0 ] || return 1
+               ;;
+       *)
+              return 1
+              ;;
+        esac
+       do_rdiff_excludes
+       [ $? = 0 ] || return 1
+       _src_done="(DONE)"
+       setDefault dest
+}
+
+do_rdiff_dest() {
    
-  _src_done="(DONE)"
-  setDefault dest
+   local replyconverted
+   local thereply
+   
+   set -o noglob
+   REPLY=
+   while [ -z "$REPLY" -o -z "$rdiff_directory" -o -z "$rdiff_host" -o -z "$rdiff_user" ] 
+   do
+     formBegin "$rdiff_title - destination: last three items are required"
+       formItem "keep" "$rdiff_keep"
+       formItem "dest_directory" "$rdiff_directory"
+       formItem "dest_host" "$rdiff_host"
+       formItem "dest_user" "$rdiff_user"
+       formDisplay
+     [ $? = 0 ] || return
+
+     IFS=$''
+     replyconverted=`echo $REPLY | tr '\n' :`
+     IFS=$':'
+     thereply=($replyconverted)
+     IFS=$' \t\n'
+  
+     rdiff_keep=${thereply[0]}
+     rdiff_directory=${thereply[1]}
+     rdiff_host=${thereply[2]}
+     rdiff_user=${thereply[3]}
+  
+  done
   set +o noglob
+  
+  _dest_done="(DONE)"
+  setDefault conn
 }
-
-do_ssh_con() {
+       
+do_rdiff_ssh_con() {
   IFS=$' \t\n'
   if [ "$_dest_done" = "" ]; then
-    msgBox "rdiff action wizard: error" "You must first configure the destination."
+    msgBox "$rdiff_title: error" "You must first configure the destination."
     return
   elif [ "$rdiff_user" = "" ]; then
-    msgBox "rdiff action wizard: error" "You must first configure the destination user."
+    msgBox "$rdiff_title: error" "You must first configure the destination user."
     return
   elif [ "$rdiff_host" = "" ]; then
-    msgBox "rdiff action wizard: error" "You must first configure the destination host."
+    msgBox "$rdiff_title: error" "You must first configure the destination host."
     return
   else
-    booleanBox "rdiff action wizard" "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?"
-    [ $? = 1 ] && return
+    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?"
+    [ $? = 0 ] || return
   fi
 
   if [ ! -f /root/.ssh/id_dsa.pub -a ! -f /root/.ssh/id_rsa.pub ]; then
@@ -96,10 +172,10 @@ do_ssh_con() {
       echo "Hit return to continue."
       read
       case $result in
-        0 )   msgBox "rdiff action wizard: error" "Directories are writable: Probably just a typo the first time." ;;
-        1 )   msgBox "rdiff action wizard: error" "Connected successfully to $rdiff_user@$rdiff_host, but unable to write. Check ownership and modes of ~$rdiff_user on $rdiff_host." ;;
-        255 ) msgBox "rdiff action wizard: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." ;;
-        * )   msgBox "rdiff action wizard: error" "Unexpected error." ;;
+        0 )   msgBox "$rdiff_title: error" "Directories are writable: Probably just a typo the first time." ;;
+        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." ;;
+        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." ;;
+        * )   msgBox "$rdiff_title: error" "Unexpected error." ;;
       esac 
       return
     else
@@ -134,19 +210,19 @@ do_ssh_con() {
                read
                case $result in
                        0)   
-                               msgBox "rdiff action wizard: success" "Creation of the remote destination directory was a success!" 
+                               msgBox "$rdiff_title: success" "Creation of the remote destination directory was a success!" 
                                remote_status=0
                        ;;
                        1)   
-                               msgBox "rdiff action wizard: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions." 
+                               msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to create the destination directory, check the directory permissions." 
                                remote_status=1
                        ;;
                        255) 
-                               msgBox "rdiff action wizard: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." 
+                               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." 
                                remote_status=1
                        ;;
                        *)   
-                               msgBox "rdiff action wizard: error" "Unexpected error." 
+                               msgBox "$rdiff_title: error" "Unexpected error." 
                                remote_status=1
                        ;;
                        esac 
@@ -179,17 +255,17 @@ do_rdiff_con() {
                                read
                                case $result in
                                        0)   
-                                               msgBox "rdiff action wizard: success" "Installation of rdiff-backup was a success!" 
+                                               msgBox "$rdiff_title: success" "Installation of rdiff-backup was a success!" 
                                                do_rdiff_con
                                        ;;
                                        1)   
-                                               msgBox "rdiff action wizard: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to install the package for some reason." 
+                                               msgBox "$rdiff_title: error" "Connected successfully to $rdiff_user@$rdiff_host, but was unable to install the package for some reason." 
                                        ;;
                                        255) 
-                                               msgBox "rdiff action wizard: error" "Failed to connect to $rdiff_user@$rdiff_host. Check hostname, username, and password. Also, make sure sshd is running on the destination host." 
+                                               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." 
                                        ;;
                                        *)   
-                                               msgBox "rdiff action wizard: error" "Unexpected error." 
+                                               msgBox "$rdiff_title: error" "Unexpected error." 
                                        ;;
                                esac 
                                return
@@ -232,15 +308,60 @@ do_rdiff_finish() {
 type = local
 keep = $rdiff_keep
 EOF
-    set -o noglob
-    for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
-        echo "include = ${rdiff_includes[$i]}" >> $next_filename
-    done
-    for ((i=0; i < ${#rdiff_excludes[@]} ; i++)); do
-        echo exclude = ${rdiff_excludes[$i]} >> $next_filename
-    done
-    set +o noglob
-    cat >> $next_filename <<EOF
+
+   if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]
+   then
+       set -o noglob
+       
+       for ((i=0; i < ${#rdiff_includes[@]} ; i++))
+       do
+         echo "include = ${rdiff_includes[$i]}" >> $next_filename
+       done
+       
+       set +o noglob
+   fi
+
+   if [ "$host_or_vservers" == vservers -o "$host_or_vservers" == both ]
+   then      
+       cat >> $next_filename <<EOF
+#
+# If vservers = yes in /etc/backupninja.conf then the following variables can
+# be used:
+# vsnames = all | <vserver1> <vserver2> ... (default = all)
+# vsinclude = <path>
+# vsinclude = <path>
+# ...
+# Any path specified in vsinclude is added to the include list for each vserver
+# listed in vsnames (or all if vsnames = all).
+#
+# For example, vsinclude = /home will backup the /home partition in every 
+# vserver listed in vsnames. If you have vsnames = "foo bar baz", this
+# vsinclude will add to the include list /vservers/foo/home, 
+# /vservers/bar/home and /vservers/baz/home.
+# Vserver paths are derived from $VROOTDIR.
+
+EOF
+
+       set -o noglob
+       echo -e "vsnames = \"$selected_vservers\"\n" >> $next_filename
+       for i in $rdiff_vsincludes; do
+           echo "vsinclude = $i" >> $next_filename
+       done
+       set +o noglob
+   fi
+   
+   # excludes
+
+   for ((i=0; i < ${#rdiff_excludes[@]} ; i++))
+   do
+     echo exclude = ${rdiff_excludes[$i]} >> $next_filename
+   done
+   set +o noglob
+       cat >> $next_filename <<EOF
+
+######################################################
+## destination section
+## (where the files are copied to)
   
 [dest]
 type = remote
@@ -248,6 +369,7 @@ directory = $rdiff_directory
 host = $rdiff_host
 user = $rdiff_user
 EOF
+
    chmod 600 $next_filename
 }
 
@@ -258,22 +380,22 @@ rdiff_main_menu() {
     destitem="configure backup destination $_dest_done"
     conitem="set up ssh keys and test remote connection $_con_done"
     advitem="edit advanced settings $_adv_done"
-    menuBox "rdiff action wizard" "choose a step:" \
+    menuBox "$rdiff_title" "choose a step:" \
         src "$srcitem" \
         dest "$destitem" \
         conn "$conitem" \
         finish "finish and create config file"
-    [ $? = 1 ] && return;
+    [ $? = 0 ] || return
     result="$REPLY"
 
     case "$result" in
        "src") do_rdiff_src;;
        "dest") do_rdiff_dest;;
-       "conn") do_ssh_con;;
+       "conn") do_rdiff_ssh_con;;
        "adv") do_rdiff_adv;;
        "finish")
           if [[ "$_con_done$_dest_done$_src_done" != "(DONE)(DONE)(DONE)" ]]; then
-            msgBox "rdiff action wizard" "You cannot create the configuration file until the other steps are completed."
+            msgBox "$rdiff_title" "You cannot create the configuration file until the other steps are completed."
           else
             do_rdiff_finish
             return
@@ -286,6 +408,9 @@ rdiff_main_menu() {
 
 rdiff_wizard() {
   require_packages rdiff-backup
+  
+  # Global variables
+  rdiff_title="rdiff-backup action wizard"
   _src_done=
   _dest_done=
   _con_done=
@@ -294,8 +419,14 @@ rdiff_wizard() {
   rdiff_directory=/backup/`hostname`
   rdiff_user=
   rdiff_host=
+  
+  # Global variables whose '*' shall not be expanded
+  set -o noglob
   rdiff_includes=(/var/spool/cron/crontabs /var/backups /etc /root /home /usr/local/*bin /var/lib/dpkg/status*)
   rdiff_excludes=(/home/*/.gnupg)
+  rdiff_vsincludes=
+  set +o noglob
+  
   rdiff_main_menu
 }