core: implement Kill/Automount/Mount Context/Runtime for io.systemd.Unit.List (#39391)
The PR implements the following objects + tests for `io.systemd.Unit.List`: - `KillContext` - `AutomountContext` - `AutomountRuntime` - `MountContext` - `MountRuntime` It's a continuation of the following PRs: * https://github.com/systemd/systemd/pull/37432 * https://github.com/systemd/systemd/pull/37646 * https://github.com/systemd/systemd/pull/38032 * https://github.com/systemd/systemd/pull/38212
This commit is contained in:
@@ -64,12 +64,15 @@ libcore_sources = files(
|
||||
'unit-serialize.c',
|
||||
'unit.c',
|
||||
'varlink.c',
|
||||
'varlink-automount.c',
|
||||
'varlink-cgroup.c',
|
||||
'varlink-common.c',
|
||||
'varlink-dynamic-user.c',
|
||||
'varlink-execute.c',
|
||||
'varlink-kill.c',
|
||||
'varlink-manager.c',
|
||||
'varlink-metrics.c',
|
||||
'varlink-mount.c',
|
||||
'varlink-unit.c',
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "sd-json.h"
|
||||
|
||||
#include "automount.h"
|
||||
#include "json-util.h"
|
||||
#include "varlink-automount.h"
|
||||
|
||||
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Where", a->where),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("ExtraOptions", a->extra_options),
|
||||
SD_JSON_BUILD_PAIR_UNSIGNED("DirectoryMode", a->directory_mode),
|
||||
JSON_BUILD_PAIR_FINITE_USEC("TimeoutIdleUSec", a->timeout_idle_usec));
|
||||
}
|
||||
|
||||
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Automount *a = ASSERT_PTR(AUTOMOUNT(userdata));
|
||||
return sd_json_buildo(ASSERT_PTR(ret), JSON_BUILD_PAIR_ENUM("Result", automount_result_to_string(a->result)));
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include "core-forward.h"
|
||||
|
||||
int automount_context_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
int automount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "bus-common-errors.h"
|
||||
#include "cpu-set-util.h"
|
||||
#include "execute.h"
|
||||
#include "json-util.h"
|
||||
#include "rlimit-util.h"
|
||||
#include "varlink-common.h"
|
||||
@@ -104,3 +105,24 @@ empty:
|
||||
*ret = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int exec_command_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
ExecCommand *cmd = ASSERT_PTR(userdata);
|
||||
|
||||
assert(ret);
|
||||
|
||||
if (isempty(cmd->path)) {
|
||||
*ret = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sd_json_buildo(
|
||||
ret,
|
||||
SD_JSON_BUILD_PAIR_STRING("path", cmd->path),
|
||||
JSON_BUILD_PAIR_STRV_NON_EMPTY("arguments", cmd->argv),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("ignoreFailure", FLAGS_SET(cmd->flags, EXEC_COMMAND_IGNORE_FAILURE)),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("privileged", FLAGS_SET(cmd->flags, EXEC_COMMAND_FULLY_PRIVILEGED)),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("noSetuid", FLAGS_SET(cmd->flags, EXEC_COMMAND_NO_SETUID)),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("noEnvExpand", FLAGS_SET(cmd->flags, EXEC_COMMAND_NO_ENV_EXPAND)),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("viaShell", FLAGS_SET(cmd->flags, EXEC_COMMAND_VIA_SHELL)));
|
||||
}
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
int rlimit_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
int rlimit_table_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
int cpuset_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
|
||||
const char* varlink_error_id_from_bus_error(const sd_bus_error *e);
|
||||
int exec_command_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "sd-json.h"
|
||||
|
||||
#include "json-util.h"
|
||||
#include "kill.h"
|
||||
#include "signal-util.h"
|
||||
#include "varlink-kill.h"
|
||||
|
||||
int unit_kill_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
KillContext *c = userdata;
|
||||
|
||||
assert(ret);
|
||||
|
||||
if (!c) {
|
||||
*ret = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return sd_json_buildo(
|
||||
ret,
|
||||
JSON_BUILD_PAIR_ENUM("KillMode", kill_mode_to_string(c->kill_mode)),
|
||||
SD_JSON_BUILD_PAIR_STRING("KillSignal", signal_to_string(c->kill_signal)),
|
||||
SD_JSON_BUILD_PAIR_STRING("RestartKillSignal", signal_to_string(restart_kill_signal(c))),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("SendSIGHUP", c->send_sighup),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("SendSIGKILL", c->send_sigkill),
|
||||
SD_JSON_BUILD_PAIR_STRING("FinalKillSignal", signal_to_string(c->final_kill_signal)),
|
||||
SD_JSON_BUILD_PAIR_STRING("WatchdogSignal", signal_to_string(c->watchdog_signal)));
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include "core-forward.h"
|
||||
|
||||
int unit_kill_context_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
@@ -0,0 +1,55 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include "sd-json.h"
|
||||
|
||||
#include "json-util.h"
|
||||
#include "mount.h"
|
||||
#include "user-util.h"
|
||||
#include "varlink-common.h"
|
||||
#include "varlink-mount.h"
|
||||
|
||||
int mount_context_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Mount *m = ASSERT_PTR(MOUNT(userdata));
|
||||
_cleanup_free_ char *what = NULL, *where = NULL, *options = NULL;
|
||||
|
||||
what = mount_get_what_escaped(m);
|
||||
if (!what)
|
||||
return -ENOMEM;
|
||||
|
||||
where = mount_get_where_escaped(m);
|
||||
if (!where)
|
||||
return -ENOMEM;
|
||||
|
||||
options = mount_get_options_escaped(m);
|
||||
if (!options)
|
||||
return -ENOMEM;
|
||||
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("What", what),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Where", where),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Type", mount_get_fstype(m)),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Options", options),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("SloppyOptions", m->sloppy_options),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("LazyUnmount", m->lazy_unmount),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("ReadWriteOnly", m->read_write_only),
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("ForceUnmount", m->force_unmount),
|
||||
SD_JSON_BUILD_PAIR_UNSIGNED("DirectoryMode", m->directory_mode),
|
||||
JSON_BUILD_PAIR_FINITE_USEC("TimeoutUSec", m->timeout_usec),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ExecMount", exec_command_build_json, &m->exec_command[MOUNT_EXEC_MOUNT]),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ExecUnmount", exec_command_build_json, &m->exec_command[MOUNT_EXEC_UNMOUNT]),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ExecRemount", exec_command_build_json, &m->exec_command[MOUNT_EXEC_REMOUNT]));
|
||||
}
|
||||
|
||||
int mount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
Unit *u = ASSERT_PTR(userdata);
|
||||
Mount *m = ASSERT_PTR(MOUNT(u));
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(pidref_is_set(&m->control_pid), "ControlPID", JSON_BUILD_PIDREF(&m->control_pid)),
|
||||
JSON_BUILD_PAIR_ENUM("Result", mount_result_to_string(m->result)),
|
||||
JSON_BUILD_PAIR_ENUM("ReloadResult", mount_result_to_string(m->reload_result)),
|
||||
JSON_BUILD_PAIR_ENUM("CleanResult", mount_result_to_string(m->clean_result)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(uid_is_valid(u->ref_uid), "UID", SD_JSON_BUILD_UNSIGNED(u->ref_uid)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(gid_is_valid(u->ref_gid), "GID", SD_JSON_BUILD_UNSIGNED(u->ref_gid)));
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include "core-forward.h"
|
||||
|
||||
int mount_context_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
int mount_runtime_build_json(sd_json_variant **ret, const char *name, void *userdata);
|
||||
+20
-13
@@ -18,8 +18,11 @@
|
||||
#include "set.h"
|
||||
#include "strv.h"
|
||||
#include "unit.h"
|
||||
#include "varlink-automount.h"
|
||||
#include "varlink-cgroup.h"
|
||||
#include "varlink-execute.h"
|
||||
#include "varlink-kill.h"
|
||||
#include "varlink-mount.h"
|
||||
#include "varlink-unit.h"
|
||||
#include "varlink-util.h"
|
||||
|
||||
@@ -112,6 +115,12 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
|
||||
* If it make sense to place a property into a config/unit file it belongs to Context.
|
||||
* Otherwise it's a 'Runtime'. */
|
||||
|
||||
/* TODO missing callbacks */
|
||||
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
|
||||
[UNIT_AUTOMOUNT] = automount_context_build_json,
|
||||
[UNIT_MOUNT] = mount_context_build_json,
|
||||
};
|
||||
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
SD_JSON_BUILD_PAIR_STRING("Type", unit_type_to_string(u->type)),
|
||||
@@ -189,18 +198,9 @@ static int unit_context_build_json(sd_json_variant **ret, const char *name, void
|
||||
SD_JSON_BUILD_PAIR_BOOLEAN("DebugInvocation", u->debug_invocation),
|
||||
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_context_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Exec", unit_exec_context_build_json, u));
|
||||
|
||||
// TODO follow up PRs:
|
||||
// JSON_BUILD_PAIR_CALLBACK_NON_NULL("Exec", exec_context_build_json, u)
|
||||
// JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", kill_context_build_json, u)
|
||||
// Mount/Automount context
|
||||
// Path context
|
||||
// Scope context
|
||||
// Swap context
|
||||
// Timer context
|
||||
// Service context
|
||||
// Socket context
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Exec", unit_exec_context_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Kill", unit_kill_context_build_json, unit_get_kill_context(u)),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
|
||||
}
|
||||
|
||||
static int can_clean_build_json(sd_json_variant **ret, const char *name, void *userdata) {
|
||||
@@ -280,6 +280,12 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
|
||||
Unit *u = ASSERT_PTR(userdata);
|
||||
Unit *f = unit_following(u);
|
||||
|
||||
/* TODO missing callbacks */
|
||||
static const sd_json_build_callback_t unit_type_callbacks[_UNIT_TYPE_MAX] = {
|
||||
[UNIT_AUTOMOUNT] = automount_runtime_build_json,
|
||||
[UNIT_MOUNT] = mount_runtime_build_json,
|
||||
};
|
||||
|
||||
return sd_json_buildo(
|
||||
ASSERT_PTR(ret),
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("Following", f ? f->id : NULL),
|
||||
@@ -309,7 +315,8 @@ static int unit_runtime_build_json(sd_json_variant **ret, const char *name, void
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(u->invocation_id), "InvocationID", SD_JSON_BUILD_UUID(u->invocation_id)),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("Markers", markers_build_json, &u->markers),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("ActivationDetails", activation_details_build_json, u->activation_details),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u));
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL("CGroup", unit_cgroup_runtime_build_json, u),
|
||||
JSON_BUILD_PAIR_CALLBACK_NON_NULL(unit_type_to_capitalized_string(u->type), unit_type_callbacks[u->type], u));
|
||||
}
|
||||
|
||||
static int list_unit_one(sd_varlink *link, Unit *unit) {
|
||||
|
||||
Reference in New Issue
Block a user