Skip to content
Snippets Groups Projects
rdiff 5.54 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
    
    elijah's avatar
    elijah committed
    #
    # rdiff-backup handler script for backupninja
    # requires rdiff-backup
    #
    
    
    elijah's avatar
    elijah committed
    ### FUNCTIONS ###
    
    function test_connection() {
    	# given a user and host,
    	# tests the connection.
    	# if user or host is missing, returns 0
    	# (ie, assume it's a local connection).
    	if [ $# -lt 2 ]; then
    		debug "(local is assumed to be a good connection)"
    		return 0
    	fi
    	local user=$1
    	local host=$2
    	debug "ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'"
    	local ret=`ssh -o PasswordAuthentication=no $host -l $user 'echo -n host is alive'`
    	if echo $ret | grep "host is alive"; then
    		debug "Connected to $host as $user successfully"
    	else
    		fatal "Can't connect to $host as $user."
    	fi
    }
    
    function get_version() {
    	# given no arguments, returns the local version.
    	# given a user and host, returns the remote version.
    	# if user or host is missing, returns the local version.
    	if [ "$#" -lt 2 ]; then
    		debug "$RDIFFBACKUP -V"
    		echo `$RDIFFBACKUP -V`
    	else
    		local user=$1
    		local host=$2
    		debug "ssh $host -l $user '$RDIFFBACKUP -V'"
    		echo `ssh $host -l $user "$RDIFFBACKUP -V | grep rdiff-backup"`
    	fi
    }
    
    function check_consistency() {
    	local section=$1
    	local type=$2
    	local user=$3
    	local host=$4
    	if [ "$type" == "local" ]; then
    		if [ "$user" != "" ]; then
    			warning "User should not be specified for local $section."
    		fi
    		if [ "$host" != "" ]; then
    			warning "Host should not be specified for local $section."
    		fi
    	fi
    	if [ "$type" == "remote" ]; then
    		if [ "$user" == "" ]; then
    			fatal "User must be specified for remote $section."
    		fi
    		if [ "host" == "" ]; then
    			fatal "Host must be specifed for remote $section."
    		fi
    	fi
    }
    
    ### GET CONFIG ###
    
    
    getconf options
    
    getconf testconnect yes
    getconf nicelevel 0
    
    elijah's avatar
    elijah committed
    setsection source
    getconf type; sourcetype=$type
    
    elijah's avatar
    elijah committed
    getconf user; sourceuser=$user
    getconf host; sourcehost=$host
    check_consistency "source" "$type" "$user" "$host"
    
    elijah's avatar
    elijah committed
    getconf label
    
    getconf keep 60
    
    elijah's avatar
    elijah committed
    getconf include
    
    micah's avatar
    micah committed
    getconf vsinclude
    
    elijah's avatar
    elijah committed
    getconf exclude
    
    setsection dest
    getconf directory; destdir=$directory
    # strip trailing /
    destdir=${destdir%/}
    getconf type; desttype=$type
    getconf user; destuser=$user
    getconf host; desthost=$host
    
    elijah's avatar
    elijah committed
    check_consistency "destination" "$type" "$user" "$host"
    
    ### CHECK CONFIG ###
    
    elijah's avatar
    elijah committed
    
    
    # If vservers are configured, check that the ones listed in $vsnames do exist.
    
    if [ $vservers_are_available = yes ]; then
       if [ "$vsnames" = all ]; then
          vsnames="$found_vservers"
       else
          if ! vservers_exist "$vsnames" ; then
                fatal "At least one of the vservers listed in vsnames ($vsnames) does not exist."
          fi
       fi
       if [ -n "$vsinclude" ]; then
          info "Using vservers '$vsnames'"
          usevserver=yes
       fi
    else
       [ -z "$vsinclude" ] || warning 'vservers support disabled in backupninja.conf, vsincludes configuration lines will be ignored'
    
    elijah's avatar
    elijah committed
    # check the connection at the source and destination
    
    if [ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]; then
    
    elijah's avatar
    elijah committed
    	test_connection $sourceuser $sourcehost
    	test_connection $destuser $desthost
    
    elijah's avatar
    elijah committed
    fi
    
    
    elijah's avatar
    elijah committed
    # see that rdiff-backup has the same version at the source and destination
    sourceversion=`get_version $sourceuser $sourcehost`
    destversion=`get_version $destuser $desthost`
    if [ "$sourceversion" != "$destversion" ]; then
    	fatal "rdiff-backup does not have the same version at the source and at the destination."
    fi
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    # source specific checks
    
    micah's avatar
    micah committed
    [ "$include" != "" -o "$vsinclude" != "" ] || fatal "No source includes specified"
    
    elijah's avatar
    elijah committed
    case $sourcetype in 
    	remote ) execstr_sourcepart="$sourceuser@$sourcehost::/" ;;
    	local  ) execstr_sourcepart="/" ;;
    	*      ) fatal "sourcetype '$sourcetype' is neither local nor remote" ;;
    esac
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    # destination specific checks
    [ "$destdir" != "" ] || fatal "Destination directory not set"
    case $desttype in 
    	remote ) execstr_destpart="$destuser@$desthost::$destdir/$label" ;;
    	local  ) execstr_destpart="$destdir/$label" ;;
    	*      ) fatal "desttype '$desttype' is neither local nor remote" ;;
    esac
    
    elijah's avatar
    elijah committed
    	
    
    elijah's avatar
    elijah committed
    ### REMOVE OLD BACKUPS ###
    
    elijah's avatar
    elijah committed
    
    
    if [ "`echo $keep | tr -d 0-9`" == "" ]; then
    
    elijah's avatar
    elijah committed
    	# add D if no other date unit is specified
    
    elijah's avatar
    elijah committed
    removestr="$RDIFFBACKUP --force --remove-older-than $keep "
    
    if [ "$desttype" == "remote" ]; then
    	removestr="${removestr}${destuser}@${desthost}::"
    fi
    removestr="${removestr}${destdir}/${label}";
    
    
    if [ ! $test ]; then
    
    elijah's avatar
    elijah committed
    	if [ $? = 0 ]; then
    
    		debug $output
    		info "Removing backups older than $keep days succeeded."
    	else
    		warning $output
    		warning "Failed removing backups older than $keep."
    
    elijah's avatar
    elijah committed
    	fi
    fi
    
    
    elijah's avatar
    elijah committed
    ### EXECUTE ###
    
    execstr="$RDIFFBACKUP $options --print-statistics "
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    # TODO: order the includes and excludes
    # excludes
    
    elijah's avatar
    elijah committed
    	str="${i//__star__/*}"
    	execstr="${execstr}--exclude '$str' "
    done
    # includes 
    
    elijah's avatar
    elijah committed
    	[ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'"
    
    elijah's avatar
    elijah committed
    	str="${i//__star__/*}"
    	execstr="${execstr}--include '$str' "
    done
    
    
    micah's avatar
    micah committed
    # vsinclude
    
    if [ $usevserver = yes ]; then
    
       for vserver in $vsnames; do
          for vi in $vsinclude; do
    
    	 str="${vi//__star__/*}"
    	 execstr="${execstr}--include '$VROOTDIR/$vserver$str' "
          done
       done
    
    elijah's avatar
    elijah committed
    # exclude everything else
    execstr="${execstr}--exclude '/*' "
    		
    # include client-part and server-part
    
    elijah's avatar
    elijah committed
    execstr="${execstr}$execstr_sourcepart $execstr_destpart"
    
    elijah's avatar
    elijah committed
    
    
    elijah's avatar
    elijah committed
    if [ ! $test ]; then
    
    	output=`nice -n $nicelevel su -c "$execstr" 2>&1`
    
    elijah's avatar
    elijah committed
    	if [ $? = 0 ]; then
    
    elijah's avatar
    elijah committed
    		debug $output
    
    		info "Successfully finished backing up source $label"
    
    elijah's avatar
    elijah committed
    	else
    
    elijah's avatar
    elijah committed
    		warning $output
    
    		warning "Failed backup up source $label"
    
    elijah's avatar
    elijah committed
    	fi
    fi	
    
    return 0