machined: optionally, allow registration of pre-existing units (scopes

or services) as machine with machined
This commit is contained in:
Lennart Poettering
2014-02-11 17:16:08 +01:00
parent 2d2ebd6b8f
commit 89f7c8465c
9 changed files with 224 additions and 88 deletions
+50 -17
View File
@@ -120,6 +120,7 @@ static char **arg_setenv = NULL;
static bool arg_quiet = false;
static bool arg_share_system = false;
static bool arg_register = true;
static bool arg_keep_unit = false;
static int help(void) {
@@ -152,6 +153,8 @@ static int help(void) {
" --bind-ro=PATH[:PATH] Similar, but creates a read-only bind mount\n"
" --setenv=NAME=VALUE Pass an environment variable to PID 1\n"
" --register=BOOLEAN Register container as machine\n"
" --keep-unit Do not register a scope for the machine, reuse\n"
" the service unit nspawn is running in\n"
" -q --quiet Do not show status information\n",
program_invocation_short_name);
@@ -172,7 +175,8 @@ static int parse_argv(int argc, char *argv[]) {
ARG_BIND_RO,
ARG_SETENV,
ARG_SHARE_SYSTEM,
ARG_REGISTER
ARG_REGISTER,
ARG_KEEP_UNIT
};
static const struct option options[] = {
@@ -197,6 +201,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "quiet", no_argument, NULL, 'q' },
{ "share-system", no_argument, NULL, ARG_SHARE_SYSTEM },
{ "register", required_argument, NULL, ARG_REGISTER },
{ "keep-unit", no_argument, NULL, ARG_KEEP_UNIT },
{}
};
@@ -410,6 +415,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_register = r;
break;
case ARG_KEEP_UNIT:
arg_keep_unit = true;
break;
case '?':
return -EINVAL;
@@ -426,6 +435,11 @@ static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
}
if (arg_keep_unit && cg_pid_get_owner_uid(0, NULL) >= 0) {
log_error("--keep-unit may not be used when invoked from a user session.");
return -EINVAL;
}
return 1;
}
@@ -1086,22 +1100,41 @@ static int register_machine(pid_t pid) {
return r;
}
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"CreateMachine",
&error,
NULL,
"sayssusa(sv)",
arg_machine,
SD_BUS_MESSAGE_APPEND_ID128(arg_uuid),
"nspawn",
"container",
(uint32_t) pid,
strempty(arg_directory),
!isempty(arg_slice), "Slice", "s", arg_slice);
if (arg_keep_unit) {
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"RegisterMachine",
&error,
NULL,
"sayssus",
arg_machine,
SD_BUS_MESSAGE_APPEND_ID128(arg_uuid),
"nspawn",
"container",
(uint32_t) pid,
strempty(arg_directory));
} else {
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
"CreateMachine",
&error,
NULL,
"sayssusa(sv)",
arg_machine,
SD_BUS_MESSAGE_APPEND_ID128(arg_uuid),
"nspawn",
"container",
(uint32_t) pid,
strempty(arg_directory),
!isempty(arg_slice), "Slice", "s", arg_slice);
}
if (r < 0) {
log_error("Failed to register machine: %s", bus_error_message(&error, r));
return r;