Re: [PATCH v5] env-update: create systemd user-session environment definition

Zac Medico <[email protected]>
Newsgroups gmane.linux.gentoo.portage.devel
Message-ID <[email protected]>
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 <[email protected]>
> ---
> 
> 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
signature.asc (application/pgp-signature, 981 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQKTBAEBCgB9FiEE8OgXaltWzqgSupCu0HX7jBBKPSAFAl9Wyv5fFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEYw
RTgxNzZBNUI1NkNFQTgxMkJBOTBBRUQwNzVGQjhDMTA0QTNEMjAACgkQ0HX7jBBK
PSDEMg//bp07ikXqyndQRJyCL4kKEe8hbfi+QB8sMxwHGGjhG4zqeBRGC9Vzysv5
bREqBELmwE1mNauDA9BqhdAoGXsFfhaMYE8lUt3GgpUomtDZzi3UEG0ba/Qn27IB
QdCYcvPBgZPzgswJ4bXJaOE4OsjUGFIoEDrD9TwFxy+TzRzfAO4A8Bxl6r5xtbCI
E8URFrsXu6qbyVM92D8x/EgNrkDFmOIMFxZZ6ZfMdNpZbh+ZAEhE+dJFWOr+dDVz
glzJ3iP9QtnbwsuZpQudvVdC4CmUILbNpr93NGhUgKoLgAbe/0dIyWL3hIWLY2u7
ASmap1syPJIVKWEdH860dtWs75LKKD627Rmn7KLGzsogzrC717TUK5b3uBjkg0hr
kLSZexiENfNKj20ejVwkYw7swHwK/0CnCZwA4F/AgRrM3CjWlEYJeJd/jE8v5bQB
WQs2TsMCyVq+hUiBpwfdPWWbSSWZzcc0CnWYTAjpekTgvKUhFRrZP6B7kzm5VA1n
tMVJuIB/pY+YyKb7FpziFYVgXtxjXFoRED4eOMTXE+EeVSY2kKk4Au25ouPAs3DZ
j9tnDEvOjBtxtPJUawta823Zptwzh6kmFcF8HM+5bj48XlrOcGhgRjs1MI7DZ8N1
jl5EZc956v1AtjtsfWRJTqsAMsMsDl0mhHuru02sW0/FkN+W8Ig=
=ZYFP
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.