On 9/5/20 12:18 AM, Florian Schmaus wrote:
> Portage's env-update currently transforms the environment information
> from /etc/env.d into /etc/profile.env, which is typically sourced by
> every user session, setting up its environment.
> 
> However, /etc/profile.env is not sourced by systemd user
> services. Instead, for the definition of a systemd user session
> environment, the 'environment.d' machinery exists. Unfortunately, up
> to now, env-update does not produce a profile.env equivalent for this
> machinery, causing issues for systemd user services. For example, an
> emacs daemon run as user systemd service does not have a complete
> PATH (bug #704412 [1]), because some PATH components are injected by
> packages via /etc/env.d. For example, an LLVM ebuild may set
> PATH="/usr/lib/llvm/9/bin".
> 
> This commit changes env-update so that a systemd user session
> environment configuration file named
> 
> /etc/environment.d/10-gentoo-env.conf
> 
> is created.
> 
> Thanks to Michael 'veremitz' Everitt, Arfrever Frehtes Taifersar
> Arahesis, Ulrich Müller, Joakim Tjernlund, and Zac Medico for the
> useful feedback.
> 
> 1: https://bugs.gentoo.org/704412
> 
> Closes: https://bugs.gentoo.org/704416
> Signed-off-by: Florian Schmaus <f...@geekplace.eu>
> ---
> 
> Notes:
>     - Shorten created filename to 10-gentoo-env.conf
>     - Minor fixes in the commit message
>     - Use atomic_ofstream()
>     - Use os.makedirs() (Thanks Zac)
> 
>  lib/portage/util/env_update.py | 42 +++++++++++++++++++++++++++++++---
>  1 file changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/portage/util/env_update.py b/lib/portage/util/env_update.py
> index f130b6f6b..ab3caee47 100644
> --- a/lib/portage/util/env_update.py
> +++ b/lib/portage/util/env_update.py
> @@ -333,14 +333,16 @@ def _env_update(makelinks, target_root, prev_mtimes, 
> contents, env,
>  
>       del specials["LDPATH"]
>  
> -     penvnotice  = "# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.\n"
> -     penvnotice += "# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES\n"
> +     notice      = "# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.\n"
> +     notice     += "# DO NOT EDIT THIS FILE."
> +     penvnotice  = notice + " CHANGES TO STARTUP PROFILES\n"
>       cenvnotice  = penvnotice[:]
>       penvnotice += "# GO INTO /etc/profile NOT /etc/profile.env\n\n"
>       cenvnotice += "# GO INTO /etc/csh.cshrc NOT /etc/csh.env\n\n"
>  
>       #create /etc/profile.env for bash support
> -     outfile = atomic_ofstream(os.path.join(eroot, "etc", "profile.env"))
> +     profile_env_path = os.path.join(eroot, "etc", "profile.env")
> +     outfile = atomic_ofstream(profile_env_path)
>       outfile.write(penvnotice)
>  
>       env_keys = [x for x in env if x != "LDPATH"]
> @@ -353,6 +355,40 @@ def _env_update(makelinks, target_root, prev_mtimes, 
> contents, env,
>                       outfile.write("export %s='%s'\n" % (k, v))
>       outfile.close()
>  
> +     # Create the systemd user environment configuration file
> +     # /etc/environment.d/10-gentoo-env.conf with the
> +     # environment configuration from /etc/env.d.
> +     systemd_environment_dir = os.path.join(eroot, "etc", "environment.d")
> +     os.makedirs(systemd_environment_dir, exist_ok=True)
> +
> +     systemd_gentoo_env_path = os.path.join(systemd_environment_dir,
> +                                          "10-gentoo-env.conf")
> +     systemd_gentoo_env = atomic_ofstream(systemd_gentoo_env_path)
> +     try:
> +             senvnotice = notice + "\n\n"
> +             systemd_gentoo_env.write(senvnotice)
> +
> +             for env_key in env_keys:
> +                     env_key_value = env[env_key]
> +
> +                     # Skip variables with the empty string
> +                     # as value. Those sometimes appear in
> +                     # profile.env (e.g. "export GCC_SPECS=''"),
> +                     # but are invalid in systemd's syntax.
> +                     if not env_key_value:
> +                             continue
> +
> +                     # Transform into systemd environment.d
> +                     # conf syntax, basically shell variable
> +                     # assignment (without "export ").
> +                     line = f"{env_key}={env_key_value}\n"
> +
> +                     systemd_gentoo_env.write(line)
> +     except:
> +             systemd_gentoo_env.abort()
> +             raise
> +     systemd_gentoo_env.close()
> +
>       #create /etc/csh.env for (t)csh support
>       outfile = atomic_ofstream(os.path.join(eroot, "etc", "csh.env"))
>       outfile.write(cenvnotice)
> 

Thanks, merged:

https://gitweb.gentoo.org/proj/portage.git/commit/?id=45a5982fe8076066323e91f6b5fe860f3a429f9f
-- 
Thanks,
Zac

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to