[systemd-commits] 2 commits - man/machinectl.xml src/machine src/test
Lennart Poettering
lennart at kemper.freedesktop.org
Tue Feb 11 17:11:11 PST 2014
man/machinectl.xml | 14 ++++++++-
src/machine/machinectl.c | 67 +++++++++++++++++++++++++++++++++++++++++++-
src/test/test-cgroup-util.c | 16 ----------
3 files changed, 79 insertions(+), 18 deletions(-)
New commits:
commit dd513a5dbfa0d5f97084c7c8e475530a03cfd973
Author: Lennart Poettering <lennart at poettering.net>
Date: Wed Feb 12 02:09:32 2014 +0100
test: fix "make check"
Let's remove the tests for cg_path_get_machine_name(), since they no
longer operate solely on the cgroup path, but actually look up data in
/run. Since we have a test for cg_pid_get_machine_name() this shouldn't
be too much of a loss.
diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c
index 12dcc17..b37468b 100644
--- a/src/test/test-cgroup-util.c
+++ b/src/test/test-cgroup-util.c
@@ -122,21 +122,6 @@ static void test_path_get_owner_uid(void) {
check_p_g_o_u("", -ENOENT, 0);
}
-static void check_p_g_m_n(const char *path, int code, const char *result) {
- _cleanup_free_ char *m = NULL;
-
- assert_se(cg_path_get_machine_name(path, &m) == code);
- assert_se(streq_ptr(m, result));
-}
-
-static void test_path_get_machine_name(void) {
- check_p_g_m_n("/user.slice/machine-foobar.scope", 0, "foobar");
- check_p_g_m_n("/machine-foobar.scope", 0, "foobar");
- check_p_g_m_n("/user.slice/user-kuux.slice/machine-foobar.scope", 0, "foobar");
- check_p_g_m_n("/user.slice/user-kuux.slice/machine-foobar.scope/asjhdkj", 0, "foobar");
- check_p_g_m_n("", -ENOENT, NULL);
-}
-
static void test_get_paths(void) {
_cleanup_free_ char *a = NULL;
@@ -267,7 +252,6 @@ int main(void) {
test_path_get_user_unit();
test_path_get_session();
test_path_get_owner_uid();
- test_path_get_machine_name();
TEST_REQ_RUNNING_SYSTEMD(test_get_paths());
test_proc();
TEST_REQ_RUNNING_SYSTEMD(test_escape());
commit 923d8fd381bced1c2d90ca53d18629d61a0f454a
Author: Lennart Poettering <lennart at poettering.net>
Date: Wed Feb 12 02:07:57 2014 +0100
machinectl: add new "machinectl reboot" call
diff --git a/man/machinectl.xml b/man/machinectl.xml
index 6e991ee..cabdbac 100644
--- a/man/machinectl.xml
+++ b/man/machinectl.xml
@@ -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
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index 703fb3a..3f4f8ac 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -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 },
};
More information about the systemd-commits
mailing list