diff options
-rw-r--r-- | man/systemd-install.xml | 60 | ||||
-rw-r--r-- | src/install.c | 42 |
2 files changed, 74 insertions, 28 deletions
diff --git a/man/systemd-install.xml b/man/systemd-install.xml index 28415d19e1..1e26310c4f 100644 --- a/man/systemd-install.xml +++ b/man/systemd-install.xml @@ -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> @@ -168,8 +171,10 @@ <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 @@ -177,7 +182,9 @@ 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> @@ -187,9 +194,9 @@ <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> @@ -197,24 +204,51 @@ <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> diff --git a/src/install.c b/src/install.c index 38c0513fad..6fc2a9fbcd 100644 --- a/src/install.c +++ b/src/install.c @@ -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); |