From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <f.ebner@proxmox.com>
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 75B1073742;
 Fri, 28 May 2021 16:30:12 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
 by firstgate.proxmox.com (Proxmox) with ESMTP id 5FBC9ACCC;
 Fri, 28 May 2021 16:30:12 +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 39A3CAC0C;
 Fri, 28 May 2021 16:30:08 +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 0318C42BDC;
 Fri, 28 May 2021 16:30:08 +0200 (CEST)
From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com,
	pbs-devel@lists.proxmox.com
Date: Fri, 28 May 2021 16:29:42 +0200
Message-Id: <20210528143002.16190-4-f.ebner@proxmox.com>
X-Mailer: git-send-email 2.20.1
In-Reply-To: <20210528143002.16190-1-f.ebner@proxmox.com>
References: <20210528143002.16190-1-f.ebner@proxmox.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-SPAM-LEVEL: Spam detection results:  0
 AWL 0.002 Adjusted score from AWL reputation of From: address
 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. [mod.rs, check.rs, repositories.rs, proxmox.com]
Subject: [pve-devel] [PATCH v5 proxmox-apt 03/23] 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 <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
X-List-Received-Date: Fri, 28 May 2021 14:30:12 -0000

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v4:
    * require package type to be 'deb' for detection

 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





From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <f.ebner@proxmox.com>
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 75B1073742;
 Fri, 28 May 2021 16:30:12 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
 by firstgate.proxmox.com (Proxmox) with ESMTP id 5FBC9ACCC;
 Fri, 28 May 2021 16:30:12 +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 39A3CAC0C;
 Fri, 28 May 2021 16:30:08 +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 0318C42BDC;
 Fri, 28 May 2021 16:30:08 +0200 (CEST)
From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com,
	pbs-devel@lists.proxmox.com
Date: Fri, 28 May 2021 16:29:42 +0200
Message-Id: <20210528143002.16190-4-f.ebner@proxmox.com>
X-Mailer: git-send-email 2.20.1
In-Reply-To: <20210528143002.16190-1-f.ebner@proxmox.com>
References: <20210528143002.16190-1-f.ebner@proxmox.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-SPAM-LEVEL: Spam detection results:  0
 AWL 0.002 Adjusted score from AWL reputation of From: address
 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. [mod.rs, check.rs, repositories.rs, proxmox.com]
Subject: [pbs-devel] [PATCH v5 proxmox-apt 03/23] 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
 <pbs-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/>
List-Post: <mailto:pbs-devel@lists.proxmox.com>
List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe>
X-List-Received-Date: Fri, 28 May 2021 14:30:12 -0000

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v4:
    * require package type to be 'deb' for detection

 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