chiark / gitweb /
install: implement systemd-install realize
authorLennart Poettering <lennart@poettering.net>
Tue, 13 Jul 2010 18:05:47 +0000 (20:05 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 13 Jul 2010 18:05:47 +0000 (20:05 +0200)
man/systemd-install.xml
src/install.c

index 28415d1..1e26310 100644 (file)
@@ -56,6 +56,9 @@
                         <command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">disable</arg> <arg choice="opt" rep="repeat">NAME</arg></command>
                 </cmdsynopsis>
                 <cmdsynopsis>
+                        <command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">realize</arg> <arg choice="opt" rep="repeat">NAME</arg></command>
+                </cmdsynopsis>
+                <cmdsynopsis>
                         <command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">test</arg> <arg choice="opt" rep="repeat">NAME</arg></command>
                 </cmdsynopsis>
         </refsynopsisdiv>
                                 <option>yes</option> starts the unit
                                 unconditionally after enabling. This
                                 setting defaults to
-                                <option>no</option>. If the mode value
-                                is omitted defaults to
+                                <option>no</option>. If
+                                <option>--realize</option> is
+                                specifieed but the mode value is
+                                omitted defaults to
                                 <option>maybe</option>. This option
                                 has no effect when
                                 <option>--global</option> or
                                 when systemd is not running or the
                                 command is executed in a
                                 <citerefentry><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-                                environment.</para></listitem>
+                                environment. This option is implied if
+                                the <command>realize</command> command
+                                is used.</para></listitem>
                         </varlistentry>
                 </variablelist>
 
                         <varlistentry>
                                 <term><command>enable</command></term>
 
-                                <listitem><para>Enable a unit. This
-                                will create a number of symlinks as
-                                encoded in the
+                                <listitem><para>Enable one or more
+                                units. This will create a number of
+                                symlinks as encoded in the
                                 <literal>[Install]</literal> section
                                 of a unit file.</para></listitem>
                         </varlistentry>
                         <varlistentry>
                                 <term><command>disable</command></term>
 
-                                <listitem><para>Disable a unit. This
-                                will remove a number of symlinks as
-                                encoded in the
+                                <listitem><para>Disable or more
+                                units. This will remove a number of
+                                symlinks as encoded in the
                                 <literal>[Install]</literal> section
                                 of a unit file.</para></listitem>
                         </varlistentry>
 
                         <varlistentry>
+                                <term><command>realize</command></term>
+
+                                <listitem><para>Does not enable or
+                                disable any unit. Checks whether any
+                                of the units specified are enabled,
+                                and then starts/stops/restarts the
+                                units accordingly. This will check for
+                                the existence of a number of symlinks
+                                as encoded in the
+                                <literal>[Install]</literal> section
+                                of a unit file, and then executes the
+                                action normally specified by
+                                <option>--realize</option>. If
+                                <option>--realize</option> is not
+                                specified implies
+                                <option>maybe</option> mode. To
+                                override this mode specify
+                                <option>--realize=</option> in
+                                addition to
+                                <command>realize</command>.</para></listitem>
+                        </varlistentry>
+
+                        <varlistentry>
                                 <term><command>test</command></term>
 
-                                <listitem><para>Checks whether any of
-                                the units specified are
-                                installed. This will check for the
+                                <listitem><para>Does not enable or
+                                disable any unit. Checks whether any
+                                of the units specified are
+                                enabled. This will check for the
                                 existence of a number of symlinks as
                                 encoded in the
                                 <literal>[Install]</literal> section
-                                of a unit file.</para></listitem>
+                                of a unit file, and return with an
+                                exit code of 0 if a unit is enabled, 1
+                                otherwise.</para></listitem>
                         </varlistentry>
+
                 </variablelist>
 
         </refsect1>
index 38c0513..6fc2a9f 100644 (file)
@@ -46,6 +46,7 @@ static enum {
         ACTION_INVALID,
         ACTION_ENABLE,
         ACTION_DISABLE,
+        ACTION_REALIZE,
         ACTION_TEST
 } arg_action = ACTION_INVALID;
 
@@ -81,6 +82,8 @@ static int help(void) {
                "Commands:\n"
                "  enable [NAME...]    Enable one or more units\n"
                "  disable [NAME...]   Disable one or more units\n"
+               "  realize [NAME...]   Test whether any of the specified units are enabled\n"
+               "                      and the start/stop/restart units accordingly\n"
                "  test [NAME...]      Test whether any of the specified units are enabled\n",
                program_invocation_short_name);
 
@@ -108,6 +111,7 @@ static int parse_argv(int argc, char *argv[]) {
         };
 
         int c;
+        bool realize_switch = false;
 
         assert(argc >= 1);
         assert(argv);
@@ -138,6 +142,8 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case ARG_REALIZE:
 
+                        realize_switch = true;
+
                         if (!optarg)
                                 arg_realize = REALIZE_MAYBE;
                         else if (streq(optarg, "no"))
@@ -177,7 +183,12 @@ static int parse_argv(int argc, char *argv[]) {
                 arg_action = ACTION_DISABLE;
         else if (streq(argv[optind], "test"))
                 arg_action = ACTION_TEST;
-        else {
+        else if (streq(argv[optind], "realize")) {
+                arg_action = ACTION_REALIZE;
+
+                if (!realize_switch)
+                        arg_realize = REALIZE_MAYBE;
+        } else {
                 log_error("Unknown verb %s.", argv[optind]);
                 return -EINVAL;
         }
@@ -297,7 +308,7 @@ finish:
         return r;
 }
 
-static int install_info_run(DBusConnection *bus, InstallInfo *i) {
+static int install_info_run(DBusConnection *bus, InstallInfo *i, bool enabled) {
         DBusMessage *m = NULL, *reply = NULL;
         DBusError error;
         int r;
@@ -308,7 +319,8 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
 
         dbus_error_init(&error);
 
-        if (arg_action == ACTION_ENABLE) {
+        if (arg_action == ACTION_ENABLE ||
+            (arg_action == ACTION_REALIZE && enabled)) {
 
                 if (arg_realize == REALIZE_MAYBE) {
                         char **k;
@@ -436,7 +448,8 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
                 }
 
 
-        } else if (arg_action == ACTION_DISABLE) {
+        } else if (arg_action == ACTION_DISABLE ||
+                   (arg_action == ACTION_REALIZE && !enabled)) {
 
                 if (!(m = dbus_message_new_method_call(
                                       "org.freedesktop.systemd1",
@@ -456,10 +469,11 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
                         r = -ENOMEM;
                         goto finish;
                 }
-        }
+        } else
+                assert_not_reached("install_info_run() called but nothing to do?");
 
         if (!(reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error))) {
-                log_error("Failed to reload configuration: %s", error.message);
+                log_error("Failed to realize unit: %s", error.message);
                 r = -EIO;
                 goto finish;
         }
@@ -591,7 +605,7 @@ static int create_symlink(const char *old_path, const char *new_path) {
                 log_error("Cannot unlink %s: %m", new_path);
                 return -errno;
 
-        } else if (arg_action == ACTION_TEST) {
+        } else if (arg_action == ACTION_TEST || arg_action == ACTION_REALIZE) {
                 char *dest;
 
                 if ((r = readlink_and_make_absolute(new_path, &dest)) < 0) {
@@ -773,7 +787,7 @@ static char *get_config_path(void) {
         }
 }
 
-static int do_realize(void) {
+static int do_realize(bool enabled) {
         DBusConnection *bus = NULL;
         DBusError error;
         int r, q;
@@ -790,7 +804,7 @@ static int do_realize(void) {
                 return 0;
         }
 
-        if (arg_action != ACTION_ENABLE && arg_action != ACTION_DISABLE) {
+        if (arg_action == ACTION_TEST) {
                 log_warning("Warning: --realize has no effect with test.");
                 return 0;
         }
@@ -812,13 +826,13 @@ static int do_realize(void) {
 
         r = 0;
 
-        if (arg_action == ACTION_ENABLE)
+        if (arg_action == ACTION_ENABLE || arg_action == ACTION_REALIZE)
                 if ((r = daemon_reload(bus)) < 0)
                         goto finish;
 
         if (arg_realize != REALIZE_RELOAD) {
                 HASHMAP_FOREACH(j, have_installed, i)
-                        if ((q = install_info_run(bus, j)) < 0)
+                        if ((q = install_info_run(bus, j, enabled)) < 0)
                                 r = q;
         }
 
@@ -887,15 +901,13 @@ int main(int argc, char *argv[]) {
 
                         /* In test mode and found something */
                         retval = 0;
-                        goto finish;
+                        break;
                 }
         }
 
-        if (do_realize() < 0)
+        if (do_realize(!retval) < 0)
                 goto finish;
 
-        retval = arg_action == ACTION_TEST ? 1 : 0;
-
 finish:
         install_info_hashmap_free(will_install);
         install_info_hashmap_free(have_installed);