mirror of https://github.com/digint/btrbk
btrbk: add rsh information to vinfo; btr_subvolume_detail() now takes real options instead of a config hash
parent
0a9c193d13
commit
72cbca13d7
65
btrbk
65
btrbk
|
@ -187,18 +187,42 @@ sub vinfo($;$)
|
||||||
return $vol_detail{$url};
|
return $vol_detail{$url};
|
||||||
}
|
}
|
||||||
|
|
||||||
my $detail = btr_subvolume_detail($url, $config);
|
my %info = ( URL => $url,
|
||||||
|
PATH => $url,
|
||||||
|
);
|
||||||
|
|
||||||
unless($detail) {
|
if($config && ($url =~ /^ssh:\/\/(\S+?)(\/\S+)$/)) {
|
||||||
$vol_detail{$url} = { ABORTED => "Failed to fetch subvolume detail for: $url" };
|
my %remote = (
|
||||||
return undef;
|
URL => $url,
|
||||||
|
HOST => $1,
|
||||||
|
PATH => $2,
|
||||||
|
RSH_TYPE => "ssh",
|
||||||
|
SSH_USER => config_key($config, "ssh_user"),
|
||||||
|
SSH_IDENTITY => config_key($config, "ssh_identity"),
|
||||||
|
);
|
||||||
|
my $ssh_options = "";
|
||||||
|
if($remote{SSH_IDENTITY}) {
|
||||||
|
$ssh_options .= "-i $remote{SSH_IDENTITY} ";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
WARN "No SSH identity provided (option ssh_identity is not set) for: $url";
|
||||||
|
}
|
||||||
|
$remote{RSH} = "/usr/bin/ssh $ssh_options" . $remote{SSH_USER} . '@' . $remote{HOST};
|
||||||
|
|
||||||
|
$info{PATH} = $remote{PATH};
|
||||||
|
$info{REMOTE} = \%remote;
|
||||||
}
|
}
|
||||||
|
|
||||||
$vol_detail{$url} = $detail;
|
my $detail = btr_subvolume_detail($info{PATH}, $info{REMOTE});
|
||||||
DEBUG "vinfo updated for: $url";
|
$detail ||= { ERROR => "Failed to fetch subvolume detail for: $url" };
|
||||||
TRACE(Data::Dumper->Dump([$detail], ["vinfo{$url}"]));
|
|
||||||
|
|
||||||
return $detail;
|
%info = ( %$detail, %info );
|
||||||
|
|
||||||
|
$vol_detail{$url} = \%info;
|
||||||
|
DEBUG "vinfo updated for: $url";
|
||||||
|
TRACE(Data::Dumper->Dump([\%info], ["vinfo{$url}"]));
|
||||||
|
|
||||||
|
return \%info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -498,32 +522,31 @@ sub btr_filesystem_usage($;$)
|
||||||
|
|
||||||
sub btr_subvolume_detail($;$)
|
sub btr_subvolume_detail($;$)
|
||||||
{
|
{
|
||||||
my $url = shift || die;
|
my $path = shift // die;
|
||||||
my $config = shift;
|
my $opts = shift || {};
|
||||||
my ($rsh, $path) = get_rsh($url, $config);
|
my $rsh = $opts->{RSH} || "";
|
||||||
|
my $url = $opts->{URL} || $path; # used only for logging
|
||||||
my $ret = run_cmd("$rsh /sbin/btrfs subvolume show $path 2>/dev/null", 1);
|
my $ret = run_cmd("$rsh /sbin/btrfs subvolume show $path 2>/dev/null", 1);
|
||||||
if($ret)
|
if($ret)
|
||||||
{
|
{
|
||||||
my $fs_path;
|
my $real_path;
|
||||||
if($ret =~ /^($file_match)/) {
|
if($ret =~ /^($file_match)/) {
|
||||||
$fs_path = $1;
|
$real_path = $1;
|
||||||
DEBUG "Real path for subvolume \"$url\" is: $fs_path" if($fs_path ne $path);
|
DEBUG "Real path for subvolume \"$url\" is: $real_path" if($real_path ne $path);
|
||||||
return undef unless(check_file($fs_path, { absolute => 1 }));
|
return undef unless(check_file($real_path, { absolute => 1 }));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$fs_path = $path;
|
$real_path = $path;
|
||||||
WARN "No real path provided by \"btrfs subvolume show\" for subvolume \"$url\", using: $path";
|
WARN "No real path provided by \"btrfs subvolume show\" for subvolume \"$url\", using: $path";
|
||||||
}
|
}
|
||||||
my %detail = ( FS_PATH => $fs_path,
|
my %detail = ( REAL_PATH => $real_path );
|
||||||
URL => $url,
|
|
||||||
);
|
|
||||||
|
|
||||||
if($ret eq "$fs_path is btrfs root") {
|
if($ret eq "$real_path is btrfs root") {
|
||||||
DEBUG "found btrfs root: $url";
|
DEBUG "found btrfs root: $url";
|
||||||
$detail{id} = 5;
|
$detail{id} = 5;
|
||||||
$detail{is_root} = 1;
|
$detail{is_root} = 1;
|
||||||
}
|
}
|
||||||
elsif($ret =~ /^$fs_path/) {
|
elsif($ret =~ /^$real_path/) {
|
||||||
TRACE "btr_detail: found btrfs subvolume: $url";
|
TRACE "btr_detail: found btrfs subvolume: $url";
|
||||||
my %trans = (
|
my %trans = (
|
||||||
name => "Name",
|
name => "Name",
|
||||||
|
|
Loading…
Reference in New Issue