[pve-devel] [PATCH v6 pve-rs 3/4] apt: add upgrade_repositories call

Fabian Ebner f.ebner at proxmox.com
Fri Jun 11 13:44:12 CEST 2021


Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---

Changes from v5:
    * Add doc comment.
    * Make digest an Option<&str>.
    * use new/renamed release_upgrade function.
    * Require that all files can be parsed.

 src/apt/repositories.rs | 42 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/apt/repositories.rs b/src/apt/repositories.rs
index 1643a23..c8a06a6 100644
--- a/src/apt/repositories.rs
+++ b/src/apt/repositories.rs
@@ -66,4 +66,46 @@ mod export {
             to_value(&no_subscription_enabled)?,
         ))
     }
+
+    /// Upgrade the repository configuration to the next major release.
+    ///
+    /// If `digest` is specified and doesn't match the current one, the operation is aborted.
+    #[export]
+    fn upgrade_repositories(digest: Option<&str>) -> Result<(), Error> {
+        let (mut files, errors) = proxmox_apt::repositories::repositories()?;
+
+        if files.is_empty() {
+            bail!("no APT repository files could be parsed!");
+        }
+
+        if !errors.is_empty() {
+            let message = errors
+                .iter()
+                .fold("Problem parsing file(s):".to_string(), |message, error| {
+                    format!("{}\n{}", message, error)
+                });
+            bail!(message);
+        }
+
+        if let Some(digest) = digest {
+            let expected_digest = proxmox::tools::hex_to_digest(digest)?;
+            let current_digest = proxmox_apt::repositories::common_digest(&files);
+            if current_digest != expected_digest {
+                bail!("detected modified configuration - file changed by other user? Try again.");
+            }
+        }
+
+        proxmox_apt::repositories::release_upgrade(&mut files)?;
+
+        if let Err(errors) = proxmox_apt::repositories::write_repositories(&files) {
+            let message = errors
+                .iter()
+                .fold("Problem writing file(s):".to_string(), |message, error| {
+                    format!("{}\n{}", message, error)
+                });
+            bail!(message);
+        }
+
+        Ok(())
+    }
 }
-- 
2.20.1






More information about the pve-devel mailing list