nixos/preload: init
[NixPkgs.git] / nixos / modules / services / development / distccd.nix
bloba3c909eb1959a1c48c6dcc0b9b9e37920040643e
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.distccd;
7 in
9   options = {
10     services.distccd = {
11       enable = mkEnableOption (lib.mdDoc "distccd");
13       allowedClients = mkOption {
14         type = types.listOf types.str;
15         default = [ "127.0.0.1" ];
16         example = [ "127.0.0.1" "192.168.0.0/24" "10.0.0.0/24" ];
17         description = lib.mdDoc ''
18           Client IPs which are allowed to connect to distccd in CIDR notation.
20           Anyone who can connect to the distccd server can run arbitrary
21           commands on that system as the distcc user, therefore you should use
22           this judiciously.
23         '';
24       };
26       jobTimeout = mkOption {
27         type = types.nullOr types.int;
28         default = null;
29         description = lib.mdDoc ''
30           Maximum duration, in seconds, of a single compilation request.
31         '';
32       };
34       logLevel = mkOption {
35         type = types.nullOr (types.enum [ "critical" "error" "warning" "notice" "info" "debug" ]);
36         default = "warning";
37         description = lib.mdDoc ''
38           Set the minimum severity of error that will be included in the log
39           file. Useful if you only want to see error messages rather than an
40           entry for each connection.
41         '';
42       };
44       maxJobs = mkOption {
45         type = types.nullOr types.int;
46         default = null;
47         description = lib.mdDoc ''
48           Maximum number of tasks distccd should execute at any time.
49         '';
50       };
53       nice = mkOption {
54         type = types.nullOr types.int;
55         default = null;
56         description = lib.mdDoc ''
57           Niceness of the compilation tasks.
58         '';
59       };
61       openFirewall = mkOption {
62         type = types.bool;
63         default = false;
64         description = lib.mdDoc ''
65           Opens the specified TCP port for distcc.
66         '';
67       };
69       package = mkOption {
70         type = types.package;
71         default = pkgs.distcc;
72         defaultText = literalExpression "pkgs.distcc";
73         description = lib.mdDoc ''
74           The distcc package to use.
75         '';
76       };
78       port = mkOption {
79         type = types.port;
80         default = 3632;
81         description = lib.mdDoc ''
82           The TCP port which distccd will listen on.
83         '';
84       };
86       stats = {
87         enable = mkEnableOption (lib.mdDoc "statistics reporting via HTTP server");
88         port = mkOption {
89           type = types.port;
90           default = 3633;
91           description = lib.mdDoc ''
92             The TCP port which the distccd statistics HTTP server will listen
93             on.
94           '';
95         };
96       };
98       zeroconf = mkOption {
99         type = types.bool;
100         default = false;
101         description = lib.mdDoc ''
102           Whether to register via mDNS/DNS-SD
103         '';
104       };
105     };
106   };
108   config = mkIf cfg.enable {
109     networking.firewall = mkIf cfg.openFirewall {
110       allowedTCPPorts = [ cfg.port ]
111         ++ optionals cfg.stats.enable [ cfg.stats.port ];
112     };
114     systemd.services.distccd = {
115       after = [ "network.target" ];
116       wantedBy = [ "multi-user.target" ];
118       description = "Distributed C, C++ and Objective-C compiler";
119       documentation = [ "man:distccd(1)" ];
121       serviceConfig = {
122         User = "distcc";
123         Group = "distcc";
124         # FIXME: I'd love to get rid of `--enable-tcp-insecure` here, but I'm
125         # not sure how I'm supposed to get distccd to "accept" running a binary
126         # (the compiler) that's outside of /usr/lib.
127         ExecStart = pkgs.writeShellScript "start-distccd" ''
128           export PATH="${pkgs.distccMasquerade}/bin"
129           ${cfg.package}/bin/distccd \
130             --no-detach \
131             --daemon \
132             --enable-tcp-insecure \
133             --port ${toString cfg.port} \
134             ${optionalString (cfg.jobTimeout != null) "--job-lifetime ${toString cfg.jobTimeout}"} \
135             ${optionalString (cfg.logLevel != null) "--log-level ${cfg.logLevel}"} \
136             ${optionalString (cfg.maxJobs != null) "--jobs ${toString cfg.maxJobs}"} \
137             ${optionalString (cfg.nice != null) "--nice ${toString cfg.nice}"} \
138             ${optionalString cfg.stats.enable "--stats"} \
139             ${optionalString cfg.stats.enable "--stats-port ${toString cfg.stats.port}"} \
140             ${optionalString cfg.zeroconf "--zeroconf"} \
141             ${concatMapStrings (c: "--allow ${c} ") cfg.allowedClients}
142         '';
143       };
144     };
146     users = {
147       groups.distcc.gid = config.ids.gids.distcc;
148       users.distcc = {
149         description = "distccd user";
150         group = "distcc";
151         uid = config.ids.uids.distcc;
152       };
153     };
154   };