vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / sitespeed-io.nix
blob2af12ac0be520b1fb327337d1b009efd1b4ef606
1 { lib, config, pkgs, ... }:
2 let
3   cfg = config.services.sitespeed-io;
4   format = pkgs.formats.json { };
5 in
7   options.services.sitespeed-io = {
8     enable = lib.mkEnableOption "Sitespeed.io";
10     user = lib.mkOption {
11       type = lib.types.str;
12       default = "sitespeed-io";
13       description = "User account under which sitespeed-io runs.";
14     };
16     package = lib.mkOption {
17       type = lib.types.package;
18       default = pkgs.sitespeed-io;
19       defaultText = "pkgs.sitespeed-io";
20       description = "Sitespeed.io package to use.";
21     };
23     dataDir = lib.mkOption {
24       default = "/var/lib/sitespeed-io";
25       type = lib.types.str;
26       description = "The base sitespeed-io data directory.";
27     };
29     period = lib.mkOption {
30       type = lib.types.str;
31       default = "hourly";
32       description = ''
33         Systemd calendar expression when to run. See {manpage}`systemd.time(7)`.
34       '';
35     };
37     runs = lib.mkOption {
38       default = [ ];
39       description = ''
40         A list of run configurations. The service will call sitespeed-io once
41         for every run listed here. This lets you examine different websites
42         with different sitespeed-io settings.
43       '';
44       type = lib.types.listOf (lib.types.submodule {
45         options = {
46           urls = lib.mkOption {
47             type = with lib.types; listOf str;
48             default = [];
49             description = ''
50               URLs the service should monitor.
51             '';
52           };
54           settings = lib.mkOption {
55             type = lib.types.submodule {
56               freeformType = format.type;
57               options = { };
58             };
59             default = { };
60             description = ''
61               Configuration for sitespeed-io, see
62               <https://www.sitespeed.io/documentation/sitespeed.io/configuration/>
63               for available options. The value here will be directly transformed to
64               JSON and passed as `--config` to the program.
65             '';
66           };
68           extraArgs = lib.mkOption {
69             type = with lib.types; listOf str;
70             default = [];
71             description = ''
72               Extra command line arguments to pass to the program.
73             '';
74           };
75         };
76       });
77     };
78   };
80   config = lib.mkIf cfg.enable {
81     assertions = [
82     {
83       assertion = cfg.runs != [];
84       message = "At least one run must be configured.";
85     }
86     {
87       assertion = lib.all (run: run.urls != []) cfg.runs;
88       message = "All runs must have at least one url configured.";
89     }
90   ];
92     systemd.services.sitespeed-io = {
93       description = "Check website status";
94       startAt = cfg.period;
95       serviceConfig = {
96         WorkingDirectory = cfg.dataDir;
97         User = cfg.user;
98       };
99       preStart = "chmod u+w -R ${cfg.dataDir}"; # Make sure things are writable
100       script = (lib.concatMapStrings (run: ''
101         ${lib.getExe cfg.package} \
102           --config ${format.generate "sitespeed.json" run.settings} \
103           ${lib.escapeShellArgs run.extraArgs} \
104           ${builtins.toFile "urls.txt" (lib.concatLines run.urls)} &
105       '') cfg.runs) +
106       ''
107         wait
108       '';
109     };
111     users = {
112       extraUsers.${cfg.user} = {
113         isSystemUser = true;
114         group = cfg.user;
115         home = cfg.dataDir;
116         createHome = true;
117         homeMode = "755";
118       };
119       extraGroups.${cfg.user} = { };
120     };
121   };