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 73334715F6; Fri, 11 Jun 2021 13:44:27 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 23475108D8; Fri, 11 Jun 2021 13:44:27 +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 id 5ABA11087C; Fri, 11 Jun 2021 13:44:24 +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 32DE942F04; Fri, 11 Jun 2021 13:44:24 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com, pbs-devel@lists.proxmox.com Date: Fri, 11 Jun 2021 13:43:52 +0200 Message-Id: <20210611114418.28772-4-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210611114418.28772-1-f.ebner@proxmox.com> References: <20210611114418.28772-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.921 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com, repositories.rs, mod.rs, check.rs] Subject: [pve-devel] [PATCH v6 proxmox-apt 03/11] add functions to check for Proxmox repositories X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Jun 2021 11:44:27 -0000 Signed-off-by: Fabian Ebner --- No changes from v5. src/repositories/check.rs | 60 +++++++++++++++++++++++++- src/repositories/mod.rs | 20 +++++++++ tests/repositories.rs | 34 ++++++++++++++- tests/sources.list.d.expected/pve.list | 2 + tests/sources.list.d/pve.list | 2 + 5 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/repositories/check.rs b/src/repositories/check.rs index 87fbbac..a682b69 100644 --- a/src/repositories/check.rs +++ b/src/repositories/check.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Error}; -use crate::types::{APTRepository, APTRepositoryFileType}; +use crate::types::{APTRepository, APTRepositoryFileType, APTRepositoryPackageType}; impl APTRepository { /// Makes sure that all basic properties of a repository are present and @@ -44,4 +44,62 @@ 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 + .types + .iter() + .any(|package_type| *package_type == APTRepositoryPackageType::Deb) + { + return false; + } + + 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 + .types + .iter() + .any(|package_type| *package_type == APTRepositoryPackageType::Deb) + { + return false; + } + + 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 aca05ef..ffb1888 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] @@ -127,3 +129,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(()) +} diff --git a/tests/sources.list.d.expected/pve.list b/tests/sources.list.d.expected/pve.list index 127a49a..805cef7 100644 --- a/tests/sources.list.d.expected/pve.list +++ b/tests/sources.list.d.expected/pve.list @@ -8,6 +8,8 @@ deb http://download.proxmox.com/debian/pve buster pve-no-subscription # deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise +deb-src https://enterprise.proxmox.com/debian/pve buster pve-enterprise + # security updates deb http://security.debian.org/debian-security buster/updates main contrib diff --git a/tests/sources.list.d/pve.list b/tests/sources.list.d/pve.list index 6213f72..2c09f15 100644 --- a/tests/sources.list.d/pve.list +++ b/tests/sources.list.d/pve.list @@ -6,5 +6,7 @@ deb http://ftp.debian.org/debian buster-updates main contrib deb http://download.proxmox.com/debian/pve buster pve-no-subscription # deb https://enterprise.proxmox.com/debian/pve buster pve-enterprise +deb-src https://enterprise.proxmox.com/debian/pve buster pve-enterprise + # security updates deb http://security.debian.org/debian-security buster/updates main contrib -- 2.20.1