diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-02-19 16:36:07 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-02-22 20:10:55 +0100 |
commit | fd03a6a92bc2c4eae2165cbfcbcd93d82cd28ccf (patch) | |
tree | e2e4a638db75744630fdc31d8fd02a29ea0a2d53 | |
parent | addddf565b982ba35cf2be290fb1a5e036f2567f (diff) | |
download | systemd-fd03a6a92bc2c4eae2165cbfcbcd93d82cd28ccf.tar.gz |
sysext: move extension_release_validate() out of os-util.c
-rw-r--r-- | src/shared/extension-release.c | 79 | ||||
-rw-r--r-- | src/shared/extension-release.h | 12 | ||||
-rw-r--r-- | src/shared/meson.build | 2 | ||||
-rw-r--r-- | src/shared/os-util.c | 71 | ||||
-rw-r--r-- | src/shared/os-util.h | 5 | ||||
-rw-r--r-- | src/sysext/sysext.c | 1 |
6 files changed, 94 insertions, 76 deletions
diff --git a/src/shared/extension-release.c b/src/shared/extension-release.c new file mode 100644 index 0000000000..5eecf5a323 --- /dev/null +++ b/src/shared/extension-release.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "alloc-util.h" +#include "env-util.h" +#include "extension-release.h" +#include "log.h" +#include "os-util.h" +#include "strv.h" + +int extension_release_validate( + const char *name, + const char *host_os_release_id, + const char *host_os_release_version_id, + const char *host_os_release_sysext_level, + char **extension_release) { + + const char *extension_release_id = NULL, *extension_release_sysext_level = NULL; + + assert(name); + assert(!isempty(host_os_release_id)); + + /* Now that we can look into the extension image, let's see if the OS version is compatible */ + if (strv_isempty(extension_release)) { + log_debug("Extension '%s' carries no extension-release data, ignoring extension.", name); + return 0; + } + + 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'", + name, strna(host_os_release_id)); + return 0; + } + + if (!streq_ptr(host_os_release_id, extension_release_id)) { + log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.", + name, strna(extension_release_id), strna(host_os_release_id)); + return 0; + } + + /* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */ + if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) { + log_debug("No version info on the host (rolling release?), but ID in %s matched.", name); + return 1; + } + + /* If the extension has a sysext API level declared, then it must match the host API + * level. Otherwise, compare OS version as a whole */ + extension_release_sysext_level = strv_env_pairs_get(extension_release, "SYSEXT_LEVEL"); + if (!isempty(host_os_release_sysext_level) && !isempty(extension_release_sysext_level)) { + if (!streq_ptr(host_os_release_sysext_level, extension_release_sysext_level)) { + log_debug("Extension '%s' is for sysext API level '%s', but running on sysext API level '%s'", + name, strna(extension_release_sysext_level), strna(host_os_release_sysext_level)); + return 0; + } + } else if (!isempty(host_os_release_version_id)) { + const char *extension_release_version_id; + + extension_release_version_id = strv_env_pairs_get(extension_release, "VERSION_ID"); + if (isempty(extension_release_version_id)) { + log_debug("Extension '%s' does not contain VERSION_ID in extension-release but requested to match '%s'", + name, strna(host_os_release_version_id)); + return 0; + } + + if (!streq_ptr(host_os_release_version_id, extension_release_version_id)) { + log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.", + name, strna(extension_release_version_id), strna(host_os_release_version_id)); + return 0; + } + } else if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) { + /* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */ + log_debug("No version info on the host (rolling release?), but ID in %s matched.", name); + return 1; + } + + log_debug("Version info of extension '%s' matches host.", name); + return 1; +} diff --git a/src/shared/extension-release.h b/src/shared/extension-release.h new file mode 100644 index 0000000000..5c77010b0e --- /dev/null +++ b/src/shared/extension-release.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +/* Given an image name (for logging purposes), a set of os-release values from the host and a key-value pair + * vector of extension-release variables, check that the distro and (system extension level or distro + * version) match and return 1, and 0 otherwise. */ +int extension_release_validate( + const char *name, + const char *host_os_release_id, + const char *host_os_release_version_id, + const char *host_os_release_sysext_level, + char **extension_release); diff --git a/src/shared/meson.build b/src/shared/meson.build index 6d9a5c5b65..dfa3275b04 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -100,6 +100,8 @@ shared_sources = files(''' exec-util.h exit-status.c exit-status.h + extension-release.c + extension-release.h fdset.c fdset.h fileio-label.c diff --git a/src/shared/os-util.c b/src/shared/os-util.c index 9aed3b5df4..3405c9aeaf 100644 --- a/src/shared/os-util.c +++ b/src/shared/os-util.c @@ -193,74 +193,3 @@ int load_extension_release_pairs(const char *root, const char *extension, char * return load_env_file_pairs(f, p, ret); } - -int extension_release_validate( - const char *name, - const char *host_os_release_id, - const char *host_os_release_version_id, - const char *host_os_release_sysext_level, - char **extension_release) { - - const char *extension_release_id = NULL, *extension_release_sysext_level = NULL; - - assert(name); - assert(!isempty(host_os_release_id)); - - /* Now that we can look into the extension image, let's see if the OS version is compatible */ - if (strv_isempty(extension_release)) { - log_debug("Extension '%s' carries no extension-release data, ignoring extension.", name); - return 0; - } - - 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'", - name, strna(host_os_release_id)); - return 0; - } - - if (!streq_ptr(host_os_release_id, extension_release_id)) { - log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.", - name, strna(extension_release_id), strna(host_os_release_id)); - return 0; - } - - /* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */ - if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) { - log_debug("No version info on the host (rolling release?), but ID in %s matched.", name); - return 1; - } - - /* If the extension has a sysext API level declared, then it must match the host API - * level. Otherwise, compare OS version as a whole */ - extension_release_sysext_level = strv_env_pairs_get(extension_release, "SYSEXT_LEVEL"); - if (!isempty(host_os_release_sysext_level) && !isempty(extension_release_sysext_level)) { - if (!streq_ptr(host_os_release_sysext_level, extension_release_sysext_level)) { - log_debug("Extension '%s' is for sysext API level '%s', but running on sysext API level '%s'", - name, strna(extension_release_sysext_level), strna(host_os_release_sysext_level)); - return 0; - } - } else if (!isempty(host_os_release_version_id)) { - const char *extension_release_version_id; - - extension_release_version_id = strv_env_pairs_get(extension_release, "VERSION_ID"); - if (isempty(extension_release_version_id)) { - log_debug("Extension '%s' does not contain VERSION_ID in extension-release but requested to match '%s'", - name, strna(host_os_release_version_id)); - return 0; - } - - if (!streq_ptr(host_os_release_version_id, extension_release_version_id)) { - log_debug("Extension '%s' is for OS '%s', but deployed on top of '%s'.", - name, strna(extension_release_version_id), strna(host_os_release_version_id)); - return 0; - } - } else if (isempty(host_os_release_version_id) && isempty(host_os_release_sysext_level)) { - /* Rolling releases do not typically set VERSION_ID (eg: ArchLinux) */ - log_debug("No version info on the host (rolling release?), but ID in %s matched.", name); - return 1; - } - - log_debug("Version info of extension '%s' matches host.", name); - return 1; -} diff --git a/src/shared/os-util.h b/src/shared/os-util.h index d4bff5e48e..bdb9e6adea 100644 --- a/src/shared/os-util.h +++ b/src/shared/os-util.h @@ -26,8 +26,3 @@ int parse_os_release(const char *root, ...) _sentinel_; int load_extension_release_pairs(const char *root, const char *extension, char ***ret); int load_os_release_pairs(const char *root, char ***ret); int load_os_release_pairs_with_prefix(const char *root, const char *prefix, char ***ret); - -/* Given an image name (for logging purposes), a set of os-release values from the host - * and a key-value pair vector of extension-release variables, check that the distro and - * (system extension level or distro version) match and return 1, and 0 otherwise. */ -int extension_release_validate(const char *name, const char *host_os_release_id, const char *host_os_release_version_id, const char *host_os_release_sysext_level, char **extension_release); diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index cd824887bf..e06108d3a1 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -10,6 +10,7 @@ #include "dissect-image.h" #include "env-util.h" #include "escape.h" +#include "extension-release.h" #include "fd-util.h" #include "fileio.h" #include "format-table.h" |