Skip to content
Snippets Groups Projects
rdiff.helper 5.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    HELPERS="$HELPERS rdiff:incremental_remote_filesystem_backup"
    
    
    elijah's avatar
    elijah committed
    declare -a rdiff_includes
    declare -a rdiff_excludes
    
    
    elijah's avatar
    elijah committed
      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]}
    
    elijah's avatar
    elijah committed
      set +o noglob
    
    elijah's avatar
    elijah committed
      #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)
    
    elijah's avatar
    elijah committed
      _src_done="(DONE)"
      setDefault dest
      set +o noglob
    
    elijah's avatar
    elijah committed
      IFS=$' \t\n'
    
    elijah's avatar
    elijah committed
        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
    
    elijah's avatar
    elijah committed
        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
    
    elijah's avatar
    elijah committed
          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 .'
    
    elijah's avatar
    elijah committed
          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." ;;
    
    elijah's avatar
    elijah committed
            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() {
    
    elijah's avatar
    elijah committed
       get_next_filename $configdirectory/90.rdiff
       cat > $next_filename <<EOF
    
    # options = --force
    # when = everyday at 02
    
    
    elijah's avatar
    elijah committed
    [source]
    type = local
    
    elijah's avatar
    elijah committed
    EOF
    
    elijah's avatar
    elijah committed
        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
    
    elijah's avatar
    elijah committed
    [dest]
    type = remote
    
    directory = $rdiff_directory
    host = $rdiff_host
    user = $rdiff_user
    
    elijah's avatar
    elijah committed
    EOF
    
    elijah's avatar
    elijah committed
    }
    
      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
    
    elijah's avatar
    elijah committed
      require_packages rdiff-backup
    
      _src_done=
      _dest_done=
      _con_done=
      _adv_done=
      rdiff_keep=60D
      rdiff_directory=/backup/`hostname`
      rdiff_user=
      rdiff_host=
    
    elijah's avatar
    elijah committed
      rdiff_includes=(/var/spool/cron/crontabs /var/backups /etc /root /home /usr/local/*bin /var/lib/dpkg/status*)
      rdiff_excludes=(/home/*/.gnupg)