diff --git a/man/sysupdate.components.xml b/man/sysupdate.components.xml
index c4897cddeaf..38b68044279 100644
--- a/man/sysupdate.components.xml
+++ b/man/sysupdate.components.xml
@@ -376,6 +376,15 @@ SuggestOnVirtualization=!vm
message is logged. The default component (i.e. sysupdate.d/) is always taken from
the file system.
+ Instead of pointing its transfers to resources on a web server, a provider may also serve these
+ resources itself. In that case, it must implement the generic
+ io.systemd.ResourceProvider Varlink interface (typically on the same socket), and
+ use URLs of the form
+ provider:[/run/systemd/sysupdate/provider/name]/resource
+ in the Path= field of the sources of its transfers, see
+ sysupdate.d5 for
+ details.
+
Since the definitions of provider-backed components do not live in the file system, the
enable-component, disable-component,
enable-feature and disable-feature commands of
diff --git a/man/sysupdate.d.xml b/man/sysupdate.d.xml
index 4b79e261640..65c9afffbdd 100644
--- a/man/sysupdate.d.xml
+++ b/man/sysupdate.d.xml
@@ -167,11 +167,12 @@
Resources of type url-file encapsulate a file on a web server,
- referenced via a HTTP or HTTPS URL. When an update takes place, the file is downloaded and decompressed
- and then written to the target file or partition. This resource type is only available for sources, not
- for targets. The list of available versions of resources of this type is encoded in
- SHA256SUMS manifest files, accompanied by
- SHA256SUMS.gpg detached signatures.
+ referenced via a HTTP or HTTPS URL, or a resource offered by a local resource provider service,
+ referenced via a provider: URL (see Path= below). When an update
+ takes place, the file is downloaded and decompressed and then written to the target file or
+ partition. This resource type is only available for sources, not for targets. The list of available
+ versions of resources of this type is encoded in SHA256SUMS manifest files,
+ accompanied by SHA256SUMS.gpg detached signatures.
The url-tar resource type is similar, but the file must be a
.tar archive. When an update takes place, the file is decompressed and unpacked
@@ -639,6 +640,21 @@
names listed in the manifest file in case an update is executed and a resource shall be
downloaded.
+ Alternatively, for these two source types a URL of the form
+ provider:[socket]/resource
+ may be specified, which refers to a resource offered by a local service implementing the
+ io.systemd.ResourceProvider Varlink interface on the
+ AF_UNIX socket socket (an absolute path). The
+ resource part is an opaque name the service understands, which may contain
+ slashes, but no . or .. components. Such URLs are suffixed and
+ otherwise treated exactly like HTTP/HTTPS URLs: /SHA256SUMS,
+ /SHA256SUMS.gpg and the file names from the manifest are appended to the
+ resource part and requested from the service via that interface.
+ Verification hence works the same way as for HTTP/HTTPS sources; in particular
+ Verify=yes requires the service to offer the signature file too. This is
+ primarily useful in combination with component providers, see
+ sysupdate.components5.
+
For all other source resource types this must be a local path in the file system, referring to
a local directory to find the versions of this resource in.
diff --git a/src/sysupdate/sysupdate-transfer.c b/src/sysupdate/sysupdate-transfer.c
index 0550a0b6f63..a998690f0eb 100644
--- a/src/sysupdate/sysupdate-transfer.c
+++ b/src/sysupdate/sysupdate-transfer.c
@@ -603,9 +603,9 @@ static int transfer_finalize(Transfer *t, const char *origin, unsigned line, Has
* sources. That's mostly for testing, since it relieves us from having to set up a HTTP
* server, and CURL abstracts this away from us thankfully. */
if (RESOURCE_IS_URL(t->source.type))
- if (!http_url_is_valid(t->source.path) && !file_url_is_valid(t->source.path))
+ if (!http_url_is_valid(t->source.path) && !file_url_is_valid(t->source.path) && !provider_url_is_valid(t->source.path))
return log_syntax(NULL, LOG_ERR, origin, line, SYNTHETIC_ERRNO(EINVAL),
- "Source path is not a valid HTTP or HTTPS URL: %s", t->source.path);
+ "Source path is not a valid HTTP, HTTPS, file, or provider URL: %s", t->source.path);
}
if (strv_isempty(t->source.patterns))