summary refs log tree commit diff
path: root/modules/services/scheduling/cron.nix
blob: e769caefdf596b513964fd7d8e93b9dc23b1cd79 (plain) (blame)
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
91
92
93
94
{ config, pkgs, ... }:

with pkgs.lib;

let

  inherit (config.services) jobsTags;

  # Put all the system cronjobs together.
  systemCronJobsFile = pkgs.writeText "system-crontab"
    ''
      SHELL=${pkgs.bash}/bin/bash
      PATH=${config.system.path}/bin:${config.system.path}/sbin
      MAILTO="${config.services.cron.mailto}"
      NIX_CONF_DIR=/nix/etc/nix
      ${pkgs.lib.concatStrings (map (job: job + "\n") config.services.cron.systemCronJobs)}
    '';
  
in

{

  ###### interface

  options = {
  
    services.cron = {

      mailto = mkOption {
        default = "";
        description = " The job output will be mailed to this email address. ";
      };

      systemCronJobs = mkOption {
        default = [];
        example = [
          "* * * * *  test   ls -l / > /tmp/cronout 2>&1"
          "* * * * *  eelco  echo Hello World > /home/eelco/cronout"
        ];
        description = ''
          A list of Cron jobs to be appended to the system-wide
          crontab.  See the manual page for crontab for the expected
          format. If you want to get the results mailed you must setuid
          sendmail. See <option>security.setuidOwners</option>

          If neither /var/cron/cron.deny nor /var/cron/cron.allow exist only root
          will is allowed to have its own crontab file. The /var/cron/cron.deny file
          is created automatically for you. So every user can use a crontab.
        '';
      };

    };
    
  };


  ###### implementation

  config = {  

    environment.etc = singleton
      # The system-wide crontab.
      { source = systemCronJobsFile;
        target = "crontab";
        mode = "0600"; # Cron requires this.
      };

    environment.systemPackages = [pkgs.cron];

    jobs.cron =
      { description = "Cron daemon";

        startOn = "startup";
 
        # Needed to interpret times in the local timezone.
        environment = { TZ = config.time.timeZone; };

        preStart =
          ''
            mkdir -m 710 -p /var/cron

            # By default, allow all users to create a crontab.  This
            # is denoted by the existence of an empty cron.deny file.
            if ! test -e /var/cron/cron.allow -o -e /var/cron/cron.deny; then
                touch /var/cron/cron.deny
            fi
          '';

        exec = "${pkgs.cron}/sbin/cron -n";
      };

  };
  
}