machinectl: add new "machinectl reboot" call
This commit is contained in:
parent
a87105a386
commit
923d8fd381
|
@ -265,7 +265,19 @@
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><command>login</command> <replaceable>ID</replaceable>...</term>
|
<term><command>reboot</command> <replaceable>ID</replaceable>...</term>
|
||||||
|
|
||||||
|
<listitem><para>Reboot one or more
|
||||||
|
containers. This will trigger a reboot
|
||||||
|
by sending SIGINT to the container's
|
||||||
|
init process, which is roughly
|
||||||
|
equivalent to pressing Ctrl+Alt+Del on
|
||||||
|
a non-containerized
|
||||||
|
system.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><command>login</command> <replaceable>ID</replaceable></term>
|
||||||
|
|
||||||
<listitem><para>Open a terminal login
|
<listitem><para>Open a terminal login
|
||||||
session to a container. This will
|
session to a container. This will
|
||||||
|
|
|
@ -395,6 +395,69 @@ static int terminate_machine(sd_bus *bus, char **args, unsigned n) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int reboot_machine(sd_bus *bus, char **args, unsigned n) {
|
||||||
|
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
|
unsigned i;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(args);
|
||||||
|
|
||||||
|
if (arg_transport != BUS_TRANSPORT_LOCAL) {
|
||||||
|
log_error("Reboot only supported on local machines.");
|
||||||
|
return -ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i < n; i++) {
|
||||||
|
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL, *reply2 = NULL;
|
||||||
|
const char *path;
|
||||||
|
uint32_t leader;
|
||||||
|
|
||||||
|
r = sd_bus_call_method(
|
||||||
|
bus,
|
||||||
|
"org.freedesktop.machine1",
|
||||||
|
"/org/freedesktop/machine1",
|
||||||
|
"org.freedesktop.machine1.Manager",
|
||||||
|
"GetMachine",
|
||||||
|
&error,
|
||||||
|
&reply,
|
||||||
|
"s", args[i]);
|
||||||
|
|
||||||
|
if (r < 0) {
|
||||||
|
log_error("Could not get path to machine: %s", bus_error_message(&error, -r));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sd_bus_message_read(reply, "o", &path);
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_parse_error(r);
|
||||||
|
|
||||||
|
r = sd_bus_get_property(
|
||||||
|
bus,
|
||||||
|
"org.freedesktop.machine1",
|
||||||
|
path,
|
||||||
|
"org.freedesktop.machine1.Machine",
|
||||||
|
"Leader",
|
||||||
|
&error,
|
||||||
|
&reply2,
|
||||||
|
"u");
|
||||||
|
if (r < 0) {
|
||||||
|
log_error("Failed to retrieve PID of leader: %s", strerror(-r));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sd_bus_message_read(reply2, "u", &leader);
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_parse_error(r);
|
||||||
|
|
||||||
|
if (kill(leader, SIGINT) < 0) {
|
||||||
|
log_error("Failed to kill init process " PID_FMT ": %m", (pid_t) leader);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int openpt_in_namespace(pid_t pid, int flags) {
|
static int openpt_in_namespace(pid_t pid, int flags) {
|
||||||
_cleanup_close_pipe_ int pair[2] = { -1, -1 };
|
_cleanup_close_pipe_ int pair[2] = { -1, -1 };
|
||||||
_cleanup_close_ int pidnsfd = -1, mntnsfd = -1, rootfd = -1;
|
_cleanup_close_ int pidnsfd = -1, mntnsfd = -1, rootfd = -1;
|
||||||
|
@ -497,7 +560,7 @@ static int login_machine(sd_bus *bus, char **args, unsigned n) {
|
||||||
assert(args);
|
assert(args);
|
||||||
|
|
||||||
if (arg_transport != BUS_TRANSPORT_LOCAL) {
|
if (arg_transport != BUS_TRANSPORT_LOCAL) {
|
||||||
log_error("Login only support on local machines.");
|
log_error("Login only supported on local machines.");
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,6 +687,7 @@ static int help(void) {
|
||||||
" show NAME... Show properties of one or more VMs/containers\n"
|
" show NAME... Show properties of one or more VMs/containers\n"
|
||||||
" terminate NAME... Terminate one or more VMs/containers\n"
|
" terminate NAME... Terminate one or more VMs/containers\n"
|
||||||
" kill NAME... Send signal to processes of a VM/container\n"
|
" kill NAME... Send signal to processes of a VM/container\n"
|
||||||
|
" reboot NAME... Reboot one or more containers\n"
|
||||||
" login NAME Get a login prompt on a container\n",
|
" login NAME Get a login prompt on a container\n",
|
||||||
program_invocation_short_name);
|
program_invocation_short_name);
|
||||||
|
|
||||||
|
@ -747,6 +811,7 @@ static int machinectl_main(sd_bus *bus, int argc, char *argv[]) {
|
||||||
{ "status", MORE, 2, show },
|
{ "status", MORE, 2, show },
|
||||||
{ "show", MORE, 1, show },
|
{ "show", MORE, 1, show },
|
||||||
{ "terminate", MORE, 2, terminate_machine },
|
{ "terminate", MORE, 2, terminate_machine },
|
||||||
|
{ "reboot", MORE, 2, reboot_machine },
|
||||||
{ "kill", MORE, 2, kill_machine },
|
{ "kill", MORE, 2, kill_machine },
|
||||||
{ "login", MORE, 2, login_machine },
|
{ "login", MORE, 2, login_machine },
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue