mirror of
https://github.com/systemd/systemd.git
synced 2025-02-27 01:57:35 +03:00
machinectl: add new "machinectl reboot" call
This commit is contained in:
parent
a87105a386
commit
923d8fd381
@ -265,7 +265,19 @@
|
||||
</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
|
||||
session to a container. This will
|
||||
|
@ -395,6 +395,69 @@ static int terminate_machine(sd_bus *bus, char **args, unsigned n) {
|
||||
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) {
|
||||
_cleanup_close_pipe_ int pair[2] = { -1, -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);
|
||||
|
||||
if (arg_transport != BUS_TRANSPORT_LOCAL) {
|
||||
log_error("Login only support on local machines.");
|
||||
log_error("Login only supported on local machines.");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
@ -624,6 +687,7 @@ static int help(void) {
|
||||
" show NAME... Show properties of 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"
|
||||
" reboot NAME... Reboot one or more containers\n"
|
||||
" login NAME Get a login prompt on a container\n",
|
||||
program_invocation_short_name);
|
||||
|
||||
@ -747,6 +811,7 @@ static int machinectl_main(sd_bus *bus, int argc, char *argv[]) {
|
||||
{ "status", MORE, 2, show },
|
||||
{ "show", MORE, 1, show },
|
||||
{ "terminate", MORE, 2, terminate_machine },
|
||||
{ "reboot", MORE, 2, reboot_machine },
|
||||
{ "kill", MORE, 2, kill_machine },
|
||||
{ "login", MORE, 2, login_machine },
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user