From 96a804150bdec199187148a2b267dedc88a36ffb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 23 Sep 2022 12:33:51 +0200 Subject: [PATCH] fix #4259: mirror: add ignore-errors option MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit to make fetching errors from broken repositories non-fatal. Signed-off-by: Fabian Grünbichler --- src/bin/proxmox-offline-mirror.rs | 2 ++ src/bin/proxmox_offline_mirror_cmds/config.rs | 3 +++ src/config.rs | 8 ++++++++ src/mirror.rs | 19 ++++++++++++++++--- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/bin/proxmox-offline-mirror.rs b/src/bin/proxmox-offline-mirror.rs index 0a6e77e..222b561 100644 --- a/src/bin/proxmox-offline-mirror.rs +++ b/src/bin/proxmox-offline-mirror.rs @@ -386,6 +386,7 @@ fn action_add_mirror(config: &SectionConfigData) -> Result, Er sync, base_dir: base_dir.clone(), use_subscription: None, + ignore_errors: false, }); } } @@ -399,6 +400,7 @@ fn action_add_mirror(config: &SectionConfigData) -> Result, Er sync, base_dir, use_subscription, + ignore_errors: false, }; configs.push(main_config); diff --git a/src/bin/proxmox_offline_mirror_cmds/config.rs b/src/bin/proxmox_offline_mirror_cmds/config.rs index b48a708..5ebf6d5 100644 --- a/src/bin/proxmox_offline_mirror_cmds/config.rs +++ b/src/bin/proxmox_offline_mirror_cmds/config.rs @@ -262,6 +262,9 @@ pub fn update_mirror( if let Some(verify) = update.verify { data.verify = verify } + if let Some(ignore_errors) = update.ignore_errors { + data.ignore_errors = ignore_errors + } config.set_data(&id, "mirror", &data)?; proxmox_offline_mirror::config::save_config(&config_file, &config)?; diff --git a/src/config.rs b/src/config.rs index 6c2f3e8..cb9a22b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -41,6 +41,11 @@ use crate::types::{ sync: { type: bool, }, + "ignore-errors": { + type: bool, + optional: true, + default: false, + }, } )] #[derive(Clone, Debug, Serialize, Deserialize, Updater)] @@ -65,6 +70,9 @@ pub struct MirrorConfig { /// Use subscription key to access (required for Proxmox Enterprise repositories). #[serde(skip_serializing_if = "Option::is_none")] pub use_subscription: Option, + /// Whether to downgrade download errors to warnings + #[serde(default)] + pub ignore_errors: bool, } #[api( diff --git a/src/mirror.rs b/src/mirror.rs index 5126393..25c6af6 100644 --- a/src/mirror.rs +++ b/src/mirror.rs @@ -46,6 +46,7 @@ struct ParsedMirrorConfig { pub sync: bool, pub auth: Option, pub client: Client, + pub ignore_errors: bool, } impl TryInto for MirrorConfig { @@ -74,6 +75,7 @@ impl TryInto for MirrorConfig { sync: self.sync, auth: None, client, + ignore_errors: self.ignore_errors, }) } } @@ -691,7 +693,7 @@ pub fn create_snapshot( let mut full_path = PathBuf::from(prefix); full_path.push(&package.file); - let res = fetch_plain_file( + match fetch_plain_file( &config, &url, &full_path, @@ -699,8 +701,19 @@ pub fn create_snapshot( &package.checksums, false, dry_run, - )?; - fetch_progress.update(&res); + ) { + Ok(res) => fetch_progress.update(&res), + Err(err) if config.ignore_errors => { + let msg = format!( + "{}: failed to fetch package '{}' - {}", + basename, package.file, err, + ); + eprintln!("{msg}"); + } + res => { + res?; + } + } } if fetch_progress.file_count() % (max(total_files / 100, 1)) == 0 { -- 2.39.2