Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 65 additions & 1 deletion modules/systemd.nix
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ let

cfg = config.systemd.user;

nixPkg = if config.nix.package == null then pkgs.nix else config.nix.package;

profileDirectory = config.home.profileDirectory;

inherit (lib)
any
attrValues
Expand Down Expand Up @@ -215,6 +219,56 @@ let
};
'';

hmSessionVarsUserEnvGenerator = {
"systemd/user-environment-generators/05-home-manager.sh" = {
text = ''
#!${pkgs.bash}/bin/bash
# Displays added or modified environment variables from sourcing one or more scripts.
# Outputs in a clean KEY=VALUE format.
#
# Usage:
# diff_env <script1.sh> [script2.sh ...]
#
diff_env() {
if [[ "$#" -eq 0 ]]; then
echo "Usage: diff_env <script1.sh> [script2.sh ...]" >&2
return 1
fi
# Capture the "before" environment into a map
declare -A before_env
while IFS= read -r line; do
local key="''${line%%=*}"
local value="''${line#*=}"
before_env["$key"]="$value"
done < <(env)
declare -A after_env
while IFS= read -r line; do
local key="''${line%%=*}"
local value="''${line#*=}"
after_env["$key"]="$value"
done < <(for f in "$@"; do source "$f"; done; env)
# Compare maps and print added or modified variables
for key in "''${!after_env[@]}"; do
# Print if the key is new OR if the value for an existing key has changed.
if ! [[ -v before_env["$key"] ]] || [[ "''${before_env[$key]}" != "''${after_env[$key]}" ]]; then
echo "$key=''${after_env[$key]}"
fi
done
}
diff_env \
"${nixPkg}/etc/profile.d/nix.sh" \
"${profileDirectory}/etc/profile.d/hm-session-vars.sh"
'';
executable = true;
force = true;
};
};

sessionVariables = mkIf (cfg.sessionVariables != { }) {
"environment.d/10-home-manager.conf".text =
lib.concatStringsSep "\n" (lib.mapAttrsToList (n: v: "${n}=${toString v}") cfg.sessionVariables)
Expand Down Expand Up @@ -357,12 +411,20 @@ in
settings = mkOption {
apply =
sections:
let
generatorPath = "SYSTEMD_ENVIRONMENT_GENERATOR_PATH=%h/.config/systemd/user-environment-generators:/run/systemd/user-environment-generators:/etc/systemd/user-environment-generators:/usr/local/lib/systemd/user-environment-generators:/usr/lib/systemd/user-environment-generators";
managerEnv = sections.Manager.ManagerEnvironment or "";
finalManagerEnv = generatorPath + (if managerEnv == "" then "" else " " + managerEnv);
newManager = (sections.Manager or { }) // {
ManagerEnvironment = finalManagerEnv;
};
in
sections
// {
# Setting one of these to an empty value would reset any
# previous settings, so we’ll remove them instead if they
# are not explicitly set.
Manager = removeIfEmpty sections.Manager [
Manager = removeIfEmpty newManager [
"ManagerEnvironment"
"DefaultEnvironment"
];
Expand Down Expand Up @@ -448,6 +510,8 @@ in
++ (buildServices "automount" cfg.automounts)
))

hmSessionVarsUserEnvGenerator

sessionVariables

settings
Expand Down
12 changes: 12 additions & 0 deletions tests/modules/systemd/default-user-config.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{ pkgs, ... }:

{
nmt.script = ''
userConf=home-files/.config/systemd/user.conf
assertFileExists $userConf
assertFileContent $userConf ${pkgs.writeText "expected" ''
[Manager]
ManagerEnvironment=SYSTEMD_ENVIRONMENT_GENERATOR_PATH=%h/.config/systemd/user-environment-generators:/run/systemd/user-environment-generators:/etc/systemd/user-environment-generators:/usr/local/lib/systemd/user-environment-generators:/usr/lib/systemd/user-environment-generators
''}
'';
}
3 changes: 2 additions & 1 deletion tests/modules/systemd/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
systemd-services-disabled-for-root = ./services-disabled-for-root.nix;
systemd-session-variables = ./session-variables.nix;
systemd-user-config = ./user-config.nix;
systemd-empty-user-config = ./empty-user-config.nix;
systemd-default-user-config = ./default-user-config.nix;
systemd-slices = ./slices.nix;
systemd-timers = ./timers.nix;
systemd-user-environment-generators = ./user-environment-generators.nix;
}
6 changes: 0 additions & 6 deletions tests/modules/systemd/empty-user-config.nix

This file was deleted.

1 change: 1 addition & 0 deletions tests/modules/systemd/user-config.nix
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
DefaultCPUAccounting=true
DefaultEnvironment=PATH='/bin:/sbin:/some where' TEST=abc
LogLevel=debug
ManagerEnvironment=SYSTEMD_ENVIRONMENT_GENERATOR_PATH=%h/.config/systemd/user-environment-generators:/run/systemd/user-environment-generators:/etc/systemd/user-environment-generators:/usr/local/lib/systemd/user-environment-generators:/usr/lib/systemd/user-environment-generators
''}
'';
}
6 changes: 6 additions & 0 deletions tests/modules/systemd/user-environment-generators.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
nmt.script = ''
hmSessionVarsUserEnvGenerator=home-files/.config/systemd/user-environment-generators/05-home-manager.sh
assertFileExists $hmSessionVarsUserEnvGenerator
'';
}