fixed many bugs in rdiff.helper
[matthijs/upstream/backupninja.git] / handlers / rdiff.helper
index 83549ecaa3af9fdc6e8a088982defb84da2c154a..066d53aecc3e663e23aaa6731a41aa5db79b979e 100644 (file)
 
-rdiff_wizard() {
-   require_packages rdiff-backup
-   startForm "rdiff action wizard"
-     formItem "keep" "60D"
-     formItem "dest_directory" "/backups/mybackup"
-     formItem "dest_host" "backuphost"
-     formItem "dest_user" "backupuser"
-   displayForm
-
-   [ $? = 1 ] && return;
-       
-   set -- $REPLY
-       keep=$1
-       directory=$2
-       host=$3
-       user=$4
-       
-   startForm "rdiff action wizard: includes"
-     formItem include /var/spool/cron/crontabs
-     formItem include /var/backups
-     formItem include /etc
-     formItem include /root
-     formItem include /home
-     formItem include '/usr/local/*bin'
-     formItem include '/var/lib/dpkg/status*'
-     formItem include 
-     formItem include 
-     formItem include 
-   displayForm
-
-   [ $? = 1 ] && return;
-   includes=   
-   set -o noglob
-   for i in $REPLY; do
-      [ "$i" != "_empty_" ] && includes="$includes\ninclude = $i"
-   done
-   set +o noglob
+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]}
+
+  _dest_done="(DONE)"
+  setDefault conn
+  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;
+
+  unset rdiff_includes
+  rdiff_includes=($REPLY)
+
+  formBegin "rdiff action wizard: excludes" 
+    for ((i=0; i < ${#rdiff_excludes[@]} ; i++)); do
+       formItem exclude ${rdiff_excludes[$i]}
+    done
+    formItem exclude 
+    formItem exclude 
+  formDisplay
+  [ $? = 1 ] && return;
+
+  unset rdiff_excludes
+  rdiff_excludes=($REPLY)
    
-   startForm "rdiff action wizard: excludes" 
-     formItem exclude '/home/*/.gnupg'
-     formItem exclude 
-     formItem exclude 
-   displayForm
-
-   [ $? = 1 ] && return;
-
-   excludes=
-   set -o noglob
-   for i in $REPLY; do
-      [ "$i" != "_empty_" ] && excludes="$excludes\nexclude = $i"
-   done
-   set +o noglob
-      
+  _src_done="(DONE)"
+  setDefault dest
+  set +o noglob
+}
+
+do_rdiff_con() {
+  IFS=$' \t\n'
+  if [ "$_dest_done" = "" ]; then
+    msgBox "rdiff action wizard: error" "You must first configure the destination."
+    return
+  elif [ "$rdiff_user" = "" ]; then
+    msgBox "rdiff action wizard: 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."
+    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. Are you sure you want to continue?"
+    [ $? = 1 ] && return
+  fi
+
+  if [ ! -f /root/.ssh/id_dsa.pub -a ! -f /root/.ssh/id_rsa.pub ]; then
+    echo "Creating local root's ssh key"
+    ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
+    echo "Done. hit return to continue"
+    read
+  fi
+  
+  ssh -o PreferredAuthentications=publickey $rdiff_host -l $rdiff_user "exit" 2> /dev/null
+  if [ $? -ne 0 ]; then
+    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."
+    ssh-copy-id -i /root/.ssh/id_[rd]sa.pub $rdiff_user@$rdiff_host
+    if [ $? -ne 0 ]; then
+      echo "FAILED: Couldn't copy root's public ssh key to authorized_keys of $rdiff_user@$rdiff_host."
+      ssh $rdiff_user@$rdiff_host 'test -w .ssh || test -w .'
+      result=$?
+      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." ;;
+      esac 
+      return
+    else
+      echo "Done. hit return to continue"
+      read
+    fi
+  else
+    echo "root@localhost is already in authorized_keys of $rdiff_user@$rdiff_host. hit return to continue"
+    read
+  fi
+  _con_done="(DONE)"
+  setDefault finish
+}
+
+do_rdiff_finish() {
    get_next_filename $configdirectory/90.rdiff
    cat > $next_filename <<EOF
+# options = --force
+# when = everyday at 02
+
 [source]
 type = local
-keep = $keep
+keep = $rdiff_keep
 EOF
-   echo -e "$includes" >> $next_filename
-   echo -e "$excludes" >> $next_filename
-   cat >> $next_filename <<EOF
-
+    set -o noglob
+    for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
+        echo include = ${rdiff_includes[$i]}
+    done
+    for ((i=0; i < ${#rdiff_includes[@]} ; i++)); do
+        echo exclude = ${rdiff_excludes[$i]}
+    done
+    set +o noglob
+    cat >> $next_filename <<EOF
+  
 [dest]
 type = remote
-directory = $directory
-host = $host
-user = $user
+directory = $rdiff_directory
+host = $rdiff_host
+user = $rdiff_user
 EOF
    chmod 000 $next_filename
 }
+
+rdiff_main_menu() {
+
+  while true; do
+    srcitem="choose files to include & exclude $_src_done"
+    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:" \
+        src "$srcitem" \
+        dest "$destitem" \
+        conn "$conitem" \
+        finish "finish and create config file"
+    [ $? = 1 ] && return;
+    result="$REPLY"
+
+    case "$result" in
+       "src") do_rdiff_src;;
+       "dest") do_rdiff_dest;;
+       "conn") do_rdiff_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."
+          else
+            do_rdiff_finish
+            return
+          fi
+          ;;
+    esac
+
+  done
+}
+
+rdiff_wizard() {
+  require_packages rdiff-backup
+  _src_done=
+  _dest_done=
+  _con_done=
+  _adv_done=
+  rdiff_keep=60D
+  rdiff_directory=/backup/`hostname`
+  rdiff_user=
+  rdiff_host=
+  rdiff_includes=(/var/spool/cron/crontabs /var/backups /etc /root /home /usr/local/*bin /var/lib/dpkg/status*)
+  rdiff_excludes=(/home/*/.gnupg)
+  rdiff_main_menu
+}
+