deb: make sure to have the right apt keyrings
Some checks failed
CI / build (push) Failing after 14s
Some checks failed
CI / build (push) Failing after 14s
This commit is contained in:
@@ -13,6 +13,7 @@ struct SeriesInfo {
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct DistData {
|
||||
base_url: String,
|
||||
archive_keyring: String,
|
||||
pockets: Vec<String>,
|
||||
series: SeriesInfo,
|
||||
}
|
||||
@@ -124,6 +125,27 @@ pub fn get_base_url(dist: &str) -> String {
|
||||
DATA.dist.get(dist).unwrap().base_url.clone()
|
||||
}
|
||||
|
||||
/// Obtain the URL for the archive keyring of a distribution series
|
||||
pub async fn get_keyring_url(series: &str) -> Result<String, Box<dyn Error>> {
|
||||
let dist = get_dist_from_series(series).await?;
|
||||
let dist_data = DATA
|
||||
.dist
|
||||
.get(&dist)
|
||||
.ok_or(format!("Unsupported distribution: {}", dist))?;
|
||||
|
||||
// For Debian, we need the series number to form the keyring URL
|
||||
if dist == "debian" {
|
||||
let series_num = get_debian_series_number(series).await?.unwrap();
|
||||
// Replace {series_num} placeholder with the actual series number
|
||||
Ok(dist_data
|
||||
.archive_keyring
|
||||
.replace("{series_num}", &series_num))
|
||||
} else {
|
||||
// For other distributions like Ubuntu, use the keyring directly
|
||||
Ok(dist_data.archive_keyring.clone())
|
||||
}
|
||||
}
|
||||
|
||||
/// Obtain the URL for the 'Release' file of a distribution series
|
||||
fn get_release_url(base_url: &str, series: &str, pocket: &str) -> String {
|
||||
let pocket_full = if pocket.is_empty() {
|
||||
@@ -159,6 +181,44 @@ pub async fn get_components(
|
||||
Err("Components not found.".into())
|
||||
}
|
||||
|
||||
/// Map a Debian series name to its version number
|
||||
pub async fn get_debian_series_number(series: &str) -> Result<Option<String>, Box<dyn Error>> {
|
||||
let series_info = &DATA.dist.get("debian").unwrap().series;
|
||||
let content = if Path::new(series_info.local.as_str()).exists() {
|
||||
std::fs::read_to_string(series_info.local.as_str())?
|
||||
} else {
|
||||
reqwest::get(series_info.network.as_str())
|
||||
.await?
|
||||
.text()
|
||||
.await?
|
||||
};
|
||||
|
||||
let mut rdr = csv::ReaderBuilder::new()
|
||||
.flexible(true)
|
||||
.from_reader(content.as_bytes());
|
||||
|
||||
let headers = rdr.headers()?.clone();
|
||||
let series_idx = headers
|
||||
.iter()
|
||||
.position(|h| h == "series")
|
||||
.ok_or("Column 'series' not found")?;
|
||||
let version_idx = headers
|
||||
.iter()
|
||||
.position(|h| h == "version")
|
||||
.ok_or("Column 'version' not found")?;
|
||||
|
||||
for result in rdr.records() {
|
||||
let record = result?;
|
||||
if let (Some(s), Some(v)) = (record.get(series_idx), record.get(version_idx))
|
||||
&& s.to_lowercase() == series.to_lowercase()
|
||||
{
|
||||
return Ok(Some(v.to_string()));
|
||||
}
|
||||
}
|
||||
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@@ -182,4 +242,20 @@ mod tests {
|
||||
assert_eq!(get_dist_from_series("sid").await.unwrap(), "debian");
|
||||
assert_eq!(get_dist_from_series("noble").await.unwrap(), "ubuntu");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_get_debian_series_number() {
|
||||
// Test with known Debian series
|
||||
let bookworm_number = get_debian_series_number("bookworm").await.unwrap();
|
||||
assert!(bookworm_number.is_some());
|
||||
assert_eq!(bookworm_number.unwrap(), "12");
|
||||
|
||||
let trixie_number = get_debian_series_number("trixie").await.unwrap();
|
||||
assert!(trixie_number.is_some());
|
||||
assert_eq!(trixie_number.unwrap(), "13");
|
||||
|
||||
// Test with unknown series
|
||||
let unknown_number = get_debian_series_number("unknown").await.unwrap();
|
||||
assert!(unknown_number.is_none());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user