aboutsummaryrefslogtreecommitdiff
path: root/nixos/serverModules/directories.nix
blob: f5c769f63c34280c94f41bdd0f36cbf1bd1edeea (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
{
  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.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 = {};
            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: {});
    };
  };
}