summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd-install.xml60
-rw-r--r--src/install.c42
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);