btrbk: add option "*preserve_min latest"; deny "snapshot_preserve_min no"

pull/88/head
Axel Burri 2016-04-12 20:35:57 +02:00
parent d143d75b43
commit e200975f32
2 changed files with 22 additions and 12 deletions

20
btrbk
View File

@ -80,9 +80,9 @@ my %config_options = (
incremental => { default => "yes", accept => [ "yes", "no", "strict" ] }, incremental => { default => "yes", accept => [ "yes", "no", "strict" ] },
preserve_day_of_week => { default => "sunday", accept => [ (keys %day_of_week_map) ] }, preserve_day_of_week => { default => "sunday", accept => [ (keys %day_of_week_map) ] },
snapshot_preserve => { default => undef, accept_preserve_matrix => 1, context => [ "root", "volume", "subvolume" ], }, snapshot_preserve => { default => undef, accept_preserve_matrix => 1, context => [ "root", "volume", "subvolume" ], },
snapshot_preserve_min => { default => '12h', accept => [ "all", "no" ], accept_regexp => qr/^[0-9]+[hdwmy]$/, context => [ "root", "volume", "subvolume" ], },
target_preserve => { default => undef, accept_preserve_matrix => 1 }, target_preserve => { default => undef, accept_preserve_matrix => 1 },
target_preserve_min => { default => undef, accept => [ "all", "no" ], accept_regexp => qr/^[0-9]+[hdwmy]$/ }, snapshot_preserve_min => { default => '12h', accept => [ "all", "latest" ], accept_regexp => qr/^[0-9]+[hdwmy]$/, context => [ "root", "volume", "subvolume" ], },
target_preserve_min => { default => undef, accept => [ "all", "latest", "no" ], accept_regexp => qr/^[0-9]+[hdwmy]$/ },
btrfs_commit_delete => { default => undef, accept => [ "after", "each", "no" ] }, btrfs_commit_delete => { default => undef, accept => [ "after", "each", "no" ] },
ssh_identity => { default => undef, accept_file => { absolute => 1 } }, ssh_identity => { default => undef, accept_file => { absolute => 1 } },
ssh_user => { default => "root", accept_regexp => qr/^[a-z_][a-z0-9_-]*$/ }, ssh_user => { default => "root", accept_regexp => qr/^[a-z_][a-z0-9_-]*$/ },
@ -2089,8 +2089,8 @@ sub config_preserve_hash($$)
my $preserve_min = config_key($config, $prefix . "_preserve_min"); my $preserve_min = config_key($config, $prefix . "_preserve_min");
if(defined($preserve_min)) { if(defined($preserve_min)) {
$ret->{min} = $preserve_min; # used for raw schedule output $ret->{min} = $preserve_min; # used for raw schedule output
if($preserve_min eq 'all') { if(($preserve_min eq 'all') || ($preserve_min eq 'latest')) {
$ret->{min_n} = 'all'; $ret->{min_q} = $preserve_min;
} }
elsif($preserve_min =~ /^([0-9]+)([hdwmy])$/) { elsif($preserve_min =~ /^([0-9]+)([hdwmy])$/) {
$ret->{min_n} = $1; $ret->{min_n} = $1;
@ -2712,8 +2712,8 @@ sub schedule(@)
# filter "preserve all within N days/weeks/..." # filter "preserve all within N days/weeks/..."
foreach my $href (@sorted_schedule) { foreach my $href (@sorted_schedule) {
if($preserve_min_n) { if($preserve_min_q) {
if($preserve_min_n eq 'all') { if($preserve_min_q eq 'all') {
$href->{preserve} ||= "preserve min: all"; $href->{preserve} ||= "preserve min: all";
} elsif($preserve_min_q eq 'h') { } elsif($preserve_min_q eq 'h') {
$href->{preserve} ||= "preserve min: $href->{delta_hours} hours ago" if($href->{delta_hours} <= $preserve_min_n); $href->{preserve} ||= "preserve min: $href->{delta_hours} hours ago" if($href->{delta_hours} <= $preserve_min_n);
@ -2729,6 +2729,10 @@ sub schedule(@)
} }
$first_in_delta_hours{$href->{delta_hours}} //= $href; $first_in_delta_hours{$href->{delta_hours}} //= $href;
} }
if($preserve_min_q && ($preserve_min_q eq 'latest') && (scalar @sorted_schedule)) {
my $href = $sorted_schedule[-1];
$href->{preserve} ||= 'preserve min: latest';
}
# filter hourly, daily, weekly, monthly, yearly # filter hourly, daily, weekly, monthly, yearly
foreach (sort {$b <=> $a} keys %first_in_delta_hours) { foreach (sort {$b <=> $a} keys %first_in_delta_hours) {
@ -2812,7 +2816,7 @@ sub format_preserve_matrix($@)
if($format eq "debug_text") { if($format eq "debug_text") {
my @out; my @out;
my %trans = ( h => 'hours', d => 'days', w => 'weeks', m => 'months', y => 'years' ); my %trans = ( h => 'hours', d => 'days', w => 'weeks', m => 'months', y => 'years' );
if($preserve->{min_n} && $preserve->{min_n} eq 'all') { if($preserve->{min_q} && ($preserve->{min_q} eq 'all')) {
push @out, "preserving all forever"; push @out, "preserving all forever";
} }
else { else {
@ -2832,7 +2836,7 @@ sub format_preserve_matrix($@)
} }
my $s = ""; my $s = "";
if($preserve->{min_n} && ($preserve->{min_n} eq 'all')) { if($preserve->{min_q} && ($preserve->{min_q} eq 'all')) {
$s = '*d+'; $s = '*d+';
} }
else { else {

View File

@ -126,11 +126,13 @@ non-incremental (initial) backups are never created. Defaults to
Set retention policy for snapshots (see RETENTION POLICY below). Set retention policy for snapshots (see RETENTION POLICY below).
.RE .RE
.PP .PP
\fBsnapshot_preserve_min\fR all|no|<number>{h,d,w,m,y} \fBsnapshot_preserve_min\fR all|latest|<number>{h,d,w,m,y}
.RS 4 .RS 4
Preserve all snapshots for a minimum amount of hours (h), days (d), Preserve all snapshots for a minimum amount of hours (h), days (d),
weeks (w), months (m) or years (y), regardless of how many there weeks (w), months (m) or years (y), regardless of how many there
are. Defaults to \[lq]12h\[rq]. are. If set to \[lq]all\[rq], preserve all snapshots forever. If set
to \[lq]latest\[rq], keep latest snapshot (useful only in conjunction
with "snapshot_create no"). Defaults to \[lq]12h\[rq].
.RE .RE
.PP .PP
\fBtarget_preserve\fR <retention_policy> \fBtarget_preserve\fR <retention_policy>
@ -138,11 +140,15 @@ are. Defaults to \[lq]12h\[rq].
Set retention policy for backups (see RETENTION POLICY below). Set retention policy for backups (see RETENTION POLICY below).
.RE .RE
.PP .PP
\fBtarget_preserve_min\fR all|no|<number>{h,d,w,m,y} \fBtarget_preserve_min\fR all|latest|no|<number>{h,d,w,m,y}
.RS 4 .RS 4
Preserve all backups for a minimum amount of hours (h), days (d), Preserve all backups for a minimum amount of hours (h), days (d),
weeks (w), months (m) or years (y), regardless of how many there weeks (w), months (m) or years (y), regardless of how many there
are. Defaults to \[lq]no\[rq]. are. If set to \[lq]all\[rq], preserve all backups forever. If set to
\[lq]latest\[rq], always preserve the latest backup (useful in
conjunction with "target_preserve no", if you want to keep the latest
backup only). If set to \[lq]no\[rq], only the backups following the
\fItarget_preserve\fR policy are created. Defaults to \[lq]no\[rq].
.RE .RE
.PP .PP
\fBpreserve_day_of_week\fR monday|tuesday|...|sunday \fBpreserve_day_of_week\fR monday|tuesday|...|sunday