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.
This commit is contained in:
parent
bc8c2f5c54
commit
b4f10a5e89
|
@ -503,7 +503,8 @@ systemd_notify_LDADD = \
|
||||||
systemd_install_SOURCES = \
|
systemd_install_SOURCES = \
|
||||||
src/install.c \
|
src/install.c \
|
||||||
src/path-lookup.c \
|
src/path-lookup.c \
|
||||||
src/dbus-common.c
|
src/dbus-common.c \
|
||||||
|
src/sd-daemon.c
|
||||||
|
|
||||||
systemd_install_LDADD = \
|
systemd_install_LDADD = \
|
||||||
libsystemd-basic.la \
|
libsystemd-basic.la \
|
||||||
|
|
|
@ -793,11 +793,11 @@ endif</programlisting>
|
||||||
package managers:</para>
|
package managers:</para>
|
||||||
|
|
||||||
<programlisting>%post
|
<programlisting>%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
|
%preun
|
||||||
if [ "$1" -eq 0 ]; then
|
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</programlisting>
|
fi</programlisting>
|
||||||
|
|
||||||
</refsect2>
|
</refsect2>
|
||||||
|
|
|
@ -130,13 +130,14 @@
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--start[=MODE]</option></term>
|
<term><option>--realize[=MODE]</option></term>
|
||||||
|
|
||||||
<listitem><para>After
|
<listitem><para>After
|
||||||
enabling/disabling stop/restart the
|
enabling/disabling stop/restart/stop
|
||||||
unit and reload manager
|
the unit and reload manager
|
||||||
configuration. Optionally, takes one
|
configuration. Optionally, takes one
|
||||||
of <option>no</option>,
|
of <option>no</option>,
|
||||||
|
<option>reload</option>,
|
||||||
<option>minimal</option>,
|
<option>minimal</option>,
|
||||||
<option>maybe</option> or
|
<option>maybe</option> or
|
||||||
<option>yes</option>. If
|
<option>yes</option>. If
|
||||||
|
@ -145,13 +146,17 @@
|
||||||
configuration and no service will be
|
configuration and no service will be
|
||||||
started or stopped after
|
started or stopped after
|
||||||
enabling/disabling of the unit
|
enabling/disabling of the unit
|
||||||
files. If <option>minimal</option> is
|
files. If <option>reload</option> is
|
||||||
passed and a unit is being enabled it
|
passed the daemon configuration is
|
||||||
will also be restarted should it
|
reloaded but the unit otherwise not
|
||||||
already be running. If a unit is being
|
started/stopped/restarted. If
|
||||||
disabled it will be stopped should it
|
<option>minimal</option> is passed and
|
||||||
be running. In either case the
|
a unit is being enabled it will also
|
||||||
daemon configuration is
|
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. <option>maybe</option> is
|
reloaded. <option>maybe</option> is
|
||||||
similar to this, but the unit will
|
similar to this, but the unit will
|
||||||
also be started if it is being enabled
|
also be started if it is being enabled
|
||||||
|
@ -168,8 +173,11 @@
|
||||||
<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
|
||||||
<command>test</command> is
|
<command>test</command> is used, or
|
||||||
used.</para></listitem>
|
when systemd is not running or the
|
||||||
|
command is executed in a
|
||||||
|
<citerefentry><refentrytitle>chroot</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
||||||
|
environment.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "conf-parser.h"
|
#include "conf-parser.h"
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
|
#include "sd-daemon.h"
|
||||||
|
|
||||||
static bool arg_force = false;
|
static bool arg_force = false;
|
||||||
|
|
||||||
|
@ -49,11 +50,12 @@ static enum {
|
||||||
} arg_action = ACTION_INVALID;
|
} arg_action = ACTION_INVALID;
|
||||||
|
|
||||||
static enum {
|
static enum {
|
||||||
START_NO, /* Don't start/stop or anything */
|
REALIZE_NO, /* Don't reload/start/stop or anything */
|
||||||
START_MINIMAL, /* Only shutdown/restart if running. */
|
REALIZE_RELOAD, /* Only reload daemon config, don't stop/start */
|
||||||
START_MAYBE, /* Start if WantedBy= suggests */
|
REALIZE_MINIMAL, /* Only shutdown/restart if running. */
|
||||||
START_YES /* Start unconditionally */
|
REALIZE_MAYBE, /* Start if WantedBy= suggests */
|
||||||
} arg_start = START_NO;
|
REALIZE_YES /* Start unconditionally */
|
||||||
|
} arg_realize = REALIZE_NO;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -69,13 +71,13 @@ static int help(void) {
|
||||||
|
|
||||||
printf("%s [OPTIONS...] {COMMAND} ...\n\n"
|
printf("%s [OPTIONS...] {COMMAND} ...\n\n"
|
||||||
"Install init system units.\n\n"
|
"Install init system units.\n\n"
|
||||||
" -h --help Show this help\n"
|
" -h --help Show this help\n"
|
||||||
" --force Override existing links\n"
|
" --force Override existing links\n"
|
||||||
" --system Install into system\n"
|
" --system Install into system\n"
|
||||||
" --session Install into session\n"
|
" --session Install into session\n"
|
||||||
" --global Install into all sessions\n"
|
" --global Install into all sessions\n"
|
||||||
" --start[=MODE] Start/stop/restart unit after installation\n"
|
" --realize[=MODE] Start/stop/restart unit after installation\n"
|
||||||
" Takes 'no', 'minimal', 'maybe' or 'yes'\n\n"
|
" Takes 'no', 'minimal', 'maybe' or 'yes'\n\n"
|
||||||
"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"
|
||||||
|
@ -92,7 +94,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
ARG_SYSTEM,
|
ARG_SYSTEM,
|
||||||
ARG_GLOBAL,
|
ARG_GLOBAL,
|
||||||
ARG_FORCE,
|
ARG_FORCE,
|
||||||
ARG_START
|
ARG_REALIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
|
@ -101,7 +103,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
{ "system", no_argument, NULL, ARG_SYSTEM },
|
{ "system", no_argument, NULL, ARG_SYSTEM },
|
||||||
{ "global", no_argument, NULL, ARG_GLOBAL },
|
{ "global", no_argument, NULL, ARG_GLOBAL },
|
||||||
{ "force", no_argument, NULL, ARG_FORCE },
|
{ "force", no_argument, NULL, ARG_FORCE },
|
||||||
{ "start", optional_argument, NULL, ARG_START },
|
{ "realize", optional_argument, NULL, ARG_REALIZE },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -134,20 +136,20 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
arg_force = true;
|
arg_force = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ARG_START:
|
case ARG_REALIZE:
|
||||||
|
|
||||||
if (!optarg)
|
if (!optarg)
|
||||||
arg_start = START_MAYBE;
|
arg_realize = REALIZE_MAYBE;
|
||||||
else if (streq(optarg, "no"))
|
else if (streq(optarg, "no"))
|
||||||
arg_start = START_NO;
|
arg_realize = REALIZE_NO;
|
||||||
else if (streq(optarg, "minimal"))
|
else if (streq(optarg, "minimal"))
|
||||||
arg_start = START_MINIMAL;
|
arg_realize = REALIZE_MINIMAL;
|
||||||
else if (streq(optarg, "maybe"))
|
else if (streq(optarg, "maybe"))
|
||||||
arg_start = START_MAYBE;
|
arg_realize = REALIZE_MAYBE;
|
||||||
else if (streq(optarg, "yes"))
|
else if (streq(optarg, "yes"))
|
||||||
arg_start = START_YES;
|
arg_realize = REALIZE_YES;
|
||||||
else {
|
else {
|
||||||
log_error("Invalid --start argument %s", optarg);
|
log_error("Invalid --realize argument %s", optarg);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,7 +308,7 @@ static int install_info_run(DBusConnection *bus, InstallInfo *i) {
|
||||||
|
|
||||||
if (arg_action == ACTION_ENABLE) {
|
if (arg_action == ACTION_ENABLE) {
|
||||||
|
|
||||||
if (arg_start == START_MAYBE) {
|
if (arg_realize == REALIZE_MAYBE) {
|
||||||
char **k;
|
char **k;
|
||||||
bool yes_please = false;
|
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",
|
"/org/freedesktop/systemd1",
|
||||||
"org.freedesktop.systemd1.Manager",
|
"org.freedesktop.systemd1.Manager",
|
||||||
arg_start == START_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) {
|
arg_realize == REALIZE_MINIMAL ? "TryRestartUnit" : "RestartUnit"))) {
|
||||||
log_error("Could not allocate message.");
|
log_error("Could not allocate message.");
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
goto finish;
|
goto finish;
|
||||||
|
@ -778,16 +780,26 @@ static int do_run(void) {
|
||||||
|
|
||||||
dbus_error_init(&error);
|
dbus_error_init(&error);
|
||||||
|
|
||||||
if (arg_start == START_NO)
|
if (arg_realize == REALIZE_NO)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (arg_where == WHERE_GLOBAL) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg_action != ACTION_ENABLE && arg_action != ACTION_DISABLE) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,9 +814,11 @@ static int do_run(void) {
|
||||||
if ((r = daemon_reload(bus)) < 0)
|
if ((r = daemon_reload(bus)) < 0)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
HASHMAP_FOREACH(j, have_installed, i)
|
if (arg_realize != REALIZE_RELOAD) {
|
||||||
if ((q = install_info_run(bus, j)) < 0)
|
HASHMAP_FOREACH(j, have_installed, i)
|
||||||
r = q;
|
if ((q = install_info_run(bus, j)) < 0)
|
||||||
|
r = q;
|
||||||
|
}
|
||||||
|
|
||||||
if (arg_action == ACTION_DISABLE)
|
if (arg_action == ACTION_DISABLE)
|
||||||
if ((q = daemon_reload(bus)) < 0)
|
if ((q = daemon_reload(bus)) < 0)
|
||||||
|
|
|
@ -1039,7 +1039,7 @@ static void socket_enter_running(Socket *s, int cfd) {
|
||||||
socket_set_state(s, SOCKET_RUNNING);
|
socket_set_state(s, SOCKET_RUNNING);
|
||||||
} else {
|
} else {
|
||||||
Unit *u;
|
Unit *u;
|
||||||
char *prefix, *instance, *name;
|
char *prefix, *instance = NULL, *name;
|
||||||
|
|
||||||
if (s->n_connections >= s->max_connections) {
|
if (s->n_connections >= s->max_connections) {
|
||||||
log_warning("Too many incoming connections (%u)", s->n_connections);
|
log_warning("Too many incoming connections (%u)", s->n_connections);
|
||||||
|
|
19
src/util.c
19
src/util.c
|
@ -2825,6 +2825,25 @@ int columns(void) {
|
||||||
return parsed_columns;
|
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[] = {
|
static const char *const ioprio_class_table[] = {
|
||||||
[IOPRIO_CLASS_NONE] = "none",
|
[IOPRIO_CLASS_NONE] = "none",
|
||||||
[IOPRIO_CLASS_RT] = "realtime",
|
[IOPRIO_CLASS_RT] = "realtime",
|
||||||
|
|
|
@ -330,6 +330,8 @@ void status_welcome(void);
|
||||||
|
|
||||||
int columns(void);
|
int columns(void);
|
||||||
|
|
||||||
|
int running_in_chroot(void);
|
||||||
|
|
||||||
const char *ioprio_class_to_string(int i);
|
const char *ioprio_class_to_string(int i);
|
||||||
int ioprio_class_from_string(const char *s);
|
int ioprio_class_from_string(const char *s);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue