environment-generator: new generator to peruse environment.d

Why the strange name: the prefix is necessary to follow our own advice that
environment generators should have numerical prefixes. I also put -d- in the
name because otherwise the name was very easy to mistake with
systemd.environment-generator. This additional letter clarifies that this
on special generator that supports environment.d files.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-02-11 11:32:17 -05:00
parent 37f3ffca27
commit f63c4aabb2
8 changed files with 208 additions and 2 deletions

1
.gitignore vendored
View File

@ -19,6 +19,7 @@
/*.tar.bz2
/*.tar.gz
/*.tar.xz
/30-systemd-environment-d-generator
/GPATH
/GRTAGS
/GSYMS

View File

@ -110,6 +110,7 @@ MANPAGES += \
man/systemd-debug-generator.8 \
man/systemd-delta.1 \
man/systemd-detect-virt.1 \
man/systemd-environment-d-generator.8 \
man/systemd-escape.1 \
man/systemd-fsck@.service.8 \
man/systemd-fstab-generator.8 \
@ -185,6 +186,7 @@ MANPAGES += \
man/udev_new.3 \
man/udevadm.8
MANPAGES_ALIAS += \
man/30-systemd-environment-d-generator.8 \
man/SD_ALERT.3 \
man/SD_BUS_ERROR_ACCESS_DENIED.3 \
man/SD_BUS_ERROR_ADDRESS_IN_USE.3 \
@ -542,6 +544,7 @@ MANPAGES_ALIAS += \
man/udev_ref.3 \
man/udev_unref.3 \
man/user.conf.d.5
man/30-systemd-environment-d-generator.8: man/systemd-environment-d-generator.8
man/SD_ALERT.3: man/sd-daemon.3
man/SD_BUS_ERROR_ACCESS_DENIED.3: man/sd-bus-errors.3
man/SD_BUS_ERROR_ADDRESS_IN_USE.3: man/sd-bus-errors.3
@ -899,6 +902,9 @@ man/udev_monitor_unref.3: man/udev_monitor_new_from_netlink.3
man/udev_ref.3: man/udev_new.3
man/udev_unref.3: man/udev_new.3
man/user.conf.d.5: man/systemd-system.conf.5
man/30-systemd-environment-d-generator.html: man/systemd-environment-d-generator.html
$(html-alias)
man/SD_ALERT.html: man/sd-daemon.html
$(html-alias)
@ -2768,6 +2774,7 @@ EXTRA_DIST += \
man/systemd-debug-generator.xml \
man/systemd-delta.xml \
man/systemd-detect-virt.xml \
man/systemd-environment-d-generator.xml \
man/systemd-escape.xml \
man/systemd-firstboot.xml \
man/systemd-fsck@.service.xml \

View File

@ -426,6 +426,9 @@ systemgenerator_PROGRAMS = \
systemd-system-update-generator \
systemd-debug-generator
userenvgenerator_PROGRAMS = \
30-systemd-environment-d-generator
dist_bashcompletion_data = \
shell-completion/bash/busctl \
shell-completion/bash/journalctl \
@ -2817,6 +2820,13 @@ systemd_system_update_generator_SOURCES = \
systemd_system_update_generator_LDADD = \
libsystemd-shared.la
# ------------------------------------------------------------------------------
30_systemd_environment_d_generator_SOURCES = \
src/environment-d-generator/environment-d-generator.c
30_systemd_environment_d_generator_LDADD = \
libsystemd-shared.la
# ------------------------------------------------------------------------------
if ENABLE_HIBERNATE
systemgenerator_PROGRAMS += \

View File

@ -0,0 +1,80 @@
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY % entities SYSTEM "custom-entities.ent" >
%entities;
]>
<!--
This file is part of systemd.
Copyright 2017 Zbigniew Jędrzejewski-Szmek
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
-->
<refentry id="systemd-environment-d-generator">
<refentryinfo>
<title>systemd-environment-d-generator</title>
<productname>systemd</productname>
<authorgroup>
<author>
<contrib>Developer</contrib>
<firstname>Zbigniew</firstname>
<surname>Jędrzejewski-Szmek</surname>
<email>zbyszek@in.waw.pl</email>
</author>
</authorgroup>
</refentryinfo>
<refmeta>
<refentrytitle>systemd-environment-d-generator</refentrytitle>
<manvolnum>8</manvolnum>
</refmeta>
<refnamediv>
<refname>systemd-environment-d-generator</refname>
<refname>30-systemd-environment-d-generator</refname>
<refpurpose>Load variables specified by <filename>environment.d</filename>
</refpurpose>
</refnamediv>
<refsynopsisdiv>
<para><filename>&userenvgeneratordir;/30-systemd-environment-d-generator</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para><filename>systemd-environment-d-generator</filename> is a
<citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
that reads environment configuration specified by
<citerefentry><refentrytitle>environment.d</refentrytitle><manvolnum>7</manvolnum></citerefentry>
configuration files and passes it to the
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>
user manager instance.</para>
</refsect1>
<refsect1>
<title>See Also</title>
<para>
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd.environment-generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>
</para>
</refsect1>
</refentry>

View File

@ -151,6 +151,7 @@
<title>See also</title>
<para>
<citerefentry><refentrytitle>systemd-environment-d-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>

View File

@ -0,0 +1 @@
../Makefile

View File

@ -0,0 +1,107 @@
/***
This file is part of systemd.
Copyright 2017 Zbigniew Jędrzejewski-Szmek
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include "sd-path.h"
#include "conf-files.h"
#include "def.h"
#include "escape.h"
#include "fileio.h"
#include "log.h"
#include "path-lookup.h"
static int environment_dirs(char ***ret) {
_cleanup_strv_free_ char **dirs = NULL;
_cleanup_free_ char *c = NULL;
int r;
dirs = strv_split_nulstr(CONF_PATHS_NULSTR("environment.d"));
if (!dirs)
return -ENOMEM;
/* ~/.config/systemd/environment.d */
r = sd_path_home(SD_PATH_USER_CONFIGURATION, "environment.d", &c);
if (r < 0)
return r;
r = strv_extend_front(&dirs, c);
if (r < 0)
return r;
*ret = dirs;
dirs = NULL;
return 0;
}
static int load_and_print(void) {
_cleanup_strv_free_ char **dirs = NULL, **files = NULL, **env = NULL;
char **i;
int r;
r = environment_dirs(&dirs);
if (r < 0)
return r;
r = conf_files_list_strv(&files, ".conf", NULL, (const char **) dirs);
if (r < 0)
return r;
/* This will mutate the existing environment, based on the presumption
* that in case of failure, a partial update is better than none. */
STRV_FOREACH(i, files) {
r = merge_env_file(&env, NULL, *i);
if (r == -ENOMEM)
return r;
}
STRV_FOREACH(i, env) {
char *t;
_cleanup_free_ char *q = NULL;
t = strchr(*i, '=');
assert(t);
q = shell_maybe_quote(t + 1);
if (!q)
return log_oom();
printf("%.*s=%s\n", (int) (t - *i), *i, q);
}
return 0;
}
int main(int argc, char *argv[]) {
int r;
log_parse_environment();
log_open();
if (argc > 1) {
log_error("This program takes no arguments.");
return EXIT_FAILURE;
}
r = load_and_print();
if (r < 0)
log_error_errno(r, "Failed to load environment.d: %m");
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

View File

@ -503,8 +503,7 @@ int lookup_paths_init(
append = true;
}
/* FIXME: empty components in other places should be
* rejected. */
/* FIXME: empty components in other places should be rejected. */
r = path_split_and_make_absolute(e, &paths);
if (r < 0)