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);
+# TODO remove support for namespaced parameters. Needs Breaks for pmg-api and libpve-storage-perl.
+# Deprecated! The namespace should be passed in as part of the config in new().
+# Snapshot or group parameters can be either just a string and will then default to the namespace
+# that's part of the initial configuration in new(), or a tuple of `[namespace, snapshot]`.
+my sub split_namespaced_parameter : prototype($$) {
+ my ($self, $snapshot) = @_;
+ return ($self->{scfg}->{namespace}, $snapshot) if !ref($snapshot);
(my $namespace, $snapshot) = @$snapshot;
return ($namespace, $snapshot);
my $namespace;
if (defined($group)) {
- ($namespace, $group) = split_namespaced_parameter($group);
+ ($namespace, $group) = split_namespaced_parameter($self, $group);
+ } else {
+ $namespace = $self->{scfg}->{namespace};
}
my $param = [];
# create a new PXAR backup of a FS directory tree - doesn't cross FS boundary
# by default.
sub backup_fs_tree {
- my ($self, $root, $id, $pxarname, $cmd_opts, $namespace) = @_;
+ my ($self, $root, $id, $pxarname, $cmd_opts) = @_;
die "backup-id not provided\n" if !defined($id);
die "backup root dir not provided\n" if !defined($root);
$cmd_opts //= {};
- $cmd_opts->{namespace} = $namespace if defined($namespace);
+ $cmd_opts->{namespace} = $self->{scfg}->{namespace} if defined($self->{scfg}->{namespace});
return run_raw_client_cmd($self, 'backup', $param, %$cmd_opts);
};
die "archive name not provided\n" if !defined($pxarname);
die "restore-target not provided\n" if !defined($target);
- (my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
+ (my $namespace, $snapshot) = split_namespaced_parameter($self, $snapshot);
my $param = [
"$snapshot",
die "snapshot not provided\n" if !defined($snapshot);
- (my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
+ (my $namespace, $snapshot) = split_namespaced_parameter($self, $snapshot);
return run_client_cmd($self, 'forget', ["$snapshot"], 1, undef, $namespace)
};
die "group not provided\n" if !defined($group);
- (my $namespace, $group) = split_namespaced_parameter($group);
+ (my $namespace, $group) = split_namespaced_parameter($self, $group);
# do nothing if no keep options specified for remote
return [] if scalar(keys %$prune_opts) == 0;
};
sub file_restore_list {
- my ($self, $snapshot, $filepath, $base64) = @_;
+ my ($self, $snapshot, $filepath, $base64, $extra_params) = @_;
+
+ (my $namespace, $snapshot) = split_namespaced_parameter($self, $snapshot);
+ my $cmd = [ $snapshot, $filepath, "--base64", $base64 ? 1 : 0];
- (my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
+ if (my $timeout = $extra_params->{timeout}) {
+ push $cmd->@*, '--timeout', $timeout;
+ }
return run_client_cmd(
$self,
"list",
- [ $snapshot, $filepath, "--base64", $base64 ? 1 : 0 ],
+ $cmd,
0,
"proxmox-file-restore",
$namespace,
# this blocks while data is transfered, call this from a background worker
sub file_restore_extract {
- my ($self, $output_file, $snapshot, $filepath, $base64) = @_;
+ my ($self, $output_file, $snapshot, $filepath, $base64, $tar) = @_;
- (my $namespace, $snapshot) = split_namespaced_parameter($snapshot);
+ (my $namespace, $snapshot) = split_namespaced_parameter($self, $snapshot);
my $ret = eval {
local $SIG{ALRM} = sub { die "got timeout\n" };
my $fn = fileno($fh);
my $errfunc = sub { print $_[0], "\n"; };
+ my $cmd = [ $snapshot, $filepath, "-", "--base64", $base64 ? 1 : 0];
+ if ($tar) {
+ push @$cmd, '--format', 'tar', '--zstd', 1;
+ }
+
return run_raw_client_cmd(
$self,
"extract",
- [ $snapshot, $filepath, "-", "--base64", $base64 ? 1 : 0 ],
+ $cmd,
binary => "proxmox-file-restore",
namespace => $namespace,
errfunc => $errfunc,