1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
Common subdirectories: flexbackup-1.2.1-r3/contrib and flexbackup-1.2.1-r4/contrib
diff -ubB flexbackup-1.2.1-r3/flexbackup flexbackup-1.2.1-r4/flexbackup
--- flexbackup-1.2.1-r3/flexbackup 2007-04-14 17:03:34.000000000 -0400
+++ flexbackup-1.2.1-r4/flexbackup 2007-04-14 17:09:48.000000000 -0400
@@ -442,7 +442,7 @@
# Get rid of trailing /
$dir = &nuke_trailing_slash($dir);
- # If level is icremental for the set, each dir might
+ # If level is incremental for the set, each dir might
# have a different numeric level
if (!defined($::set_incremental)) {
$level = $::level;
@@ -3090,7 +3090,7 @@
push(@::remoteprogs, $::path{'mbuffer'});
my $megs = $cfg::buffer_megs . "M";
- my $bufcmd = "$::path{mbuffer} -q -m $megs -p $cfg::buffer_fill_pct $mbuffer_blk_flag ";
+ my $bufcmd = "$::path{mbuffer} -q -m $megs -P $cfg::buffer_fill_pct $mbuffer_blk_flag ";
$::buffer_cmd = " | $bufcmd";
$::write_cmd = "$bufcmd -f -o ";
@@ -4884,18 +4884,24 @@
}
if (defined(%{$::prune{$prunekey}})) {
+ my $rex;
# FreeBSD needs -E (above) and no backslashes around the (|) chars
if ($::uname =~ /FreeBSD/) {
- $cmd .= '-regex "\./(';
- $cmd .= join('|', keys %{$::prune{$prunekey}});
- $cmd .= ')/.*" ';
- } else {
- $cmd .= '-regex "\./\(';
- $cmd .= join('\|', keys %{$::prune{$prunekey}});
- $cmd .= '\)/.*" ';
- }
+ $rex = '-regex "\./(';
+ $rex .= join('|', keys %{$::prune{$prunekey}});
+ $rex .= ')/.*" ';
+ } else {
+ $rex = '-regex "\./\(';
+ $rex .= join('\|', keys %{$::prune{$prunekey}});
+ $rex .= '\)/.*" ';
+ }
+ # Show what the darn thing is constructing for prune expressions.
+ &log("| \"find\" regex for pruning is: $rex");
+ $cmd .= $rex;
$cmd .= '-prune -o ';
} else {
+ # Show what the darn thing is constructing for prune expressions.
+ &log("| No pruning defined for this tree.");
# Can't use find -depth with -prune (see single unix spec etc)
# (not toally required anyway, only if you are archiving dirs you
# don't have permissions on and are running as non-root)
diff -ubB flexbackup-1.2.1-r3/flexbackup.conf flexbackup-1.2.1-r4/flexbackup.conf
--- flexbackup-1.2.1-r3/flexbackup.conf 2007-04-14 17:03:35.000000000 -0400
+++ flexbackup-1.2.1-r4/flexbackup.conf 2007-04-14 17:09:48.000000000 -0400
@@ -30,6 +30,45 @@
# A space-separated list of directories to prune from each backup.
# Key is a filesystem or host:dir spec as outlined above
# regular expressions allowed (not shell-type wildcards!)
+#
+# Note: These directories are actually regular expressions and must
+# match "find" output relative to the path of the current backup set. This
+# means that different exclusions are needed for different backup sets.
+# This is a little tricky, so, read on.
+#
+# The regular expressions are processed by "find" but, before "find" is run,
+# FlexBackup changes into the base directory of the backup set in progress.
+# FlexBackup then runs "find" with a path of "." which means all output lines
+# start with "./". To be helpful, FlexBackup packages each space-separated
+# prune directory as follows. If you have a prune list like this
+#
+# $prune{'/somedir'} = "one two three";
+#
+# then, the constructed -regex argument to "find" looks like this
+#
+# -regex "\./\(one\|two\|three\)/.*"
+#
+# The last thing you need to know is that FlexBackup only uses the prune
+# terms that match the current base directory in the set you're backing
+# up. For example, if your backup set definition looks like this
+#
+# $set{'daily'} = "/home /root /var /usr";
+#
+# and you want to do some exclusions in "/home" and "/var" (but not the other
+# directories), you must set up a prune list for those two directories
+# separately. For example, to exclude bert's and ernie's home directories plus
+# /var/tmp, you would need the following:
+#
+# $prune{'/home'} = "bert ernie";
+# $prune{'/var'} = "tmp";
+#
+# In particular, combining these *does not* work. For example, this
+#
+# $prune{'/'} = "home/bert home/ernie var/tmp";
+#
+# does not work, unless, of course, your backup set is backing up "/",
+# which our example is not.
+#
$prune{'/'} = "tmp proc";
# Compression
@@ -84,7 +123,8 @@
# True to try and preserve file access times during backup, if the selected
# archive program can do so. Note that if this is true, -cnewer checks (file
# permission/status changes only, not content) are turned off when deciding
-# which files to archive on the local system.
+# which files to archive on the local system. This is because preserving the
+# access time changes the permission/status change time in the filesystem.
$atime_preserve = 'false';
# Span across filesytems? ("dump" will ignore this option)
@@ -97,8 +137,13 @@
# leading directories (the filesystem specs above or the "-dir" flag).
# Matches paths, not filenames, so put .* on the front/back as needed.
# Comment these out to exclude nothing.
-$exclude_expr[0] = '.*/[Cc]ache/.*';
-$exclude_expr[1] = '.*~$';
+#
+# Note: The first example line breaks portage in a restored backup because
+# "/usr/lib/portage/pym/cache" is not backed up. Way too general! The moral
+# of this story is, be very careful with global excludes. The second example
+# is probably okay.
+# $exclude_expr[0] = '.*/[Cc]ache/.*';
+# $exclude_expr[1] = '.*~$';
# If true (default), and using a tape device, level zero "set" backups
# assume you want to erase and use a new tape for each set. If false, level
|