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 BDA886A41F for ; Fri, 26 Feb 2021 16:10:08 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 93EA01888B for ; Fri, 26 Feb 2021 16:10:08 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (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 EA7191883D for ; Fri, 26 Feb 2021 16:10:05 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id ABAEE4633A for ; Fri, 26 Feb 2021 16:10:05 +0100 (CET) From: Fabian Ebner To: pbs-devel@lists.proxmox.com Date: Fri, 26 Feb 2021 16:09:52 +0100 Message-Id: <20210226150959.9518-4-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210226150959.9518-1-f.ebner@proxmox.com> References: <20210226150959.9518-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.000 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust 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. [mod.rs, repositories.rs, proxmox.com, check.rs] Subject: [pbs-devel] [PATCH v2 proxmox-apt 03/10] add functions to check for Proxmox repositories 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: Fri, 26 Feb 2021 15:10:08 -0000 Signed-off-by: Fabian Ebner --- Changes from v1: * split this and checks with suites into two also API-wise * add tests src/repositories/check.rs | 42 +++++++++++++++++++++++++++++++++++++++ src/repositories/mod.rs | 21 ++++++++++++++++++++ tests/repositories.rs | 29 ++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/repositories/check.rs b/src/repositories/check.rs index 87fbbac..d0656cd 100644 --- a/src/repositories/check.rs +++ b/src/repositories/check.rs @@ -44,4 +44,46 @@ impl APTRepository { Ok(()) } + + /// Checks if the repository is the no-subscription repository of the specified + /// Proxmox product. + pub fn is_no_subscription(&self, product: &str) -> bool { + let base_uri = "http://download.proxmox.com/debian"; + let no_subscription_uri = format!("{}/{}", base_uri, product); + let no_subscription_component = format!("{}-no-subscription", product); + + if self + .uris + .iter() + .any(|uri| uri.trim_end_matches('/') == no_subscription_uri) + { + return self + .components + .iter() + .any(|comp| *comp == no_subscription_component); + } else { + false + } + } + + /// Checks if the repository is the enterprise repository of the specified + /// Proxmox product. + pub fn is_enterprise(&self, product: &str) -> bool { + let base_uri = "https://enterprise.proxmox.com/debian"; + let enterprise_uri = format!("{}/{}", base_uri, product); + let enterprise_component = format!("{}-enterprise", product); + + if self + .uris + .iter() + .any(|uri| uri.trim_end_matches('/') == enterprise_uri) + { + return self + .components + .iter() + .any(|comp| *comp == enterprise_component); + } else { + false + } + } } diff --git a/src/repositories/mod.rs b/src/repositories/mod.rs index 123222a..4951cb1 100644 --- a/src/repositories/mod.rs +++ b/src/repositories/mod.rs @@ -105,6 +105,27 @@ fn check_filename>( Ok(Some((file_type, path_string))) } +/// Checks if the enterprise repository for the specified Proxmox product is +/// configured and enabled. +pub fn enterprise_repository_enabled>(repos: &[A], product: &str) -> bool { + repos.iter().any(|repo| { + let repo = repo.as_ref(); + repo.enabled && repo.is_enterprise(product) + }) +} + +/// Checks if the no-subscription repository for the specified Proxmox product +/// is configured and enabled. +pub fn no_subscription_repository_enabled>( + repos: &[A], + product: &str, +) -> bool { + repos.iter().any(|repo| { + let repo = repo.as_ref(); + repo.enabled && repo.is_no_subscription(product) + }) +} + /// Returns all APT repositories configured in the specified files including /// disabled ones. /// Warns about invalid file names and some format violations, while other diff --git a/tests/repositories.rs b/tests/repositories.rs index 020e133..deb2f6a 100644 --- a/tests/repositories.rs +++ b/tests/repositories.rs @@ -3,7 +3,10 @@ use std::path::PathBuf; use anyhow::{bail, format_err, Error}; -use proxmox_apt::repositories::{repositories_from_files, write_repositories}; +use proxmox_apt::repositories::{ + enterprise_repository_enabled, no_subscription_repository_enabled, repositories_from_files, + write_repositories, +}; use proxmox_apt::types::APTRepository; #[test] @@ -71,3 +74,27 @@ fn test_parse_write() -> Result<(), Error> { Ok(()) } + +#[test] +fn test_proxmox_repositories() -> Result<(), Error> { + let test_dir = std::env::current_dir()?.join("tests"); + let read_dir = test_dir.join("sources.list.d"); + + let pve_list = read_dir.join("pve.list"); + let repos = repositories_from_files(&vec![pve_list])?; + + assert_eq!(false, enterprise_repository_enabled(&repos, "pbs")); + assert_eq!(false, enterprise_repository_enabled(&repos, "pve")); + assert_eq!(false, no_subscription_repository_enabled(&repos, "pmg")); + assert_eq!(true, no_subscription_repository_enabled(&repos, "pve")); + + let pbs_list = read_dir.join("pbs-enterprise.list"); + let repos = repositories_from_files(&vec![pbs_list])?; + + assert_eq!(true, enterprise_repository_enabled(&repos, "pbs")); + assert_eq!(false, enterprise_repository_enabled(&repos, "pve")); + assert_eq!(false, no_subscription_repository_enabled(&repos, "pmg")); + assert_eq!(false, no_subscription_repository_enabled(&repos, "pve")); + + Ok(()) +} -- 2.20.1