summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-03-18 04:44:39 +0100
committerLennart Poettering <lennart@poettering.net>2014-03-18 04:48:26 +0100
commit1dba654b27918c22e413ac5b3c19301f1ff86ad2 (patch)
tree93e2ac845e4edebf7a1cf805a6decd1518630321
parentde58a50e24a0d55e3bbcc77f8f6170a7322acf52 (diff)
machinectl: reimplement machinectl's "reboot" verb on top of "kill", and add new verb "poweroff"
There's really no point to send the reboot SIGINT from machinectl directly, if machined can do that anyway. This saves code, and makes machinectl network transparent for these verbs. And while we are at it we can easily add a "poweroff" verb in addition to "reboot". Yay!
-rw-r--r--man/machinectl.xml72
-rw-r--r--src/machine/machinectl.c85
2 files changed, 64 insertions, 93 deletions
diff --git a/man/machinectl.xml b/man/machinectl.xml
index 89dca9cf89..2f2e2571f5 100644
--- a/man/machinectl.xml
+++ b/man/machinectl.xml
@@ -203,14 +203,45 @@
</varlistentry>
<varlistentry>
- <term><command>terminate</command> <replaceable>ID</replaceable>...</term>
+ <term><command>login</command> <replaceable>ID</replaceable></term>
- <listitem><para>Terminates a virtual
- machine or container. This kills all
- processes of the virtual machine or
- container and deallocates all
- resources attached to that
- instance.</para></listitem>
+ <listitem><para>Open a terminal login
+ session to a container. This will
+ create a TTY connection to a specific
+ container and asks for the execution of a
+ getty on it. Note that this is only
+ supported for containers running
+ <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+ as init system.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <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, and is
+ compatible with containers running any
+ init system.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><command>poweroff</command> <replaceable>ID</replaceable>...</term>
+
+ <listitem><para>Power off one or more
+ containers. This will trigger a reboot
+ by sending SIGRTMIN+4 to the
+ container's init process, which causes
+ systemd-compatible init systems to
+ shut down cleanly. This operation does
+ not work on containers that do not run
+ a
+ <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>-compatible
+ init system, such as
+ sysvinit.</para></listitem>
</varlistentry>
<varlistentry>
@@ -229,29 +260,16 @@
</varlistentry>
<varlistentry>
- <term><command>reboot</command> <replaceable>ID</replaceable>...</term>
+ <term><command>terminate</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>
+ <listitem><para>Terminates a virtual
+ machine or container. This kills all
+ processes of the virtual machine or
+ container and deallocates all
+ resources attached to that
+ instance.</para></listitem>
</varlistentry>
- <varlistentry>
- <term><command>login</command> <replaceable>ID</replaceable></term>
-
- <listitem><para>Open a terminal login
- session to a container. This will
- create a TTY connection to a specific
- container and asks for the execution of a
- getty on it. Note that this is only
- supported for containers running
- <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
- as init system.</para></listitem>
- </varlistentry>
</variablelist>
</refsect1>
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index 32f862d093..2183d5c397 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -370,91 +370,42 @@ static int kill_machine(sd_bus *bus, char **args, unsigned n) {
return 0;
}
-static int terminate_machine(sd_bus *bus, char **args, unsigned n) {
- _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- unsigned i;
-
- assert(args);
+static int reboot_machine(sd_bus *bus, char **args, unsigned n) {
+ arg_kill_who = "leader";
+ arg_signal = SIGINT; /* sysvinit + systemd */
- for (i = 1; i < n; i++) {
- int r;
+ return kill_machine(bus, args, n);
+}
- r = sd_bus_call_method(
- bus,
- "org.freedesktop.machine1",
- "/org/freedesktop/machine1",
- "org.freedesktop.machine1.Manager",
- "TerminateMachine",
- &error,
- NULL,
- "s", args[i]);
- if (r < 0) {
- log_error("Could not terminate machine: %s", bus_error_message(&error, -r));
- return r;
- }
- }
+static int poweroff_machine(sd_bus *bus, char **args, unsigned n) {
+ arg_kill_who = "leader";
+ arg_signal = SIGRTMIN+4; /* only systemd */
- return 0;
+ return kill_machine(bus, args, n);
}
-static int reboot_machine(sd_bus *bus, char **args, unsigned n) {
+static int terminate_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;
+ int r;
r = sd_bus_call_method(
bus,
"org.freedesktop.machine1",
"/org/freedesktop/machine1",
"org.freedesktop.machine1.Manager",
- "GetMachine",
+ "TerminateMachine",
&error,
- &reply,
+ NULL,
"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));
+ log_error("Could not terminate machine: %s", bus_error_message(&error, -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;
@@ -687,10 +638,11 @@ static int help(void) {
" list List running VMs and containers\n"
" status NAME... Show VM/container status\n"
" 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"
+ " login NAME Get a login prompt on a container\n"
+ " poweroff NAME... Power off one or more containers\n"
" reboot NAME... Reboot one or more containers\n"
- " login NAME Get a login prompt on a container\n",
+ " kill NAME... Send signal to processes of a VM/container\n"
+ " terminate NAME... Terminate one or more VMs/containers\n",
program_invocation_short_name);
return 0;
@@ -814,6 +766,7 @@ static int machinectl_main(sd_bus *bus, int argc, char *argv[]) {
{ "show", MORE, 1, show },
{ "terminate", MORE, 2, terminate_machine },
{ "reboot", MORE, 2, reboot_machine },
+ { "poweroff", MORE, 2, poweroff_machine },
{ "kill", MORE, 2, kill_machine },
{ "login", MORE, 2, login_machine },
};