From: Lennart Poettering Date: Thu, 8 Jul 2010 19:34:51 +0000 (+0200) Subject: install: various improvements X-Git-Tag: v2~10 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=b4f10a5e8956d26f0bc6b9aef12846b57caee08b;ds=sidebyside install: various improvements Rename --start to --realize, to make things less confusing when doing "systemctl stop --realize foo.service". Introduce --realize=reload. Don't talk to systemd when run within a chroot, or when systemd isn't running. --- diff --git a/Makefile.am b/Makefile.am index debe47596..52339718a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -503,7 +503,8 @@ systemd_notify_LDADD = \ systemd_install_SOURCES = \ src/install.c \ src/path-lookup.c \ - src/dbus-common.c + src/dbus-common.c \ + src/sd-daemon.c systemd_install_LDADD = \ libsystemd-basic.la \ diff --git a/man/daemon.xml b/man/daemon.xml index dfee39016..b708bdcfb 100644 --- a/man/daemon.xml +++ b/man/daemon.xml @@ -793,11 +793,11 @@ endif package managers: %post -/usr/bin/systemd-install --start enable foobar.service foobar.socket >/dev/null 2>&1 || : +/usr/bin/systemd-install --realize enable foobar.service foobar.socket >/dev/null 2>&1 || : %preun if [ "$1" -eq 0 ]; then - /usr/bin/systemd-install --start disable foobar.service foobar.socket >/dev/null 2>&1 || : + /usr/bin/systemd-install --realize disable foobar.service foobar.socket >/dev/null 2>&1 || : fi diff --git a/man/systemd-install.xml b/man/systemd-install.xml index c3ec4bdcd..28415d19e 100644 --- a/man/systemd-install.xml +++ b/man/systemd-install.xml @@ -130,13 +130,14 @@ - + After - enabling/disabling stop/restart the - unit and reload manager + enabling/disabling stop/restart/stop + the unit and reload manager configuration. Optionally, takes one of , + , , or . If @@ -145,13 +146,17 @@ configuration and no service will be started or stopped after enabling/disabling of the unit - files. If is - passed and a unit is being enabled it - will also be restarted should it - already be running. If a unit is being - disabled it will be stopped should it - be running. In either case the - daemon configuration is + files. If is + passed the daemon configuration is + reloaded but the unit otherwise not + started/stopped/restarted. If + is passed and + a unit is being enabled it will also + be restarted should it already be + running. If a unit is being disabled + it will be stopped should it be + running. In either case the daemon + configuration is reloaded. is similar to this, but the unit will also be started if it is being enabled @@ -168,8 +173,11 @@ . This option has no effect when or - test is - used. + test is used, or + when systemd is not running or the + command is executed in a + chroot2 + environment. diff --git a/src/install.c b/src/install.c index 3b70bd1d3..a05002d07 100644 --- a/src/install.c +++ b/src/install.c @@ -32,6 +32,7 @@ #include "strv.h" #include "conf-parser.h" #include "dbus-common.h" +#include "sd-daemon.h" static bool arg_force = false; @@ -49,11 +50,12 @@ static enum { } arg_action = ACTION_INVALID; static enum { - START_NO, /* Don't start/stop or anything */ - START_MINIMAL, /* Only shutdown/restart if running. */ - START_MAYBE, /* Start if WantedBy= suggests */ - START_YES /* Start unconditionally */ -} arg_start = START_NO; + REALIZE_NO, /* Don't reload/start/stop or anything */ + REALIZE_RELOAD, /* Only reload daemon config, don't stop/start */ + REALIZE_MINIMAL, /* Only shutdown/restart if running. */ + REALIZE_MAYBE, /* Start if WantedBy= suggests */ + REALIZE_YES /* Start unconditionally */ +} arg_realize = REALIZE_NO; typedef struct { char *name; @@ -69,13 +71,13 @@ static int help(void) { printf("%s [OPTIONS...] {COMMAND} ...\n\n" "Install init system units.\n\n" - " -h --help Show this help\n" - " --force Override existing links\n" - " --system Install into system\n" - " --session Install into session\n" - " --global Install into all sessions\n" - " --start[=MODE] Start/stop/restart unit after installation\n" - " Takes 'no', 'minimal', 'maybe' or 'yes'\n\n" + " -h --help Show this help\n" + " --force Override existing links\n" + " --system Install into system\n" + " --session Install into session\n" + " --global Install into all sessions\n" + " --realize[=MODE] Start/stop/restart unit after installation\n" + " Takes 'no', 'minimal', 'maybe' or 'yes'\n\n" "Commands:\n" " enable [NAME...] Enable one or more units\n" " disable [NAME...] Disable one or more units\n" @@ -92,7 +94,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_SYSTEM, ARG_GLOBAL, ARG_FORCE, - ARG_START + ARG_REALIZE }; static const struct option options[] = { @@ -101,7 +103,7 @@ static int parse_argv(int argc, char *argv[]) { { "system", no_argument, NULL, ARG_SYSTEM }, { "global", no_argument, NULL, ARG_GLOBAL }, { "force", no_argument, NULL, ARG_FORCE }, - { "start", optional_argument, NULL, ARG_START }, + { "realize", optional_argument, NULL, ARG_REALIZE }, { NULL, 0, NULL, 0 } }; @@ -134,20 +136,20 @@ static int parse_argv(int argc, char *argv[]) { arg_force = true; break; - case ARG_START: + case ARG_REALIZE: if (!optarg) - arg_start = START_MAYBE; + arg_realize = REALIZE_MAYBE; else if (streq(optarg, "no")) - arg_start = START_NO; + arg_realize = REALIZE_NO; else if (streq(optarg, "minimal")) - arg_start = START_MINIMAL; + arg_realize = REALIZE_MINIMAL; else if (streq(optarg, "maybe")) - arg_start = START_MAYBE; + arg_realize = REALIZE_MAYBE; else if (streq(optarg, "yes")) - arg_start = START_YES; + arg_realize = REALIZE_YES; else { - log_error("Invalid --start argument %s", optarg); + log_error("Invalid --realize argument %s", optarg); return -EINVAL; } @@ -306,7 +308,7 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) { if (arg_action == ACTION_ENABLE) { - if (arg_start == START_MAYBE) { + if (arg_realize == REALIZE_MAYBE) { char **k; bool yes_please = false; @@ -416,7 +418,7 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) { "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - arg_start == START_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) { + arg_realize == REALIZE_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) { log_error("Could not allocate message."); r = -ENOMEM; goto finish; @@ -778,16 +780,26 @@ static int do_run(void) { dbus_error_init(&error); - if (arg_start == START_NO) + if (arg_realize == REALIZE_NO) return 0; if (arg_where == WHERE_GLOBAL) { - log_warning("Warning: --start has no effect with --global."); + log_warning("Warning: --realize has no effect with --global."); return 0; } if (arg_action != ACTION_ENABLE && arg_action != ACTION_DISABLE) { - log_warning("Warning: --start has no effect with test."); + log_warning("Warning: --realize has no effect with test."); + return 0; + } + + if (arg_where == WHERE_SYSTEM && sd_booted() <= 0) { + log_info("systemd is not running, --realize has not effect."); + return 0; + } + + if (arg_where == WHERE_SYSTEM && running_in_chroot() > 0) { + log_info("Running in a chroot() environment, --realize has no effect."); return 0; } @@ -802,9 +814,11 @@ static int do_run(void) { if ((r = daemon_reload(bus)) < 0) goto finish; - HASHMAP_FOREACH(j, have_installed, i) - if ((q = install_info_run(bus, j)) < 0) - r = q; + if (arg_realize != REALIZE_RELOAD) { + HASHMAP_FOREACH(j, have_installed, i) + if ((q = install_info_run(bus, j)) < 0) + r = q; + } if (arg_action == ACTION_DISABLE) if ((q = daemon_reload(bus)) < 0) diff --git a/src/socket.c b/src/socket.c index ee75de04d..acd49a504 100644 --- a/src/socket.c +++ b/src/socket.c @@ -1039,7 +1039,7 @@ static void socket_enter_running(Socket *s, int cfd) { socket_set_state(s, SOCKET_RUNNING); } else { Unit *u; - char *prefix, *instance, *name; + char *prefix, *instance = NULL, *name; if (s->n_connections >= s->max_connections) { log_warning("Too many incoming connections (%u)", s->n_connections); diff --git a/src/util.c b/src/util.c index 2e5827f32..7f5fa05dc 100644 --- a/src/util.c +++ b/src/util.c @@ -2825,6 +2825,25 @@ int columns(void) { return parsed_columns; } +int running_in_chroot(void) { + struct stat a, b; + + zero(a); + zero(b); + + /* Only works as root */ + + if (stat("/proc/1/root", &a) < 0) + return -errno; + + if (stat("/", &b) < 0) + return -errno; + + return + a.st_dev != b.st_dev || + a.st_ino != b.st_ino; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", diff --git a/src/util.h b/src/util.h index 5d51c07e2..1a4c440ba 100644 --- a/src/util.h +++ b/src/util.h @@ -330,6 +330,8 @@ void status_welcome(void); int columns(void); +int running_in_chroot(void); + const char *ioprio_class_to_string(int i); int ioprio_class_from_string(const char *s);