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 1E59A70483 for ; Fri, 2 Apr 2021 13:21:00 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 0BBF8E296 for ; Fri, 2 Apr 2021 13:21:00 +0200 (CEST) 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 341AEE223 for ; Fri, 2 Apr 2021 13:20:57 +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 F30F645C22 for ; Fri, 2 Apr 2021 13:20:56 +0200 (CEST) From: Fabian Ebner To: pbs-devel@lists.proxmox.com Date: Fri, 2 Apr 2021 13:20:44 +0200 Message-Id: <20210402112051.14628-4-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210402112051.14628-1-f.ebner@proxmox.com> References: <20210402112051.14628-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.007 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. [check.rs, mod.rs, proxmox.com, repositories.rs] Subject: [pbs-devel] [PATCH v4 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, 02 Apr 2021 11:21:00 -0000 Signed-off-by: Fabian Ebner --- Changes from v3: * switched to taking APTRepositoryFile slice as input. src/repositories/check.rs | 42 +++++++++++++++++++++++++++++++++++++++ src/repositories/mod.rs | 20 +++++++++++++++++++ tests/repositories.rs | 34 ++++++++++++++++++++++++++++++- 3 files changed, 95 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 187ead3..b7919a9 100644 --- a/src/repositories/mod.rs +++ b/src/repositories/mod.rs @@ -148,6 +148,26 @@ impl APTRepositoryFile { } } +/// Checks if the enterprise repository for the specified Proxmox product is +/// configured and enabled. +pub fn enterprise_repository_enabled(files: &[APTRepositoryFile], product: &str) -> bool { + files.iter().any(|file| { + file.repositories + .iter() + .any(|repo| 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(files: &[APTRepositoryFile], product: &str) -> bool { + files.iter().any(|file| { + file.repositories + .iter() + .any(|repo| repo.enabled && repo.is_no_subscription(product)) + }) +} + /// Returns all APT repositories configured in `/etc/apt/sources.list` and /// in `/etc/apt/sources.list.d` including disabled repositories. /// diff --git a/tests/repositories.rs b/tests/repositories.rs index 348c496..d23beac 100644 --- a/tests/repositories.rs +++ b/tests/repositories.rs @@ -2,7 +2,9 @@ use std::path::PathBuf; use anyhow::{bail, format_err, Error}; -use proxmox_apt::repositories::write_repositories; +use proxmox_apt::repositories::{ + enterprise_repository_enabled, no_subscription_repository_enabled, write_repositories, +}; use proxmox_apt::types::APTRepositoryFile; #[test] @@ -129,3 +131,33 @@ fn test_digest() -> 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 mut file = APTRepositoryFile::new(&pve_list)?.unwrap(); + file.parse()?; + + let files = vec![file]; + + assert_eq!(false, enterprise_repository_enabled(&files, "pbs")); + assert_eq!(false, enterprise_repository_enabled(&files, "pve")); + assert_eq!(false, no_subscription_repository_enabled(&files, "pmg")); + assert_eq!(true, no_subscription_repository_enabled(&files, "pve")); + + let pbs_list = read_dir.join("pbs-enterprise.list"); + let mut file = APTRepositoryFile::new(&pbs_list)?.unwrap(); + file.parse()?; + + let files = vec![file]; + + assert_eq!(true, enterprise_repository_enabled(&files, "pbs")); + assert_eq!(false, enterprise_repository_enabled(&files, "pve")); + assert_eq!(false, no_subscription_repository_enabled(&files, "pmg")); + assert_eq!(false, no_subscription_repository_enabled(&files, "pve")); + + Ok(()) +} -- 2.20.1