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 7E47C79DC1 for ; Thu, 28 Oct 2021 11:05:46 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 617D41D84D for ; Thu, 28 Oct 2021 11:05:46 +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 C22A91D842 for ; Thu, 28 Oct 2021 11:05:45 +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 9BA6145AD9 for ; Thu, 28 Oct 2021 11:05:45 +0200 (CEST) Date: Thu, 28 Oct 2021 11:05:44 +0200 From: Wolfgang Bumiller To: Dominik Csapak Cc: pbs-devel@lists.proxmox.com Message-ID: <20211028090544.hdzw336rqrxb4juc@olga.proxmox.com> References: <20211027112238.3758515-1-d.csapak@proxmox.com> <20211027112238.3758515-9-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20211027112238.3758515-9-d.csapak@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.588 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: Re: [pbs-devel] [PATCH proxmox-backup v3 08/13] api2/admin/datastore: add get/set_protection 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: Thu, 28 Oct 2021 09:05:46 -0000 1 error handling issue, and another nit On Wed, Oct 27, 2021 at 01:22:33PM +0200, Dominik Csapak wrote: > for gettin/setting the protected flag for snapshots (akin to notes) > > Signed-off-by: Dominik Csapak > --- > pbs-datastore/src/datastore.rs | 24 +++++++++ > src/api2/admin/datastore.rs | 92 ++++++++++++++++++++++++++++++++++ > 2 files changed, 116 insertions(+) > > diff --git a/pbs-datastore/src/datastore.rs b/pbs-datastore/src/datastore.rs > index e32887de..5049cb3d 100644 > --- a/pbs-datastore/src/datastore.rs > +++ b/pbs-datastore/src/datastore.rs > @@ -858,6 +858,30 @@ impl DataStore { > Ok(()) > } > > + /// Updates the protection status of the specified snapshot. > + pub fn update_protection( > + &self, > + backup_dir: &BackupDir, > + protection: bool > + ) -> Result<(), Error> { > + let full_path = self.snapshot_path(backup_dir); > + > + let _guard = lock_dir_noblock(&full_path, "snapshot", "possibly running or in use")?; > + > + let protected_path = backup_dir.protected_file(self.base_path()); > + if protection { > + std::fs::File::create(protected_path) > + .map_err(|err| format_err!("could not create protection file: {}", err))?; Should we not also ignore `ErrorKind::AlreadyExists` here? After all, we ignore `NotFound` when removing it. > + } else if let Err(err) = std::fs::remove_file(protected_path) { > + // ignore error for non-existing file > + if err.kind() != std::io::ErrorKind::NotFound { > + bail!("could not remove protection file: {}", err); > + } > + } > + > + Ok(()) > + } > + > pub fn verify_new(&self) -> bool { > self.verify_new > } > diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs > index fe962e4e..b9bcde12 100644 > --- a/src/api2/admin/datastore.rs > +++ b/src/api2/admin/datastore.rs > @@ -1750,6 +1750,92 @@ pub fn set_notes( > Ok(()) > } > > +#[api( > + input: { > + properties: { > + store: { > + schema: DATASTORE_SCHEMA, > + }, > + "backup-type": { > + schema: BACKUP_TYPE_SCHEMA, > + }, > + "backup-id": { > + schema: BACKUP_ID_SCHEMA, > + }, > + "backup-time": { > + schema: BACKUP_TIME_SCHEMA, > + }, > + }, > + }, > + access: { > + permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_AUDIT | PRIV_DATASTORE_BACKUP, true), > + }, > +)] > +/// Query protection for a specific backup > +pub fn get_protection( > + store: String, > + backup_type: String, > + backup_id: String, > + backup_time: i64, > + rpcenv: &mut dyn RpcEnvironment, > +) -> Result { > + let datastore = DataStore::lookup_datastore(&store)?; > + > + let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?; > + let backup_dir = BackupDir::new(backup_type, backup_id, backup_time)?; > + > + check_priv_or_backup_owner(&datastore, backup_dir.group(), &auth_id, PRIV_DATASTORE_AUDIT)?; > + > + let protected_path = backup_dir.protected_file(datastore.base_path()); > + > + Ok(protected_path.exists()) since you don't need the path, use `.is_protected()` > +} > +