rdiff and dup handlers/helpers/examples symlink and globbing support enhancement
authorintrigeri <intrigeri@boum.org>
Sun, 4 Jun 2006 00:30:03 +0000 (00:30 +0000)
committerintrigeri <intrigeri@boum.org>
Sun, 4 Jun 2006 00:30:03 +0000 (00:30 +0000)
and clarification: for a given include/exclude/vsinclude statement, they now
support EITHER globbing with '*' OR symlinks in the path.

examples/example.dup
examples/example.rdiff
handlers/dup
handlers/dup.helper
handlers/rdiff
handlers/rdiff.helper

index b90655140c1b56626eb3f6fc2fd6ea82f11d9a66..f3d39812d2cdb57bb02870a27279928b58eb592c 100644 (file)
@@ -55,9 +55,11 @@ password = a_very_complicated_passphrase
 
 [source]
 
-# files to include in the backup
-# (supports globbing with '*')
+# WARNING: include, exclude and vsinclude statements support EITHER globbing
+# with '*' OR symlinks in the path; usage of both in the same statement is *not*
+# supported and will lead to weird behaviour.
 
+# files to include in the backup
 include = /var/spool/cron/crontabs
 include = /var/backups
 include = /etc
@@ -82,10 +84,8 @@ include = /var/lib/dpkg/status-old
 # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home
 # and /vservers/baz/home.
 # Vservers paths are derived from $VROOTDIR.
-# vsinclude supports globbing with '*'.
 
 # files to exclude from the backup
-# (supports globbing with '*')
 exclude = /home/*/.gnupg
 
 ######################################################
index 698776ea753b13951aa624d5b8568be82b18991a..dd2ac5e4825bc3d4c52c430fc464638993b186e2 100644 (file)
@@ -33,12 +33,14 @@ type = local
 # (you can also use the time format of rdiff-backup, e.g. 6D5h)
 keep = 60
 
-# a note about includes and excludes:
-# All the excludes come after all the includes. The order is
-# not otherwise taken into account. 
+# A few notes about includes and excludes:
+#   - include, exclude and vsinclude statements support EITHER globbing with '*'
+#     OR symlinks in the path; usage of both in the same statement is *not*
+#     supported and will lead to weird behaviour.
+#   - All the excludes come after all the includes. The order is not otherwise
+#     taken into account.
 
 # files to include in the backup
-# (supports globbing with '*')
 include = /var/spool/cron/crontabs
 include = /var/backups
 include = /etc
@@ -63,10 +65,8 @@ include = /var/lib/dpkg/status-old
 # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home
 # and /vservers/baz/home.
 # Vservers paths are derived from $VROOTDIR.
-# vsinclude supports globbing with '*'.
 
 # files to exclude from the backup
-# (supports globbing with '*')
 #exclude = /home/*/.gnupg
 
 ######################################################
index 59bb9bf082cd5c763cde9b6c9e7434f280c0d6c3..c16ec40f83da0984973898b4f912596725954144 100644 (file)
@@ -129,41 +129,49 @@ execstr_clientpart="/"
 
 set -o noglob
 
+symlinks_warning="Maybe you have mixed symlinks and '*' in this statement, which is not supported."
+
 # excludes
 for i in $exclude; do
-       str="${i//__star__/*}"
-       i=`readlink -f ${i#}`
-       execstr="${execstr}--exclude '$str' "
+   str="${i//__star__/*}"
+   str=`readlink -f $str`
+   if [ -n "$str" ]; then
+      execstr="${execstr}--exclude '$str' "
+   else
+      warning "exclude statement ${i//__star__/*} will be ignored. $symlinks_warning"
+   fi
 done
        
 # includes 
 for i in $include; do
-       str="${i//__star__/*}"
-       i=`readlink -f ${i#}`
-       execstr="${execstr}--include '$str' "
+   str="${i//__star__/*}"
+   str=`readlink -f $str`
+   if [ -n "$str" ]; then
+      execstr="${execstr}--include '$str' "
+   else
+      warning "include statement ${i//__star__/*} will be ignored. $symlinks_warning"
+   fi
 done
 
 # vsincludes
 if [ $usevserver = yes ]; then
-    for vserver in $vsnames; do
-       for vi in $vsinclude; do
-           i=`readlink -f $VROOTDIR/$vserver$vi`
-           str="${i//__star__/*}"
-           execstr="${execstr}--include '$VROOTDIR/$vserver$str' "
-       done
-    done
+   for vserver in $vsnames; do
+      for vi in $vsinclude; do
+        str="${vi//__star__/*}"
+        str=`readlink -f $VROOTDIR/$vserver$str`
+         if [ -n "$str" ]; then
+           execstr="${execstr}--include '$str' "
+         else
+            warning "vsinclude statement ${vi//__star__/*} will be ignored for VServer $vserver. $symlinks_warning"
+         fi
+      done
+   done
 fi
 
 set +o noglob
 
 ### EXECUTE ###
 
-# exclude everything else, start with root
-#execstr="${execstr}--exclude '**' / "
-               
-# include client-part and server-part
-#execstr="$execstr $execstr_serverpart"
-
 execstr=${execstr//\\*/\\\\\\*}
 
 debug "duplicity $execstr --exclude '**' / $execstr_serverpart"
index a18063dbd507de83a7e6b4f242a0c673c159ee6b..dbf964363b4e9be895e54631f37915495474db9a 100644 (file)
@@ -310,22 +310,11 @@ password = $dup_gpg_password
 
 [source]
 
+# WARNING: include, exclude and vsinclude statements support EITHER globbing
+# with '*' OR symlinks in the path; usage of both in the same statement is *not*
+# supported and will lead to weird behaviour.
+
 # files to include in the backup
-# (supports globbing with '*')
-# BIG FAT WARNING
-# Symlinks are not dereferenced. Moreover, an include line whose path
-# contains, at any level, a symlink to a directory, will only have the
-# symlink backed-up, not the target directory's content. Yes, you have
-# to dereference yourself the symlinks, or to use 'mount --bind'
-# instead.
-# EXAMPLE
-# Let's say /home is a symlink to /mnt/crypt/home ; the following line
-# will only backup a "/home" symlink ; neither /home/user nor
-# /home/user/Mail will be backed-up :
-#   include = /home/user/Mail
-# A workaround is to 'mount --bind /mnt/crypt/home /home' ; another
-# one is to write :
-#   include = /mnt/crypt/home/user/Mail
 EOF
 
    if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]; then
@@ -352,7 +341,6 @@ EOF
 # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home
 # and /vservers/baz/home.
 # Vservers paths are derived from $VROOTDIR.
-# vsinclude supports globbing with '*'.
 
 EOF
 
@@ -368,9 +356,7 @@ EOF
    # excludes
    cat >> $next_filename <<EOF
 
-# rdiff-backup specific comment, TO ADAPT
 # files to exclude from the backup
-# (supports globbing with '*')
 EOF
     set -o noglob
     for i in $dup_excludes; do
index a80b2c53c4f2fabe787c592a3e76e6ae6fdb68d5..8f0edfb558ffd6ef4bbe24caf8acc210629c11ae 100644 (file)
@@ -112,6 +112,7 @@ else
 fi
 
 # check the connection at the source and destination
+[ -n "$test" ] || test=0
 if [ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]; then
        test_connection $sourceuser $sourcehost
        test_connection $destuser $desthost
@@ -171,28 +172,42 @@ execstr="$RDIFFBACKUP $options --print-statistics "
 
 set -o noglob
 
+symlinks_warning="Maybe you have mixed symlinks and '*' in this statement, which is not supported."
+
 # TODO: order the includes and excludes
 # excludes
 for i in $exclude; do
-       str="${i//__star__/*}"
-       i=`readlink -f ${i#}`
-       execstr="${execstr}--exclude '$str' "
+   str="${i//__star__/*}"
+   str=`readlink -f $str`
+   if [ -n "$str" ]; then
+      execstr="${execstr}--exclude '$str' "
+   else
+      warning "exclude statement ${i//__star__/*} will be ignored. $symlinks_warning"
+   fi
 done
 # includes 
 for i in $include; do
-       [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'"
-       str="${i//__star__/*}"
-       i=`readlink -f $i`
-       execstr="${execstr}--include '$str' "
+   [ "$i" != "/" ] || fatal "Sorry, you cannot use 'include = /'"
+   str="${i//__star__/*}"
+   str=`readlink -f $str`
+   if [ -n "$str" ]; then
+      execstr="${execstr}--include '$str' "
+   else
+      warning "include statement ${i//__star__/*} will be ignored. $symlinks_warning"
+   fi
 done
 
 # vsinclude
 if [ $usevserver = yes ]; then
    for vserver in $vsnames; do
       for vi in $vsinclude; do
-        i=`readlink -f $VROOTDIR/$vserver$vi`
-        str="${i//__star__/*}"
-        execstr="${execstr}--include '$str' "
+        str="${vi//__star__/*}"
+        str=`readlink -f $VROOTDIR/$vserver$str`
+         if [ -n "$str" ]; then
+           execstr="${execstr}--include '$str' "
+         else
+            warning "vsinclude statement ${vi//__star__/*} will be ignored for VServer $vserver. $symlinks_warning"
+         fi
       done
    done
 fi
index d28375e718ad0c822aff2a1cf6ca231c9195124e..904ac98887555826ec69126dca6297475f9d8b96 100644 (file)
@@ -269,6 +269,14 @@ do_rdiff_finish() {
 [source]
 type = local
 keep = $rdiff_keep
+
+# A few notes about includes and excludes:
+#   - include, exclude and vsinclude statements support EITHER globbing with '*'
+#     OR symlinks in the path; usage of both in the same statement is *not*
+#     supported and will lead to weird behaviour.
+#   - All the excludes come after all the includes. The order is not otherwise
+#     taken into account.
+
 EOF
    ## includes ##
    if [ "$host_or_vservers" == host -o "$host_or_vservers" == both ]; then
@@ -296,7 +304,6 @@ EOF
 # vsinclude will add to the include list /vservers/foo/home, /vservers/bar/home
 # and /vservers/baz/home.
 # Vservers paths are derived from $VROOTDIR.
-# vsinclude supports globbing with '*'.
 
 EOF
       set -o noglob