mirror of https://github.com/digint/btrbk
btrbk: implemented "info" command
parent
ff504b508f
commit
2552cab314
63
btrbk
63
btrbk
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue