btrbk: remove tree output for "resolve snapshots"; cleanup

pull/57/head
Axel Burri 2015-10-20 15:59:16 +02:00
parent 40a384e7c7
commit fef691aa04
1 changed files with 35 additions and 64 deletions

99
btrbk
View File

@ -2758,79 +2758,50 @@ MAIN:
# #
# print all snapshots and their receive targets # print all snapshots and their receive targets
# #
my @tree_out; my @data;
my @raw_out; my %droot_compat;
foreach my $config_vol (@{$config->{VOLUME}}) foreach my $config_vol (@{$config->{VOLUME}}) {
{
next if($config_vol->{ABORTED}); next if($config_vol->{ABORTED});
my %droot_compat;
my $sroot = $config_vol->{sroot} || die; my $sroot = $config_vol->{sroot} || die;
push @tree_out, "$sroot->{PRINT}"; foreach my $config_subvol (@{$config_vol->{SUBVOLUME}}) {
foreach my $config_subvol (@{$config_vol->{SUBVOLUME}})
{
next if($config_subvol->{ABORTED}); next if($config_subvol->{ABORTED});
my $svol = $config_subvol->{svol} || die; my $svol = $config_subvol->{svol} || die;
my $snapshot_name = config_key($config_subvol, "snapshot_name") // die; my $snapshot_name = config_key($config_subvol, "snapshot_name") // die;
push @tree_out, "|-- $svol->{PRINT}"; foreach my $snapshot (sort { $a->{cgen} cmp $b->{cgen} } get_snapshot_children($sroot, $svol)) {
foreach my $snapshot (sort { $a->{cgen} cmp $b->{cgen} } get_snapshot_children($sroot, $svol))
{
my $raw_data = { type => "snapshot", my $raw_data = { type => "snapshot",
status => ($snapshot->{cgen} == $svol->{gen}) ? "up-to-date" : undef,
vinfo_prefixed_keys("source", $svol), vinfo_prefixed_keys("source", $svol),
vinfo_prefixed_keys("snapshot", $snapshot), vinfo_prefixed_keys("snapshot", $snapshot),
snapshot_name => $snapshot_name, snapshot_name => $snapshot_name,
}; };
if($snapshot->{cgen} == $svol->{gen}) { my $found = 0;
push @tree_out, "| ^== $snapshot->{PATH}"; foreach my $config_target (@{$config_subvol->{TARGET}}) {
$raw_data->{status} = "up-to-date";
} else {
push @tree_out, "| ^-- $snapshot->{PATH}";
}
push @raw_out, $raw_data;
foreach my $config_target (@{$config_subvol->{TARGET}})
{
next if($config_target->{ABORTED}); next if($config_target->{ABORTED});
my $droot = $config_target->{droot} || die; my $droot = $config_target->{droot} || die;
$droot_compat{$droot->{URL}} = 1 if($droot->{BTRFS_PROGS_COMPAT}); $droot_compat{$droot->{URL}} = 1 if($droot->{BTRFS_PROGS_COMPAT});
foreach (sort { $a->{SUBVOL_PATH} cmp $b->{SUBVOL_PATH} } get_receive_targets($droot, $snapshot)) { foreach (sort { $a->{SUBVOL_PATH} cmp $b->{SUBVOL_PATH} } get_receive_targets($droot, $snapshot)) {
push @tree_out, "| | >>> $_->{PRINT}"; push @data, { %$raw_data,
push @raw_out, { %$raw_data, type => "received",
type => "received", vinfo_prefixed_keys("target", $_),
vinfo_prefixed_keys("target", $_), };
}; $found = 1;
} }
push @data, $raw_data unless($found);
} }
} }
} }
if(keys %droot_compat) {
push @tree_out, "\nNOTE: Received subvolumes (backups) are guessed by subvolume name for targets:";
push @tree_out, " - " . join("\n - ", (sort keys %droot_compat));
}
push @tree_out, "";
} }
if(keys %droot_compat) {
$output_format ||= "tree"; WARN "Received subvolumes (backups) are guessed by subvolume name for targets (btrfs_progs_compat=yes)";
if($output_format eq "tree") { WARN " - target: $_" foreach(sort keys %droot_compat);
print_header(title => "Backup Tree",
config => $config,
time => $start_time,
legend => [
"^-- snapshot",
"^== snapshot (up-to-date)",
">>> received subvolume (backup)",
]
);
print join("\n", @tree_out);
}
else {
print_formatted("resolved", \@raw_out);
} }
print_formatted("resolved", \@data);
} }
elsif($action_resolve eq "targets") elsif($action_resolve eq "targets") {
{
# #
# print all targets and their corresponding source snapshots # print all targets and their corresponding source snapshots
# #
my @raw_targets; my @data;
foreach my $config_vol (@{$config->{VOLUME}}) { foreach my $config_vol (@{$config->{VOLUME}}) {
next if($config_vol->{ABORTED}); next if($config_vol->{ABORTED});
my $sroot = $config_vol->{sroot} || die; my $sroot = $config_vol->{sroot} || die;
@ -2850,31 +2821,31 @@ MAIN:
} }
} }
if($parent_snapshot) { if($parent_snapshot) {
push @raw_targets, { type => "received", push @data, { type => "received",
vinfo_prefixed_keys("target", $target_vol), vinfo_prefixed_keys("target", $target_vol),
vinfo_prefixed_keys("snapshot", $parent_snapshot), vinfo_prefixed_keys("snapshot", $parent_snapshot),
vinfo_prefixed_keys("source", $svol), vinfo_prefixed_keys("source", $svol),
status => ($parent_snapshot->{cgen} == $svol->{gen}) ? "up-to-date" : undef, status => ($parent_snapshot->{cgen} == $svol->{gen}) ? "up-to-date" : undef,
}; };
} }
else { else {
push @raw_targets, { type => "received", push @data, { type => "received",
vinfo_prefixed_keys("target", $target_vol), vinfo_prefixed_keys("target", $target_vol),
vinfo_prefixed_keys("source", $svol), vinfo_prefixed_keys("source", $svol),
}; };
} }
} }
} }
} }
} }
print_formatted("resolved", \@raw_targets); print_formatted("resolved", \@data);
} }
elsif($action_resolve eq "latest") elsif($action_resolve eq "latest")
{ {
# #
# print latest common # print latest common
# #
my @raw_latest; my @data;
foreach my $config_vol (@{$config->{VOLUME}}) { foreach my $config_vol (@{$config->{VOLUME}}) {
next if($config_vol->{ABORTED}); next if($config_vol->{ABORTED});
my $sroot = $config_vol->{sroot} || die; my $sroot = $config_vol->{sroot} || die;
@ -2887,7 +2858,7 @@ MAIN:
my $droot = $config_target->{droot} || die; my $droot = $config_target->{droot} || die;
my ($latest_common_src, $latest_common_target) = get_latest_common($sroot, $svol, $droot); my ($latest_common_src, $latest_common_target) = get_latest_common($sroot, $svol, $droot);
if ($latest_common_src && $latest_common_target) { if ($latest_common_src && $latest_common_target) {
push @raw_latest, { type => "latest_common", push @data, { type => "latest_common",
status => ($latest_common_src->{cgen} == $svol->{gen}) ? "up-to-date" : undef, status => ($latest_common_src->{cgen} == $svol->{gen}) ? "up-to-date" : undef,
vinfo_prefixed_keys("source", $svol), vinfo_prefixed_keys("source", $svol),
vinfo_prefixed_keys("snapshot", $latest_common_src), vinfo_prefixed_keys("snapshot", $latest_common_src),
@ -2898,7 +2869,7 @@ MAIN:
} }
unless($found) { unless($found) {
my $latest_snapshot = get_latest_snapshot_child($sroot, $svol); my $latest_snapshot = get_latest_snapshot_child($sroot, $svol);
push @raw_latest, { type => "latest_snapshot", push @data, { type => "latest_snapshot",
status => ($latest_snapshot->{cgen} == $svol->{gen}) ? "up-to-date" : undef, status => ($latest_snapshot->{cgen} == $svol->{gen}) ? "up-to-date" : undef,
vinfo_prefixed_keys("source", $svol), vinfo_prefixed_keys("source", $svol),
vinfo_prefixed_keys("snapshot", $latest_snapshot), # all unset if no $latest_snapshot vinfo_prefixed_keys("snapshot", $latest_snapshot), # all unset if no $latest_snapshot
@ -2906,7 +2877,7 @@ MAIN:
} }
} }
} }
print_formatted("resolved", \@raw_latest); print_formatted("resolved", \@data);
} }
else { else {
die; die;