btrbk: implemented "info" command

pull/30/head
Axel Burri 2014-12-13 16:51:30 +01:00
parent ff504b508f
commit 2552cab314
1 changed files with 48 additions and 15 deletions

63
btrbk
View File

@ -46,7 +46,6 @@ use POSIX qw(strftime);
use File::Path qw(make_path); use File::Path qw(make_path);
use Getopt::Std; use Getopt::Std;
use Data::Dumper; use Data::Dumper;
use Tie::IxHash;
our $VERSION = "0.01"; our $VERSION = "0.01";
our $PROJECT_HOME = '<http://www.digint.ch/btrbk>'; our $PROJECT_HOME = '<http://www.digint.ch/btrbk>';
@ -210,7 +209,7 @@ sub btr_tree($)
{ {
my $vol = shift; my $vol = shift;
die("btr_tree: \"$vol\" is not btrfs root!") unless(check_rootvol($vol)); die("btr_tree: \"$vol\" is not btrfs root!") unless(check_rootvol($vol));
my $ret = run_cmd("/sbin/btrfs subvolume list -p -a $vol", 1); my $ret = run_cmd("/sbin/btrfs subvolume list -u -q -a $vol", 1);
my %tree; my %tree;
foreach (split(/\n/, $ret)) foreach (split(/\n/, $ret))
{ {
@ -220,13 +219,15 @@ sub btr_tree($)
# the subvolid= option. If -p is given, then parent <ID> is added to # the subvolid= option. If -p is given, then parent <ID> is added to
# the output between ID and top level. The parent?s ID may be used at # the output between ID and top level. The parent?s ID may be used at
# mount time via the subvolrootid= option. # mount time via the subvolrootid= option.
die("Failed to parse line: \"$_\"") unless(/^ID ([0-9]+) gen ([0-9]+) parent ([0-9]+) top level ([0-9]+) path (.+)$/); die("Failed to parse line: \"$_\"") unless(/^ID ([0-9]+) gen ([0-9]+) top level ([0-9]+) parent_uuid ([0-9a-z-]+) uuid ([0-9a-z-]+) path (.+)$/);
my %node = ( ID => $1, my %node = ( ID => $1,
gen => $2, gen => $2,
parent => $3, top_level => $3,
top_level => $4, parent_uuid => $4,
path => $5 uuid => $5,
); path => $6
);
$node{parent_uuid} = undef if($node{parent_uuid} eq '-');
$tree{$node{ID}} = \%node; $tree{$node{ID}} = \%node;
DEBUG "btr_tree: processing subvolid=$node{ID}"; DEBUG "btr_tree: processing subvolid=$node{ID}";
@ -410,14 +411,46 @@ MAIN:
if($action_info) if($action_info)
{ {
INFO(Data::Dumper->Dump([\%vol_info], ["vol_info"])); #
# print snapshot tree
#
my %info;
foreach my $job (@$jobs) foreach my $job (@$jobs)
{ {
my $sroot = $job->{sroot} || die; $info{$job->{sroot}}->{$job->{svol}} = $job;
my $svol = $job->{svol} || die; }
my $droot = $job->{droot} || die; foreach my $root (keys %info)
my $dvol = $job->{dvol} || die; {
print "$sroot/$svol\n" print "$root\n";
foreach my $job (values %{$info{$root}})
{
my $sroot = $job->{sroot} || die;
my $svol = $job->{svol} || die;
print "|-- $svol\n";
my $sroot_uuid;
foreach (values $vol_info{$sroot}) {
if($_->{FS_PATH} eq "$sroot/$svol") {
die if $sroot_uuid;
$sroot_uuid = $_->{uuid};
}
}
die unless $sroot_uuid;
foreach (values $vol_info{$sroot}) {
next unless($_->{parent_uuid} && ($_->{parent_uuid} eq $sroot_uuid));
# next unless($_->{SUBVOL_PATH} =~ /^$src_snapshot_dir\//); # don't print non-btrbk snapshots
print "| ^-- $_->{SUBVOL_PATH}\n";
my $snapshot = $_->{FS_PATH};
$snapshot =~ s/^.*\///;
foreach (@$jobs) {
next unless(($_->{sroot} eq $sroot) && ($_->{svol} eq $svol));
my $match = "$_->{droot}/$_->{dvol}/$snapshot";
foreach (values $vol_info{$_->{droot}}) {
print "| | # $_->{FS_PATH}\n" if($_->{FS_PATH} eq $match);
}
}
}
}
print "\n";
} }
} }