]> git.proxmox.com Git - proxmox-backup.git/log
proxmox-backup.git
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>
3 months agopxar: bin: support creation of split pxar archives via cli
Christian Ebner [Mon, 3 Jun 2024 14:37:16 +0000 (16:37 +0200)]
pxar: bin: support creation of split pxar archives via cli

Add support to create split pxar archives by redirecting the payload
output to a dedicated file.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: test `pxar list` with payload-input
Christian Ebner [Mon, 3 Jun 2024 10:45:03 +0000 (12:45 +0200)]
pxar: bin: test `pxar list` with payload-input

Add a unit test to check for correct listing of pxar archives with
split payload input.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: ignore version and prelude entries in listing
Christian Ebner [Mon, 27 May 2024 12:07:36 +0000 (14:07 +0200)]
pxar: bin: ignore version and prelude entries in listing

Do not list the pxar format version and the prelude entries in the
output of pxar list, these are not regular entries. Do include them
however when dumping with the debug environmet variable set.
Since the prelude is arbitrary in size, only show the content size.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: show padding in debug output on archive list
Christian Ebner [Mon, 25 Mar 2024 13:15:11 +0000 (14:15 +0100)]
pxar: bin: show padding in debug output on archive list

In addition to the entries, also show the padding encountered in-between
referenced payloads.

Example invocation: `PXAR_LOG=debug pxar list archive.mpxar`

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: allow to restore prelude to optional path
Christian Ebner [Thu, 2 May 2024 09:26:57 +0000 (11:26 +0200)]
client: pxar: allow to restore prelude to optional path

Pxar archives allow to store additional information in a prelude
entry since pxar format version 2.

Add an optional parameter to `pxar` and `proxmox-backup-client` to
specify the path to restore the prelude to and pass this to the
archive extraction by extending the `PxarExtractOptions` by a
corresponding field. If none is given, the prelude is simply skipped
during restore.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: opt encode cli exclude patterns as Prelude
Christian Ebner [Fri, 22 Mar 2024 14:27:59 +0000 (15:27 +0100)]
client: pxar: opt encode cli exclude patterns as Prelude

Instead of encoding the pxar cli exclude patterns as regular file
within the root directory of an archive, store this information
directly after the pxar format version entry in the entry of kind
Prelude.

This behavior is however currently exclusive to the archives written
with format version 2 in a split metadata and payload case.

This is a breaking change for the encoding of new cli exclude
parameters. Any new exclude parameter will not be added to an already
present .pxar-cliexclude file, and it will not be created if not
present.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: add helper to handle optional preludes
Christian Ebner [Thu, 4 Apr 2024 10:49:42 +0000 (12:49 +0200)]
client: pxar: add helper to handle optional preludes

Pxar archives with format version 2 allows to store optional
information file format version and prelude entries.

Cover the case for these entries, the file format version entry being
introduced to distinguish between different file formats used for
encoding as well as the prelude entry used to store optional metadata
such as the pxar cli exlude parameters.

Add the logic to accept and decode these prelude entries when
accessing the archive via a decoder instance.

For now simply ignore them.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: backup writer: make backup info output more concise
Christian Ebner [Mon, 3 Jun 2024 08:24:48 +0000 (10:24 +0200)]
client: backup writer: make backup info output more concise

With the additional output in case of split pxar archives, the upload
statistics logged by the backup writer following a backup are crowded
and hard to read.

Make the output more concise by merging the currenlty 2 lines per
upload stream, shown as e.g.:

```
data.ppxar: had to backup 4 MiB of 10.943 GiB (compressed 159 B) in 49.30s
data.ppxar: average backup speed: 83.09 KiB/s
```

into a single line, shown as e.g.:

```
data.ppxar: had to back up 4 MiB of 10.943 GiB (159 B compressed) in 49.30 s (average 83.09 KiB/s)
```

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: create: show chunk injection stats info output
Christian Ebner [Thu, 21 Mar 2024 14:18:00 +0000 (15:18 +0100)]
pxar: create: show chunk injection stats info output

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: create: keep track of reused chunks and files
Christian Ebner [Tue, 23 Apr 2024 13:50:07 +0000 (15:50 +0200)]
pxar: create: keep track of reused chunks and files

Track and log reused or reencoded files as well as the reused chunks
and their paddings.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: backup writer: add injected chunk count to stats
Christian Ebner [Thu, 21 Mar 2024 09:08:23 +0000 (10:08 +0100)]
client: backup writer: add injected chunk count to stats

Track the number of injected chunks and show them in the debug output

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofix #3174: client: pxar: enable caching and meta comparison
Christian Ebner [Fri, 24 May 2024 16:31:39 +0000 (18:31 +0200)]
fix #3174: client: pxar: enable caching and meta comparison

When walking the file system tree, check for each entry if it is
reusable, meaning that the metadata did not change and the payload
chunks can be reindexed instead of reencoding the whole data.

If the metadata matched, the range of the dynamic index entries for
that file are looked up in the previous payload data index.
Use the range and possible padding introduced by partial reuse of
chunks to decide whether to reuse the dynamic entries and encode
the file payloads as payload reference right away or cache the entry
for now and keep looking ahead.

If however a non-reusable (because changed) entry is encountered
before the padding threshold is reached, the entries on the cache are
flushed to the archive by reencoding them, resetting the cached state.

Reusable chunk digests and size as well as reference offsets to the
start of regular files payloads within the payload stream are injected
into the backup stream by sending them to the chunker via a dedicated
channel, forcing a chunk boundary and inserting the chunks.

If the threshold value for reuse is reached, the chunks are injected
in the payload stream and the references with the corresponding
offsets encoded in the metadata stream.

Since multiple files might be contained within a single chunk, it is
assured that the deduplication of chunks is performed, by keeping back
the last chunk, so following files might as well reuse that same
chunk without double indexing it.  It is assured that this chunk is
injected in the stream also in case that the following lookups lead to
a cache clear and reencoding.

Directory boundaries are cached as well, and written as part of the
encoding when flushing.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: refactor catalog encoding for directories
Christian Ebner [Fri, 24 May 2024 17:11:10 +0000 (19:11 +0200)]
client: pxar: refactor catalog encoding for directories

Move the catalog directory start and end encoding from `add_entry`
to the `add_directory`, the latter being called by the previous.

By this, the `add_entry` method can be reused to walk the filesystem
tree in the context of an enabled lookahead cache without encoding
anything.

No functional change intended.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: caching: add look-ahead cache
Christian Ebner [Tue, 23 Apr 2024 13:16:26 +0000 (15:16 +0200)]
pxar: caching: add look-ahead cache

Add a lookahead cache and the neccessary types to store the required
data and keep track of directory boundaries while traversing the
filesystem tree, in order to postpone a decision if to reuse or
reencode a given regular file with unchanged metadata.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: add method for metadata comparison
Christian Ebner [Wed, 21 Feb 2024 13:50:40 +0000 (14:50 +0100)]
client: pxar: add method for metadata comparison

Add method to compare metadata of current file entry against metadata
of the entry looked up in the previous backup snapshot. If the
metadata matched, the start offset pointing to the files payload
header in the payload steam is returned.

This is in preparation for reusing payload chunks for unchanged files.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: implement prepare reference method
Christian Ebner [Wed, 21 Feb 2024 12:06:46 +0000 (13:06 +0100)]
client: implement prepare reference method

Implement a method that prepares the decoder instance to access a
previous snapshots metadata index and payload index in order to
pass it to the pxar archiver. The archiver than can utilize these
to compare the metadata for files to the previous state and gather
reusable chunks.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agospecs: add backup detection mode specification
Christian Ebner [Tue, 26 Sep 2023 09:28:55 +0000 (11:28 +0200)]
specs: add backup detection mode specification

Adds the specification for switching the detection mode used to
identify regular files which changed since a reference backup run.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: streams: add channels for dynamic entry injection
Christian Ebner [Wed, 21 Feb 2024 10:58:14 +0000 (11:58 +0100)]
client: streams: add channels for dynamic entry injection

To reuse dynamic entries of a previous backup run and index them for
the new snapshot. Adds a non-blocking channel between the pxar
archiver and the chunk stream, as well as the chunk stream and the
backup writer.

The archiver sends forced boundary positions and the dynamic
entries to inject into the chunk stream following this boundary.

The chunk stream consumes this channel inputs as receiver whenever a
new chunk is requested by the upload stream, forcing a non-regular
chunk boundary in the pxar stream at the requested positions.

The dynamic entries to inject and the boundary are then send via the
second asynchronous channel to the backup writer's upload stream,
indexing them by inserting the dynamic entries as known chunks into
the upload stream.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agochunker: add method to reset chunker state
Christian Ebner [Mon, 13 May 2024 12:37:23 +0000 (14:37 +0200)]
chunker: add method to reset chunker state

When forcing a boundary, the internal chunker state is not in sync
with the chunk stream anymore. The reset method therefore allows
to reset the internal state.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: chunk stream: add struct to hold injection state
Christian Ebner [Tue, 19 Mar 2024 09:23:08 +0000 (10:23 +0100)]
client: chunk stream: add struct to hold injection state

Adds a dedicated structure to hold the optional sender and receiver
instances and state for injection of reused dynamic entries in the
payload stream for split stream pxar archives.

The asynchronous channels must only be attached to the payload
archive, leaving the current behavior for the metadata archive and
current default encoding without reusing payload chunks of previous
snapshots.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoupload stream: implement reused chunk injector
Christian Ebner [Thu, 21 Sep 2023 12:46:56 +0000 (14:46 +0200)]
upload stream: implement reused chunk injector

In order to be included in the backups index file, reused payload
chunks have to be injected into the payload upload stream at a
forced boundary. The chunker forces a chunk boundary and sends the
list of reusable dynamic entries to be uploaded.

This implements the logic to receive these dynamic entries via the
corresponding communication channel from the chunker and inject the
entries into the backup upload stream by looking for the matching
chunk boundary, already forced by the chunker.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: helper for lookup of reusable dynamic entries
Christian Ebner [Thu, 14 Mar 2024 14:07:03 +0000 (15:07 +0100)]
client: pxar: helper for lookup of reusable dynamic entries

The helper method allows to lookup the entries of a dynamic index
which fully cover a given offset range. Further, the helper returns
the start padding from the start offset of the dynamic index entry
to the start offset of the given range and the end padding.

This will be used to lookup size and digest for chunks covering the
payload range of a regular file in order to re-use found chunks by
indexing them in the archives index file instead of re-encoding the
payload.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: include payload offset in entry listing
Christian Ebner [Fri, 15 Mar 2024 08:46:06 +0000 (09:46 +0100)]
client: pxar: include payload offset in entry listing

Also display the payload offset as listing output when the regular file
entry had a payload reference rather than the payload encoded in the
archive. This allows for debugging by inspecting the raw payload data
file at given offset.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: add more context to extraction error
Christian Ebner [Mon, 25 Mar 2024 11:53:48 +0000 (12:53 +0100)]
pxar: bin: add more context to extraction error

Show more of the extraction error context provided by the pxar decoder.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: cover listing for split archives
Christian Ebner [Mon, 27 May 2024 11:57:44 +0000 (13:57 +0200)]
pxar: bin: cover listing for split archives

Allows to list entries of split pxar archives. As the decoder skips
over the file payloads, the corresponding payload file has to be
provided. Otherwise the decoder would skip inside the metadata
archive, leading to incorrect decoding.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agopxar: bin: add optional payload input for archive restore
Christian Ebner [Mon, 25 Mar 2024 10:59:46 +0000 (11:59 +0100)]
pxar: bin: add optional payload input for archive restore

Allows to pass the optional payload input to restore for cases where the
regular file payloads are stored in the split archive.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile restore: show more error context when extraction fails
Christian Ebner [Wed, 24 Apr 2024 10:02:14 +0000 (12:02 +0200)]
file restore: show more error context when extraction fails

Otherwise the context swallows the actual, underlying error message.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile restore: cover split metadata and payload archives
Christian Ebner [Tue, 23 Apr 2024 17:25:55 +0000 (19:25 +0200)]
file restore: cover split metadata and payload archives

Attach the payload data archive as input stream to the decoder
and accessor instances for split archives.
Allows to restore contents from split archives via the
`proxmox-file-restore extract` command, by passing the metadata
archive name.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile restore: factor out getting pxar reader
Christian Ebner [Tue, 23 Apr 2024 17:19:16 +0000 (19:19 +0200)]
file restore: factor out getting pxar reader

Factor out the logic to get the pxar reader into a dedicated function
so it can be reused to get the payload data archive reader instance.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agofile restore: cover extension for split pxar archives
Christian Ebner [Mon, 19 Feb 2024 13:40:49 +0000 (14:40 +0100)]
file restore: cover extension for split pxar archives

Cover the additional `.mpxar` for metadata archive and `.ppxar` for
the payload data for pxar archives written as split archive.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agowww: cover metadata extension for pxar archives
Christian Ebner [Mon, 19 Feb 2024 13:45:49 +0000 (14:45 +0100)]
www: cover metadata extension for pxar archives

Allows to access the pxar metadata archives for navigation and
download via the Proxmox Backup Server web ui.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agocatalog: shell: make split pxar archives accessible
Christian Ebner [Wed, 21 Feb 2024 19:39:48 +0000 (20:39 +0100)]
catalog: shell: make split pxar archives accessible

Cover the cases where the pxar archive was uploaded as split payload
data and metadata streams. Instantiate the required reader and
decoder instances to access the metadata and payload data archives,
using the corresponding helper methods.
Allows to restore split metadata and payload stream pxar archives via
the catalog shell.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: attach split archive payload chunk reader
Christian Ebner [Tue, 20 Feb 2024 14:49:18 +0000 (15:49 +0100)]
api: datastore: attach split archive payload chunk reader

Attach the payload chunk reader for pxar archives which have been
uploaded using split streams for metadata and payload data.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: mount: make split pxar archives mountable
Christian Ebner [Thu, 15 Feb 2024 11:47:32 +0000 (12:47 +0100)]
client: mount: make split pxar archives mountable

Cover the cases where the pxar archive was uploaded as split payload
data and metadata streams. Instantiate the required reader and
decoder instances to access the metadata and payload data archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: tools: cover extension for split pxar archives
Christian Ebner [Mon, 19 Feb 2024 13:50:28 +0000 (14:50 +0100)]
client: tools: cover extension for split pxar archives

Cover the additional `.mpxar` for metadata archive and `.ppxar` for
the payload data file in the cli parameter completion callback.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: restore: read payload from dedicated index
Christian Ebner [Wed, 21 Feb 2024 10:51:52 +0000 (11:51 +0100)]
client: restore: read payload from dedicated index

Whenever a split pxar archive is encountered, instantiate and attach
the required dedicated reader instance to the decoder instance on
restore.

Piping the output to stdout is not possible for these, as this would
require a decoder instance which can decode the input stream, while
maintaining the pxar stream format as output.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: tools: helper to check pxar filename extensions
Christian Ebner [Tue, 21 May 2024 15:18:38 +0000 (17:18 +0200)]
client: tools: helper to check pxar filename extensions

With the introduction of split pxar archives, the allowed extensions
are now `.pxar`, `.mpxar` and `.ppxar`. Add a helper function to
allow to check for all valid variants, including the optional
additional `.didx` in case of a server archive name.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: helper: add method for split archive name mapping
Christian Ebner [Tue, 19 Mar 2024 08:43:22 +0000 (09:43 +0100)]
client: helper: add method for split archive name mapping

Helper method that takes an archive name as input and checks if the
given archive is present in the manifest, by also taking possible
split archive extensions into account.
Returns the pxar archive name if found or the split archive names if
the split archive variant is present in the manifest.

If neither is matched, an error is returned signaling that nothing
matched entries in the manifest.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: helper: add helpers for creating reader instances
Christian Ebner [Wed, 13 Mar 2024 13:44:20 +0000 (14:44 +0100)]
client: helper: add helpers for creating reader instances

Add module to place helper methods which need to be used in different
submodules of the client.

Add `get_pxar_fuse_reader`, `get_buffered_pxar_reader` and
`get_pxar_fuse_accessor` to create reader instances to access pxar
archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: optionally split metadata and payload streams
Christian Ebner [Mon, 22 Apr 2024 15:39:00 +0000 (17:39 +0200)]
client: pxar: optionally split metadata and payload streams

... and attach the split payload writer variant to the pxar archive
creation. By this, metadata and payload data will create different
dynamic indexes, allowing to lookup and reuse payload chunks without
the additional overhead of the pxar archive's metadata.

For now this functionality remains disabled and will be enabled in a
later patch once the logic for reusing the payload chunks is in
place.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: combine writers into struct
Christian Ebner [Mon, 22 Apr 2024 14:23:40 +0000 (16:23 +0200)]
client: pxar: combine writers into struct

Introduce a `PxarWriters` struct to bundle all writer instances
required for the pxar archive creation into a single object to limit
the number of function call parameters.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: pxar: switch to stack based encoder state
Christian Ebner [Tue, 20 Feb 2024 16:07:08 +0000 (17:07 +0100)]
client: pxar: switch to stack based encoder state

... and adapt to the new reader/writer variant for encoder or
decoder/accessor to attach a dedicated payload input/output for split
pxar archives.

In preparation for look-ahead caching, where a passing around of
per-directory level encoder instances with internal references is
not feasible.

Previously, for each directory level a new encoder instance has been
generated, restricting possible implementation errors. These encoder
instances have been internally linked by references to keep track of
the state changes in a parent child relationship.

This is however not feasible when the encoder has to be passed by
mutable reference, as required by the look-ahead cache
implementation. The encoder has therefore been adapted to use a
single instance implementation with an internal stack keeping track
of the state.

Depends on the bumped pxar library version, including the patches to
attach the corresponding variant for the pxar reader/writer
instantiation.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agobump version to 3.2.4-1
Fabian Grünbichler [Wed, 5 Jun 2024 14:24:36 +0000 (16:24 +0200)]
bump version to 3.2.4-1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agodatastore: dynamic index: add method to get digest
Christian Ebner [Tue, 28 May 2024 09:42:33 +0000 (11:42 +0200)]
datastore: dynamic index: add method to get digest

In preparation for injecting reused payload chunks in payload streams
for regular files with unchanged metaddata. Allows to get the digest
of a dynamic index entry to construct a reusable dynamic entry from
it.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoapi: datastore: refactor getting local chunk reader
Christian Ebner [Tue, 28 May 2024 09:42:11 +0000 (11:42 +0200)]
api: datastore: refactor getting local chunk reader

Move the code to get the local chunk reader to a dedicated function
to make it reusable. The same code is required to get the local chunk
reader for the payload stream for split stream archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoclient: backup: factor out extension from backup target
Christian Ebner [Tue, 28 May 2024 09:42:10 +0000 (11:42 +0200)]
client: backup: factor out extension from backup target

Instead of composing the backup target name and pushing it to the
backup list, push the archive name and extension separately, only
constructing it while iterating the list later.

By this it remains possible to additionally prefix the extension, as
required with the separate pxar metadata and payload indexes.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
3 months agoauth: add locking to `PbsAuthenticator` to avoid race conditions
Shannon Sterz [Thu, 23 May 2024 11:25:59 +0000 (13:25 +0200)]
auth: add locking to `PbsAuthenticator` to avoid race conditions

currently we don't lock the shadow file when removing or storing a
password. by adding locking here we avoid a situation where storing
and/or removing a password concurrently could lead to a race
condition. in this scenario it is possible that a password isn't
persisted or a password isn't removed. we already do this for
the "token.shadow" file, so just use the same mechanism here.

Signed-off-by: Shannon Sterz <s.sterz@proxmox.com>
3 months agofix #5503: d/control: bump dependency for proxmox-widget-toolkit
Fiona Ebner [Fri, 31 May 2024 14:09:21 +0000 (16:09 +0200)]
fix #5503: d/control: bump dependency for proxmox-widget-toolkit

With proxmox-widget-toolkit < 4.1.4, loading the UI will fail with
a JavaScript error:

> Uncaught TypeError: Proxmox.Utils.overrideNotificationFieldName is not a function

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
3 months agofix: api: permission using wrong pathname
Gabriel Goller [Wed, 29 May 2024 12:54:58 +0000 (14:54 +0200)]
fix: api: permission using wrong pathname

The read_interface endpoint uses the wrong path identifier. It has been
renamed to 'iface' some time ago but hasn't been changed here.

When a user has a permission on '/' with 'Admin', he wasn't able to
show the config of a single interface, as the non-existent path didn't
match.

Reported-by: https://forum.proxmox.com/threads/permissons-not-working-for-network-settings.147899/
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
3 months agofixup build with new acme crate
Wolfgang Bumiller [Mon, 27 May 2024 08:53:46 +0000 (10:53 +0200)]
fixup build with new acme crate

We missed an API break in the acme crate versioning...

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 months agotrivial clippy fixes
Fabian Grünbichler [Fri, 24 May 2024 10:49:04 +0000 (12:49 +0200)]
trivial clippy fixes

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agorun `cargo fmt`
Fabian Grünbichler [Fri, 24 May 2024 10:49:21 +0000 (12:49 +0200)]
run `cargo fmt`

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agobump version to 3.2.3-1
Thomas Lamprecht [Wed, 22 May 2024 17:31:39 +0000 (19:31 +0200)]
bump version to 3.2.3-1

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agotape: rework setting MAM Host type attributes
Thomas Lamprecht [Wed, 22 May 2024 17:03:05 +0000 (19:03 +0200)]
tape: rework setting MAM Host type attributes

The product name is Proxmox Backup Server, not just Backup Server,
that makes no sense on its own and it really cannot be expected by
tools extracting any Medium Auxiliary Memory (MAM) info to render it
as `${app_vendor} ${app_name}`.

Drop the comment about ignoring errors, that's pretty clear with
the only-log-error construct.

Instead, add some comments about what the hex numbers refers too and
what their respective length (limit) is. The names where taken from
Table 315 "MAM Host type attributes" in the "IBM LTO SCSI Reference"
for LTO 9.

Slightly off-topic: The tape code really is a mess with sprinkling
those hex numbers hard coded all over the place, often with some
unchecked coupling in other places (like here, the list of set MAM
attrs and the one that get cleared can easily get out of sync..), but
that's for another time to clean-up (I need to cut a release).

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agobuild config: add constant for full cargo crate version
Thomas Lamprecht [Wed, 22 May 2024 16:58:41 +0000 (18:58 +0200)]
build config: add constant for full cargo crate version

and a todo comment to document some cleanup potential

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agoacme: explicitly ask for custom directory URI
Fabian Grünbichler [Wed, 15 May 2024 11:21:42 +0000 (13:21 +0200)]
acme: explicitly ask for custom directory URI

instead of blocking on input without telling the user what's going on.

Reported on the forum: https://forum.proxmox.com/threads/147058/

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoui: datastore options: link to 'notification-mode' section
Lukas Wagner [Fri, 26 Apr 2024 11:23:35 +0000 (13:23 +0200)]
ui: datastore options: link to 'notification-mode' section

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
3 months agodocs: notifications: rewrite overview for more clarity
Lukas Wagner [Fri, 26 Apr 2024 11:23:34 +0000 (13:23 +0200)]
docs: notifications: rewrite overview for more clarity

Also link to the following subsections where applicable.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
3 months agodocs: document notification-mode and merge old notification section
Lukas Wagner [Fri, 26 Apr 2024 11:23:33 +0000 (13:23 +0200)]
docs: document notification-mode and merge old notification section

This new section describes how the notification-mode parameter works.
The section also contains also parts of the old notification section
from the maintenance chapter, reusing the description of the
`notify` and `notify-user` parameters.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Gabriel Goller <g.goller@proxmox.com>
3 months agonotifications: fix legacy sync notifications
Gabriel Goller [Wed, 15 May 2024 09:58:45 +0000 (11:58 +0200)]
notifications: fix legacy sync notifications

When using the legacy notifications the sync mode would pick up the
settings from the prune-job, which default to Error. This completely
disables notifications for successful sync-jobs when using the legacy
system.

Reported in the forum: https://forum.proxmox.com/threads/147018/

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Max Carrara <m.carrara@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
3 months agobump d/control
Wolfgang Bumiller [Wed, 22 May 2024 14:05:53 +0000 (16:05 +0200)]
bump d/control

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 months agobump proxmox-auth-api to 0.4
Wolfgang Bumiller [Wed, 22 May 2024 14:05:49 +0000 (16:05 +0200)]
bump proxmox-auth-api to 0.4

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 months agoauth: use auth-api when generating keys and generate ec keys
Stefan Sterz [Wed, 6 Mar 2024 12:36:09 +0000 (13:36 +0100)]
auth: use auth-api when generating keys and generate ec keys

this commit switches pbs over to generating ed25519 keys when
generating new auth api keys. this also removes the last direct
usages of openssl here and further unifies key handling in the auth
api.

Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
3 months agoauth: move to auth-api's private and public keys when loading keys
Stefan Sterz [Wed, 6 Mar 2024 12:36:08 +0000 (13:36 +0100)]
auth: move to auth-api's private and public keys when loading keys

this commit moves away from using openssl's `PKey` and uses the
wrappers from proxmox-auth-api. this allows us to handle keys in a
more flexible way and enables as to move to ec based crypto for the
authkey in the future.

Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
3 months agoauth: upgrade hashes on user log in
Stefan Sterz [Wed, 6 Mar 2024 12:36:07 +0000 (13:36 +0100)]
auth: upgrade hashes on user log in

if a users password is not hashed with the latest password hashing
function, re-hash the password with the newest hashing function. we
can only do this on login and after the password has been validated,
as this is the only point at which we have access to the plain text
password and also know that it matched the original password.

Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
3 months agoauth: move to hmac keys for csrf tokens
Stefan Sterz [Wed, 6 Mar 2024 12:36:06 +0000 (13:36 +0100)]
auth: move to hmac keys for csrf tokens

previously we used a self-rolled implementation for csrf tokens. while
it's unlikely to cause issues in reality, as csrf tokens are only
valid for a given tickets lifetime, there are still theoretical
attacks on our implementation. so move all of this code into the
proxmox-auth-api crate and use hmac instead.

this change should not impact existing installations for now, as this
falls back to the old implementation if a key is already present. hmac
keys will only be used for new installations and if users manually
remove the old key and

Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
3 months agoui: garbage-collection: use different state-id for global and per-datastore view
Thomas Lamprecht [Tue, 21 May 2024 09:30:07 +0000 (11:30 +0200)]
ui: garbage-collection: use different state-id for global and per-datastore view

For one these different views have different columns shown, and more
importantly: with the state being shared one could change sorting in
the global view and then have that applied in the per-datastore view
too, even if one cannot sort that view explicitly otherwise as there's
just one row anyway. This small glitch might lead to a bit of
confusion in the worst case and looks unpolished in any way.

Note that I explicitly decided against encoding the datastore in the
state-id for the per-datastore views for now, as most users will want
to adapt layout (like column width) for all per-datastores views.

Having to re-do that for every datastore separately can be quite a
nuisance while the same user wanting different layout for each
datastore in their per-datastore view seems rather to be an edge case.
And we can always change this, so starting out with the slightly more
restricted design that has less browser local data to be saved seems
better w.r.t. maintainability.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agofix #5422: ui: garbage-collection: make columns in global view sortable
Gabriel Goller [Thu, 16 May 2024 09:18:41 +0000 (11:18 +0200)]
fix #5422: ui: garbage-collection: make columns in global view sortable

Make columns sortable in the global 'Prune & GC Jobs' view. In the
per-datastore view the columns will not be sortable as there can only be
one job.

Fixes: db3fd213 ("fix #3217: ui: global prune and gc job view")
Co-authored-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Max Carrara <m.carrara@proxmox.com>
4 months agorestore daemon: search disk also with truncated serial
Dominik Csapak [Wed, 15 May 2024 09:55:13 +0000 (11:55 +0200)]
restore daemon: search disk also with truncated serial

the disk serial given to virtio disks only can be 20 characters, so
looking for a disk with a longer serial will always fail (like
'drive-tpmstate0-backup'). If the serial is longer, also try with the
truncated one. Leave the first try in place in case the limit changes.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agorestore daemon: log some errors for dir traversal
Dominik Csapak [Wed, 15 May 2024 09:55:12 +0000 (11:55 +0200)]
restore daemon: log some errors for dir traversal

in case we cannot stat a file in the restore vm, log the path and reason
why. This should normally not happen, but when it does, the path and
error might help us find the issue.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agofix #5465: restore daemon: mount ntfs with utf8 charset
Dominik Csapak [Wed, 15 May 2024 09:55:11 +0000 (11:55 +0200)]
fix #5465: restore daemon: mount ntfs with utf8 charset

since the change in our restore image to ntfs3, non iso8859-1 filenames
were broken. Fix that by adding the 'iocharset' option to ntfs3.

Leave the ntfs option in place, so that if the image gets booted
with an older kernel for some reason, this still works.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agoui: update online help info
Thomas Lamprecht [Wed, 15 May 2024 12:14:51 +0000 (14:14 +0200)]
ui: update online help info

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoapi: syslog: fix api macro to return array instead of object.
Dietmar Maurer [Wed, 15 May 2024 10:17:03 +0000 (12:17 +0200)]
api: syslog: fix api macro to return array instead of object.

The implementation already returns Vec, so this change is to generate
correct api documentation.

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
4 months agotape: write informational MAM attributes on tapes
Dominik Csapak [Tue, 14 May 2024 14:12:48 +0000 (16:12 +0200)]
tape: write informational MAM attributes on tapes

namely:

Vendor: Proxmox
Name: Backup Server
Version: current running package version
User Label Text: the label text
Media Pool: the current media pool

write it on labeling and when writing a new media-set to a tape.

While we currently don't use this info for anything, this can help users
to identify tapes, even with different backup software.

If we need it in the future, we can e.g. make decisions based on these
fields (e.g. the version).

On format, delete them again.

Note that some VTLs don't correctly delete the attributes from the
virtual tapes.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: correct mam format for some attributes
Dominik Csapak [Tue, 14 May 2024 14:12:47 +0000 (16:12 +0200)]
tape: correct mam format for some attributes

Some MAM attributes are of type 'TEXT' that is not only ascii, but
controlled by an addition field that specifies various 8bit text
formats.

For now, simply assume utf8 as the default is ascii, and we don't expect
any data that is not ASCII anyway.

This will be needed when we'll want to write those attributes.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: include drive activity in status
Dominik Csapak [Mon, 13 May 2024 10:49:26 +0000 (12:49 +0200)]
tape: include drive activity in status

Since we don't query each drives status seperately, but rely on a single
call to the drives listing parameter for that, we now add the option
to query the activity there too. This makes that data avaiable for us
to show in a seperate (by default hidden) column.

Also we show the activity in the 'State' column when the drive is idle
from our perspective. This is useful when e.g. an LTO-9 tape is loaded
the first time and is calibrating, since that happens automatically.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: drive status: make some depend on the activity
Dominik Csapak [Mon, 13 May 2024 10:49:25 +0000 (12:49 +0200)]
tape: drive status: make some depend on the activity

when the tape drive has an activity (and the tape is in motion), certain
calls block until the operation is finished. Since we cannot predict how
long it's going to be and it can be quite long in certain cases,
skip those calls when the drive is doing anything.

If we cannot determine the activity, try to do the queries.

We have to extend the check for a loaded drive in the UI, since the
position is not available during any activity.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: add drive activity to drive status api
Dominik Csapak [Mon, 13 May 2024 10:49:24 +0000 (12:49 +0200)]
tape: add drive activity to drive status api

and show it in the gui for single drives. Adds the known values for the
activity to the UI.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: add functions to parse drive device activity
Dominik Csapak [Mon, 13 May 2024 10:49:23 +0000 (12:49 +0200)]
tape: add functions to parse drive device activity

we use the VHF part from the DT Device Activity page for that.
This is intended to query the drive for it's current state and activity.

Currently only the activity is parsed and used.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: save 'bytes used' in tape inventory
Dominik Csapak [Mon, 13 May 2024 10:46:09 +0000 (12:46 +0200)]
tape: save 'bytes used' in tape inventory

and show them on the ui. This can help uses with seeing how much a tape
is used.

The value is updated on 'commit' and when the tape is changed during a
backup.

For drives not supporting the volume statistics, this is simply skipped.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: cleanup: rename bytes_written to bytes_written_after_sync
Dietmar Maurer [Wed, 8 May 2024 07:16:57 +0000 (09:16 +0200)]
tape: cleanup: rename bytes_written to bytes_written_after_sync

4 months agoexamples: add tape write benchmark
Dominik Csapak [Tue, 7 May 2024 13:45:53 +0000 (15:45 +0200)]
examples: add tape write benchmark

A small example that simply writes pseudo-random chunks to a drive.
This is useful to benchmark throughput on tape drives.

The output and behavior is similar to what the pool writer does, but
without writing multiple files, committing or loading data from disk.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agotape: improve throughput by not unnecessarily syncing/committing
Dominik Csapak [Tue, 7 May 2024 13:45:52 +0000 (15:45 +0200)]
tape: improve throughput by not unnecessarily syncing/committing

When writing data on tape, the idea was to sync/committing to tape and
the catalog to disk every 128GiB of data. For that the counter
'bytes_written' was introduced and checked after every chunk/snapshot
archive.

Sadly we forgot to reset the counter after doing so, which meant that
after 128GiB was written onto the tape, we synced/committed after every
archive on the tape for the remaining length of the tape.

Since syncing to tape and writing to disk takes a bit of time, the drive
had to slow down every time and reduced the available throughput. (In
our tests here from ~300MB/s to ~255MB/s).

By resetting the value to zero after syncing, we avoid that and increase
throughput performance when backups are bigger than 128GiB on tape.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
4 months agoapi: delay datastore lookup after permission check
Dietmar Maurer [Thu, 25 Apr 2024 09:31:47 +0000 (11:31 +0200)]
api: delay datastore lookup after permission check

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
4 months agoupdate proxmox-metrics dependency to 0.3.1
Thomas Lamprecht [Fri, 26 Apr 2024 15:55:28 +0000 (17:55 +0200)]
update proxmox-metrics dependency to 0.3.1

to ensure that it can handle the recently lifted restrictions on the
organization and bucket parameters correctly by URL encoding them.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoapi-types: remove influxdb bucket name restrictions
Gabriel Goller [Fri, 26 Apr 2024 14:02:43 +0000 (16:02 +0200)]
api-types: remove influxdb bucket name restrictions

Remove the regex for influxdb organizations and buckets. Influxdb does
not place any constraints on these names and allows all characters. This
allows influxdb organization names with slashes.

Also remove a duplicate comment and add some missing ones.

This also aligns the behavior to PVE as there are no restrictions there
either.

The motivation for this patch is this forum post:
https://forum.proxmox.com/threads/influx-db-organization-doesnt-allow-slash.145402/

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agoupdate proxmox-sys dependency to 0.5.4
Thomas Lamprecht [Fri, 26 Apr 2024 15:54:06 +0000 (17:54 +0200)]
update proxmox-sys dependency to 0.5.4

to ensure the next build contains the 78bf05a4 ("fix: use fragmented
block size for space calculation") improvement.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agobump version to 3.2.2-1 v3.2.2
Thomas Lamprecht [Thu, 25 Apr 2024 10:06:15 +0000 (12:06 +0200)]
bump version to 3.2.2-1

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoui: sync job: fix error if local namespace is selected first
Lukas Wagner [Thu, 25 Apr 2024 08:59:36 +0000 (10:59 +0200)]
ui: sync job: fix error if local namespace is selected first

When creating a new sync job and a local namespace is configured
without setting a remote first, the createMaxPrefixLength
was passed an array instead of a string/undefined/null, which
triggered a 'ns2.match is not a funtion exception', making the UI
glitchy afterwards.

Fixed by explicitly checking for a string. Verified that the other
user of NamespaceMaxDepthReduced, the prune job edit window, does not
break after the change.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
4 months agofix: tape ui: unset `deleteEmpty` in `TapeBackupWindow`
Stefan Sterz [Fri, 5 Apr 2024 14:12:57 +0000 (16:12 +0200)]
fix: tape ui: unset `deleteEmpty` in `TapeBackupWindow`

since the api rejects unknown parameters, deleteEmpty needs to be
unset here, because the endpoint for creating backups does not support
deleting parameters. otherwise a user will get a fairly cryptic error
message in the gui.

Signed-off-by: Stefan Sterz <s.sterz@proxmox.com>
4 months agoui: utils: fix defaultMailAuthor
Lukas Wagner [Thu, 25 Apr 2024 07:37:07 +0000 (09:37 +0200)]
ui: utils: fix defaultMailAuthor

The default mail author for SMTP and Sendmail target is
"Proxmox Backup Server - <hostname>" and not
"Proxmox Backup Server (<hostname>)".

This is just a cosmetical change which affects the empty text for the
'Author' field in the sendmail/smtp edit window.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
4 months agobump version to 3.2.1-1
Thomas Lamprecht [Wed, 24 Apr 2024 20:07:05 +0000 (22:07 +0200)]
bump version to 3.2.1-1

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoui: enable vlan widget
Stefan Lendl [Thu, 4 Apr 2024 10:00:36 +0000 (12:00 +0200)]
ui: enable vlan widget

* Enabled the "Linux VLAN" option when creating a new interface.
* This requires the updated widget-toolkit to contain vlan field widget.

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoapi: create and update vlan interfaces
Stefan Lendl [Thu, 4 Apr 2024 10:00:35 +0000 (12:00 +0200)]
api: create and update vlan interfaces

* Implement setting vlan-id and vlan-raw-device in the create and update api.
* Checking if the provided vlan-raw-device exists
* Moved VLAN_INTERFACE_REGEX to top level network module to use it in
  the checking functions there. Changed to match with named capture groups.
* Unit tests to verify parsing vlan_id and vlan_raw_device from name.

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agofmt: fix intendation in api macro
Stefan Lendl [Thu, 4 Apr 2024 10:00:34 +0000 (12:00 +0200)]
fmt: fix intendation in api macro

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoconfig: remove unnecessary pub in various methods in NetworkConfig
Stefan Lendl [Thu, 4 Apr 2024 10:00:33 +0000 (12:00 +0200)]
config: remove unnecessary pub in various methods in NetworkConfig

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoconfig: parse vlan interface from config
Stefan Lendl [Thu, 4 Apr 2024 10:00:32 +0000 (12:00 +0200)]
config: parse vlan interface from config

Support three types of vlan configurations defined in interfaces,
conforming to the PVE configurations:

iface nic.<vlan-id> inet

iface vlan<vlan-id> inet
vlan-raw-device <nic>

iface <arbitraty-name> inet
vlan-id <vlan-id>
vlan-raw-device <nic>

* Add lexer Token enum variants for vlan-id and vlan-raw-device and parse
  them in parse_iface_attributes.
* Add tests to verify this works in the above scenarios

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoconfig: write vlan network interface
Stefan Lendl [Thu, 4 Apr 2024 10:00:31 +0000 (12:00 +0200)]
config: write vlan network interface

* Add vlan_id and vlan_raw_device fields to the Interface api type
* Write to the network config the vlan specific properties for vlan
  interface type
* Add several tests to verify the functionally

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agotests: simple tests for writing the network config
Stefan Lendl [Thu, 4 Apr 2024 10:00:30 +0000 (12:00 +0200)]
tests: simple tests for writing the network config

Simple tests for manual and static configurations.

Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Folke Gleumes <f.gleumes@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>