diff options
author | Luca Boccassi <luca.boccassi@microsoft.com> | 2020-06-23 13:09:42 +0100 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2021-03-31 09:56:44 +0100 |
commit | 907952bbc92dd6656807d9b2eb0d0c94a4c9e865 (patch) | |
tree | b5a1f594b1191699443798922b2c94e6d7fb0c76 /src/portable/portabled-bus.c | |
parent | 248b1e0aa41d97958c6f45132f6cc7e888263eb7 (diff) | |
download | systemd-907952bbc92dd6656807d9b2eb0d0c94a4c9e865.tar.gz |
portabled: add --extension parameter for layered images support
Add an --extension parameter to portablectl, and new DBUS methods
to attach/detach/reattach/inspect.
Allows to append separate images on top of the root directory (os-release
will be searched in there) and mount the images using an overlay-like
setup (unit files will be searched in there) using the new ExtensionImages
service option.
Diffstat (limited to 'src/portable/portabled-bus.c')
-rw-r--r-- | src/portable/portabled-bus.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/src/portable/portabled-bus.c b/src/portable/portabled-bus.c index 6d0dee99c3..72f685f76d 100644 --- a/src/portable/portabled-bus.c +++ b/src/portable/portabled-bus.c @@ -252,11 +252,13 @@ static int method_attach_image(sd_bus_message *message, void *userdata, sd_bus_e } static int method_detach_image(sd_bus_message *message, void *userdata, sd_bus_error *error) { + _cleanup_strv_free_ char **extension_images = NULL; PortableChange *changes = NULL; + PortableFlags flags = 0; Manager *m = userdata; size_t n_changes = 0; const char *name_or_path; - int r, runtime; + int r; assert(message); assert(m); @@ -265,10 +267,37 @@ static int method_detach_image(sd_bus_message *message, void *userdata, sd_bus_e * detach already deleted images too, in case the user already deleted an image before properly detaching * it. */ - r = sd_bus_message_read(message, "sb", &name_or_path, &runtime); + r = sd_bus_message_read(message, "s", &name_or_path); if (r < 0) return r; + if (sd_bus_message_is_method_call(message, NULL, "DetachImageWithExtensions")) { + uint64_t input_flags = 0; + + r = sd_bus_message_read_strv(message, &extension_images); + if (r < 0) + return r; + + r = sd_bus_message_read(message, "t", &input_flags); + if (r < 0) + return r; + + if ((input_flags & ~_PORTABLE_MASK_PUBLIC) != 0) + return sd_bus_reply_method_errorf(message, SD_BUS_ERROR_INVALID_ARGS, + "Invalid 'flags' parameter '%" PRIu64 "'", + input_flags); + flags |= input_flags; + } else { + int runtime; + + r = sd_bus_message_read(message, "b", &runtime); + if (r < 0) + return r; + + if (runtime) + flags |= PORTABLE_RUNTIME; + } + r = bus_verify_polkit_async( message, CAP_SYS_ADMIN, @@ -286,7 +315,8 @@ static int method_detach_image(sd_bus_message *message, void *userdata, sd_bus_e r = portable_detach( sd_bus_message_get_bus(message), name_or_path, - runtime ? PORTABLE_RUNTIME : 0, + extension_images, + flags, &changes, &n_changes, error); @@ -383,6 +413,16 @@ const sd_bus_vtable manager_vtable[] = { "a{say}", units), method_get_image_metadata, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS("GetImageMetadataWithExtensions", + SD_BUS_ARGS("s", image, + "as", extensions, + "as", matches, + "t", flags), + SD_BUS_RESULT("s", image, + "ay", os_release, + "a{say}", units), + method_get_image_metadata, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("GetImageState", SD_BUS_ARGS("s", image), SD_BUS_RESULT("s", state), @@ -397,12 +437,29 @@ const sd_bus_vtable manager_vtable[] = { SD_BUS_RESULT("a(sss)", changes), method_attach_image, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS("AttachImageWithExtensions", + SD_BUS_ARGS("s", image, + "as", extensions, + "as", matches, + "s", profile, + "s", copy_mode, + "t", flags), + SD_BUS_RESULT("a(sss)", changes), + method_attach_image, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("DetachImage", SD_BUS_ARGS("s", image, "b", runtime), SD_BUS_RESULT("a(sss)", changes), method_detach_image, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS("DetachImageWithExtensions", + SD_BUS_ARGS("s", image, + "as", extensions, + "t", flags), + SD_BUS_RESULT("a(sss)", changes), + method_detach_image, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("ReattachImage", SD_BUS_ARGS("s", image, "as", matches, @@ -413,6 +470,17 @@ const sd_bus_vtable manager_vtable[] = { "a(sss)", changes_updated), method_reattach_image, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_ARGS("ReattachImageWithExtensions", + SD_BUS_ARGS("s", image, + "as", extensions, + "as", matches, + "s", profile, + "s", copy_mode, + "t", flags), + SD_BUS_RESULT("a(sss)", changes_removed, + "a(sss)", changes_updated), + method_reattach_image, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD_WITH_ARGS("RemoveImage", SD_BUS_ARGS("s", image), SD_BUS_NO_RESULT, |