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 0B5807997C for ; Wed, 27 Oct 2021 13:23:41 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1C0C811ED7 for ; Wed, 27 Oct 2021 13:22:44 +0200 (CEST) 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 8B42111E79 for ; Wed, 27 Oct 2021 13:22:40 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 620A145FD1 for ; Wed, 27 Oct 2021 13:22:40 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Wed, 27 Oct 2021 13:22:30 +0200 Message-Id: <20211027112238.3758515-6-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211027112238.3758515-1-d.csapak@proxmox.com> References: <20211027112238.3758515-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.267 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. [datastore.rs] Subject: [pbs-devel] [PATCH proxmox-backup v3 05/13] backup/datastore: prevent protected snapshots to be removed X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Oct 2021 11:23:41 -0000 by throwing an error for remove_backup_dir, and skipping for remove_backup_group Signed-off-by: Dominik Csapak --- pbs-datastore/src/datastore.rs | 37 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs index 7159e578..e32887de 100644 --- a/pbs-datastore/src/datastore.rs +++ b/pbs-datastore/src/datastore.rs @@ -266,8 +266,9 @@ impl DataStore { full_path } - /// Remove a complete backup group including all snapshots - pub fn remove_backup_group(&self, backup_group: &BackupGroup) -> Result<(), Error> { + /// Remove a complete backup group including all snapshots, returns true + /// if all snapshots were removed, and false if some were protected + pub fn remove_backup_group(&self, backup_group: &BackupGroup) -> Result { let full_path = self.group_path(backup_group); @@ -275,22 +276,30 @@ impl DataStore { log::info!("removing backup group {:?}", full_path); + let mut removed_all = true; + // remove all individual backup dirs first to ensure nothing is using them for snap in backup_group.list_backups(&self.base_path())? { + if snap.backup_dir.is_protected(self.base_path()) { + removed_all = false; + continue; + } self.remove_backup_dir(&snap.backup_dir, false)?; } - // no snapshots left, we can now safely remove the empty folder - std::fs::remove_dir_all(&full_path) - .map_err(|err| { - format_err!( - "removing backup group directory {:?} failed - {}", - full_path, - err, - ) - })?; + if removed_all { + // no snapshots left, we can now safely remove the empty folder + std::fs::remove_dir_all(&full_path) + .map_err(|err| { + format_err!( + "removing backup group directory {:?} failed - {}", + full_path, + err, + ) + })?; + } - Ok(()) + Ok(removed_all) } /// Remove a backup directory including all content @@ -304,6 +313,10 @@ impl DataStore { _manifest_guard = self.lock_manifest(backup_dir)?; } + if backup_dir.is_protected(self.base_path()) { + bail!("cannot remove protected snapshot"); + } + log::info!("removing backup snapshot {:?}", full_path); std::fs::remove_dir_all(&full_path) .map_err(|err| { -- 2.30.2