python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / programs / xfs_quota.nix
bloba1e9ff941c6b8e69e854de974ad6e040876cfaf8
1 # Configuration for the xfs_quota command
3 { config, lib, pkgs, ... }:
5 with lib;
7 let
9   cfg = config.programs.xfs_quota;
11   limitOptions = opts: concatStringsSep " " [
12     (optionalString (opts.sizeSoftLimit != null) "bsoft=${opts.sizeSoftLimit}")
13     (optionalString (opts.sizeHardLimit != null) "bhard=${opts.sizeHardLimit}")
14   ];
20   ###### interface
22   options = {
24     programs.xfs_quota = {
25       projects = mkOption {
26         default = {};
27         type = types.attrsOf (types.submodule {
28           options = {
29             id = mkOption {
30               type = types.int;
31               description = lib.mdDoc "Project ID.";
32             };
34             fileSystem = mkOption {
35               type = types.str;
36               description = lib.mdDoc "XFS filesystem hosting the xfs_quota project.";
37               default = "/";
38             };
40             path = mkOption {
41               type = types.str;
42               description = lib.mdDoc "Project directory.";
43             };
45             sizeSoftLimit = mkOption {
46               type = types.nullOr types.str;
47               default = null;
48               example = "30g";
49               description = lib.mdDoc "Soft limit of the project size";
50             };
52             sizeHardLimit = mkOption {
53               type = types.nullOr types.str;
54               default = null;
55               example = "50g";
56               description = lib.mdDoc "Hard limit of the project size.";
57             };
58           };
59         });
61         description = lib.mdDoc "Setup of xfs_quota projects. Make sure the filesystem is mounted with the pquota option.";
63         example = {
64           projname = {
65             id = 50;
66             path = "/xfsprojects/projname";
67             sizeHardLimit = "50g";
68           };
69         };
70       };
71     };
73   };
76   ###### implementation
78   config = mkIf (cfg.projects != {}) {
80     environment.etc.projects.source = pkgs.writeText "etc-project"
81       (concatStringsSep "\n" (mapAttrsToList
82         (name: opts: "${toString opts.id}:${opts.path}") cfg.projects));
84     environment.etc.projid.source = pkgs.writeText "etc-projid"
85       (concatStringsSep "\n" (mapAttrsToList
86         (name: opts: "${name}:${toString opts.id}") cfg.projects));
88     systemd.services = mapAttrs' (name: opts:
89       nameValuePair "xfs_quota-${name}" {
90         description = "Setup xfs_quota for project ${name}";
91         script = ''
92           ${pkgs.xfsprogs.bin}/bin/xfs_quota -x -c 'project -s ${name}' ${opts.fileSystem}
93           ${pkgs.xfsprogs.bin}/bin/xfs_quota -x -c 'limit -p ${limitOptions opts} ${name}' ${opts.fileSystem}
94         '';
96         wantedBy = [ "multi-user.target" ];
97         after = [ ((replaceChars [ "/" ] [ "-" ] opts.fileSystem) + ".mount") ];
99         restartTriggers = [ config.environment.etc.projects.source ];
101         serviceConfig = {
102           Type = "oneshot";
103           RemainAfterExit = true;
104         };
105       }
106     ) cfg.projects;
108   };