From 53b543608ec293cd3138c526fa39b1f888120498 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 13 Jul 2010 20:05:47 +0200 Subject: [PATCH] install: implement systemd-install realize --- man/systemd-install.xml | 60 ++++++++++++++++++++++++++++++++--------- src/install.c | 42 ++++++++++++++++++----------- 2 files changed, 74 insertions(+), 28 deletions(-) diff --git a/man/systemd-install.xml b/man/systemd-install.xml index 28415d19e..1e26310c4 100644 --- a/man/systemd-install.xml +++ b/man/systemd-install.xml @@ -55,6 +55,9 @@ systemd-install OPTIONS disable NAME + + systemd-install OPTIONS realize NAME + systemd-install OPTIONS test NAME @@ -168,8 +171,10 @@ starts the unit unconditionally after enabling. This setting defaults to - . If the mode value - is omitted defaults to + . If + is + specifieed but the mode value is + omitted defaults to . This option has no effect when or @@ -177,7 +182,9 @@ when systemd is not running or the command is executed in a chroot2 - environment. + environment. This option is implied if + the realize command + is used. @@ -187,9 +194,9 @@ enable - Enable a unit. This - will create a number of symlinks as - encoded in the + Enable one or more + units. This will create a number of + symlinks as encoded in the [Install] section of a unit file. @@ -197,24 +204,51 @@ disable - Disable a unit. This - will remove a number of symlinks as - encoded in the + Disable or more + units. This will remove a number of + symlinks as encoded in the [Install] section of a unit file. + + realize + + 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 + [Install] section + of a unit file, and then executes the + action normally specified by + . If + is not + specified implies + mode. To + override this mode specify + in + addition to + realize. + + test - Checks whether any of - the units specified are - installed. This will check for the + 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 [Install] section - of a unit file. + of a unit file, and return with an + exit code of 0 if a unit is enabled, 1 + otherwise. + diff --git a/src/install.c b/src/install.c index 38c0513fa..6fc2a9fbc 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); -- 2.30.2