From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 751F61FF177 for ; Fri, 2 Aug 2024 14:26:51 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1A018C2C4; Fri, 2 Aug 2024 14:25:57 +0200 (CEST) From: Lukas Wagner To: pve-devel@lists.proxmox.com Date: Fri, 2 Aug 2024 14:25:41 +0200 Message-Id: <20240802122542.221388-14-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240802122542.221388-1-l.wagner@proxmox.com> References: <20240802122542.221388-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.007 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 proxmox-perl-rs v2 14/15] pmg-rs: acme: simplify acount config saving 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: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" We already depend on proxmox_sys, so we can just use `replace_file`. Fixing a clippy warning (missing truncate setting for OpenOptions) is an added benefit. Signed-off-by: Lukas Wagner --- pmg-rs/src/acme.rs | 62 ++++++++++------------------------------------ 1 file changed, 13 insertions(+), 49 deletions(-) diff --git a/pmg-rs/src/acme.rs b/pmg-rs/src/acme.rs index e2e7327..ca24f17 100644 --- a/pmg-rs/src/acme.rs +++ b/pmg-rs/src/acme.rs @@ -2,11 +2,9 @@ //! //! The functions in here are perl bindings. -use std::fs::OpenOptions; -use std::io::{self, Write}; -use std::os::unix::fs::OpenOptionsExt; - use anyhow::{format_err, Error}; +use nix::sys::stat::Mode; +use proxmox_sys::fs::CreateOptions; use serde::{Deserialize, Serialize}; use proxmox_acme::types::AccountData as AcmeAccountData; @@ -90,19 +88,12 @@ impl Inner { let _account = self .client .new_account(contact, tos_agreed, rsa_bits, eab_creds)?; - let file = OpenOptions::new() - .write(true) - .create(true) - .mode(0o600) - .open(&account_path) - .map_err(|err| format_err!("failed to open {:?} for writing: {}", account_path, err))?; - self.write_to(file).map_err(|err| { - format_err!( - "failed to write acme account to {:?}: {}", - account_path, - err - ) - })?; + + let data = serde_json::to_vec(&self.to_account_data()?)?; + let create_options = CreateOptions::new().perm(Mode::from_bits_truncate(0o600)); + proxmox_sys::fs::replace_file(&account_path, &data, create_options, true) + .map_err(|err| format_err!("failed to replace ACME account config: {err}"))?; + self.account_path = Some(account_path); Ok(()) @@ -131,12 +122,6 @@ impl Inner { }) } - fn write_to(&mut self, out: T) -> Result<(), Error> { - let data = self.to_account_data()?; - - Ok(serde_json::to_writer_pretty(out, &data)?) - } - pub fn update_account(&mut self, data: &T) -> Result<(), Error> { let account_path = self .account_path @@ -144,32 +129,11 @@ impl Inner { .ok_or_else(|| format_err!("missing account path"))?; self.client.update_account(data)?; - let tmp_path = format!("{}.tmp", account_path); - // FIXME: move proxmox::tools::replace_file & make_temp out into a nice *little* crate... - let mut file = OpenOptions::new() - .write(true) - .create(true) - .mode(0o600) - .open(&tmp_path) - .map_err(|err| format_err!("failed to open {:?} for writing: {}", tmp_path, err))?; - self.write_to(&mut file).map_err(|err| { - format_err!("failed to write acme account to {:?}: {}", tmp_path, err) - })?; - file.flush().map_err(|err| { - format_err!("failed to flush acme account file {:?}: {}", tmp_path, err) - })?; - - // re-borrow since we needed `self` as mut earlier - let account_path = self.account_path.as_deref().unwrap(); - std::fs::rename(&tmp_path, account_path).map_err(|err| { - format_err!( - "failed to rotate temp file into place ({:?} -> {:?}): {}", - &tmp_path, - account_path, - err - ) - })?; - drop(file); + let data = serde_json::to_vec(&self.to_account_data()?)?; + let create_options = CreateOptions::new().perm(Mode::from_bits_truncate(0o600)); + proxmox_sys::fs::replace_file(account_path, &data, create_options, true) + .map_err(|err| format_err!("failed to replace ACME account config: {err}"))?; + Ok(()) } -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel