]> git.llucax.com Git - software/bacap.git/blobdiff - bacap
Avoid creation of dangling symlinks
[software/bacap.git] / bacap
diff --git a/bacap b/bacap
index 22578482a3cd41129538a1abda3c861bc3c96876..8be3167341569d5d86e13c3c8e1d0893ce619cde 100755 (executable)
--- a/bacap
+++ b/bacap
@@ -35,7 +35,7 @@ DATE_FMT="%Y-%m-%d"
 PING_CHECK=1
 
 # rsync flags to use
 PING_CHECK=1
 
 # rsync flags to use
-RSYNC_FLAGS="-aAXHx --numeric-ids --delete"
+RSYNC_FLAGS="-aAXHx --numeric-ids"
 
 # rsync flags to use when in verbose mode
 RSYNC_VERBOSE_FLAGS="-v --stats"
 
 # rsync flags to use when in verbose mode
 RSYNC_VERBOSE_FLAGS="-v --stats"
@@ -103,6 +103,7 @@ do
        source "$host_path/bacaprc" 2>/dev/null
        host=`basename "$host_path"`
        host_backup_path="$BACKUP_PATH/$host"
        source "$host_path/bacaprc" 2>/dev/null
        host=`basename "$host_path"`
        host_backup_path="$BACKUP_PATH/$host"
+       mkdir -p $host_backup_path
        dst="$BACKUP_PATH/$host/$date"
        src=`cat "$host_path/paths"`
        [ "$host" != "$LOCALHOST" ] &&
        dst="$BACKUP_PATH/$host/$date"
        src=`cat "$host_path/paths"`
        [ "$host" != "$LOCALHOST" ] &&
@@ -113,7 +114,7 @@ do
        current_dir="$host_backup_path/`readlink \"$current_link\"`"
        extra_flags=
        plog "-----------------------------------------------------------------"
        current_dir="$host_backup_path/`readlink \"$current_link\"`"
        extra_flags=
        plog "-----------------------------------------------------------------"
-       plog "Backup for host $host"
+       plog "Backup for host $host started at `date '+%Y-%m-%d %H:%M:%S'`"
        plog "-----------------------------------------------------------------"
        plog "Source:      $src"
        plog "Destination: $dst"
        plog "-----------------------------------------------------------------"
        plog "Source:      $src"
        plog "Destination: $dst"
@@ -126,20 +127,38 @@ do
                perror "$host is down, skipping..." &&
                continue
        [ -r "$exclude" ] &&
                perror "$host is down, skipping..." &&
                continue
        [ -r "$exclude" ] &&
-               extra_flags="--exclude-from=$exclude --delete-excluded"
+               extra_flags="--exclude-from=$exclude"
        [ -r "$include" ] &&
                extra_flags="$extra_flags --include-from=$include"
        plog "Running rsync..."
        $run rsync $RSYNC_FLAGS $extra_flags \
        [ -r "$include" ] &&
                extra_flags="$extra_flags --include-from=$include"
        plog "Running rsync..."
        $run rsync $RSYNC_FLAGS $extra_flags \
-                               --link-dest="$current_dir" $src "$dst/" ||
-               ret=$(($ret+1))
-       plog "Moving current..."
-       $run rm $V "$current_link" ||
+                               --link-dest="$current_dir" $src "$dst/"
+       rsync_ret=$?
+       case $rsync_ret in
+               0)
+                       # Normal return
+                       ;;
+               24)
+                       # Ignore error 24 from rsync ("Partial transfer due to
+                       # vanished source files") which is somewhat expected
+                       # since we don't do a snapshot
+                       ;;
+               *)
+                       # Any other error is important enough
+                       ret=$(($ret+1))
+                       ;;
+       esac
+
+       if [ $ret -eq $saved_ret ]
+       then
+               # Only move current if rsync did not fail, to avoid dangling
+               # symlinks
+               plog "Moving current..."
+               $run rm -f $V "$current_link" ||
                ret=$(($ret+1))
                ret=$(($ret+1))
-       $run ln -s $V "$date" "$current_link" ||
+               $run ln -s $V "$date" "$current_link" ||
                ret=$(($ret+1))
                ret=$(($ret+1))
-       if [ $ret -ne $saved_ret ]
-       then
+       else
                ERROR_HOSTS="$ERROR_HOSTS $host"
        fi
 done
                ERROR_HOSTS="$ERROR_HOSTS $host"
        fi
 done