diff options
author | Luca Boccassi <luca.boccassi@microsoft.com> | 2022-01-25 15:49:22 +0000 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2022-01-25 22:22:47 +0000 |
commit | e3f7ed944ae750a40685c52349f3cc850db0876e (patch) | |
tree | 7c28734e38f32c41e3210286099ecc6c94fcbdce /src/portable/portablectl.c | |
parent | 0017415cc5f2b97e0f9812cb10984c364d4e03bc (diff) | |
download | systemd-e3f7ed944ae750a40685c52349f3cc850db0876e.tar.gz |
portable: add flag to return extension-releases in GetImageMetadataWithExtensions
Return the name of each extension and the associated extension-release
file, and pretty-print them in 'portablectl inspect', if a new flag
is passed.
$ portablectl inspect --extension app2 --extension app0 minimal app0 app1
(Matching unit files with prefixes 'app0', 'app1'.)
Image:
/run/portables/minimal.raw
Portable Service:
n/a
Operating System:
Debian GNU/Linux 10 (buster)
Extension:
/run/portables/app2.raw
Extension Scope:
n/a
Extension Compatibility Level:
n/a
Portable Service:
n/a
Portable Prefixes:
n/a
Operating System:
n/a (debian 10)
Extension:
/run/portables/app0.raw
Extension Scope:
n/a
Extension Compatibility Level:
n/a
Portable Service:
n/a
Portable Prefixes:
n/a
Operating System:
n/a (debian 10)
Unit files:
app0.service
Diffstat (limited to 'src/portable/portablectl.c')
-rw-r--r-- | src/portable/portablectl.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c index 27883eb867..eee26d0033 100644 --- a/src/portable/portablectl.c +++ b/src/portable/portablectl.c @@ -260,8 +260,8 @@ static int maybe_reload(sd_bus **bus) { static int get_image_metadata(sd_bus *bus, const char *image, char **matches, sd_bus_message **reply) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + PortableFlags flags = PORTABLE_INSPECT_EXTENSION_RELEASES; const char *method; - uint64_t flags = 0; int r; assert(bus); @@ -366,6 +366,74 @@ static int inspect_image(int argc, char *argv[], void *userdata) { if (r < 0) return bus_log_parse_error(r); + /* If we specified any extensions, we'll first get back exactly the + * paths (and extension-release content) for each one of the arguments. */ + for (size_t i = 0; i < strv_length(arg_extension_images); ++i) { + const char *name; + + r = sd_bus_message_enter_container(reply, 'e', "say"); + if (r < 0) + return bus_log_parse_error(r); + if (r == 0) + break; + + r = sd_bus_message_read(reply, "s", &name); + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_read_array(reply, 'y', &data, &sz); + if (r < 0) + return bus_log_parse_error(r); + + if (arg_cat) { + if (nl) + fputc('\n', stdout); + + printf("%s-- Extension Release: %s --%s\n", ansi_highlight(), name, ansi_normal()); + fwrite(data, sz, 1, stdout); + fflush(stdout); + nl = true; + } else { + _cleanup_free_ char *pretty_portable = NULL, *pretty_os = NULL, *sysext_level = NULL, + *id = NULL, *version_id = NULL, *sysext_scope = NULL, *portable_prefixes = NULL; + _cleanup_fclose_ FILE *f = NULL; + + f = fmemopen_unlocked((void*) data, sz, "re"); + if (!f) + return log_error_errno(errno, "Failed to open extension-release buffer: %m"); + + r = parse_env_file(f, name, + "ID", &id, + "VERSION_ID", &version_id, + "SYSEXT_SCOPE", &sysext_scope, + "SYSEXT_LEVEL", &sysext_level, + "PORTABLE_PRETTY_NAME", &pretty_portable, + "PORTABLE_PREFIXES", &portable_prefixes, + "PRETTY_NAME", &pretty_os); + if (r < 0) + return log_error_errno(r, "Failed to parse extension release from '%s': %m", name); + + printf("Extension:\n\t%s\n" + "\tExtension Scope:\n\t\t%s\n" + "\tExtension Compatibility Level:\n\t\t%s\n" + "\tPortable Service:\n\t\t%s\n" + "\tPortable Prefixes:\n\t\t%s\n" + "\tOperating System:\n\t\t%s (%s %s)\n", + name, + strna(sysext_scope), + strna(sysext_level), + strna(pretty_portable), + strna(portable_prefixes), + strna(pretty_os), + strna(id), + strna(version_id)); + } + + r = sd_bus_message_exit_container(reply); + if (r < 0) + return bus_log_parse_error(r); + } + for (;;) { const char *name; @@ -700,6 +768,14 @@ static int maybe_stop_disable(sd_bus *bus, char *image, char *argv[]) { if (r < 0) return bus_log_parse_error(r); + /* If we specified any extensions, we'll first get back exactly the + * paths (and extension-release content) for each one of the arguments. */ + for (size_t i = 0; i < strv_length(arg_extension_images); ++i) { + r = sd_bus_message_skip(reply, "{say}"); + if (r < 0) + return bus_log_parse_error(r); + } + for (;;) { const char *name; |