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 D91117B407; Fri, 8 Jul 2022 13:56:33 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CEF21154F; Fri, 8 Jul 2022 13:56:03 +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; Fri, 8 Jul 2022 13:56:01 +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 CD9B643E04; Fri, 8 Jul 2022 13:56:00 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com, pmg-devel@lists.proxmox.com Date: Fri, 8 Jul 2022 13:55:53 +0200 Message-Id: <20220708115555.82693-1-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.046 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] [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 11:56:33 -0000 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