vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / scheduling / fcron.nix
blobdb627841526e2c37f8ee3a24e47eb9e42f53706e
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   cfg = config.services.fcron;
9   queuelen = optionalString (cfg.queuelen != null) "-q ${toString cfg.queuelen}";
11   # Duplicate code, also found in cron.nix. Needs deduplication.
12   systemCronJobs =
13     ''
14       SHELL=${pkgs.bash}/bin/bash
15       PATH=${config.system.path}/bin:${config.system.path}/sbin
16       ${optionalString (config.services.cron.mailto != null) ''
17         MAILTO="${config.services.cron.mailto}"
18       ''}
19       NIX_CONF_DIR=/etc/nix
20       ${lib.concatStrings (map (job: job + "\n") config.services.cron.systemCronJobs)}
21     '';
23   allowdeny = target: users:
24     { source = pkgs.writeText "fcron.${target}" (concatStringsSep "\n" users);
25       target = "fcron.${target}";
26       mode = "644";
27       gid = config.ids.gids.fcron;
28     };
34   ###### interface
36   options = {
38     services.fcron = {
40       enable = mkOption {
41         type = types.bool;
42         default = false;
43         description = "Whether to enable the {command}`fcron` daemon.";
44       };
46       allow = mkOption {
47         type = types.listOf types.str;
48         default = [ "all" ];
49         description = ''
50           Users allowed to use fcrontab and fcrondyn (one name per
51           line, `all` for everyone).
52         '';
53       };
55       deny = mkOption {
56         type = types.listOf types.str;
57         default = [];
58         description = "Users forbidden from using fcron.";
59       };
61       maxSerialJobs = mkOption {
62         type = types.int;
63         default = 1;
64         description = "Maximum number of serial jobs which can run simultaneously.";
65       };
67       queuelen = mkOption {
68         type = types.nullOr types.int;
69         default = null;
70         description = "Number of jobs the serial queue and the lavg queue can contain.";
71       };
73       systab = mkOption {
74         type = types.lines;
75         default = "";
76         description = ''The "system" crontab contents.'';
77       };
78     };
80   };
83   ###### implementation
85   config = mkIf cfg.enable {
87     services.fcron.systab = systemCronJobs;
89     environment.etc = listToAttrs
90       (map (x: { name = x.target; value = x; })
91       [ (allowdeny "allow" (cfg.allow))
92         (allowdeny "deny" cfg.deny)
93         # see man 5 fcron.conf
94         { source =
95             let
96               isSendmailWrapped =
97                 lib.hasAttr "sendmail" config.security.wrappers;
98               sendmailPath =
99                 if isSendmailWrapped then "/run/wrappers/bin/sendmail"
100                 else "${config.system.path}/bin/sendmail";
101             in
102             pkgs.writeText "fcron.conf" ''
103               fcrontabs   =       /var/spool/fcron
104               pidfile     =       /run/fcron.pid
105               fifofile    =       /run/fcron.fifo
106               fcronallow  =       /etc/fcron.allow
107               fcrondeny   =       /etc/fcron.deny
108               shell       =       /bin/sh
109               sendmail    =       ${sendmailPath}
110               editor      =       ${pkgs.vim}/bin/vim
111             '';
112           target = "fcron.conf";
113           gid = config.ids.gids.fcron;
114           mode = "0644";
115         }
116       ]);
118     environment.systemPackages = [ pkgs.fcron ];
119     users.users.fcron = {
120       uid = config.ids.uids.fcron;
121       home = "/var/spool/fcron";
122       group = "fcron";
123     };
124     users.groups.fcron.gid = config.ids.gids.fcron;
126     security.wrappers = {
127       fcrontab = {
128         source = "${pkgs.fcron}/bin/fcrontab";
129         owner = "fcron";
130         group = "fcron";
131         setgid = true;
132         setuid = true;
133       };
134       fcrondyn = {
135         source = "${pkgs.fcron}/bin/fcrondyn";
136         owner = "fcron";
137         group = "fcron";
138         setgid = true;
139         setuid = false;
140       };
141       fcronsighup = {
142         source = "${pkgs.fcron}/bin/fcronsighup";
143         owner = "root";
144         group = "fcron";
145         setuid = true;
146       };
147     };
148     systemd.services.fcron = {
149       description = "fcron daemon";
150       wantedBy = [ "multi-user.target" ];
152       path = [ pkgs.fcron ];
154       preStart = ''
155         install \
156           --mode 0770 \
157           --owner fcron \
158           --group fcron \
159           --directory /var/spool/fcron
160         # load system crontab file
161         /run/wrappers/bin/fcrontab -u systab - < ${pkgs.writeText "systab" cfg.systab}
162       '';
164       serviceConfig = {
165         Type = "forking";
166         ExecStart = "${pkgs.fcron}/sbin/fcron -m ${toString cfg.maxSerialJobs} ${queuelen}";
167       };
168     };
169   };