This commit is contained in:
Lucy 2025-09-30 17:12:09 +02:00
parent 9670deab55
commit 98c5feaaee
5 changed files with 9 additions and 54 deletions

View file

@ -7,10 +7,8 @@ use std::thread;
use console::style; use console::style;
use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
use md5;
use reqwest::blocking::Client; use reqwest::blocking::Client;
/// Prüft Datei gegen erwarteten MD5-Hash
fn verify_md5(file_path: &Path, expected_hash: &str) -> bool { fn verify_md5(file_path: &Path, expected_hash: &str) -> bool {
let mut f = match File::open(file_path) { let mut f = match File::open(file_path) {
Ok(f) => f, Ok(f) => f,
@ -25,7 +23,6 @@ fn verify_md5(file_path: &Path, expected_hash: &str) -> bool {
hex == expected_hash hex == expected_hash
} }
/// Download + Live-MD5-Prüfung
pub fn download_files( pub fn download_files(
wget_list: &str, wget_list: &str,
target_dir: &Path, target_dir: &Path,
@ -39,7 +36,6 @@ pub fn download_files(
let client = Arc::new(Client::new()); let client = Arc::new(Client::new());
let mp = Arc::new(MultiProgress::new()); let mp = Arc::new(MultiProgress::new());
// Clone md5_map before the loop so we can move it into threads
let md5_map = md5_map.cloned(); let md5_map = md5_map.cloned();
let mut handles = vec![]; let mut handles = vec![];
@ -106,7 +102,6 @@ pub fn download_files(
pb.set_position(downloaded); pb.set_position(downloaded);
} }
// Live-MD5-Prüfung
let status = if let Some(ref md5_map) = md5_map { let status = if let Some(ref md5_map) = md5_map {
if let Some(expected_hash) = md5_map.get(filename) { if let Some(expected_hash) = md5_map.get(filename) {
if verify_md5(&filepath, expected_hash) { if verify_md5(&filepath, expected_hash) {

View file

@ -10,7 +10,6 @@ use std::env;
use std::path::PathBuf; use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
// LFS sources Pfad
let lfs_sources = match env::var("LFS") { let lfs_sources = match env::var("LFS") {
Ok(lfs) => PathBuf::from(lfs).join("sources"), Ok(lfs) => PathBuf::from(lfs).join("sources"),
Err(_) => { Err(_) => {
@ -26,10 +25,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
} }
}; };
// Mirror für Pakete auswählen
let package_mirror = mirrors::choose_package_mirror(); let package_mirror = mirrors::choose_package_mirror();
// Wget-Liste vom Original LFS-Mirror holen
let wget_list = wget_list::get_wget_list()?; let wget_list = wget_list::get_wget_list()?;
// MD5 Map vorbereiten // MD5 Map vorbereiten
@ -42,7 +39,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
} }
} }
// Pakete herunterladen + Live-MD5 prüfen
downloader::download_files(&wget_list, &lfs_sources, package_mirror, Some(&md5_map))?; downloader::download_files(&wget_list, &lfs_sources, package_mirror, Some(&md5_map))?;
println!("{} All done!", style("🎉").green().bold()); println!("{} All done!", style("🎉").green().bold());

View file

@ -1,9 +1,3 @@
use console::style;
use md5;
use std::fs::File;
use std::io::{BufRead, BufReader, Read};
use std::path::Path;
pub fn get_md5sums() -> Result<String, Box<dyn std::error::Error>> { pub fn get_md5sums() -> Result<String, Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::builder() let client = reqwest::blocking::Client::builder()
.redirect(reqwest::redirect::Policy::none()) .redirect(reqwest::redirect::Policy::none())
@ -14,5 +8,3 @@ pub fn get_md5sums() -> Result<String, Box<dyn std::error::Error>> {
.text()?; .text()?;
Ok(res) Ok(res)
} }

View file

@ -1,33 +0,0 @@
use console::Style;
use std::io::{self, Write};
pub fn choose_package_mirror() -> Option<String> {
let mirrors = vec![
"https://ftp.fau.de",
"https://mirror.kernel.org/linux",
"https://mirror.example.org/linux",
];
println!("Optional: choose a mirror for source packages:");
for (i, mirror) in mirrors.iter().enumerate() {
println!(" [{}] {}", i + 1, mirror);
}
print!("Enter number or press Enter for default: ");
io::stdout().flush().unwrap();
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
let input = input.trim();
if input.is_empty() {
None
} else {
let choice = input.parse::<usize>().unwrap_or(1);
let chosen = mirrors.get(choice.saturating_sub(1)).unwrap_or(&mirrors[0]);
println!("Using package mirror: {}", Style::new().green().apply_to(chosen));
Some(chosen.to_string())
}
}

View file

@ -9,7 +9,11 @@ pub fn choose_package_mirror() -> Option<String> {
Err(e) => { Err(e) => {
println!("Failed to fetch mirrors: {}", e); println!("Failed to fetch mirrors: {}", e);
// Fallback to a default list if fetching fails // Fallback to a default list if fetching fails
vec!["ftp.fau.de".to_string(), "mirror.kernel.org".to_string(), "mirror.example.org".to_string()] vec![
"ftp.fau.de".to_string(),
"mirror.kernel.org".to_string(),
"mirror.example.org".to_string(),
]
} }
}; };
@ -41,10 +45,11 @@ pub fn choose_package_mirror() -> Option<String> {
fn fetch_mirrors() -> Result<Vec<String>, Box<dyn std::error::Error>> { fn fetch_mirrors() -> Result<Vec<String>, Box<dyn std::error::Error>> {
let client = Client::new(); let client = Client::new();
// Fetching from the LFS mirrors page as it lists mirrors for various projects, including GNU let res = client
let res = client.get("https://www.linuxfromscratch.org/lfs/mirrors.html#files").send()?.text()?; .get("https://www.linuxfromscratch.org/lfs/mirrors.html#files")
.send()?
.text()?;
let document = Html::parse_document(&res); let document = Html::parse_document(&res);
// This selector targets links that are likely to be mirrors. Adjust if needed.
let selector = Selector::parse("a[href^='http']").unwrap(); let selector = Selector::parse("a[href^='http']").unwrap();
let mirrors = document let mirrors = document
.select(&selector) .select(&selector)