all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Gabriel Goller <g.goller@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 3/3] pxar: added creation parameters
Date: Wed,  6 Mar 2024 15:34:13 +0100	[thread overview]
Message-ID: <20240306143422.114335-4-g.goller@proxmox.com> (raw)
In-Reply-To: <20240306143422.114335-1-g.goller@proxmox.com>

This adds support for the creation parameters and the
`.pxar_creation_params` file into the `pxar` binary.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
 pxar-bin/Cargo.toml  |  1 +
 pxar-bin/src/main.rs | 68 +++++++++++++++++++++++++++-----------------
 2 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/pxar-bin/Cargo.toml b/pxar-bin/Cargo.toml
index d91c03d3..4ed5c29a 100644
--- a/pxar-bin/Cargo.toml
+++ b/pxar-bin/Cargo.toml
@@ -13,6 +13,7 @@ anyhow.workspace = true
 futures.workspace = true
 log.workspace = true
 nix.workspace = true
+serde.workspace = true
 serde_json.workspace = true
 tokio = { workspace = true, features = [ "rt", "rt-multi-thread" ] }
 
diff --git a/pxar-bin/src/main.rs b/pxar-bin/src/main.rs
index 277d0b46..f0db2440 100644
--- a/pxar-bin/src/main.rs
+++ b/pxar-bin/src/main.rs
@@ -9,6 +9,7 @@ use std::sync::Arc;
 use anyhow::{bail, format_err, Error};
 use futures::future::FutureExt;
 use futures::select;
+use serde_json::Value;
 use tokio::signal::unix::{signal, SignalKind};
 
 use pathpatterns::{MatchEntry, MatchType, PatternFlag};
@@ -234,46 +235,71 @@ fn extract_archive(
     Ok(())
 }
 
+#[derive(serde::Deserialize)]
+#[serde(rename_all = "kebab-case")]
+struct CreateArchiveParams {
+    archive: String,
+    source: String,
+    no_xattrs: Option<bool>,
+    no_fcaps: Option<bool>,
+    no_acls: Option<bool>,
+    all_file_systems: Option<bool>,
+    no_device_nodes: Option<bool>,
+    no_fifos: Option<bool>,
+    no_sockets: Option<bool>,
+    exclude: Option<Vec<String>>,
+    entries_max: Option<isize>,
+}
+
 #[api(
     input: {
         properties: {
             archive: {
+                type: String,
                 description: "Archive name.",
             },
             source: {
+                type: String,
                 description: "Source directory.",
             },
             "no-xattrs": {
+                type: Boolean,
                 description: "Ignore extended file attributes.",
                 optional: true,
                 default: false,
             },
             "no-fcaps": {
+                type: Boolean,
                 description: "Ignore file capabilities.",
                 optional: true,
                 default: false,
             },
             "no-acls": {
+                type: Boolean,
                 description: "Ignore access control list entries.",
                 optional: true,
                 default: false,
             },
             "all-file-systems": {
+                type: Boolean,
                 description: "Include mounted sudirs.",
                 optional: true,
                 default: false,
             },
             "no-device-nodes": {
+                type: Boolean,
                 description: "Ignore device nodes.",
                 optional: true,
                 default: false,
             },
             "no-fifos": {
+                type: Boolean,
                 description: "Ignore fifos.",
                 optional: true,
                 default: false,
             },
             "no-sockets": {
+                type: Boolean,
                 description: "Ignore sockets.",
                 optional: true,
                 default: false,
@@ -288,6 +314,7 @@ fn extract_archive(
                 },
             },
             "entries-max": {
+                type: Integer,
                 description: "Max number of entries loaded at once into memory",
                 optional: true,
                 default: ENCODER_MAX_ENTRIES as isize,
@@ -298,22 +325,11 @@ fn extract_archive(
     },
 )]
 /// Create a new .pxar archive.
-#[allow(clippy::too_many_arguments)]
-async fn create_archive(
-    archive: String,
-    source: String,
-    no_xattrs: bool,
-    no_fcaps: bool,
-    no_acls: bool,
-    all_file_systems: bool,
-    no_device_nodes: bool,
-    no_fifos: bool,
-    no_sockets: bool,
-    exclude: Option<Vec<String>>,
-    entries_max: isize,
-) -> Result<(), Error> {
+async fn create_archive(param: Value) -> Result<(), Error> {
+    let params: CreateArchiveParams = serde_json::from_value(param.clone()).unwrap();
+
     let patterns = {
-        let input = exclude.unwrap_or_default();
+        let input = params.exclude.unwrap_or_default();
         let mut patterns = Vec::with_capacity(input.len());
         for entry in input {
             patterns.push(
@@ -324,21 +340,21 @@ async fn create_archive(
         patterns
     };
 
-    let device_set = if all_file_systems {
+    let device_set = if params.all_file_systems.unwrap_or(false) {
         None
     } else {
         Some(HashSet::new())
     };
 
     let options = pbs_client::pxar::PxarCreateOptions {
-        entries_max: entries_max as usize,
+        entries_max: params.entries_max.unwrap_or(ENCODER_MAX_ENTRIES as isize) as usize,
         device_set,
         patterns,
         skip_lost_and_found: false,
         skip_e2big_xattr: false,
     };
 
-    let source = PathBuf::from(source);
+    let source = PathBuf::from(params.source);
 
     let dir = nix::dir::Dir::open(
         &source,
@@ -350,26 +366,26 @@ async fn create_archive(
         .create_new(true)
         .write(true)
         .mode(0o640)
-        .open(archive)?;
+        .open(params.archive)?;
 
     let writer = std::io::BufWriter::with_capacity(1024 * 1024, file);
     let mut feature_flags = Flags::DEFAULT;
-    if no_xattrs {
+    if params.no_xattrs.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_XATTRS);
     }
-    if no_fcaps {
+    if params.no_fcaps.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_FCAPS);
     }
-    if no_acls {
+    if params.no_acls.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_ACL);
     }
-    if no_device_nodes {
+    if params.no_device_nodes.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_DEVICE_NODES);
     }
-    if no_fifos {
+    if params.no_fifos.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_FIFOS);
     }
-    if no_sockets {
+    if params.no_sockets.unwrap_or(false) {
         feature_flags.remove(Flags::WITH_SOCKETS);
     }
 
@@ -384,7 +400,7 @@ async fn create_archive(
         },
         None,
         options,
-        "".to_string(),
+        param.to_string(),
     )
     .await?;
 
-- 
2.43.0





  parent reply	other threads:[~2024-03-06 14:34 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-06 14:34 [pbs-devel] [RFC proxmox-backup 0/3] Encode creation parameters into pxar archive Gabriel Goller
2024-03-06 14:34 ` [pbs-devel] [PATCH proxmox-backup 1/3] pxar: factor out encode_file Gabriel Goller
2024-03-06 14:34 ` [pbs-devel] [PATCH proxmox-backup 2/3] client: unify parameters and write to file Gabriel Goller
2024-03-06 14:34 ` Gabriel Goller [this message]
2024-03-06 15:13 ` [pbs-devel] [RFC proxmox-backup 0/3] Encode creation parameters into pxar archive Christian Ebner
2024-03-07  9:22   ` Gabriel Goller
2024-03-07  9:50   ` Thomas Lamprecht

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=20240306143422.114335-4-g.goller@proxmox.com \
    --to=g.goller@proxmox.com \
    --cc=pbs-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