all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH proxmox-offline-mirror 1/2] fix #4259: mirror: add ignore-errors option
Date: Fri, 23 Sep 2022 12:33:51 +0200	[thread overview]
Message-ID: <20220923103352.569770-1-f.gruenbichler@proxmox.com> (raw)

to make fetching errors from broken repositories non-fatal.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
based on top of "extend/add commands" series from
20220921081242.1139249-1-f.gruenbichler@proxmox.com

 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<Vec<MirrorConfig>, Er
                 sync,
                 base_dir: base_dir.clone(),
                 use_subscription: None,
+                ignore_errors: false,
             });
         }
     }
@@ -399,6 +400,7 @@ fn action_add_mirror(config: &SectionConfigData) -> Result<Vec<MirrorConfig>, 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<ProductType>,
+    /// 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 5bf9219..e655847 100644
--- a/src/mirror.rs
+++ b/src/mirror.rs
@@ -46,6 +46,7 @@ struct ParsedMirrorConfig {
     pub sync: bool,
     pub auth: Option<String>,
     pub client: Client,
+    pub ignore_errors: bool,
 }
 
 impl TryInto<ParsedMirrorConfig> for MirrorConfig {
@@ -74,6 +75,7 @@ impl TryInto<ParsedMirrorConfig> 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.30.2





             reply	other threads:[~2022-09-23 10:34 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-23 10:33 Fabian Grünbichler [this message]
2022-09-23 10:33 ` [pve-devel] [PATCH proxmox-offline-mirror 2/2] mirror: collect and summarize warnings Fabian Grünbichler
2022-09-23 12:30 ` [pve-devel] applied: [PATCH proxmox-offline-mirror 1/2] fix #4259: mirror: add ignore-errors option Wolfgang Bumiller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220923103352.569770-1-f.gruenbichler@proxmox.com \
    --to=f.gruenbichler@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal