Commit 53b54360 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

install: implement systemd-install realize

parent 9f611ad8
...@@ -55,6 +55,9 @@ ...@@ -55,6 +55,9 @@
<cmdsynopsis> <cmdsynopsis>
<command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">disable</arg> <arg choice="opt" rep="repeat">NAME</arg></command> <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>
<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> <cmdsynopsis>
<command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">test</arg> <arg choice="opt" rep="repeat">NAME</arg></command> <command>systemd-install <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="plain">test</arg> <arg choice="opt" rep="repeat">NAME</arg></command>
</cmdsynopsis> </cmdsynopsis>
...@@ -168,8 +171,10 @@ ...@@ -168,8 +171,10 @@
<option>yes</option> starts the unit <option>yes</option> starts the unit
unconditionally after enabling. This unconditionally after enabling. This
setting defaults to setting defaults to
<option>no</option>. If the mode value <option>no</option>. If
is omitted defaults to <option>--realize</option> is
specifieed but the mode value is
omitted defaults to
<option>maybe</option>. This option <option>maybe</option>. This option
has no effect when has no effect when
<option>--global</option> or <option>--global</option> or
...@@ -177,7 +182,9 @@ ...@@ -177,7 +182,9 @@
when systemd is not running or the when systemd is not running or the
command is executed in a command is executed in a
<citerefentry><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry> <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> </varlistentry>
</variablelist> </variablelist>
...@@ -187,9 +194,9 @@ ...@@ -187,9 +194,9 @@
<varlistentry> <varlistentry>
<term><command>enable</command></term> <term><command>enable</command></term>
<listitem><para>Enable a unit. This <listitem><para>Enable one or more
will create a number of symlinks as units. This will create a number of
encoded in the symlinks as encoded in the
<literal>[Install]</literal> section <literal>[Install]</literal> section
of a unit file.</para></listitem> of a unit file.</para></listitem>
</varlistentry> </varlistentry>
...@@ -197,24 +204,51 @@ ...@@ -197,24 +204,51 @@
<varlistentry> <varlistentry>
<term><command>disable</command></term> <term><command>disable</command></term>
<listitem><para>Disable a unit. This <listitem><para>Disable or more
will remove a number of symlinks as units. This will remove a number of
encoded in the symlinks as encoded in the
<literal>[Install]</literal> section <literal>[Install]</literal> section
of a unit file.</para></listitem> of a unit file.</para></listitem>
</varlistentry> </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> <varlistentry>
<term><command>test</command></term> <term><command>test</command></term>
<listitem><para>Checks whether any of <listitem><para>Does not enable or
the units specified are disable any unit. Checks whether any
installed. This will check for the of the units specified are
enabled. This will check for the
existence of a number of symlinks as existence of a number of symlinks as
encoded in the encoded in the
<literal>[Install]</literal> section <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> </varlistentry>
</variablelist> </variablelist>
</refsect1> </refsect1>
......
...@@ -46,6 +46,7 @@ static enum { ...@@ -46,6 +46,7 @@ static enum {
ACTION_INVALID, ACTION_INVALID,
ACTION_ENABLE, ACTION_ENABLE,
ACTION_DISABLE, ACTION_DISABLE,
ACTION_REALIZE,
ACTION_TEST ACTION_TEST
} arg_action = ACTION_INVALID; } arg_action = ACTION_INVALID;
...@@ -81,6 +82,8 @@ static int help(void) { ...@@ -81,6 +82,8 @@ static int help(void) {
"Commands:\n" "Commands:\n"
" enable [NAME...] Enable one or more units\n" " enable [NAME...] Enable one or more units\n"
" disable [NAME...] Disable 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", " test [NAME...] Test whether any of the specified units are enabled\n",
program_invocation_short_name); program_invocation_short_name);
...@@ -108,6 +111,7 @@ static int parse_argv(int argc, char *argv[]) { ...@@ -108,6 +111,7 @@ static int parse_argv(int argc, char *argv[]) {
}; };
int c; int c;
bool realize_switch = false;
assert(argc >= 1); assert(argc >= 1);
assert(argv); assert(argv);
...@@ -138,6 +142,8 @@ static int parse_argv(int argc, char *argv[]) { ...@@ -138,6 +142,8 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_REALIZE: case ARG_REALIZE:
realize_switch = true;
if (!optarg) if (!optarg)
arg_realize = REALIZE_MAYBE; arg_realize = REALIZE_MAYBE;
else if (streq(optarg, "no")) else if (streq(optarg, "no"))
...@@ -177,7 +183,12 @@ static int parse_argv(int argc, char *argv[]) { ...@@ -177,7 +183,12 @@ static int parse_argv(int argc, char *argv[]) {
arg_action = ACTION_DISABLE; arg_action = ACTION_DISABLE;
else if (streq(argv[optind], "test")) else if (streq(argv[optind], "test"))
arg_action = ACTION_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]); log_error("Unknown verb %s.", argv[optind]);
return -EINVAL; return -EINVAL;
} }
...@@ -297,7 +308,7 @@ finish: ...@@ -297,7 +308,7 @@ finish:
return r; 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; DBusMessage *m = NULL, *reply = NULL;
DBusError error; DBusError error;
int r; int r;
...@@ -308,7 +319,8 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) { ...@@ -308,7 +319,8 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
dbus_error_init(&error); dbus_error_init(&error);
if (arg_action == ACTION_ENABLE) { if (arg_action == ACTION_ENABLE ||
(arg_action == ACTION_REALIZE && enabled)) {
if (arg_realize == REALIZE_MAYBE) { if (arg_realize == REALIZE_MAYBE) {
char **k; char **k;
...@@ -436,7 +448,8 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) { ...@@ -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( if (!(m = dbus_message_new_method_call(
"org.freedesktop.systemd1", "org.freedesktop.systemd1",
...@@ -456,10 +469,11 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) { ...@@ -456,10 +469,11 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
r = -ENOMEM; r = -ENOMEM;
goto finish; 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))) { 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; r = -EIO;
goto finish; goto finish;
} }
...@@ -591,7 +605,7 @@ static int create_symlink(const char *old_path, const char *new_path) { ...@@ -591,7 +605,7 @@ static int create_symlink(const char *old_path, const char *new_path) {
log_error("Cannot unlink %s: %m", new_path); log_error("Cannot unlink %s: %m", new_path);
return -errno; return -errno;
} else if (arg_action == ACTION_TEST) { } else if (arg_action == ACTION_TEST || arg_action == ACTION_REALIZE) {
char *dest; char *dest;
if ((r = readlink_and_make_absolute(new_path, &dest)) < 0) { if ((r = readlink_and_make_absolute(new_path, &dest)) < 0) {
...@@ -773,7 +787,7 @@ static char *get_config_path(void) { ...@@ -773,7 +787,7 @@ static char *get_config_path(void) {
} }
} }
static int do_realize(void) { static int do_realize(bool enabled) {
DBusConnection *bus = NULL; DBusConnection *bus = NULL;
DBusError error; DBusError error;
int r, q; int r, q;
...@@ -790,7 +804,7 @@ static int do_realize(void) { ...@@ -790,7 +804,7 @@ static int do_realize(void) {
return 0; 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."); log_warning("Warning: --realize has no effect with test.");
return 0; return 0;
} }
...@@ -812,13 +826,13 @@ static int do_realize(void) { ...@@ -812,13 +826,13 @@ static int do_realize(void) {
r = 0; r = 0;
if (arg_action == ACTION_ENABLE) if (arg_action == ACTION_ENABLE || arg_action == ACTION_REALIZE)
if ((r = daemon_reload(bus)) < 0) if ((r = daemon_reload(bus)) < 0)
goto finish; goto finish;
if (arg_realize != REALIZE_RELOAD) { if (arg_realize != REALIZE_RELOAD) {
HASHMAP_FOREACH(j, have_installed, i) 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; r = q;
} }
...@@ -887,15 +901,13 @@ int main(int argc, char *argv[]) { ...@@ -887,15 +901,13 @@ int main(int argc, char *argv[]) {
/* In test mode and found something */ /* In test mode and found something */
retval = 0; retval = 0;
goto finish; break;
} }
} }
if (do_realize() < 0) if (do_realize(!retval) < 0)
goto finish; goto finish;
retval = arg_action == ACTION_TEST ? 1 : 0;
finish: finish:
install_info_hashmap_free(will_install); install_info_hashmap_free(will_install);
install_info_hashmap_free(have_installed); install_info_hashmap_free(have_installed);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment