nix-processmgmt/nixproc/create-credentials/default.nix

62 lines
2.2 KiB
Nix

{stdenv, lib, ids ? {}, forceDisableUserChange}:
{groups ? {}, users ? {}}:
stdenv.mkDerivation {
name = "credentials";
buildCommand = ''
${lib.optionalString (!forceDisableUserChange && groups != {}) ''
mkdir -p $out/dysnomia-support/groups
${lib.concatMapStrings (groupname:
let
group = builtins.getAttr groupname groups;
in
''
${lib.optionalString (!(group ? gid) && ids ? gids && builtins.hasAttr groupname ids.gids) ''echo "gid=${toString ids.gids."${groupname}"}" > $out/dysnomia-support/groups/${groupname}''}
cat >> $out/dysnomia-support/groups/${groupname} <<EOF
${lib.concatMapStrings (propertyName:
let
value = builtins.getAttr propertyName group;
in
"${propertyName}=${lib.escapeShellArg value}\n"
) (builtins.attrNames group)}
EOF
''
) (builtins.attrNames groups)}
''}
mkdir -p $out/dysnomia-support/users
${lib.concatMapStrings (username:
let
user = builtins.getAttr username users;
in
# If we force disable user changes, we should still create the desired home directory, if applicable
if forceDisableUserChange then lib.optionalString (user ? createHomeDir && user.createHomeDir) ''
cat > $out/dysnomia-support/users/${username} <<EOF
homeDir=${user.homeDir}
createHomeDir=1
createHomeDirOnly=1
EOF
''
# Regular user creation configuration
else ''
${lib.optionalString (!(user ? uid) && ids ? uids && builtins.hasAttr username ids.uids) ''echo "uid=${toString ids.uids."${username}"}" > $out/dysnomia-support/users/${username}''}
cat >> $out/dysnomia-support/users/${username} <<EOF
${lib.concatMapStrings (propertyName:
let
value = builtins.getAttr propertyName user;
in
"${propertyName}=${lib.escapeShellArg value}\n"
) (builtins.attrNames user)}
EOF
''
) (builtins.attrNames users)}
# If we end up having no user configurations, then delete the empty folder
rmdir --ignore-fail-on-non-empty $out/dysnomia-support/users
'';
}