aboutsummaryrefslogtreecommitdiff
path: root/modules/nixosModules/directories.nix
blob: 6a1426fedaeed12c4121c951b6be8af4d0554e03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
{inputs, ...}: {
  flake.nixosModules.directories = {
    config,
    lib,
    ...
  }:
    with lib; let
      cfg = config.createPaths;
      pathAttrsToListRec = pathsAttrSet: parentPath: parentConfig:
        lib.flatten (lib.mapAttrsToList (path: config: let
          filteredConfig = lib.filterAttrs (n: v: v != null) (builtins.removeAttrs config ["subPaths"]);
          out =
            {
              path =
                if parentPath == ""
                then path
                else parentPath + "/" + path;
            }
            // parentConfig // filteredConfig;
        in
          if config ? subPaths
          then [out] ++ (pathAttrsToListRec config.subPaths path filteredConfig)
          else [out])
        pathsAttrSet);
      pathConfig = {
        options = {
          group = mkOption {
            type = types.nullOr types.str;
            default = null;
          };
          owner = mkOption {
            type = types.nullOr types.str;
            default = null;
          };
          permissions = mkOption {
            type = types.nullOr types.str;
            default = null;
          };
          subPaths = mkOption {
            type = types.attrsOf (types.submodule pathConfig);
            default = {};
          };
        };
      };
      pathList = pathAttrsToListRec cfg "" {};
    in rec {
      options = {
        createPaths = mkOption {
          type = types.attrsOf (types.submodule {
            options = {
              group = mkOption {
                type = types.str;
              };
              owner = mkOption {
                type = types.str;
              };
              permissions = mkOption {
                type = types.str;
                default = "0740";
              };
              subPaths = mkOption {
                type = types.attrsOf (types.submodule pathConfig);
                default = {};
                description = ''
                  SubPaths to create using systemd tmpfiles.
                '';
              };
            };
          });
          default = {};
          description = ''
            Paths to create using systemd tmpfiles.
          '';
        };
      };

      config = mkIf (cfg != {}) {
        systemd.tmpfiles.rules =
          map
          (dir: "d ${dir.path} ${dir.permissions} ${dir.owner} ${dir.group}")
          pathList;

        users = let
          extraGroups = map (path: path.group) pathList;
        in {
          groups = genAttrs extraGroups (group: {});
        };
      };
    };
}