# This module defines a system-wide environment that will be # initialised by pam_env (that is, not only in shells). { config, lib, pkgs, ... }: with lib; let cfg = config.environment; pamProfiles = map (replaceStrings ["$HOME" "$USER"] ["@{HOME}" "@{PAM_USER}"]) cfg.profiles; in { options = { environment.sessionVariables = mkOption { default = {}; description = '' A set of environment variables used in the global environment. These variables will be set by PAM early in the login process. The value of each session variable can be either a string or a list of strings. The latter is concatenated, interspersed with colon characters. Note, due to limitations in the PAM format values may not contain the " character. Also, these variables are merged into and it is therefore not possible to use PAM style variables such as @{HOME}. ''; type = with types; attrsOf (either str (listOf str)); apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v); }; environment.profileRelativeSessionVariables = mkOption { type = types.attrsOf (types.listOf types.str); example = { PATH = [ "/bin" ]; MANPATH = [ "/man" "/share/man" ]; }; description = '' Attribute set of environment variable used in the global environment. These variables will be set by PAM early in the login process. Variable substitution is available as described in pam_env.conf 5 . Each attribute maps to a list of relative paths. Each relative path is appended to the each profile of to form the content of the corresponding environment variable. Also, these variables are merged into and it is therefore not possible to use PAM style variables such as @{HOME}. ''; }; }; config = { system.build.pamEnvironment = let suffixedVariables = flip mapAttrs cfg.profileRelativeSessionVariables (envVar: suffixes: flip concatMap pamProfiles (profile: map (suffix: "${profile}${suffix}") suffixes ) ); pamVariable = n: v: ''${n} DEFAULT="${concatStringsSep ":" (toList v)}"''; pamVariables = concatStringsSep "\n" (mapAttrsToList pamVariable (zipAttrsWith (n: concatLists) [ (mapAttrs (n: toList) cfg.sessionVariables) suffixedVariables ])); in pkgs.writeText "pam-environment" "${pamVariables}\n"; }; }