]> git.proxmox.com Git - proxmox-backup.git/log
proxmox-backup.git
2 months agodatastore: fix typo in comment
Gabriel Goller [Wed, 3 Jul 2024 14:55:06 +0000 (16:55 +0200)]
datastore: fix typo in comment

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agodatastore: use cached snapshot time string in path
Gabriel Goller [Wed, 3 Jul 2024 15:08:36 +0000 (17:08 +0200)]
datastore: use cached snapshot time string in path

When getting the `full_path` of a snapshot we did not use the cached
time string. By using it we avoid a call to the super-slow libc strftime.

This has some minor performance improvements of circa 7%. That is ~100ms
on my datastore with ~5000 snapshots.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agodatastore: avoid calculating protected attribute twice
Gabriel Goller [Wed, 3 Jul 2024 15:02:46 +0000 (17:02 +0200)]
datastore: avoid calculating protected attribute twice

The protected status of the snapshot is retrieved twice. This is slow
because it stat's the .protected file multiple times.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
2 months agodon't directly depend on tracing-subscriber
Wolfgang Bumiller [Fri, 12 Jul 2024 09:19:25 +0000 (11:19 +0200)]
don't directly depend on tracing-subscriber

This was only used for LevelFilter which is also exposed via the
tracing crate directly.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agoapi: inherit LogContext in tasks hyper spawns in h2 handlers
Wolfgang Bumiller [Thu, 11 Jul 2024 14:21:35 +0000 (16:21 +0200)]
api: inherit LogContext in tasks hyper spawns in h2 handlers

so that tasks spawn()ed by hyper's h2 code log to the correct place

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobump sys and rest-server dependencies to 0.6
Wolfgang Bumiller [Thu, 11 Jul 2024 13:33:43 +0000 (15:33 +0200)]
bump sys and rest-server dependencies to 0.6

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agoapi: switch from task_log! macro to tracing
Gabriel Goller [Tue, 9 Jul 2024 14:20:13 +0000 (16:20 +0200)]
api: switch from task_log! macro to tracing

Import `proxmox-log` and substitute all `task_log!`
(and task_warn!, task_error!) invocations with tracing calls (info!,
warn!, etc..). Remove worker references where it isn't necessary
anymore.

Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agoswitch from task_log! macro to tracing
Gabriel Goller [Tue, 9 Jul 2024 14:20:12 +0000 (16:20 +0200)]
switch from task_log! macro to tracing

Import `proxmox-log` and substitute all `task_log!`
(and task_warn!, task_error!) invocations with tracing calls (info!,
warn!, etc..). Remove worker references where it isn't necessary
anymore.

Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agocargo: fix package name
Gabriel Goller [Thu, 11 Jul 2024 08:33:28 +0000 (10:33 +0200)]
cargo: fix package name

s/proxmox-apt-api/proxmox-apt-api-types/

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agocargo: add local dependencies
Gabriel Goller [Tue, 9 Jul 2024 10:54:26 +0000 (12:54 +0200)]
cargo: add local dependencies

Add local dependencies for new crates `proxmox-apt-api-types` and
`proxmox-config-digest`. Also fix order of deps.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agobump d/control
Wolfgang Bumiller [Tue, 9 Jul 2024 06:06:17 +0000 (08:06 +0200)]
bump d/control

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agouse new apt/apt-api-types crate
Dietmar Maurer [Fri, 21 Jun 2024 09:51:30 +0000 (11:51 +0200)]
use new apt/apt-api-types crate

2 months agobump proxmox-tfa dependency to 5.0.0
Wolfgang Bumiller [Wed, 3 Jul 2024 13:27:47 +0000 (15:27 +0200)]
bump proxmox-tfa dependency to 5.0.0

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobump version to 3.2.7-1 v3.2.7
Thomas Lamprecht [Wed, 3 Jul 2024 11:33:59 +0000 (13:33 +0200)]
bump version to 3.2.7-1

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 months agoupdate online help reference info
Thomas Lamprecht [Wed, 3 Jul 2024 08:59:39 +0000 (10:59 +0200)]
update online help reference info

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 months agomanager: restore newline in wipe-disk confirmation query
Wolfgang Bumiller [Wed, 3 Jul 2024 09:20:40 +0000 (11:20 +0200)]
manager: restore newline in wipe-disk confirmation query

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobackup_manager: use confirmation helper in wipe-disk command
Gabriel Goller [Wed, 19 Jun 2024 10:15:44 +0000 (12:15 +0200)]
backup_manager: use confirmation helper in wipe-disk command

Use `Confirmation` helper in the wipe-disk command prompt.

Improves: 887d83cb (cli: add interactive confirmation for block device wipe, 2023-11-29)
Cc: Markus Frank <m.frank@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agodatastore: fix problem with operations counting
Hannes Laimer [Thu, 25 Apr 2024 09:01:50 +0000 (11:01 +0200)]
datastore: fix problem with operations counting

... if `.chunks/` is not available(deleted/moved) ChunkStore::open
fails, but that would happen after updating the active operations on the
datastore, so no reference that could be dropped is returned. Leading to
the operations counter to always increase. This only updates the counter
when a reference is returned, not before.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
2 months agohttp_client: keep renewal future running on failed re-auth
Hannes Laimer [Mon, 24 Jun 2024 07:54:38 +0000 (09:54 +0200)]
http_client: keep renewal future running on failed re-auth

The re-authentication request can also fail due to network instability,
and not necesarrily only due to an invalid ticket. In that case it makes
sense to retry refreshing the ticket in 15 minutes. Also, the future does
not depend on a failed re-authentication to be clean up properly, so that
happens already somewhere else, therefore we don't rely on this return
anyway. If the ticket is actually invalid or timed out, the main job
will fail and also terminate the renewal future, same applies if the
network is not just unstable but straight up not working.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agofix 5304: client: set process uid/gid for .pxarexclude-cli
Christian Ebner [Tue, 30 Apr 2024 15:37:14 +0000 (17:37 +0200)]
fix 5304: client: set process uid/gid for .pxarexclude-cli

The .pxarexclude-cli encodes the exclude patterns the client was
invoked with in the pxar archive as regular file entry. The current
behaviour of setting the uid and gid to default 0 (root) causes
however issues when trying to backup and restore the backup as
non-root user.

Opt for using the uid/gid of the user the executable was called as,
allowing the restore for this user to succeed. Root will succeed
to restore anyways.

Link to issue in bugtracker:
https://bugzilla.proxmox.com/show_bug.cgi?id=5304

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Gabriel Goller <g.goller@proxmox.com>
2 months agoclient: mount: wait for child to return before exiting
Gabriel Goller [Tue, 18 Jun 2024 14:03:33 +0000 (16:03 +0200)]
client: mount: wait for child to return before exiting

When using the `proxmox-backup-client mount` command, the parent sometimes
exits before we can print any error message. Most notably this happens
when no PBS_REPOSITORY is passed, as this is the first option checked.
If the underlying file descriptor has been closed, wait for the client
to complete and return the error message.

Reported-by: Friedrich Weber <f.weber@proxmox.com>
Suggested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Friedrich Weber <f.weber@proxmox.com>
2 months agoclose #5571: client: fix regression for `map` command
Christian Ebner [Tue, 2 Jul 2024 07:24:14 +0000 (09:24 +0200)]
close #5571: client: fix regression for `map` command

Commit 08fe5052 introduced functionality to mount split pxar archives
(sharing code with the map command), moving the manifest lookup
exclusive to fixed index archives.

However, the lookup now uses the incorrect archive name, not
containing the `.fidx` extension, which is however required for the
lookup in the manifest.

Fix the issue by calling the method with the correct server archive
name including the required extension.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Gabriel Goller <g.goller@proxmox.com>
Reviewed-by: Gabriel Goller <g.goller@proxmox.com>
Fixes: 08fe5052 ("client: mount: make split pxar archives mountable")
[FG: reworded, add proper "Fixes:" trailer.]
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agomake: add deb-nostrip target
Fabian Grünbichler [Thu, 27 Jun 2024 08:33:39 +0000 (10:33 +0200)]
make: add deb-nostrip target

it builds about 1.5 times faster than regular `make deb` (shaving off a
whopping 100s on my machine). the resulting debs containing executables are of
course bigger (since the debug symbols are not split out into their own
package, and the ELF linkage stripping is also skipped), but other than the
associated file and memory mapping overhead there should be no difference in
behaviour or performance, and such debs are suitable for local testing (both of
the build process, and the built code).

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agodon't call contains_key() before remove()
Wolfgang Bumiller [Fri, 28 Jun 2024 07:33:23 +0000 (09:33 +0200)]
don't call contains_key() before remove()

HashMap::remove() returns the value it removes as an Option<>, so
instead of first checking if the key exists before removing it, just
try to remove it and use the returned Option<> to test whether we
should bail!().

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agotools: add missing cfg(test) macro
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:03 +0000 (15:06 +0200)]
tools: add missing cfg(test) macro

Fixes the rustc warning:

warning: struct `TestAsyncCacher` is never constructed
  --> pbs-tools/src/async_lru_cache.rs:86:12
   |
86 |     struct TestAsyncCacher {
   |            ^^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agochunk_store: do not explicitly write implied trait
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:02 +0000 (15:06 +0200)]
chunk_store: do not explicitly write implied trait

Fixes the clippy warning:

warning: this bound is already specified as the supertrait of `std::iter::FusedIterator`
   --> pbs-datastore/src/chunk_store.rs:254:14
    |
254 |         impl Iterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implied_bounds_in_impls
    = note: `#[warn(clippy::implied_bounds_in_impls)]` on by default
help: try removing this bound
    |
254 -         impl Iterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>
255 -             + std::iter::FusedIterator,
254 +         impl std::iter::FusedIterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>,

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agotools: write multiplication by 01 succinctly
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:01 +0000 (15:06 +0200)]
tools: write multiplication by 01 succinctly

Fixes the clippy warning:

warning: this multiplication by -1 can be written more succinctly
   --> pbs-client/src/tools/mod.rs:700:58
    |
700 |                         SignedDuration::Negative(val) => -1 * i64::try_from(val.as_secs())?,
    |                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `-i64::try_from(val.as_secs())?`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#neg_multiply
    = note: `#[warn(clippy::neg_multiply)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agoapi: remove use of unnecessary pub(self)
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:00 +0000 (15:06 +0200)]
api: remove use of unnecessary pub(self)

Fixes the clippy warning:

warning: unnecessary `pub(self)`
  --> src/api2/access/mod.rs:35:1
   |
35 | pub(self) async fn user_update_auth<S: AsRef<str>>(
   | ^^^^^^^^^ help: remove it
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_pub_self
   = note: `#[warn(clippy::needless_pub_self)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agoreplace get(key).is_none() with !contains_key()
Maximiliano Sandoval [Wed, 26 Jun 2024 13:05:59 +0000 (15:05 +0200)]
replace get(key).is_none() with !contains_key()

Fixes the clippy warning:

warning: unnecessary use of `get(&user2).is_none()`
    --> pbs-config/src/acl.rs:1067:36
     |
1067 |                 assert!(node.users.get(&user2).is_none());
     |                         -----------^^^^^^^^^^^^^^^^^^^^^
     |                         |
     |                         help: replace it with: `!node.users.contains_key(&user2)`
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agoreplace get(key).is_some() with contains_key()
Maximiliano Sandoval [Wed, 26 Jun 2024 13:05:58 +0000 (15:05 +0200)]
replace get(key).is_some() with contains_key()

Fixes the clippy warning:

warning: unnecessary use of `get(realm).is_some()`
  --> pbs-config/src/domains.rs:68:58
   |
68 |     realm == "pbs" || realm == "pam" || domains.sections.get(realm).is_some()
   |                                                          ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `contains_key(realm)`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agoMakefile: drop outdated comment
Fabian Grünbichler [Thu, 27 Jun 2024 07:43:01 +0000 (09:43 +0200)]
Makefile: drop outdated comment

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agobuild: fix `nocheck` build
Fabian Grünbichler [Mon, 3 Jun 2024 12:04:50 +0000 (14:04 +0200)]
build: fix `nocheck` build

pbs2to3 was missing from the list of to-be-compiled binaries, and thus was only
compiled as a side-effect of running `cargo test` (which is skipped when the
build is using the `nocheck` build profile).

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agocargo config: add `debug=true`
Fabian Grünbichler [Tue, 25 Jun 2024 12:21:58 +0000 (14:21 +0200)]
cargo config: add `debug=true`

else debug symbols are stipped with 1.79+.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agotrivial clippy fixes
Fabian Grünbichler [Tue, 25 Jun 2024 11:37:35 +0000 (13:37 +0200)]
trivial clippy fixes

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agorun cargo fmt
Fabian Grünbichler [Mon, 24 Jun 2024 08:02:07 +0000 (10:02 +0200)]
run cargo fmt

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agotrivial clippy fixes
Fabian Grünbichler [Mon, 24 Jun 2024 07:59:27 +0000 (09:59 +0200)]
trivial clippy fixes

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agobump proxmox-rrd to 0.2 and proxmox-time to 2.0
Wolfgang Bumiller [Thu, 20 Jun 2024 12:08:08 +0000 (14:08 +0200)]
bump proxmox-rrd to 0.2 and proxmox-time to 2.0

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobump bitflags to 2.4
Wolfgang Bumiller [Thu, 20 Jun 2024 11:36:59 +0000 (13:36 +0200)]
bump bitflags to 2.4

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agoupdate README.rst to refer to .cargo/config.toml
Wolfgang Bumiller [Thu, 20 Jun 2024 10:31:18 +0000 (12:31 +0200)]
update README.rst to refer to .cargo/config.toml

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agofs: update comment to reflect usage of C-string literals
Maximiliano Sandoval [Thu, 20 Jun 2024 09:00:08 +0000 (11:00 +0200)]
fs: update comment to reflect usage of C-string literals

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agorename .cargo/config to .cargo/config.toml
Wolfgang Bumiller [Thu, 20 Jun 2024 10:24:27 +0000 (12:24 +0200)]
rename .cargo/config to .cargo/config.toml

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agocargo: use default-features
Maximiliano Sandoval [Thu, 20 Jun 2024 09:00:05 +0000 (11:00 +0200)]
cargo: use default-features

Fixes the compile-time warning:

warning: Cargo.toml: `default_features` is deprecated in favor of `default-features` and will not work in the 2024 edition
(in the `proxmox-router` dependency)

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
2 months agouse XATTR_* constants instead of calling functions
Wolfgang Bumiller [Thu, 20 Jun 2024 09:07:33 +0000 (11:07 +0200)]
use XATTR_* constants instead of calling functions

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobump sys dependency to 0.5.7
Wolfgang Bumiller [Thu, 20 Jun 2024 09:08:10 +0000 (11:08 +0200)]
bump sys dependency to 0.5.7

for the new xattr constants

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agoreplace c_str! macro with c"literals"
Wolfgang Bumiller [Thu, 20 Jun 2024 09:07:10 +0000 (11:07 +0200)]
replace c_str! macro with c"literals"

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agobuild: use cargo wrapper when building package
Fabian Grünbichler [Wed, 19 Jun 2024 14:38:05 +0000 (16:38 +0200)]
build: use cargo wrapper when building package

else we don't pick up the options set by the wrapper, which include generation
of debug symbols. until rustc 1.77, this was not needed because compiled
binaries always included a non-stripped libstd. now, without this change, the
binaries built with `cargo build --release` have no debug symbols at all
trigger a warning. fix this and include debug symbols when building a package,
like was originally intended for release package builds.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agobuild: fix SUBCRATES for arbitrary working dirs
Fabian Grünbichler [Wed, 19 Jun 2024 15:47:37 +0000 (17:47 +0200)]
build: fix SUBCRATES for arbitrary working dirs

else this only works if the git working tree is in a dir called
'proxmox-backup'

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agobuild: adapt workspace member command
Fabian Grünbichler [Wed, 19 Jun 2024 14:00:39 +0000 (16:00 +0200)]
build: adapt workspace member command

to work with cargo 1.77, which changed from

 pbs-api-types 0.1.0 (path+file:///home/fgruenbichler/Sources/proxmox-backup/pbs-api-types)

to

 path+file:///home/fgruenbichler/Sources/proxmox-backup/pbs-api-types#0.1.0

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
2 months agoclose #4763: client: add command to forget backup group
Gabriel Goller [Mon, 3 Jun 2024 08:43:11 +0000 (10:43 +0200)]
close #4763: client: add command to forget backup group

Add the command `proxmox-backup-client group forget <group>` so
that we can forget (delete) whole groups with all the containing
snapshots.
To avoid printing full datastore paths (which are in the error messages)
we filter out the most common one (group not found) and rephrase it.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
[WB: rebased & sorted import statements in client's main.rs]
[WB: replace extract_repository_from_value with
     remove_repository_from_value since the parameter is rejected on
     the remote side]
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agoclient: add 'remove_repository_from_value' helper
Wolfgang Bumiller [Wed, 19 Jun 2024 09:30:09 +0000 (11:30 +0200)]
client: add 'remove_repository_from_value' helper

'extract_repository_from_value' takes an immutable reference and
doesn't remove the parsed parameter (whereas in contrast in our PVE
codebase, the 'extract_param' method does remove it).

This adds a variant that explicitly removes it called
'remove_repository_from_value'.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2 months agopxar: use anyhow::Error in PxarBackupStream
Gabriel Goller [Tue, 18 Jun 2024 14:22:03 +0000 (16:22 +0200)]
pxar: use anyhow::Error in PxarBackupStream

Instead of storing the error as a string in the PxarBackupStream, we
store it as an anyhow::Error. As we can't clone an anyhow::Error, we take
it out from the mutex and return it. This won't change anything as
the consumation of the stream will stop if it gets a Some(Err(..)).

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agopxar: add UniqueContext helper
Gabriel Goller [Tue, 18 Jun 2024 14:22:02 +0000 (16:22 +0200)]
pxar: add UniqueContext helper

To create a pxar archive, we recursively traverse the target folder.
If there is an error further down and we add a context using anyhow,
the context will be duplicated and we get an output like:

> Error: error at "xattr/xattr.txt": error at "xattr/xattr.txt": E2BIG [skip]

This is obviously not optimal, so in recursive contexts we can use the
UniqueContext, which quickly checks the context from the last item in
the error chain and only adds it if it is unique.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agopxar: remove ArchiveError
Gabriel Goller [Tue, 18 Jun 2024 14:22:01 +0000 (16:22 +0200)]
pxar: remove ArchiveError

The sole purpose of the ArchiveError was to add the file-path to the
error. Using anyhow::Error we can add this information using the context
and don't need this struct anymore.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
2 months agoui: gc job edit: fix i18n gettext usage
Thomas Lamprecht [Tue, 18 Jun 2024 14:12:14 +0000 (16:12 +0200)]
ui: gc job edit: fix i18n gettext usage

String concatenating a variable with some static text as gettext
parameter cannot really work, and it also does not make sense to do
most of the time, as even if we'd use some overly generic format
string like '{0} (disabled)', it would be not easy to translate
correctly in all languages in such a generic way.

So just use the actual full string, which is already contained in our
translation catalogue anyway…

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2 months agodocs: drop blanket statement recommending against remote storage
Thomas Lamprecht [Mon, 17 Jun 2024 15:06:55 +0000 (17:06 +0200)]
docs: drop blanket statement recommending against remote storage

This is basically semantic revert of e5c0d80c ("docs: add note for not
using remote storages") that, while well intended, has a few problems,
e.g.:
- This is the minimal/recommended requirements section, which should
  list the rough basic specs a setup must/should have. Listing
  everything that is not best to do would bloat this list
  significantly and it's just the wrong place for it, i.e., it isn't a
  recommended against list.
- while it's true that a remote storage will basically always have
  _some_ overhead over using the same HW with a (modern) local storage
  (file) system, that does **not** mean that the remote storage has
  insufficient performance characteristics. We know of lots of fast
  Ceph setups, even release benchmarks for them, or storages like
  BlockBridge, that provide high performance while being remote.

So avoid this X-Y-problem style argumentation and focus on what is
actually important, even though I naturally get that there are some
users that use slow NFS attached storages, but breaking style here
won't cure them and I'm sure that they are capable of setting up such
a slow local storage that it won't make a real difference compared to
the NFS one.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agobump proxmox-sys dep to 0.5.6
Wolfgang Bumiller [Mon, 17 Jun 2024 12:06:25 +0000 (14:06 +0200)]
bump proxmox-sys dep to 0.5.6

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 months agoMerge branch '3.2.6'
Fabian Grünbichler [Mon, 17 Jun 2024 08:38:02 +0000 (10:38 +0200)]
Merge branch '3.2.6'

branched off to avoid a breaking change on master

3 months agobump version to 3.2.6-1
Fabian Grünbichler [Mon, 17 Jun 2024 08:18:53 +0000 (10:18 +0200)]
bump version to 3.2.6-1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoclient: pxar: fix fuse mount performance for split archives
Christian Ebner [Wed, 12 Jun 2024 13:17:13 +0000 (15:17 +0200)]
client: pxar: fix fuse mount performance for split archives

Adapt to the decoder/accessor method changes introduced in the pxar
library, which were introduced in order to move the consistency check
for metadata and payload data archives.

The new location of the checks allows to access the pxar archive via
a `Split` variant reader instance, without penalization when just
accessing the metadata, not reading any payload data.

This greatly improves performance when accessing fuse mounted
archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
bumped dependency after pxar version bump

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoconfig: acme: use latest proxmox_sys::fs::ensure_dir_exists
Dietmar Maurer [Thu, 13 Jun 2024 09:58:09 +0000 (11:58 +0200)]
config: acme: use latest proxmox_sys::fs::ensure_dir_exists

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
3 months agodocs: add note for not using remote storages
Dominik Csapak [Tue, 11 Jun 2024 09:30:46 +0000 (11:30 +0200)]
docs: add note for not using remote storages

such as NFS or SMB. They will not provide the expected performance
and it's better to recommend against them.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agotape: handle PEWZ like regular early warning
Dominik Csapak [Mon, 10 Jun 2024 11:45:05 +0000 (13:45 +0200)]
tape: handle PEWZ like regular early warning

as a safeguard, should the disabling not work for some reason.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agotape: disable Programmable Early Warning Zone (PEWZ)
Dominik Csapak [Mon, 10 Jun 2024 11:45:04 +0000 (13:45 +0200)]
tape: disable Programmable Early Warning Zone (PEWZ)

since that leads to errors that we don't currently catch before we
reach the regular early warning on tape.

This can be read/set by the Device Configuration Extension Mode Page.
ignore errors on reading or writing, since it may not be available on
LTO-4

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agotape: refactor setting the mode page
Dominik Csapak [Mon, 10 Jun 2024 11:45:03 +0000 (13:45 +0200)]
tape: refactor setting the mode page

we'll reuse that code later for a different page/subpage

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agobump version to 3.2.5-1
Fabian Grünbichler [Mon, 10 Jun 2024 11:45:17 +0000 (13:45 +0200)]
bump version to 3.2.5-1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agobump pxar to 0.11.1
Fabian Grünbichler [Mon, 10 Jun 2024 11:39:33 +0000 (13:39 +0200)]
bump pxar to 0.11.1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoextract: don't interpret prelude as OsStr
Fabian Grünbichler [Mon, 10 Jun 2024 11:38:10 +0000 (13:38 +0200)]
extract: don't interpret prelude as OsStr

that would drop the final byte, and the corresponding code has been removed
from pxar now as well.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoclient: pxar: encode prelude based on writer variant
Christian Ebner [Mon, 10 Jun 2024 11:06:21 +0000 (13:06 +0200)]
client: pxar: encode prelude based on writer variant

Currently, whether to encode the exlcude patterns passed via cli as
prelude or via the `.pxar-exclude-cli` is based on the presence of
a previous metadata accessor.
That leaves however to the encoding of the file entry instead of the
prelude for split archives in `data` mode and for the first snapshot
in a backup, creating undesired padding in the first payload chunk.

Therefore, use the pxar writer variant to make the decision instead.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: json encode cli exclude pattern in prelude
Christian Ebner [Mon, 10 Jun 2024 11:06:20 +0000 (13:06 +0200)]
client: pxar: json encode cli exclude pattern in prelude

The current encoding is not extensible, so encode the cli exclude
patterns as json instead. By this, the prelude is easily seralized
and deserialized, while remaining human readable.

Originally-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile-restore: list: improve pxar v2 performance
Christian Ebner [Mon, 10 Jun 2024 08:39:33 +0000 (10:39 +0200)]
file-restore: list: improve pxar v2 performance

Do not attach the payload reader for split pxar archives, as only the
metadata has to be accessed for listing.
This avoids that the decoder performs consistency checks with the
payload stream, which require chunk download and decoding, making the
listing unusable slow.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agodocs: add table listing possible change detection modes
Christian Ebner [Fri, 7 Jun 2024 13:12:51 +0000 (15:12 +0200)]
docs: add table listing possible change detection modes

Quick and concise listing of the available change detection modes for
reference.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: backup spec: rename change detection mode default
Christian Ebner [Fri, 7 Jun 2024 13:12:50 +0000 (15:12 +0200)]
client: backup spec: rename change detection mode default

The currently default variant is named `Default`, which is not future
prove since the default might change in the future. So rename it to
`Legacy` instead.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: catalog: improve pxar v2 performance
Fabian Grünbichler [Mon, 10 Jun 2024 08:06:37 +0000 (10:06 +0200)]
api: catalog: improve pxar v2 performance

by skipping the payloader reader entirely, it's not needed for listing contents
and would make accessing larger archives too expensive.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
3 months agorun cargo fmt
Fabian Grünbichler [Fri, 7 Jun 2024 12:00:33 +0000 (14:00 +0200)]
run cargo fmt

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoapi: catalog/file-restore: use archive-name schema
Fabian Grünbichler [Fri, 7 Jun 2024 12:00:15 +0000 (14:00 +0200)]
api: catalog/file-restore: use archive-name schema

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoclient: backup: conditionally write catalog for file level backups
Christian Ebner [Fri, 7 Jun 2024 11:37:52 +0000 (13:37 +0200)]
client: backup: conditionally write catalog for file level backups

Only write the catalog when using the regular backup mode, do not write
it when using the split archive mode.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agowww: content: lookup via metadata archive instead of catalog
Christian Ebner [Fri, 7 Jun 2024 11:37:51 +0000 (13:37 +0200)]
www: content: lookup via metadata archive instead of catalog

In case of pxar archives with split metadata and payload data, the
metadata archive has to be used to lookup entries for navigation
before performing a single file restore.

Decide based on the archive filename extension whether to use the
`catalog` or the `pxar-lookup` api endpoint.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile-restore: fallback to mpxar if catalog not present
Christian Ebner [Fri, 7 Jun 2024 11:37:50 +0000 (13:37 +0200)]
file-restore: fallback to mpxar if catalog not present

The `proxmox-file-restore list` command will uses the provided path to
lookup and list directory entries via the catalog. Fallback to using
the metadata archive if the catalog is not present for fast lookups in
a backup snapshot.

This is in preparation for dropping encoding of the catalog for
snapshots using split archive encoding. Proxmox VE's storage plugin
uses this to allow single file restore for LXCs.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile-restore: never list ppxar as archive
Christian Ebner [Fri, 7 Jun 2024 11:37:49 +0000 (13:37 +0200)]
file-restore: never list ppxar as archive

Payload data archives cannot be used to navigate the content, so
exclude them from the archive listing, as this is used by
Proxmox VE to list in the file browser.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: add optional archive-name to file-restore
Christian Ebner [Fri, 7 Jun 2024 11:37:48 +0000 (13:37 +0200)]
api: datastore: add optional archive-name to file-restore

Allow to pass the archive name as optional api call parameter instead
of having it as prefix to the path.
If this parameter is given, instead of splitting of the archive name
from the path, the parameter itself is used, leaving the path
untouched.

This allows to restore single files from the archive, without having
to artificially construct the path in case of file restores for split
pxar archives, where the response path of the listing does not
include the archive, as opposed to the response provided by lookup
via the catalog.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: conditional lookup for catalog endpoint
Christian Ebner [Fri, 7 Jun 2024 11:37:47 +0000 (13:37 +0200)]
api: datastore: conditional lookup for catalog endpoint

Add an optional `archive-name` parameter, indicating the metadata
archive to be used for directory content lookups instead of the
catalog. If provided, instead of the catalog reader, a pxar Accessor
instance is created to perform the lookup.

This is in preparation for dropping catalog encoding for snapshots
with split pxar archive encoding.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: tools: add helper to lookup `ArchiveEntry`s via pxar
Christian Ebner [Fri, 7 Jun 2024 11:37:46 +0000 (13:37 +0200)]
client: tools: add helper to lookup `ArchiveEntry`s via pxar

In preparation to lookup entries via the pxar metadata archive
instead of the catalog, in order to drop encoding the catalog
for snapshots using split pxar archives altogehter.

This helper allows to lookup the directory entries via the provided
accessor instance and formats them to be compatible with the output
as produced by lookups via the catalog.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: move reusable code out of thread
Christian Ebner [Fri, 7 Jun 2024 11:37:45 +0000 (13:37 +0200)]
api: datastore: move reusable code out of thread

Move code that can be reused when having to  perform a lookup via the
pxar metadata archive instead of the catalog out of the thread.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: factor out path decoding for catalog
Christian Ebner [Fri, 7 Jun 2024 11:37:44 +0000 (13:37 +0200)]
api: datastore: factor out path decoding for catalog

The file path passed to the catalog is base64 encoded, with an exception
for the root.
Factor this check and decoding step out into a helper function to make
it reusable when doing the same for lookups via the metadata archive
instead of the catalog.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: helper: fix minor formatting issue
Christian Ebner [Thu, 6 Jun 2024 17:28:13 +0000 (19:28 +0200)]
client: helper: fix minor formatting issue

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: fix minor formatting issue
Christian Ebner [Thu, 6 Jun 2024 17:28:12 +0000 (19:28 +0200)]
client: pxar: fix minor formatting issue

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: conditionally skip metadata reference test
Christian Ebner [Thu, 6 Jun 2024 08:17:11 +0000 (10:17 +0200)]
client: pxar: conditionally skip metadata reference test

The test will fail for all users not having euid/egid set to
1000/1000, as the reference test folder structure cannot be created
with the expected ownership.
Therefore, skip over the test if either euid or egid do not match
this condition.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: do not attempt to set uid/gid in test
Christian Ebner [Thu, 6 Jun 2024 08:17:10 +0000 (10:17 +0200)]
client: pxar: do not attempt to set uid/gid in test

Setting the uid/gid for the files and folders of the test directory
structure will not work when lacking the permissions.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agobump pxar build-dep to 0.11
Fabian Grünbichler [Wed, 5 Jun 2024 14:04:12 +0000 (16:04 +0200)]
bump pxar build-dep to 0.11

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agodocs: add section describing change detection mode
Christian Ebner [Tue, 26 Mar 2024 09:57:13 +0000 (10:57 +0100)]
docs: add section describing change detection mode

Describe the motivation and basic principle of the clients change
detection mode and show an example invocation.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agodocs: file formats: describe split pxar archive file layout
Christian Ebner [Thu, 14 Mar 2024 10:25:38 +0000 (11:25 +0100)]
docs: file formats: describe split pxar archive file layout

Describes the pxar metadata archive and the corresponding pxar payload
file-format layout.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: set cache limit based on nofile rlimit
Christian Ebner [Tue, 7 May 2024 13:16:03 +0000 (15:16 +0200)]
client: pxar: set cache limit based on nofile rlimit

The lookahead cache size requires the resource limit for open file
handles to be high in order to allow for efficient reuse of unchanged
file payloads.

Increase the nofile soft limit to the hard limit and dynamically adapt
the cache size to the new soft limit minus the half of the previous
soft limit.

The `PxarCreateOptions` and the `Archiver` are therefore extended by
an additional field to store the maximum cache size, with fallback to
a default size of 512 entries.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: tools: add helper to raise nofile rlimit
Christian Ebner [Tue, 7 May 2024 13:04:03 +0000 (15:04 +0200)]
client: tools: add helper to raise nofile rlimit

The default soft limit for open file handles is rather low, as some
apis (e.g. the POSIX `select(2)` syscall) do not work [0].

The lookahead cache use during the backup clients metadata comparison
to reuse unchanged files however requires much higher limits to work
effectively.

This helper function allows to raise the soft limit to the hard
limit, as provided by the `getrlimit(2)` syscall.

[0] https://0pointer.net/blog/file-descriptor-limits.html

Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: add archive creation with reference test
Christian Ebner [Mon, 6 May 2024 09:35:01 +0000 (11:35 +0200)]
client: pxar: add archive creation with reference test

Add a basic regression test for archive creation with reference
metadata archive and index.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: chunk stream: switch payload stream chunker
Christian Ebner [Fri, 19 Apr 2024 15:14:12 +0000 (17:14 +0200)]
client: chunk stream: switch payload stream chunker

Use the dedicated chunker with boundary suggestions for the payload
stream, by attaching the channel sender to the archiver and the
channel receiver to the payload stream chunker.

The archiver sends the file boundaries for the chunker to consume.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agochunk stream: tests: add regression tests for payload chunker
Christian Ebner [Tue, 14 May 2024 09:57:47 +0000 (11:57 +0200)]
chunk stream: tests: add regression tests for payload chunker

Regression tests to cover suggested and forced boundaries as well as
chunk injection.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agochunker: tests: add regression tests for payload chunker
Christian Ebner [Mon, 13 May 2024 12:39:54 +0000 (14:39 +0200)]
chunker: tests: add regression tests for payload chunker

Test chunking of a payload stream with suggested chunk boundaries.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agodatastore: chunker: implement chunker for payload stream
Christian Ebner [Fri, 19 Apr 2024 13:47:11 +0000 (15:47 +0200)]
datastore: chunker: implement chunker for payload stream

Implement the Chunker trait for a dedicated payload stream chunker,
which extends the regular chunker by the option to suggest boundaries
to be used over the hast based boundaries whenever possible.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agodatastore: chunker: add Chunker trait
Christian Ebner [Fri, 19 Apr 2024 13:34:54 +0000 (15:34 +0200)]
datastore: chunker: add Chunker trait

Add the Chunker trait and move the current Chunker to ChunkerImpl to
implement the trait instead. This allows to use different chunker
implementations by dynamic dispatch and is in preparation for
implementing a dedicated payload chunker.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: add optional payload input to mount archive
Christian Ebner [Mon, 3 Jun 2024 14:46:07 +0000 (16:46 +0200)]
pxar: add optional payload input to mount archive

Allow to pass an optional input path to mount a split pxar archive
with dedicated payload data file.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>