From: Kai Lueke Date: Tue, 9 Aug 2022 11:34:18 +0000 (+0200) Subject: sysext: support distribution-independent extensions using ID=_any X-Git-Tag: v252-rc1~446^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ab4d43c54e977e5e53a98da3e77fd71a62b4fbfb;p=thirdparty%2Fsystemd.git sysext: support distribution-independent extensions using ID=_any A sysext image that merely contains static binaries has no dependency on the host distribution and should be able to be used anywhere. Support the special '_any' value for the ID field in the extension to opt-out of ID and VERSION_ID/SYSEXT_LEVEL matching. See https://github.com/systemd/systemd/issues/24061 --- diff --git a/man/systemd-sysext.xml b/man/systemd-sysext.xml index 42e8e12df97..c2cf87c9cb9 100644 --- a/man/systemd-sysext.xml +++ b/man/systemd-sysext.xml @@ -115,8 +115,9 @@ A simple mechanism for version compatibility is enforced: a system extension image must carry a /usr/lib/extension-release.d/extension-release.$name file, which must match its image name, that is compared with the host os-release - file: the contained ID= fields have to match, as well as the - SYSEXT_LEVEL= field (if defined). If the latter is not defined, the + file: the contained ID= fields have to match unless _any is set + for the extension. If the extension ID= is not _any, the + SYSEXT_LEVEL= field (if defined) has to match. If the latter is not defined, the VERSION_ID= field has to match instead. System extensions should not ship a /usr/lib/os-release file (as that would be merged into the host /usr/ tree, overriding the host OS version data, which is not desirable). The diff --git a/src/shared/extension-release.c b/src/shared/extension-release.c index db87b23a71e..681dcbf7f81 100644 --- a/src/shared/extension-release.c +++ b/src/shared/extension-release.c @@ -50,11 +50,18 @@ int extension_release_validate( extension_release_id = strv_env_pairs_get(extension_release, "ID"); if (isempty(extension_release_id)) { - log_debug("Extension '%s' does not contain ID in extension-release but requested to match '%s'", + log_debug("Extension '%s' does not contain ID in extension-release but requested to match '%s' or be '_any'", name, host_os_release_id); return 0; } + /* A sysext with no host OS dependency (static binaries or scripts) can match + * '_any' host OS, and VERSION_ID or SYSEXT_LEVEL are not required anywhere */ + if (streq(extension_release_id, "_any")) { + log_debug("Extension '%s' matches '_any' OS.", name); + return 1; + } + if (!streq(host_os_release_id, extension_release_id)) { log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.", name, extension_release_id, host_os_release_id); diff --git a/test/test-functions b/test/test-functions index b208825e674..f7f467dfca8 100644 --- a/test/test-functions +++ b/test/test-functions @@ -712,6 +712,12 @@ EOF chmod +x "$initdir/opt/script1.sh" echo MARKER=1 >"$initdir/usr/lib/systemd/system/other_file" mksquashfs "$initdir" "$oldinitdir/usr/share/app1.raw" -noappend + + export initdir="$TESTDIR/app-nodistro" + mkdir -p "$initdir/usr/lib/extension-release.d" "$initdir/usr/lib/systemd/system" + ( echo "ID=_any" ) >"$initdir/usr/lib/extension-release.d/extension-release.app-nodistro" + echo MARKER=1 >"$initdir/usr/lib/systemd/system/some_file" + mksquashfs "$initdir" "$oldinitdir/usr/share/app-nodistro.raw" -noappend ) } diff --git a/test/units/testsuite-50.sh b/test/units/testsuite-50.sh index 31cb52064ea..ae6dd0b3d7e 100755 --- a/test/units/testsuite-50.sh +++ b/test/units/testsuite-50.sh @@ -305,6 +305,7 @@ systemd-run -P --property ExtensionImages="/usr/share/app0.raw /usr/share/app1.r systemd-run -P --property ExtensionImages="/usr/share/app0.raw /usr/share/app1.raw" --property RootImage="${image}.raw" cat /usr/lib/systemd/system/some_file | grep -q -F "MARKER=1" systemd-run -P --property ExtensionImages="/usr/share/app0.raw /usr/share/app1.raw" --property RootImage="${image}.raw" cat /opt/script1.sh | grep -q -F "extension-release.app2" systemd-run -P --property ExtensionImages="/usr/share/app0.raw /usr/share/app1.raw" --property RootImage="${image}.raw" cat /usr/lib/systemd/system/other_file | grep -q -F "MARKER=1" +systemd-run -P --property ExtensionImages=/usr/share/app-nodistro.raw --property RootImage="${image}.raw" cat /usr/lib/systemd/system/some_file | grep -q -F "MARKER=1" cat >/run/systemd/system/testservice-50e.service </run/systemd/system/testservice-50f.service <