[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