mirror of
https://git.proxmox.com/git/pve-common
synced 2025-04-29 10:50:12 +00:00
pbs-client: namespace support
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
2efc79d6ce
commit
4a09bdc3ef
@ -178,6 +178,9 @@ my sub do_raw_client_cmd {
|
|||||||
push @$cmd, @$param if defined($param);
|
push @$cmd, @$param if defined($param);
|
||||||
|
|
||||||
push @$cmd, "--repository", $repo;
|
push @$cmd, "--repository", $repo;
|
||||||
|
if (defined(my $ns = delete($opts{namespace}))) {
|
||||||
|
push @$cmd, '--ns', $ns;
|
||||||
|
}
|
||||||
|
|
||||||
local $ENV{PBS_PASSWORD} = $self->get_password();
|
local $ENV{PBS_PASSWORD} = $self->get_password();
|
||||||
|
|
||||||
@ -194,13 +197,13 @@ my sub do_raw_client_cmd {
|
|||||||
run_command($cmd, %opts);
|
run_command($cmd, %opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
my sub run_raw_client_cmd {
|
my sub run_raw_client_cmd : prototype($$$%) {
|
||||||
my ($self, $client_cmd, $param, %opts) = @_;
|
my ($self, $client_cmd, $param, %opts) = @_;
|
||||||
return do_raw_client_cmd($self, $client_cmd, $param, %opts);
|
return do_raw_client_cmd($self, $client_cmd, $param, %opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
my sub run_client_cmd {
|
my sub run_client_cmd : prototype($$;$$$$) {
|
||||||
my ($self, $client_cmd, $param, $no_output, $binary) = @_;
|
my ($self, $client_cmd, $param, $no_output, $binary, $namespace) = @_;
|
||||||
|
|
||||||
my $json_str = '';
|
my $json_str = '';
|
||||||
my $outfunc = sub { $json_str .= "$_[0]\n" };
|
my $outfunc = sub { $json_str .= "$_[0]\n" };
|
||||||
@ -219,6 +222,7 @@ my sub run_client_cmd {
|
|||||||
outfunc => $outfunc,
|
outfunc => $outfunc,
|
||||||
errmsg => "$binary failed",
|
errmsg => "$binary failed",
|
||||||
binary => $binary,
|
binary => $binary,
|
||||||
|
namespace => $namespace,
|
||||||
);
|
);
|
||||||
|
|
||||||
return undef if $no_output;
|
return undef if $no_output;
|
||||||
@ -238,20 +242,35 @@ sub autogen_encryption_key {
|
|||||||
return file_get_contents($encfile);
|
return file_get_contents($encfile);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Snapshot or group parameters can be either just a string and will then refer to the root
|
||||||
|
# namespace, or a tuple of `[namespace, snapshot]`.
|
||||||
|
my sub split_namespaced_parameter : prototype($) {
|
||||||
|
my ($snapshot) = @_;
|
||||||
|
return (undef, $snapshot) if !ref($snapshot);
|
||||||
|
|
||||||
|
(my $namespace, $snapshot) = @$snapshot;
|
||||||
|
return ($namespace, $snapshot);
|
||||||
|
}
|
||||||
|
|
||||||
# lists all snapshots, optionally limited to a specific group
|
# lists all snapshots, optionally limited to a specific group
|
||||||
sub get_snapshots {
|
sub get_snapshots {
|
||||||
my ($self, $group) = @_;
|
my ($self, $group) = @_;
|
||||||
|
|
||||||
|
my $namespace;
|
||||||
|
if (defined($group)) {
|
||||||
|
($namespace, $group) = split_namespaced_parameter($group);
|
||||||
|
}
|
||||||
|
|
||||||
my $param = [];
|
my $param = [];
|
||||||
push @$param, $group if defined($group);
|
push @$param, $group if defined($group);
|
||||||
|
|
||||||
return run_client_cmd($self, "snapshots", $param);
|
return run_client_cmd($self, "snapshots", $param, undef, undef, $namespace);
|
||||||
};
|
};
|
||||||
|
|
||||||
# create a new PXAR backup of a FS directory tree - doesn't cross FS boundary
|
# create a new PXAR backup of a FS directory tree - doesn't cross FS boundary
|
||||||
# by default.
|
# by default.
|
||||||
sub backup_fs_tree {
|
sub backup_fs_tree {
|
||||||
my ($self, $root, $id, $pxarname, $cmd_opts) = @_;
|
my ($self, $root, $id, $pxarname, $cmd_opts, $namespace) = @_;
|
||||||
|
|
||||||
die "backup-id not provided\n" if !defined($id);
|
die "backup-id not provided\n" if !defined($id);
|
||||||
die "backup root dir not provided\n" if !defined($root);
|
die "backup root dir not provided\n" if !defined($root);
|
||||||
@ -265,6 +284,8 @@ sub backup_fs_tree {
|
|||||||
|
|
||||||
$cmd_opts //= {};
|
$cmd_opts //= {};
|
||||||
|
|
||||||
|
$cmd_opts->{namespace} = $namespace if defined($namespace);
|
||||||
|
|
||||||
return run_raw_client_cmd($self, 'backup', $param, %$cmd_opts);
|
return run_raw_client_cmd($self, 'backup', $param, %$cmd_opts);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -275,6 +296,8 @@ sub restore_pxar {
|
|||||||
die "archive name not provided\n" if !defined($pxarname);
|
die "archive name not provided\n" if !defined($pxarname);
|
||||||
die "restore-target not provided\n" if !defined($target);
|
die "restore-target not provided\n" if !defined($target);
|
||||||
|
|
||||||
|
(my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
|
||||||
|
|
||||||
my $param = [
|
my $param = [
|
||||||
"$snapshot",
|
"$snapshot",
|
||||||
"$pxarname.pxar",
|
"$pxarname.pxar",
|
||||||
@ -283,6 +306,8 @@ sub restore_pxar {
|
|||||||
];
|
];
|
||||||
$cmd_opts //= {};
|
$cmd_opts //= {};
|
||||||
|
|
||||||
|
$cmd_opts->{namespace} = $namespace;
|
||||||
|
|
||||||
return run_raw_client_cmd($self, 'restore', $param, %$cmd_opts);
|
return run_raw_client_cmd($self, 'restore', $param, %$cmd_opts);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -291,7 +316,9 @@ sub forget_snapshot {
|
|||||||
|
|
||||||
die "snapshot not provided\n" if !defined($snapshot);
|
die "snapshot not provided\n" if !defined($snapshot);
|
||||||
|
|
||||||
return run_raw_client_cmd($self, 'forget', ["$snapshot"]);
|
(my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
|
||||||
|
|
||||||
|
return run_raw_client_cmd($self, 'forget', ["$snapshot"], namespace => $namespace);
|
||||||
};
|
};
|
||||||
|
|
||||||
sub prune_group {
|
sub prune_group {
|
||||||
@ -299,6 +326,8 @@ sub prune_group {
|
|||||||
|
|
||||||
die "group not provided\n" if !defined($group);
|
die "group not provided\n" if !defined($group);
|
||||||
|
|
||||||
|
(my $namespace, $group) = split_namespaced_parameter($group);
|
||||||
|
|
||||||
# do nothing if no keep options specified for remote
|
# do nothing if no keep options specified for remote
|
||||||
return [] if scalar(keys %$prune_opts) == 0;
|
return [] if scalar(keys %$prune_opts) == 0;
|
||||||
|
|
||||||
@ -315,7 +344,7 @@ sub prune_group {
|
|||||||
}
|
}
|
||||||
push @$param, "$group";
|
push @$param, "$group";
|
||||||
|
|
||||||
return run_client_cmd($self, 'prune', $param);
|
return run_client_cmd($self, 'prune', $param, undef, undef, $namespace);
|
||||||
};
|
};
|
||||||
|
|
||||||
sub status {
|
sub status {
|
||||||
@ -343,12 +372,16 @@ sub status {
|
|||||||
|
|
||||||
sub file_restore_list {
|
sub file_restore_list {
|
||||||
my ($self, $snapshot, $filepath, $base64) = @_;
|
my ($self, $snapshot, $filepath, $base64) = @_;
|
||||||
|
|
||||||
|
(my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
|
||||||
|
|
||||||
return run_client_cmd(
|
return run_client_cmd(
|
||||||
$self,
|
$self,
|
||||||
"list",
|
"list",
|
||||||
[ $snapshot, $filepath, "--base64", $base64 ? 1 : 0 ],
|
[ $snapshot, $filepath, "--base64", $base64 ? 1 : 0 ],
|
||||||
0,
|
0,
|
||||||
"proxmox-file-restore",
|
"proxmox-file-restore",
|
||||||
|
$namespace,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,6 +409,8 @@ sub file_restore_extract_prepare {
|
|||||||
sub file_restore_extract {
|
sub file_restore_extract {
|
||||||
my ($self, $output_file, $snapshot, $filepath, $base64) = @_;
|
my ($self, $output_file, $snapshot, $filepath, $base64) = @_;
|
||||||
|
|
||||||
|
(my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
|
||||||
|
|
||||||
my $ret = eval {
|
my $ret = eval {
|
||||||
local $SIG{ALRM} = sub { die "got timeout\n" };
|
local $SIG{ALRM} = sub { die "got timeout\n" };
|
||||||
alarm(30);
|
alarm(30);
|
||||||
@ -391,6 +426,7 @@ sub file_restore_extract {
|
|||||||
"extract",
|
"extract",
|
||||||
[ $snapshot, $filepath, "-", "--base64", $base64 ? 1 : 0 ],
|
[ $snapshot, $filepath, "-", "--base64", $base64 ? 1 : 0 ],
|
||||||
binary => "proxmox-file-restore",
|
binary => "proxmox-file-restore",
|
||||||
|
namespace => $namespace,
|
||||||
errfunc => $errfunc,
|
errfunc => $errfunc,
|
||||||
output => ">&$fn",
|
output => ">&$fn",
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user