manager: add DefaultEnvironment option

This complements existing functionality of setting variables
through 'systemctl set-environment', the kernel command line,
and through normal environment variables for systemd in session
mode.
This commit is contained in:
Umut Tezduyar 2013-06-09 07:08:46 +02:00 committed by Zbigniew Jędrzejewski-Szmek
parent 8c1396b1c2
commit 97d0e5f83b
7 changed files with 49 additions and 4 deletions

View file

@ -262,6 +262,27 @@
too.</para></listitem> too.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>DefaultEnvironment=</varname></term>
<listitem><para>Sets systemd manager
environment variables for executed
processes. Takes a space-separated
list of variable assignments.
</para>
<para>Example:
<programlisting>Environment="VAR1=word1 word2" VAR2=word3 "VAR3=word 5 6"</programlisting>
gives three variables <literal>VAR1</literal>,
<literal>VAR2</literal>, <literal>VAR3</literal>.
</para>
<para>
See
<citerefentry><refentrytitle>environ</refentrytitle><manvolnum>7</manvolnum></citerefentry>
for details about environment variables.</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><varname>DefaultLimitCPU=</varname></term> <term><varname>DefaultLimitCPU=</varname></term>
<term><varname>DefaultLimitFSIZE=</varname></term> <term><varname>DefaultLimitFSIZE=</varname></term>

View file

@ -288,8 +288,9 @@
variables is reset, all prior variables is reset, all prior
assignments have no effect. assignments have no effect.
Variable expansion is not performed Variable expansion is not performed
inside the strings, and $ has no special inside the strings, however, specifier
meaning. expansion is possible. $ character has
no special meaning.
If you need to assign a value containing spaces If you need to assign a value containing spaces
to a variable, use double quotes (") to a variable, use double quotes (")
for the assignment.</para> for the assignment.</para>

View file

@ -1564,7 +1564,7 @@ int config_parse_environ(const char *unit,
assert(filename); assert(filename);
assert(lvalue); assert(lvalue);
assert(rvalue); assert(rvalue);
assert(u); assert(data);
if (isempty(rvalue)) { if (isempty(rvalue)) {
/* Empty assignment resets the list */ /* Empty assignment resets the list */
@ -1573,7 +1573,11 @@ int config_parse_environ(const char *unit,
return 0; return 0;
} }
k = unit_full_printf(u, rvalue); if (u)
k = unit_full_printf(u, rvalue);
else
k = strdup(rvalue);
if (!k) if (!k)
return log_oom(); return log_oom();

View file

@ -94,6 +94,7 @@ static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT; static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
static usec_t arg_runtime_watchdog = 0; static usec_t arg_runtime_watchdog = 0;
static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE; static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
static char **arg_default_environment = NULL;
static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {}; static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
static uint64_t arg_capability_bounding_set_drop = 0; static uint64_t arg_capability_bounding_set_drop = 0;
static nsec_t arg_timer_slack_nsec = (nsec_t) -1; static nsec_t arg_timer_slack_nsec = (nsec_t) -1;
@ -646,6 +647,7 @@ static int parse_config_file(void) {
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog }, { "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_shutdown_watchdog },
{ "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop }, { "Manager", "CapabilityBoundingSet", config_parse_bounding_set, 0, &arg_capability_bounding_set_drop },
{ "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec }, { "Manager", "TimerSlackNSec", config_parse_nsec, 0, &arg_timer_slack_nsec },
{ "Manager", "DefaultEnvironment", config_parse_environ, 0, &arg_default_environment },
{ "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]}, { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
{ "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]}, { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
{ "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]}, { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
@ -1630,6 +1632,9 @@ int main(int argc, char *argv[]) {
if (arg_default_controllers) if (arg_default_controllers)
manager_set_default_controllers(m, arg_default_controllers); manager_set_default_controllers(m, arg_default_controllers);
if (arg_default_environment)
manager_set_default_environment(m, arg_default_environment);
manager_set_show_status(m, arg_show_status); manager_set_show_status(m, arg_show_status);
/* Remember whether we should queue the default job */ /* Remember whether we should queue the default job */

View file

@ -2570,6 +2570,18 @@ void manager_undo_generators(Manager *m) {
remove_generator_dir(m, &m->generator_unit_path_late); remove_generator_dir(m, &m->generator_unit_path_late);
} }
int manager_set_default_environment(Manager *m, char **environment) {
char **e = NULL;
assert(m);
e = strv_env_merge(2, m->environment, environment);
if (!e)
return -ENOMEM;
strv_free(m->environment);
m->environment = e;
return 0;
}
int manager_set_default_controllers(Manager *m, char **controllers) { int manager_set_default_controllers(Manager *m, char **controllers) {
char **l; char **l;

View file

@ -272,6 +272,7 @@ unsigned manager_dispatch_load_queue(Manager *m);
unsigned manager_dispatch_run_queue(Manager *m); unsigned manager_dispatch_run_queue(Manager *m);
unsigned manager_dispatch_dbus_queue(Manager *m); unsigned manager_dispatch_dbus_queue(Manager *m);
int manager_set_default_environment(Manager *m, char **environment);
int manager_set_default_controllers(Manager *m, char **controllers); int manager_set_default_controllers(Manager *m, char **controllers);
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit); int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);

View file

@ -25,6 +25,7 @@
#ShutdownWatchdogSec=10min #ShutdownWatchdogSec=10min
#CapabilityBoundingSet= #CapabilityBoundingSet=
#TimerSlackNSec= #TimerSlackNSec=
#DefaultEnvironment=
#DefaultLimitCPU= #DefaultLimitCPU=
#DefaultLimitFSIZE= #DefaultLimitFSIZE=
#DefaultLimitDATA= #DefaultLimitDATA=