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 D35537B116; Thu, 7 Jul 2022 12:39:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A89CD1DE7A; Thu, 7 Jul 2022 12:38: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)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS; Thu, 7 Jul 2022 12:38:50 +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 3A7F340F98; Thu, 7 Jul 2022 12:38:50 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com, pmg-devel@lists.proxmox.com Date: Thu, 7 Jul 2022 12:38:42 +0200 Message-Id: <20220707103844.73931-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.047 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 - URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [genpackage.pl, lib.rs, repositories.rs, common.pm, repositories.pm, mod.rs] Subject: [pmg-devel] [PATCH v2 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: Thu, 07 Jul 2022 10:39:22 -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 v1: * Add wrappers, so we can defer the Breaks to later. * Drop unnecessary changes in Proxmox/Lib/Common.pm libproxmox-perl-rs needs a depends/breaks+replaces with both libpve-rs-perl and libpmg-rs-perl, because it now includes the P{MG,VE}/APT/Repositories.pm file. pve-manager and pmg-api depend and build-depend on libproxmox-rs-perl. The depends/breaks cycle above then ensures that the new functionality is available in the product-specific shared lib. Makefile | 6 +- common/pkg/Makefile | 1 + common/pkg/PMG/RS/APT/Repositories.pm | 23 +++ common/pkg/PVE/RS/APT/Repositories.pm | 23 +++ {pmg-rs => common}/src/apt/mod.rs | 0 {pmg-rs => common}/src/apt/repositories.rs | 18 ++- common/src/mod.rs | 1 + pmg-rs/src/lib.rs | 1 - pve-rs/src/apt/mod.rs | 1 - pve-rs/src/apt/repositories.rs | 162 --------------------- pve-rs/src/lib.rs | 1 - 11 files changed, 61 insertions(+), 176 deletions(-) create mode 100644 common/pkg/PMG/RS/APT/Repositories.pm create mode 100644 common/pkg/PVE/RS/APT/Repositories.pm rename {pmg-rs => common}/src/apt/mod.rs (100%) rename {pmg-rs => common}/src/apt/repositories.rs (86%) delete mode 100644 pve-rs/src/apt/mod.rs delete mode 100644 pve-rs/src/apt/repositories.rs diff --git a/Makefile b/Makefile index 6f9b597..4b59a57 100644 --- a/Makefile +++ b/Makefile @@ -41,13 +41,13 @@ 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 \ PVE::RS::TFA perl ./scripts/genpackage.pl PMG \ - PMG::RS::APT::Repositories \ PMG::RS::Acme \ PMG::RS::CSR \ PMG::RS::OpenId \ diff --git a/common/pkg/Makefile b/common/pkg/Makefile index 8c71a0a..be4b3bb 100644 --- a/common/pkg/Makefile +++ b/common/pkg/Makefile @@ -18,6 +18,7 @@ all: .PHONY: install install: install -d -m755 $(DESTDIR)$(PERL_INSTALLVENDORLIB) + find PMG \! -type d -print -exec install -Dm644 '{}' $(DESTDIR)$(PERL_INSTALLVENDORLIB)'/{}' ';' find PVE \! -type d -print -exec install -Dm644 '{}' $(DESTDIR)$(PERL_INSTALLVENDORLIB)'/{}' ';' find Proxmox \! -type d -print -exec install -Dm644 '{}' $(DESTDIR)$(PERL_INSTALLVENDORLIB)'/{}' ';' rm $(DESTDIR)$(PERL_INSTALLVENDORLIB)'/Proxmox/Lib/template.pm' diff --git a/common/pkg/PMG/RS/APT/Repositories.pm b/common/pkg/PMG/RS/APT/Repositories.pm new file mode 100644 index 0000000..71520c8 --- /dev/null +++ b/common/pkg/PMG/RS/APT/Repositories.pm @@ -0,0 +1,23 @@ +package PMG::RS::APT::Repositories; +# Compat, Deprecated! + +use strict; +use warnings; + +use Proxmox::RS::APT::Repositories; + +sub repositories { + return Proxmox::RS::APT::Repositories::repositories("pmg"); +} + +sub add_repository { + my ($handle, $digest) = @_; + return Proxmox::RS::APT::Repositories::add_repository($handle, "pmg", $digest); +} + +sub change_repository { + my ($path, $index, $options, $digest) = @_; + return Proxmox::RS::APT::Repositories::change_repository($path, $index, $options, $digest); +} + +1 diff --git a/common/pkg/PVE/RS/APT/Repositories.pm b/common/pkg/PVE/RS/APT/Repositories.pm new file mode 100644 index 0000000..c9587ed --- /dev/null +++ b/common/pkg/PVE/RS/APT/Repositories.pm @@ -0,0 +1,23 @@ +package PVE::RS::APT::Repositories; +# Compat, Deprecated! + +use strict; +use warnings; + +use Proxmox::RS::APT::Repositories; + +sub repositories { + return Proxmox::RS::APT::Repositories::repositories("pve"); +} + +sub add_repository { + my ($handle, $digest) = @_; + return Proxmox::RS::APT::Repositories::add_repository($handle, "pve", $digest); +} + +sub change_repository { + my ($path, $index, $options, $digest) = @_; + return Proxmox::RS::APT::Repositories::change_repository($path, $index, $options, $digest); +} + +1 diff --git a/pmg-rs/src/apt/mod.rs b/common/src/apt/mod.rs similarity index 100% rename from pmg-rs/src/apt/mod.rs rename to common/src/apt/mod.rs diff --git a/pmg-rs/src/apt/repositories.rs b/common/src/apt/repositories.rs similarity index 86% rename from pmg-rs/src/apt/repositories.rs rename to common/src/apt/repositories.rs index 596ea4d..8979b58 100644 --- a/pmg-rs/src/apt/repositories.rs +++ b/common/src/apt/repositories.rs @@ -1,4 +1,4 @@ -#[perlmod::package(name = "PMG::RS::APT::Repositories")] +#[perlmod::package(name = "Proxmox::RS::APT::Repositories")] mod export { use std::convert::TryInto; @@ -38,16 +38,17 @@ mod export { pub enabled: Option, } - /// Get information about configured and standard repositories. + /// Get information about configured repositories and standard repositories for `product`. #[export] - pub fn repositories() -> Result { + 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, "pmg", suite); + let standard_repos = + proxmox_apt::repositories::standard_repositories(&files, product, suite); Ok(RepositoriesResult { files, @@ -58,12 +59,12 @@ mod export { }) } - /// Add the repository identified by the `handle`. + /// 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, digest: Option<&str>) -> Result<(), Error> { + 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()?; @@ -79,7 +80,7 @@ mod export { // 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.is_referenced_repository(handle, product, &suite.to_string()) { if repo.enabled { return Ok(()); } @@ -92,7 +93,8 @@ mod export { } } - let (repo, path) = proxmox_apt::repositories::get_standard_repository(handle, "pmg", suite); + let (repo, path) = + proxmox_apt::repositories::get_standard_repository(handle, product, suite); if let Some(error) = errors.iter().find(|error| error.path == path) { bail!( diff --git a/common/src/mod.rs b/common/src/mod.rs index fe377d7..1beb96d 100644 --- a/common/src/mod.rs +++ b/common/src/mod.rs @@ -1 +1,2 @@ +mod apt; mod calendar_event; diff --git a/pmg-rs/src/lib.rs b/pmg-rs/src/lib.rs index af89416..327809e 100644 --- a/pmg-rs/src/lib.rs +++ b/pmg-rs/src/lib.rs @@ -2,6 +2,5 @@ pub mod common; pub mod acme; -pub mod apt; pub mod csr; pub mod tfa; diff --git a/pve-rs/src/apt/mod.rs b/pve-rs/src/apt/mod.rs deleted file mode 100644 index 574c1a7..0000000 --- a/pve-rs/src/apt/mod.rs +++ /dev/null @@ -1 +0,0 @@ -mod repositories; diff --git a/pve-rs/src/apt/repositories.rs b/pve-rs/src/apt/repositories.rs deleted file mode 100644 index 2d5e1da..0000000 --- a/pve-rs/src/apt/repositories.rs +++ /dev/null @@ -1,162 +0,0 @@ -#[perlmod::package(name = "PVE::RS::APT::Repositories", lib = "pve_rs")] -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 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, - }) - } - - /// Add the repository identified by the `handle`. - /// 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, 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(()) - } - - /// 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/pve-rs/src/lib.rs b/pve-rs/src/lib.rs index 26b998b..93771c2 100644 --- a/pve-rs/src/lib.rs +++ b/pve-rs/src/lib.rs @@ -3,6 +3,5 @@ #[path = "../../common/src/mod.rs"] pub mod common; -pub mod apt; pub mod openid; pub mod tfa; -- 2.30.2