grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / ananicy.nix
blob2129868a2919b7d992fb370e93b84edeac6402c3
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   cfg = config.services.ananicy;
10   configFile = pkgs.writeText "ananicy.conf" (lib.generators.toKeyValue { } cfg.settings);
11   extraRules = pkgs.writeText "extraRules" (
12     lib.concatMapStringsSep "\n" (l: builtins.toJSON l) cfg.extraRules
13   );
14   extraTypes = pkgs.writeText "extraTypes" (
15     lib.concatMapStringsSep "\n" (l: builtins.toJSON l) cfg.extraTypes
16   );
17   extraCgroups = pkgs.writeText "extraCgroups" (
18     lib.concatMapStringsSep "\n" (l: builtins.toJSON l) cfg.extraCgroups
19   );
20   servicename =
21     if ((lib.getName cfg.package) == (lib.getName pkgs.ananicy-cpp)) then "ananicy-cpp" else "ananicy";
22   # Ananicy-CPP with BPF is not supported on hardened kernels https://github.com/NixOS/nixpkgs/issues/327382
23   finalPackage =
24     if (servicename == "ananicy-cpp" && config.boot.kernelPackages.isHardened) then
25       (cfg.package { withBpf = false; })
26     else
27       cfg.package;
30   options.services.ananicy = {
31     enable = lib.mkEnableOption "Ananicy, an auto nice daemon";
33     package = lib.mkPackageOption pkgs "ananicy" { example = "ananicy-cpp"; };
35     rulesProvider = lib.mkPackageOption pkgs "ananicy" { example = "ananicy-cpp"; } // {
36       description = ''
37         Which package to copy default rules,types,cgroups from.
38       '';
39     };
41     settings = lib.mkOption {
42       type =
43         with lib.types;
44         attrsOf (oneOf [
45           int
46           bool
47           str
48         ]);
49       default = { };
50       example = {
51         apply_nice = false;
52       };
53       description = ''
54         See <https://github.com/Nefelim4ag/Ananicy/blob/master/ananicy.d/ananicy.conf>
55       '';
56     };
58     extraRules = lib.mkOption {
59       type = with lib.types; listOf attrs;
60       default = [ ];
61       description = ''
62         Rules to write in 'nixRules.rules'. See:
63         <https://github.com/Nefelim4ag/Ananicy#configuration>
64         <https://gitlab.com/ananicy-cpp/ananicy-cpp/#global-configuration>
65       '';
66       example = [
67         {
68           name = "eog";
69           type = "Image-Viewer";
70         }
71         {
72           name = "fdupes";
73           type = "BG_CPUIO";
74         }
75       ];
76     };
77     extraTypes = lib.mkOption {
78       type = with lib.types; listOf attrs;
79       default = [ ];
80       description = ''
81         Types to write in 'nixTypes.types'. See:
82         <https://gitlab.com/ananicy-cpp/ananicy-cpp/#types>
83       '';
84       example = [
85         {
86           type = "my_type";
87           nice = 19;
88           other_parameter = "value";
89         }
90         {
91           type = "compiler";
92           nice = 19;
93           sched = "batch";
94           ioclass = "idle";
95         }
96       ];
97     };
98     extraCgroups = lib.mkOption {
99       type = with lib.types; listOf attrs;
100       default = [ ];
101       description = ''
102         Cgroups to write in 'nixCgroups.cgroups'. See:
103         <https://gitlab.com/ananicy-cpp/ananicy-cpp/#cgroups>
104       '';
105       example = [
106         {
107           cgroup = "cpu80";
108           CPUQuota = 80;
109         }
110       ];
111     };
112   };
114   config = lib.mkIf cfg.enable {
115     environment = {
116       systemPackages = [ finalPackage ];
117       etc."ananicy.d".source = pkgs.runCommandLocal "ananicyfiles" { } ''
118         mkdir -p $out
119         # ananicy-cpp does not include rules or settings on purpose
120         if [[ -d "${cfg.rulesProvider}/etc/ananicy.d/00-default" ]]; then
121           cp -r ${cfg.rulesProvider}/etc/ananicy.d/* $out
122         else
123           cp -r ${cfg.rulesProvider}/* $out
124         fi
126         # configured through .setings
127         rm -f $out/ananicy.conf
128         cp ${configFile} $out/ananicy.conf
129         ${lib.optionalString (cfg.extraRules != [ ]) "cp ${extraRules} $out/nixRules.rules"}
130         ${lib.optionalString (cfg.extraTypes != [ ]) "cp ${extraTypes} $out/nixTypes.types"}
131         ${lib.optionalString (cfg.extraCgroups != [ ]) "cp ${extraCgroups} $out/nixCgroups.cgroups"}
132       '';
133     };
135     # ananicy and ananicy-cpp have different default settings
136     services.ananicy.settings =
137       let
138         mkOD = lib.mkOptionDefault;
139       in
140       {
141         cgroup_load = mkOD true;
142         type_load = mkOD true;
143         rule_load = mkOD true;
144         apply_nice = mkOD true;
145         apply_ioclass = mkOD true;
146         apply_ionice = mkOD true;
147         apply_sched = mkOD true;
148         apply_oom_score_adj = mkOD true;
149         apply_cgroup = mkOD true;
150       }
151       // (
152         if servicename == "ananicy-cpp" then
153           {
154             # https://gitlab.com/ananicy-cpp/ananicy-cpp/-/blob/master/src/config.cpp#L12
155             loglevel = mkOD "warn"; # default is info but its spammy
156             cgroup_realtime_workaround = true;
157             log_applied_rule = mkOD false;
158           }
159         else
160           {
161             # https://github.com/Nefelim4ag/Ananicy/blob/master/ananicy.d/ananicy.conf
162             check_disks_schedulers = mkOD true;
163             check_freq = mkOD 5;
164           }
165       );
167     systemd = {
168       packages = [ finalPackage ];
169       services."${servicename}" = {
170         wantedBy = [ "default.target" ];
171       };
172     };
173   };
175   meta.maintainers = with lib.maintainers; [ artturin ];