machined: convert to the new scheme and add --bus-introspect
This commit is contained in:
parent
5ceceff170
commit
4faa530cf6
|
@ -354,30 +354,6 @@ int bus_image_method_get_os_release(
|
|||
return bus_reply_pair_array(message, image->os_release);
|
||||
}
|
||||
|
||||
const sd_bus_vtable image_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_PROPERTY("Name", "s", NULL, offsetof(Image, name), 0),
|
||||
SD_BUS_PROPERTY("Path", "s", NULL, offsetof(Image, path), 0),
|
||||
SD_BUS_PROPERTY("Type", "s", property_get_type, offsetof(Image, type), 0),
|
||||
SD_BUS_PROPERTY("ReadOnly", "b", bus_property_get_bool, offsetof(Image, read_only), 0),
|
||||
SD_BUS_PROPERTY("CreationTimestamp", "t", NULL, offsetof(Image, crtime), 0),
|
||||
SD_BUS_PROPERTY("ModificationTimestamp", "t", NULL, offsetof(Image, mtime), 0),
|
||||
SD_BUS_PROPERTY("Usage", "t", NULL, offsetof(Image, usage), 0),
|
||||
SD_BUS_PROPERTY("Limit", "t", NULL, offsetof(Image, limit), 0),
|
||||
SD_BUS_PROPERTY("UsageExclusive", "t", NULL, offsetof(Image, usage_exclusive), 0),
|
||||
SD_BUS_PROPERTY("LimitExclusive", "t", NULL, offsetof(Image, limit_exclusive), 0),
|
||||
SD_BUS_METHOD("Remove", NULL, NULL, bus_image_method_remove, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("Rename", "s", NULL, bus_image_method_rename, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("Clone", "sb", NULL, bus_image_method_clone, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("MarkReadOnly", "b", NULL, bus_image_method_mark_read_only, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("SetLimit", "t", NULL, bus_image_method_set_limit, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetHostname", NULL, "s", bus_image_method_get_hostname, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetMachineID", NULL, "ay", bus_image_method_get_machine_id, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetMachineInfo", NULL, "a{ss}", bus_image_method_get_machine_info, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetOSRelease", NULL, "a{ss}", bus_image_method_get_os_release, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
static int image_flush_cache(sd_event_source *s, void *userdata) {
|
||||
Manager *m = userdata;
|
||||
|
||||
|
@ -388,7 +364,7 @@ static int image_flush_cache(sd_event_source *s, void *userdata) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
|
||||
static int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
Manager *m = userdata;
|
||||
Image *image = NULL;
|
||||
|
@ -462,7 +438,7 @@ char *image_bus_path(const char *name) {
|
|||
return strjoin("/org/freedesktop/machine1/image/", e);
|
||||
}
|
||||
|
||||
int image_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
|
||||
static int image_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
|
||||
_cleanup_hashmap_free_ Hashmap *images = NULL;
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Image *image;
|
||||
|
@ -497,3 +473,34 @@ int image_node_enumerator(sd_bus *bus, const char *path, void *userdata, char **
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const sd_bus_vtable image_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_PROPERTY("Name", "s", NULL, offsetof(Image, name), 0),
|
||||
SD_BUS_PROPERTY("Path", "s", NULL, offsetof(Image, path), 0),
|
||||
SD_BUS_PROPERTY("Type", "s", property_get_type, offsetof(Image, type), 0),
|
||||
SD_BUS_PROPERTY("ReadOnly", "b", bus_property_get_bool, offsetof(Image, read_only), 0),
|
||||
SD_BUS_PROPERTY("CreationTimestamp", "t", NULL, offsetof(Image, crtime), 0),
|
||||
SD_BUS_PROPERTY("ModificationTimestamp", "t", NULL, offsetof(Image, mtime), 0),
|
||||
SD_BUS_PROPERTY("Usage", "t", NULL, offsetof(Image, usage), 0),
|
||||
SD_BUS_PROPERTY("Limit", "t", NULL, offsetof(Image, limit), 0),
|
||||
SD_BUS_PROPERTY("UsageExclusive", "t", NULL, offsetof(Image, usage_exclusive), 0),
|
||||
SD_BUS_PROPERTY("LimitExclusive", "t", NULL, offsetof(Image, limit_exclusive), 0),
|
||||
SD_BUS_METHOD("Remove", NULL, NULL, bus_image_method_remove, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("Rename", "s", NULL, bus_image_method_rename, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("Clone", "sb", NULL, bus_image_method_clone, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("MarkReadOnly", "b", NULL, bus_image_method_mark_read_only, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("SetLimit", "t", NULL, bus_image_method_set_limit, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetHostname", NULL, "s", bus_image_method_get_hostname, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetMachineID", NULL, "ay", bus_image_method_get_machine_id, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetMachineInfo", NULL, "a{ss}", bus_image_method_get_machine_info, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_METHOD("GetOSRelease", NULL, "a{ss}", bus_image_method_get_os_release, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
const BusObjectImplementation image_object = {
|
||||
"/org/freedesktop/machine1/image",
|
||||
"org.freedesktop.machine1.Image",
|
||||
.fallback_vtables = BUS_FALLBACK_VTABLES({image_vtable, image_object_find}),
|
||||
.node_enumerator = image_node_enumerator,
|
||||
};
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
#pragma once
|
||||
|
||||
#include "bus-util.h"
|
||||
#include "machined.h"
|
||||
|
||||
extern const sd_bus_vtable image_vtable[];
|
||||
extern const BusObjectImplementation image_object;
|
||||
|
||||
char *image_bus_path(const char *name);
|
||||
|
||||
int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
|
||||
int image_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
|
||||
|
||||
int bus_image_method_remove(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_image_method_rename(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_image_method_clone(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
|
|
@ -1321,7 +1321,99 @@ int bus_machine_method_get_uid_shift(sd_bus_message *message, void *userdata, sd
|
|||
return sd_bus_reply_method_return(message, "u", (uint32_t) shift);
|
||||
}
|
||||
|
||||
const sd_bus_vtable machine_vtable[] = {
|
||||
static int machine_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
|
||||
Manager *m = userdata;
|
||||
Machine *machine;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(interface);
|
||||
assert(found);
|
||||
assert(m);
|
||||
|
||||
if (streq(path, "/org/freedesktop/machine1/machine/self")) {
|
||||
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
|
||||
sd_bus_message *message;
|
||||
pid_t pid;
|
||||
|
||||
message = sd_bus_get_current_message(bus);
|
||||
if (!message)
|
||||
return 0;
|
||||
|
||||
r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_creds_get_pid(creds, &pid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = manager_get_machine_by_pid(m, pid, &machine);
|
||||
if (r <= 0)
|
||||
return 0;
|
||||
} else {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
const char *p;
|
||||
|
||||
p = startswith(path, "/org/freedesktop/machine1/machine/");
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
e = bus_label_unescape(p);
|
||||
if (!e)
|
||||
return -ENOMEM;
|
||||
|
||||
machine = hashmap_get(m->machines, e);
|
||||
if (!machine)
|
||||
return 0;
|
||||
}
|
||||
|
||||
*found = machine;
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *machine_bus_path(Machine *m) {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
|
||||
assert(m);
|
||||
|
||||
e = bus_label_escape(m->name);
|
||||
if (!e)
|
||||
return NULL;
|
||||
|
||||
return strjoin("/org/freedesktop/machine1/machine/", e);
|
||||
}
|
||||
|
||||
static int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Machine *machine = NULL;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
char *p;
|
||||
|
||||
p = machine_bus_path(machine);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
r = strv_consume(&l, p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
*nodes = TAKE_PTR(l);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const sd_bus_vtable machine_vtable[] = {
|
||||
SD_BUS_VTABLE_START(0),
|
||||
SD_BUS_PROPERTY("Name", "s", NULL, offsetof(Machine, name), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_PROPERTY("Id", "ay", bus_property_get_id128, offsetof(Machine, id), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
|
@ -1423,97 +1515,12 @@ const sd_bus_vtable machine_vtable[] = {
|
|||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
int machine_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
|
||||
Manager *m = userdata;
|
||||
Machine *machine;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(interface);
|
||||
assert(found);
|
||||
assert(m);
|
||||
|
||||
if (streq(path, "/org/freedesktop/machine1/machine/self")) {
|
||||
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
|
||||
sd_bus_message *message;
|
||||
pid_t pid;
|
||||
|
||||
message = sd_bus_get_current_message(bus);
|
||||
if (!message)
|
||||
return 0;
|
||||
|
||||
r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID, &creds);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_creds_get_pid(creds, &pid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = manager_get_machine_by_pid(m, pid, &machine);
|
||||
if (r <= 0)
|
||||
return 0;
|
||||
} else {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
const char *p;
|
||||
|
||||
p = startswith(path, "/org/freedesktop/machine1/machine/");
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
e = bus_label_unescape(p);
|
||||
if (!e)
|
||||
return -ENOMEM;
|
||||
|
||||
machine = hashmap_get(m->machines, e);
|
||||
if (!machine)
|
||||
return 0;
|
||||
}
|
||||
|
||||
*found = machine;
|
||||
return 1;
|
||||
}
|
||||
|
||||
char *machine_bus_path(Machine *m) {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
|
||||
assert(m);
|
||||
|
||||
e = bus_label_escape(m->name);
|
||||
if (!e)
|
||||
return NULL;
|
||||
|
||||
return strjoin("/org/freedesktop/machine1/machine/", e);
|
||||
}
|
||||
|
||||
int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
Machine *machine = NULL;
|
||||
Manager *m = userdata;
|
||||
Iterator i;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
assert(nodes);
|
||||
|
||||
HASHMAP_FOREACH(machine, m->machines, i) {
|
||||
char *p;
|
||||
|
||||
p = machine_bus_path(machine);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
r = strv_consume(&l, p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
*nodes = TAKE_PTR(l);
|
||||
|
||||
return 1;
|
||||
}
|
||||
const BusObjectImplementation machine_object = {
|
||||
"/org/freedesktop/machine1/machine",
|
||||
"org.freedesktop.machine1.Machine",
|
||||
.fallback_vtables = BUS_FALLBACK_VTABLES({machine_vtable, machine_object_find}),
|
||||
.node_enumerator = machine_node_enumerator,
|
||||
};
|
||||
|
||||
int machine_send_signal(Machine *m, bool new_machine) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
|
|
@ -3,13 +3,12 @@
|
|||
|
||||
#include "sd-bus.h"
|
||||
|
||||
#include "bus-util.h"
|
||||
#include "machine.h"
|
||||
|
||||
extern const sd_bus_vtable machine_vtable[];
|
||||
extern const BusObjectImplementation machine_object;
|
||||
|
||||
char *machine_bus_path(Machine *s);
|
||||
int machine_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
|
||||
int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
|
||||
|
||||
int bus_machine_method_unregister(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_machine_method_terminate(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
|
|
@ -1440,6 +1440,14 @@ const sd_bus_vtable manager_vtable[] = {
|
|||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
const BusObjectImplementation manager_object = {
|
||||
"/org/freedesktop/machine1",
|
||||
"org.freedesktop.machine1.Manager",
|
||||
.vtables = BUS_VTABLES(manager_vtable),
|
||||
.children = BUS_IMPLEMENTATIONS( &machine_object,
|
||||
&image_object ),
|
||||
};
|
||||
|
||||
int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
const char *path, *result, *unit;
|
||||
Manager *m = userdata;
|
||||
|
|
|
@ -189,25 +189,9 @@ static int manager_connect_bus(Manager *m) {
|
|||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to system bus: %m");
|
||||
|
||||
r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/machine1", "org.freedesktop.machine1.Manager", manager_vtable, m);
|
||||
r = bus_add_implementation(m->bus, &manager_object, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add manager object vtable: %m");
|
||||
|
||||
r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/machine", "org.freedesktop.machine1.Machine", machine_vtable, machine_object_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add machine object vtable: %m");
|
||||
|
||||
r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/machine", machine_node_enumerator, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add machine enumerator: %m");
|
||||
|
||||
r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/machine1/image", "org.freedesktop.machine1.Image", image_vtable, image_object_find, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add image object vtable: %m");
|
||||
|
||||
r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/machine1/image", image_node_enumerator, m);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to add image enumerator: %m");
|
||||
return r;
|
||||
|
||||
r = sd_bus_match_signal_async(
|
||||
m->bus,
|
||||
|
@ -360,7 +344,8 @@ static int run(int argc, char *argv[]) {
|
|||
|
||||
r = service_parse_argv("systemd-machined.service",
|
||||
"Manage registrations of local VMs and containers.",
|
||||
NULL,
|
||||
BUS_IMPLEMENTATIONS(&manager_object,
|
||||
&log_control_object),
|
||||
argc, argv);
|
||||
if (r <= 0)
|
||||
return r;
|
||||
|
|
|
@ -42,7 +42,7 @@ struct Manager {
|
|||
int manager_add_machine(Manager *m, const char *name, Machine **_machine);
|
||||
int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine);
|
||||
|
||||
extern const sd_bus_vtable manager_vtable[];
|
||||
extern const BusObjectImplementation manager_object;
|
||||
|
||||
int match_reloading(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
|
Loading…
Reference in a new issue