From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id A18B784F9C for ; Thu, 16 Dec 2021 13:13:14 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 912051E573 for ; Thu, 16 Dec 2021 13:12:44 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 128371E471 for ; Thu, 16 Dec 2021 13:12:39 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id D9932452B3 for ; Thu, 16 Dec 2021 13:12:38 +0100 (CET) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Thu, 16 Dec 2021 13:12:32 +0100 Message-Id: <20211216121233.162288-11-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211216121233.162288-1-f.ebner@proxmox.com> References: <20211216121233.162288-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.154 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [vzdump.pm] Subject: [pve-devel] [PATCH manager 5/6] vzdump: support setting protected status and notes X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Dec 2021 12:13:14 -0000 Check the number of protected backups early if the protected flag is set. Suggested-by: Thomas Lamprecht Signed-off-by: Fabian Ebner --- Dependency bump for guest-common needed. Arguably, a warning from failing to set notes is not very visible, but I didn't want to make it a full-blown error. PVE/VZDump.pm | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm index 8e20c320..1aa3822e 100644 --- a/PVE/VZDump.pm +++ b/PVE/VZDump.pm @@ -4,6 +4,7 @@ use strict; use warnings; use Fcntl ':flock'; +use File::Basename; use File::Path; use IO::File; use IO::Select; @@ -772,21 +773,30 @@ sub exec_backup_task { } } - if ($backup_limit && !$opts->{remove}) { + if (($backup_limit && !$opts->{remove}) || $opts->{protected}) { my $count; + my $protected_count; if (my $storeid = $opts->{storage}) { - my $backups = PVE::Storage::volume_list($cfg, $storeid, $vmid, 'backup'); - $count = grep { - !$_->{protected} && (!$_->{subtype} || $_->{subtype} eq $vmtype) - } $backups->@*; + my @backups = grep { + !$_->{subtype} || $_->{subtype} eq $vmtype + } PVE::Storage::volume_list($cfg, $storeid, $vmid, 'backup')->@*; + + $count = grep { !$_->{protected} } @backups; + $protected_count = scalar(@backups) - $count; } else { $count = scalar(get_unprotected_backup_file_list($opts->{dumpdir}, $bkname)->@*); } - die "There is a max backup limit of $backup_limit enforced by the". - " target storage or the vzdump parameters.". - " Either increase the limit or delete old backup(s).\n" - if $count >= $backup_limit; + if ($opts->{protected}) { + my $max_protected = $opts->{scfg}->{'max-protected-backups'} // 5; + if ($max_protected > -1 && $protected_count >= $max_protected) { + die "The number of protected backups per guest is limited to $max_protected ". + "on storage '$opts->{storage}'\n"; + } + } elsif ($count >= $backup_limit) { + die "There is a max backup limit of $backup_limit enforced by the target storage ". + "or the vzdump parameters. Either increase the limit or delete old backups.\n"; + } } if (!$self->{opts}->{pbs}) { @@ -987,6 +997,24 @@ sub exec_backup_task { debugmsg ('info', "archive file size: $cs", $logfd); } + # Mark as protected before pruning. + if (my $storeid = $opts->{storage}) { + my $volname = $opts->{pbs} ? $task->{target} : basename($task->{target}); + my $volid = "${storeid}:backup/${volname}"; + + if ((my $notes = $opts->{notes}) && $opts->{notes} ne '') { + debugmsg('info', "adding notes to backup", $logfd); + eval { PVE::Storage::update_volume_attribute($cfg, $volid, 'notes', $notes) }; + debugmsg('warn', "unable to add notes - $@", $logfd) if $@; + } + + if ($opts->{protected}) { + debugmsg('info', "marking backup as protected", $logfd); + eval { PVE::Storage::update_volume_attribute($cfg, $volid, 'protected', 1) }; + die "unable to set protected flag - $@\n" if $@; + } + } + if ($opts->{remove}) { my $keepstr = join(', ', map { "$_=$prune_options->{$_}" } sort keys %$prune_options); debugmsg ('info', "prune older backups with retention: $keepstr", $logfd); -- 2.30.2