aboutsummaryrefslogtreecommitdiff
path: root/modules/system/users.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/system/users.nix')
-rw-r--r--modules/system/users.nix83
1 files changed, 83 insertions, 0 deletions
diff --git a/modules/system/users.nix b/modules/system/users.nix
new file mode 100644
index 0000000..022a7e7
--- /dev/null
+++ b/modules/system/users.nix
@@ -0,0 +1,83 @@
+{ config, pkgs, lib, ... }:
+
+let
+
+ inherit (builtins)
+ genList hashString mul substring ;
+
+ inherit (lib)
+ foldl genAttrs imap mkOption stringToCharacters toLower
+ types unique ;
+
+ inherit (types)
+ listOf str ;
+
+ uid = name:
+ let
+ dec = {
+ "0" = 0; "1" = 1; "2" = 2; "3" = 3;
+ "4" = 4; "5" = 5; "6" = 6; "7" = 7;
+ "8" = 8; "9" = 9; "a" = 10; "b" = 11;
+ "c" = 12; "d" = 13; "e" = 14; "f" = 15;
+ };
+ base = 1000000000; # 2^32 > base + 16^7
+ hex = toLower (substring 0 7 (hashString "sha1" name));
+ pow = b: n: foldl mul 1 (genList (_: b) n);
+ digits = imap (i: d: {m = pow 16 (i - 1); d = d;}) (stringToCharacters hex);
+ f = a: {m, d}: a + m * dec.${d};
+
+ in foldl f base digits;
+
+ daemons = config.nixsap.system.users.daemons;
+ normal = config.nixsap.system.users.normal;
+ groups = config.nixsap.system.groups;
+
+ mkGroup = name: { gid = uid name; };
+ mkDaemonUser = name:
+ {
+ isNormalUser = false;
+ uid = uid name;
+ group = name;
+ };
+
+ mkNormalUser = name:
+ {
+ isNormalUser = true;
+ uid = uid name;
+ };
+
+in {
+ options.nixsap.system = {
+ users.daemons = mkOption {
+ type = listOf str;
+ description = "List of system users with automatic UID and group";
+ default = [];
+ };
+ users.normal = mkOption {
+ type = listOf str;
+ description = "List of regular users with automatic UID";
+ default = [];
+ };
+ users.sysops = mkOption {
+ description = ''
+ List of local users with special roles in applications or system-wide.
+ The users in this list are not create automatically.
+ '';
+ type = listOf str;
+ default = [];
+ };
+ groups = mkOption {
+ type = listOf str;
+ description = "List of groups with automatic GID";
+ default = [];
+ };
+ };
+
+ # XXX: Modules for automatic unicity of user names:
+ imports = [
+ { users.groups = genAttrs (unique (daemons ++ groups)) mkGroup; }
+ { users.users = genAttrs daemons mkDaemonUser; }
+ { users.users = genAttrs normal mkNormalUser; }
+ ];
+}
+