apt: avoid global apt config

Because it was only used for the test setup. Instead, we simply
add an apt_lists_dir parameter where we need it.

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
This commit is contained in:
Dietmar Maurer 2024-07-05 09:54:05 +02:00 committed by Wolfgang Bumiller
parent f451a643ae
commit 75c62574c6
7 changed files with 25 additions and 67 deletions

View File

@ -1,4 +1,5 @@
// API function that work without feature "cache" // API function that work without feature "cache"
use std::path::Path;
use anyhow::{bail, Error}; use anyhow::{bail, Error};
@ -27,11 +28,13 @@ pub fn get_changelog(options: &APTGetChangelogOptions) -> Result<String, Error>
/// Get APT repository information. /// Get APT repository information.
pub fn list_repositories(product: &str) -> Result<APTRepositoriesResult, Error> { pub fn list_repositories(product: &str) -> Result<APTRepositoriesResult, Error> {
let apt_lists_dir = Path::new("/var/lib/apt/lists");
let (files, errors, digest) = crate::repositories::repositories()?; let (files, errors, digest) = crate::repositories::repositories()?;
let suite = crate::repositories::get_current_release_codename()?; let suite = crate::repositories::get_current_release_codename()?;
let infos = crate::repositories::check_repositories(&files, suite); let infos = crate::repositories::check_repositories(&files, suite, apt_lists_dir);
let standard_repos = crate::repositories::standard_repositories(&files, product, suite); let standard_repos = crate::repositories::standard_repositories(&files, product, suite);
Ok(APTRepositoriesResult { Ok(APTRepositoriesResult {

View File

@ -1,35 +0,0 @@
use once_cell::sync::OnceCell;
static GLOBAL_CONFIG: OnceCell<APTConfig> = OnceCell::new();
/// APT configuration variables.
pub struct APTConfig {
/// Dir::State
pub dir_state: String,
/// Dir::State::Lists
pub dir_state_lists: String,
}
impl APTConfig {
/// Create a new configuration overriding the provided values.
pub fn new(dir_state: Option<&str>, dir_state_lists: Option<&str>) -> Self {
Self {
dir_state: dir_state.unwrap_or("/var/lib/apt/").to_string(),
dir_state_lists: dir_state_lists.unwrap_or("lists/").to_string(),
}
}
}
/// Get the configuration.
///
/// Initializes with default values if init() wasn't called before.
pub fn get() -> &'static APTConfig {
GLOBAL_CONFIG.get_or_init(|| APTConfig::new(None, None))
}
/// Initialize the configuration.
///
/// Only has an effect if no init() or get() has been called yet.
pub fn init(config: APTConfig) -> &'static APTConfig {
GLOBAL_CONFIG.get_or_init(|| config)
}

View File

@ -9,6 +9,6 @@ pub mod cache;
mod cache_api; mod cache_api;
#[cfg(feature = "cache")] #[cfg(feature = "cache")]
pub use cache_api::{get_package_versions, list_available_apt_update, update_database}; pub use cache_api::{get_package_versions, list_available_apt_update, update_database};
pub mod config;
pub mod deb822; pub mod deb822;
pub mod repositories; pub mod repositories;

View File

@ -59,7 +59,7 @@ pub trait APTRepositoryFileImpl {
fn check_suites(&self, current_codename: DebianCodename) -> Vec<APTRepositoryInfo>; fn check_suites(&self, current_codename: DebianCodename) -> Vec<APTRepositoryInfo>;
/// Checks for official URIs. /// Checks for official URIs.
fn check_uris(&self) -> Vec<APTRepositoryInfo>; fn check_uris(&self, apt_lists_dir: &Path) -> Vec<APTRepositoryInfo>;
} }
impl APTRepositoryFileImpl for APTRepositoryFile { impl APTRepositoryFileImpl for APTRepositoryFile {
@ -357,7 +357,7 @@ impl APTRepositoryFileImpl for APTRepositoryFile {
infos infos
} }
fn check_uris(&self) -> Vec<APTRepositoryInfo> { fn check_uris(&self, apt_lists_dir: &Path) -> Vec<APTRepositoryInfo> {
let mut infos = vec![]; let mut infos = vec![];
let path = match &self.path { let path = match &self.path {
@ -366,7 +366,7 @@ impl APTRepositoryFileImpl for APTRepositoryFile {
}; };
for (n, repo) in self.repositories.iter().enumerate() { for (n, repo) in self.repositories.iter().enumerate() {
let mut origin = match repo.get_cached_origin() { let mut origin = match repo.get_cached_origin(apt_lists_dir) {
Ok(option) => option, Ok(option) => option,
Err(_) => None, Err(_) => None,
}; };

View File

@ -1,5 +1,5 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::path::PathBuf; use std::path::{Path, PathBuf};
use anyhow::{bail, Error}; use anyhow::{bail, Error};
@ -56,12 +56,13 @@ fn common_digest(files: &[APTRepositoryFile]) -> ConfigDigest {
pub fn check_repositories( pub fn check_repositories(
files: &[APTRepositoryFile], files: &[APTRepositoryFile],
current_suite: DebianCodename, current_suite: DebianCodename,
apt_lists_dir: &Path,
) -> Vec<APTRepositoryInfo> { ) -> Vec<APTRepositoryInfo> {
let mut infos = vec![]; let mut infos = vec![];
for file in files.iter() { for file in files.iter() {
infos.append(&mut file.check_suites(current_suite)); infos.append(&mut file.check_suites(current_suite));
infos.append(&mut file.check_uris()); infos.append(&mut file.check_uris(apt_lists_dir));
} }
infos infos

View File

@ -1,5 +1,5 @@
use std::io::{BufRead, BufReader, Write}; use std::io::{BufRead, BufReader, Write};
use std::path::PathBuf; use std::path::{Path, PathBuf};
use anyhow::{bail, format_err, Error}; use anyhow::{bail, format_err, Error};
@ -33,7 +33,7 @@ pub trait APTRepositoryImpl {
fn origin_from_uris(&self) -> Option<String>; fn origin_from_uris(&self) -> Option<String>;
/// Get the `Origin:` value from a cached InRelease file. /// Get the `Origin:` value from a cached InRelease file.
fn get_cached_origin(&self) -> Result<Option<String>, Error>; fn get_cached_origin(&self, apt_lists_dir: &Path) -> Result<Option<String>, Error>;
/// Writes a repository in the corresponding format followed by a blank. /// Writes a repository in the corresponding format followed by a blank.
/// ///
@ -163,13 +163,13 @@ impl APTRepositoryImpl for APTRepository {
None None
} }
fn get_cached_origin(&self) -> Result<Option<String>, Error> { fn get_cached_origin(&self, apt_lists_dir: &Path) -> Result<Option<String>, Error> {
for uri in self.uris.iter() { for uri in self.uris.iter() {
for suite in self.suites.iter() { for suite in self.suites.iter() {
let mut file = release_filename(uri, suite, false); let mut file = release_filename(apt_lists_dir, uri, suite, false);
if !file.exists() { if !file.exists() {
file = release_filename(uri, suite, true); file = release_filename(apt_lists_dir, uri, suite, true);
if !file.exists() { if !file.exists() {
continue; continue;
} }
@ -206,9 +206,8 @@ impl APTRepositoryImpl for APTRepository {
} }
/// Get the path to the cached (In)Release file. /// Get the path to the cached (In)Release file.
fn release_filename(uri: &str, suite: &str, detached: bool) -> PathBuf { fn release_filename(apt_lists_dir: &Path, uri: &str, suite: &str, detached: bool) -> PathBuf {
let mut path = PathBuf::from(&crate::config::get().dir_state); let mut path = PathBuf::from(apt_lists_dir);
path.push(&crate::config::get().dir_state_lists);
let encoded_uri = uri_to_filename(uri); let encoded_uri = uri_to_filename(uri);
let filename = if detached { "Release" } else { "InRelease" }; let filename = if detached { "Release" } else { "InRelease" };

View File

@ -2,8 +2,6 @@ use std::path::PathBuf;
use anyhow::{bail, format_err, Error}; use anyhow::{bail, format_err, Error};
use proxmox_apt::config::APTConfig;
use proxmox_apt::repositories::{ use proxmox_apt::repositories::{
check_repositories, get_current_release_codename, standard_repositories, DebianCodename, check_repositories, get_current_release_codename, standard_repositories, DebianCodename,
}; };
@ -185,17 +183,13 @@ fn test_empty_write() -> Result<(), Error> {
fn test_check_repositories() -> Result<(), Error> { fn test_check_repositories() -> Result<(), Error> {
let test_dir = std::env::current_dir()?.join("tests"); let test_dir = std::env::current_dir()?.join("tests");
let read_dir = test_dir.join("sources.list.d"); let read_dir = test_dir.join("sources.list.d");
let apt_lists_dir: PathBuf = test_dir.join("lists");
proxmox_apt::config::init(APTConfig::new(
Some(&test_dir.into_os_string().into_string().unwrap()),
None,
));
let absolute_suite_list = read_dir.join("absolute_suite.list"); let absolute_suite_list = read_dir.join("absolute_suite.list");
let mut file = APTRepositoryFile::new(absolute_suite_list)?.unwrap(); let mut file = APTRepositoryFile::new(absolute_suite_list)?.unwrap();
file.parse()?; file.parse()?;
let infos = check_repositories(&[file], DebianCodename::Bullseye); let infos = check_repositories(&[file], DebianCodename::Bullseye, &apt_lists_dir);
assert!(infos.is_empty()); assert!(infos.is_empty());
let pve_list = read_dir.join("pve.list"); let pve_list = read_dir.join("pve.list");
@ -220,7 +214,7 @@ fn test_check_repositories() -> Result<(), Error> {
} }
expected_infos.sort(); expected_infos.sort();
let mut infos = check_repositories(&[file], DebianCodename::Bullseye); let mut infos = check_repositories(&[file], DebianCodename::Bullseye, &apt_lists_dir);
infos.sort(); infos.sort();
assert_eq!(infos, expected_infos); assert_eq!(infos, expected_infos);
@ -286,7 +280,7 @@ fn test_check_repositories() -> Result<(), Error> {
} }
expected_infos.sort(); expected_infos.sort();
let mut infos = check_repositories(&[file], DebianCodename::Bullseye); let mut infos = check_repositories(&[file], DebianCodename::Bullseye, &apt_lists_dir);
infos.sort(); infos.sort();
assert_eq!(infos, expected_infos); assert_eq!(infos, expected_infos);
@ -318,7 +312,7 @@ fn test_check_repositories() -> Result<(), Error> {
} }
expected_infos.sort(); expected_infos.sort();
let mut infos = check_repositories(&[file], DebianCodename::Bullseye); let mut infos = check_repositories(&[file], DebianCodename::Bullseye, &apt_lists_dir);
infos.sort(); infos.sort();
assert_eq!(infos, expected_infos); assert_eq!(infos, expected_infos);
@ -329,11 +323,7 @@ fn test_check_repositories() -> Result<(), Error> {
fn test_get_cached_origin() -> Result<(), Error> { fn test_get_cached_origin() -> Result<(), Error> {
let test_dir = std::env::current_dir()?.join("tests"); let test_dir = std::env::current_dir()?.join("tests");
let read_dir = test_dir.join("sources.list.d"); let read_dir = test_dir.join("sources.list.d");
let apt_lists_dir: PathBuf = test_dir.clone().join("lists");
proxmox_apt::config::init(APTConfig::new(
Some(&test_dir.into_os_string().into_string().unwrap()),
None,
));
let pve_list = read_dir.join("pve.list"); let pve_list = read_dir.join("pve.list");
let mut file = APTRepositoryFile::new(pve_list)?.unwrap(); let mut file = APTRepositoryFile::new(pve_list)?.unwrap();
@ -351,7 +341,7 @@ fn test_get_cached_origin() -> Result<(), Error> {
assert_eq!(file.repositories.len(), origins.len()); assert_eq!(file.repositories.len(), origins.len());
for (n, repo) in file.repositories.iter().enumerate() { for (n, repo) in file.repositories.iter().enumerate() {
assert_eq!(repo.get_cached_origin()?, origins[n]); assert_eq!(repo.get_cached_origin(&apt_lists_dir)?, origins[n]);
} }
Ok(()) Ok(())