From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id EEA1D1FF15E for <inbox@lore.proxmox.com>; Tue, 11 Mar 2025 15:24:50 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 67D0312549; Tue, 11 Mar 2025 15:24:11 +0100 (CET) From: Filip Schauer <f.schauer@proxmox.com> To: pve-devel@lists.proxmox.com Date: Tue, 11 Mar 2025 15:23:27 +0100 Message-Id: <20250311142328.112538-9-f.schauer@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250311142328.112538-1-f.schauer@proxmox.com> References: <20250311142328.112538-1-f.schauer@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.018 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH storage v7 8/9] support copying VMA backups to PBS X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> Extend the copy API to support copying VMA backups to a Proxmox Backup Server. Signed-off-by: Filip Schauer <f.schauer@proxmox.com> --- debian/control | 1 + src/PVE/API2/Storage/Content.pm | 20 ++++++++--- src/PVE/Storage/PBSPlugin.pm | 59 +++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/debian/control b/debian/control index 4e1a046..0883777 100644 --- a/debian/control +++ b/debian/control @@ -46,6 +46,7 @@ Depends: bzip2, nfs-common, proxmox-backup-client (>= 2.1.10~), proxmox-backup-file-restore, + proxmox-vma-to-pbs (>= 0.0.2), pve-cluster (>= 5.0-32), smartmontools, smbclient, diff --git a/src/PVE/API2/Storage/Content.pm b/src/PVE/API2/Storage/Content.pm index ff3c88d..6ce9e9f 100644 --- a/src/PVE/API2/Storage/Content.pm +++ b/src/PVE/API2/Storage/Content.pm @@ -6,6 +6,7 @@ use warnings; use PVE::SafeSyslog; use PVE::Cluster; use PVE::Storage; +use PVE::Storage::PBSPlugin; use PVE::INotify; use PVE::Exception qw(raise_param_exc); use PVE::RPCEnvironment; @@ -576,10 +577,21 @@ __PACKAGE__->register_method ({ my $worker = sub { PVE::Storage::storage_check_enabled($cfg, $src_storeid, $src_node); PVE::Storage::storage_check_enabled($cfg, $dst_storeid, $dst_node); - my $sshinfo; - $sshinfo = PVE::SSHInfo::get_ssh_info($dst_node) if $src_node ne $dst_node; - my $opts = { 'target_volname' => $volname }; - PVE::Storage::storage_migrate($cfg, $src_volid, $sshinfo, $dst_storeid, $opts); + + my $src_cfg = PVE::Storage::storage_config($cfg, $src_storeid); + my $dst_cfg = PVE::Storage::storage_config($cfg, $dst_storeid); + if ($vtype eq 'backup' && $src_cfg->{path} && $dst_cfg->{type} eq 'pbs') { + my $src_plugin = PVE::Storage::Plugin->lookup($src_cfg->{type}); + my $src_path = $src_plugin->path($src_cfg, $volname, $src_storeid); + my $protected = PVE::Storage::get_volume_attribute($cfg, $src_volid, 'protected'); + PVE::Storage::PBSPlugin::vma_to_pbs( + $ownervm, $src_path, $dst_cfg, $dst_storeid, $protected); + } else { + my $sshinfo; + $sshinfo = PVE::SSHInfo::get_ssh_info($dst_node) if $src_node ne $dst_node; + my $opts = { 'target_volname' => $volname }; + PVE::Storage::storage_migrate($cfg, $src_volid, $sshinfo, $dst_storeid, $opts); + } if ($delete) { &$volume_remove($cfg, $src_volid); diff --git a/src/PVE/Storage/PBSPlugin.pm b/src/PVE/Storage/PBSPlugin.pm index 0808bcc..089f543 100644 --- a/src/PVE/Storage/PBSPlugin.pm +++ b/src/PVE/Storage/PBSPlugin.pm @@ -6,6 +6,7 @@ use strict; use warnings; use Fcntl qw(F_GETFD F_SETFD FD_CLOEXEC); +use File::Basename; use IO::File; use JSON; use MIME::Base64 qw(decode_base64); @@ -971,4 +972,62 @@ sub volume_has_feature { return undef; } +sub vma_to_pbs { + my ($vmid, $source_path, $target_scfg, $target_storeid, $protected) = @_; + + #my $source_plugin = PVE::Storage::Plugin->lookup($source_scfg->{type}); + my $target_plugin = PVE::Storage::Plugin->lookup($target_scfg->{type}); + my $info = PVE::Storage::archive_info($source_path); + die "moving non-VMA backups to a Proxmox Backup Server is not supported\n" + if $info->{format} ne 'vma'; + + my $repo = PVE::PBSClient::get_repository($target_scfg); + my $fingerprint = $target_scfg->{fingerprint}; + my $password = PVE::Storage::PBSPlugin::pbs_password_file_name($target_scfg, $target_storeid); + my $namespace = $target_scfg->{namespace}; + my $keyfile = PVE::Storage::PBSPlugin::pbs_encryption_key_file_name( + $target_scfg, $target_storeid); + my $master_keyfile = PVE::Storage::PBSPlugin::pbs_master_pubkey_file_name( + $target_scfg, $target_storeid); + + my $comp = $info->{compression}; + my $backup_time = $info->{ctime}; + my $source_dirname = dirname($source_path); + my $log_file_path = "$source_dirname/$info->{logfilename}"; + my $notes_file_path = "$source_dirname/$info->{notesfilename}"; + + my $vma_to_pbs_cmd = [ + "vma-to-pbs", + "--repository", $repo, + "--vmid", $vmid, + "--fingerprint", $fingerprint, + "--password-file", $password, + "--backup-time", $backup_time, + "--compress", + ]; + + push @$vma_to_pbs_cmd, "--ns", $namespace if $namespace; + push @$vma_to_pbs_cmd, "--log-file", $log_file_path if -e $log_file_path; + push @$vma_to_pbs_cmd, "--notes-file", $notes_file_path if -e $notes_file_path; + push @$vma_to_pbs_cmd, "--encrypt", "--keyfile", $keyfile if -e $keyfile; + push @$vma_to_pbs_cmd, "--master-keyfile", $master_keyfile if -e $master_keyfile; + + if ($comp) { + PVE::Storage::decompress_archive_into_pipe($source_path, $vma_to_pbs_cmd); + } else { + push @$vma_to_pbs_cmd, $source_path; + run_command($vma_to_pbs_cmd); + } + + if ($protected) { + my $target_volid = PVE::Storage::PBSPlugin::print_volid( + $target_storeid, 'vm', $vmid, $backup_time); + my (undef, $target_volname) = PVE::Storage::parse_volume_id($target_volid, 0); + $target_plugin->update_volume_attribute( + $target_scfg, $target_storeid, $target_volname, 'protected', 1); + } + + return; +} + 1; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel