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 5B1F17B3C5; Fri, 8 Jul 2022 15:07:52 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 50F6122D3; Fri, 8 Jul 2022 15:07:52 +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) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS; Fri, 8 Jul 2022 15:07:49 +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 8DBB743E12; Fri, 8 Jul 2022 15:07:49 +0200 (CEST) Date: Fri, 8 Jul 2022 15:07:46 +0200 From: Wolfgang Bumiller To: Fabian Ebner Cc: pve-devel@lists.proxmox.com, pmg-devel@lists.proxmox.com Message-ID: <20220708130746.iqdggvlgmjoygglr@wobu-vie.proxmox.com> References: <20220708115555.82693-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220708115555.82693-1-f.ebner@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.287 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 T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pmg-devel] applied: [PATCH v3 proxmox-perl-rs] move apt repositories module to common X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Jul 2022 13:07:52 -0000 applied this one & bumped On Fri, Jul 08, 2022 at 01:55:53PM +0200, Fabian Ebner wrote: > while introducing a 'product' parameter to the relevant functions and > adding wrappers for backwards-compatibility. > > Suggested-by: Wolfgang Bumiller > Signed-off-by: Fabian Ebner > --- > > Changes from v2: > * Turn Rust side into wrappers rahter than adding Perl wrappers. > * Avoid moving files between packages. > > pve-manager (respectively pmg-api) depends and build-depends on > libproxmox-rs-perl and libpve-rs-perl (respectively libpmg-rs-perl). > Both are needed, because just upgrading libproxmox-rs-perl doesn't > make the new functionality available in the product-specific shared > lib. > > Makefile | 4 +- > common/src/apt/mod.rs | 1 + > common/src/apt/repositories.rs | 164 +++++++++++++++++++++++++++++++++ > common/src/mod.rs | 1 + > pmg-rs/src/apt/repositories.rs | 142 ++-------------------------- > pve-rs/src/apt/repositories.rs | 142 ++-------------------------- > 6 files changed, 183 insertions(+), 271 deletions(-) > create mode 100644 common/src/apt/mod.rs > create mode 100644 common/src/apt/repositories.rs > > diff --git a/Makefile b/Makefile > index 6f9b597..c0212a8 100644 > --- a/Makefile > +++ b/Makefile > @@ -41,7 +41,9 @@ pve pmg: > gen: > $(call package_template,PMG,pmg_rs) > $(call package_template,PVE,pve_rs) > - perl ./scripts/genpackage.pl Common Proxmox::RS::CalendarEvent > + perl ./scripts/genpackage.pl Common \ > + Proxmox::RS::APT::Repositories \ > + Proxmox::RS::CalendarEvent > perl ./scripts/genpackage.pl PVE \ > PVE::RS::APT::Repositories \ > PVE::RS::OpenId \ > diff --git a/common/src/apt/mod.rs b/common/src/apt/mod.rs > new file mode 100644 > index 0000000..21b552a > --- /dev/null > +++ b/common/src/apt/mod.rs > @@ -0,0 +1 @@ > +pub mod repositories; > diff --git a/common/src/apt/repositories.rs b/common/src/apt/repositories.rs > new file mode 100644 > index 0000000..26a20e4 > --- /dev/null > +++ b/common/src/apt/repositories.rs > @@ -0,0 +1,164 @@ > +#[perlmod::package(name = "Proxmox::RS::APT::Repositories")] > +pub mod export { > + use std::convert::TryInto; > + > + use anyhow::{bail, Error}; > + use serde::{Deserialize, Serialize}; > + > + use proxmox_apt::repositories::{ > + APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo, > + APTStandardRepository, > + }; > + > + #[derive(Deserialize, Serialize)] > + #[serde(rename_all = "kebab-case")] > + /// Result for the repositories() function > + pub struct RepositoriesResult { > + /// Successfully parsed files. > + pub files: Vec, > + > + /// Errors for files that could not be parsed or read. > + pub errors: Vec, > + > + /// Common digest for successfully parsed files. > + pub digest: String, > + > + /// Additional information/warnings about repositories. > + pub infos: Vec, > + > + /// Standard repositories and their configuration status. > + pub standard_repos: Vec, > + } > + > + #[derive(Deserialize, Serialize)] > + #[serde(rename_all = "kebab-case")] > + /// For changing an existing repository. > + pub struct ChangeProperties { > + /// Whether the repository should be enabled or not. > + pub enabled: Option, > + } > + > + /// Get information about configured repositories and standard repositories for `product`. > + #[export] > + pub fn repositories(product: &str) -> Result { > + let (files, errors, digest) = proxmox_apt::repositories::repositories()?; > + let digest = hex::encode(&digest); > + > + let suite = proxmox_apt::repositories::get_current_release_codename()?; > + > + let infos = proxmox_apt::repositories::check_repositories(&files, suite); > + let standard_repos = > + proxmox_apt::repositories::standard_repositories(&files, product, suite); > + > + Ok(RepositoriesResult { > + files, > + errors, > + digest, > + infos, > + standard_repos, > + }) > + } > + > + /// Add the repository identified by the `handle` and `product`. > + /// If the repository is already configured, it will be set to enabled. > + /// > + /// The `digest` parameter asserts that the configuration has not been modified. > + #[export] > + pub fn add_repository(handle: &str, product: &str, digest: Option<&str>) -> Result<(), Error> { > + let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > + > + let handle: APTRepositoryHandle = handle.try_into()?; > + let suite = proxmox_apt::repositories::get_current_release_codename()?; > + > + if let Some(digest) = digest { > + let expected_digest = hex::decode(digest)?; > + if expected_digest != current_digest { > + bail!("detected modified configuration - file changed by other user? Try again."); > + } > + } > + > + // check if it's already configured first > + for file in files.iter_mut() { > + for repo in file.repositories.iter_mut() { > + if repo.is_referenced_repository(handle, product, &suite.to_string()) { > + if repo.enabled { > + return Ok(()); > + } > + > + repo.set_enabled(true); > + file.write()?; > + > + return Ok(()); > + } > + } > + } > + > + let (repo, path) = > + proxmox_apt::repositories::get_standard_repository(handle, product, suite); > + > + if let Some(error) = errors.iter().find(|error| error.path == path) { > + bail!( > + "unable to parse existing file {} - {}", > + error.path, > + error.error, > + ); > + } > + > + if let Some(file) = files.iter_mut().find(|file| file.path == path) { > + file.repositories.push(repo); > + > + file.write()?; > + } else { > + let mut file = match APTRepositoryFile::new(&path)? { > + Some(file) => file, > + None => bail!("invalid path - {}", path), > + }; > + > + file.repositories.push(repo); > + > + file.write()?; > + } > + > + Ok(()) > + } > + > + /// Change the properties of the specified repository. > + /// > + /// The `digest` parameter asserts that the configuration has not been modified. > + #[export] > + pub fn change_repository( > + path: &str, > + index: usize, > + options: ChangeProperties, > + digest: Option<&str>, > + ) -> Result<(), Error> { > + let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > + > + if let Some(digest) = digest { > + let expected_digest = hex::decode(digest)?; > + if expected_digest != current_digest { > + bail!("detected modified configuration - file changed by other user? Try again."); > + } > + } > + > + if let Some(error) = errors.iter().find(|error| error.path == path) { > + bail!("unable to parse file {} - {}", error.path, error.error); > + } > + > + if let Some(file) = files.iter_mut().find(|file| file.path == path) { > + if let Some(repo) = file.repositories.get_mut(index) { > + if let Some(enabled) = options.enabled { > + repo.set_enabled(enabled); > + } > + > + file.write()?; > + } else { > + bail!("invalid index - {}", index); > + } > + } else { > + bail!("invalid path - {}", path); > + } > + > + Ok(()) > + } > +} > diff --git a/common/src/mod.rs b/common/src/mod.rs > index fe377d7..738657e 100644 > --- a/common/src/mod.rs > +++ b/common/src/mod.rs > @@ -1 +1,2 @@ > +pub mod apt; > mod calendar_event; > diff --git a/pmg-rs/src/apt/repositories.rs b/pmg-rs/src/apt/repositories.rs > index 596ea4d..f6ddb37 100644 > --- a/pmg-rs/src/apt/repositories.rs > +++ b/pmg-rs/src/apt/repositories.rs > @@ -1,61 +1,13 @@ > #[perlmod::package(name = "PMG::RS::APT::Repositories")] > mod export { > - use std::convert::TryInto; > + use anyhow::Error; > > - use anyhow::{bail, Error}; > - use serde::{Deserialize, Serialize}; > - > - use proxmox_apt::repositories::{ > - APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo, > - APTStandardRepository, > - }; > - > - #[derive(Deserialize, Serialize)] > - #[serde(rename_all = "kebab-case")] > - /// Result for the repositories() function > - pub struct RepositoriesResult { > - /// Successfully parsed files. > - pub files: Vec, > - > - /// Errors for files that could not be parsed or read. > - pub errors: Vec, > - > - /// Common digest for successfully parsed files. > - pub digest: String, > - > - /// Additional information/warnings about repositories. > - pub infos: Vec, > - > - /// Standard repositories and their configuration status. > - pub standard_repos: Vec, > - } > - > - #[derive(Deserialize, Serialize)] > - #[serde(rename_all = "kebab-case")] > - /// For changing an existing repository. > - pub struct ChangeProperties { > - /// Whether the repository should be enabled or not. > - pub enabled: Option, > - } > + use crate::common::apt::repositories::export as common; > > /// Get information about configured and standard repositories. > #[export] > - pub fn repositories() -> Result { > - let (files, errors, digest) = proxmox_apt::repositories::repositories()?; > - let digest = hex::encode(&digest); > - > - let suite = proxmox_apt::repositories::get_current_release_codename()?; > - > - let infos = proxmox_apt::repositories::check_repositories(&files, suite); > - let standard_repos = proxmox_apt::repositories::standard_repositories(&files, "pmg", suite); > - > - Ok(RepositoriesResult { > - files, > - errors, > - digest, > - infos, > - standard_repos, > - }) > + pub fn repositories() -> Result { > + common::repositories("pmg") > } > > /// Add the repository identified by the `handle`. > @@ -64,60 +16,7 @@ mod export { > /// The `digest` parameter asserts that the configuration has not been modified. > #[export] > pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> { > - let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > - > - let handle: APTRepositoryHandle = handle.try_into()?; > - let suite = proxmox_apt::repositories::get_current_release_codename()?; > - > - if let Some(digest) = digest { > - let expected_digest = hex::decode(digest)?; > - if expected_digest != current_digest { > - bail!("detected modified configuration - file changed by other user? Try again."); > - } > - } > - > - // check if it's already configured first > - for file in files.iter_mut() { > - for repo in file.repositories.iter_mut() { > - if repo.is_referenced_repository(handle, "pmg", &suite.to_string()) { > - if repo.enabled { > - return Ok(()); > - } > - > - repo.set_enabled(true); > - file.write()?; > - > - return Ok(()); > - } > - } > - } > - > - let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pmg", suite); > - > - if let Some(error) = errors.iter().find(|error| error.path == path) { > - bail!( > - "unable to parse existing file {} - {}", > - error.path, > - error.error, > - ); > - } > - > - if let Some(file) = files.iter_mut().find(|file| file.path == path) { > - file.repositories.push(repo); > - > - file.write()?; > - } else { > - let mut file = match APTRepositoryFile::new(&path)? { > - Some(file) => file, > - None => bail!("invalid path - {}", path), > - }; > - > - file.repositories.push(repo); > - > - file.write()?; > - } > - > - Ok(()) > + common::add_repository(handle, "pmg", digest) > } > > /// Change the properties of the specified repository. > @@ -127,36 +26,9 @@ mod export { > pub fn change_repository( > path: &str, > index: usize, > - options: ChangeProperties, > + options: common::ChangeProperties, > digest: Option<&str>, > ) -> Result<(), Error> { > - let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > - > - if let Some(digest) = digest { > - let expected_digest = hex::decode(digest)?; > - if expected_digest != current_digest { > - bail!("detected modified configuration - file changed by other user? Try again."); > - } > - } > - > - if let Some(error) = errors.iter().find(|error| error.path == path) { > - bail!("unable to parse file {} - {}", error.path, error.error); > - } > - > - if let Some(file) = files.iter_mut().find(|file| file.path == path) { > - if let Some(repo) = file.repositories.get_mut(index) { > - if let Some(enabled) = options.enabled { > - repo.set_enabled(enabled); > - } > - > - file.write()?; > - } else { > - bail!("invalid index - {}", index); > - } > - } else { > - bail!("invalid path - {}", path); > - } > - > - Ok(()) > + common::change_repository(path, index, options, digest) > } > } > diff --git a/pve-rs/src/apt/repositories.rs b/pve-rs/src/apt/repositories.rs > index 2d5e1da..d5c2f56 100644 > --- a/pve-rs/src/apt/repositories.rs > +++ b/pve-rs/src/apt/repositories.rs > @@ -1,61 +1,13 @@ > #[perlmod::package(name = "PVE::RS::APT::Repositories", lib = "pve_rs")] > mod export { > - use std::convert::TryInto; > + use anyhow::Error; > > - use anyhow::{bail, Error}; > - use serde::{Deserialize, Serialize}; > - > - use proxmox_apt::repositories::{ > - APTRepositoryFile, APTRepositoryFileError, APTRepositoryHandle, APTRepositoryInfo, > - APTStandardRepository, > - }; > - > - #[derive(Deserialize, Serialize)] > - #[serde(rename_all = "kebab-case")] > - /// Result for the repositories() function > - pub struct RepositoriesResult { > - /// Successfully parsed files. > - pub files: Vec, > - > - /// Errors for files that could not be parsed or read. > - pub errors: Vec, > - > - /// Common digest for successfully parsed files. > - pub digest: String, > - > - /// Additional information/warnings about repositories. > - pub infos: Vec, > - > - /// Standard repositories and their configuration status. > - pub standard_repos: Vec, > - } > - > - #[derive(Deserialize, Serialize)] > - #[serde(rename_all = "kebab-case")] > - /// For changing an existing repository. > - pub struct ChangeProperties { > - /// Whether the repository should be enabled or not. > - pub enabled: Option, > - } > + use crate::common::apt::repositories::export as common; > > /// Get information about configured and standard repositories. > #[export] > - pub fn repositories() -> Result { > - let (files, errors, digest) = proxmox_apt::repositories::repositories()?; > - let digest = hex::encode(&digest); > - > - let suite = proxmox_apt::repositories::get_current_release_codename()?; > - > - let infos = proxmox_apt::repositories::check_repositories(&files, suite); > - let standard_repos = proxmox_apt::repositories::standard_repositories(&files, "pve", suite); > - > - Ok(RepositoriesResult { > - files, > - errors, > - digest, > - infos, > - standard_repos, > - }) > + pub fn repositories() -> Result { > + common::repositories("pve") > } > > /// Add the repository identified by the `handle`. > @@ -64,60 +16,7 @@ mod export { > /// The `digest` parameter asserts that the configuration has not been modified. > #[export] > pub fn add_repository(handle: &str, digest: Option<&str>) -> Result<(), Error> { > - let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > - > - let handle: APTRepositoryHandle = handle.try_into()?; > - let suite = proxmox_apt::repositories::get_current_release_codename()?; > - > - if let Some(digest) = digest { > - let expected_digest = hex::decode(digest)?; > - if expected_digest != current_digest { > - bail!("detected modified configuration - file changed by other user? Try again."); > - } > - } > - > - // check if it's already configured first > - for file in files.iter_mut() { > - for repo in file.repositories.iter_mut() { > - if repo.is_referenced_repository(handle, "pve", &suite.to_string()) { > - if repo.enabled { > - return Ok(()); > - } > - > - repo.set_enabled(true); > - file.write()?; > - > - return Ok(()); > - } > - } > - } > - > - let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pve", suite); > - > - if let Some(error) = errors.iter().find(|error| error.path == path) { > - bail!( > - "unable to parse existing file {} - {}", > - error.path, > - error.error, > - ); > - } > - > - if let Some(file) = files.iter_mut().find(|file| file.path == path) { > - file.repositories.push(repo); > - > - file.write()?; > - } else { > - let mut file = match APTRepositoryFile::new(&path)? { > - Some(file) => file, > - None => bail!("invalid path - {}", path), > - }; > - > - file.repositories.push(repo); > - > - file.write()?; > - } > - > - Ok(()) > + common::add_repository(handle, "pve", digest) > } > > /// Change the properties of the specified repository. > @@ -127,36 +26,9 @@ mod export { > pub fn change_repository( > path: &str, > index: usize, > - options: ChangeProperties, > + options: common::ChangeProperties, > digest: Option<&str>, > ) -> Result<(), Error> { > - let (mut files, errors, current_digest) = proxmox_apt::repositories::repositories()?; > - > - if let Some(digest) = digest { > - let expected_digest = hex::decode(digest)?; > - if expected_digest != current_digest { > - bail!("detected modified configuration - file changed by other user? Try again."); > - } > - } > - > - if let Some(error) = errors.iter().find(|error| error.path == path) { > - bail!("unable to parse file {} - {}", error.path, error.error); > - } > - > - if let Some(file) = files.iter_mut().find(|file| file.path == path) { > - if let Some(repo) = file.repositories.get_mut(index) { > - if let Some(enabled) = options.enabled { > - repo.set_enabled(enabled); > - } > - > - file.write()?; > - } else { > - bail!("invalid index - {}", index); > - } > - } else { > - bail!("invalid path - {}", path); > - } > - > - Ok(()) > + common::change_repository(path, index, options, digest) > } > } > -- > 2.30.2