vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / exporters / postfix.nix
blob7aa3622f16d6221b22806991d6cf441e696f3f84
1 { config, lib, pkgs, options, ... }:
3 let
4   cfg = config.services.prometheus.exporters.postfix;
5   inherit (lib)
6     mkOption
7     types
8     mkIf
9     escapeShellArg
10     concatStringsSep
11     optional
12     ;
15   port = 9154;
16   extraOpts = {
17     group = mkOption {
18       type = types.str;
19       description = ''
20         Group under which the postfix exporter shall be run.
21         It should match the group that is allowed to access the
22         `showq` socket in the `queue/public/` directory.
23         Defaults to `services.postfix.setgidGroup` when postfix is enabled.
24       '';
25     };
26     telemetryPath = mkOption {
27       type = types.str;
28       default = "/metrics";
29       description = ''
30         Path under which to expose metrics.
31       '';
32     };
33     logfilePath = mkOption {
34       type = types.path;
35       default = "/var/log/postfix_exporter_input.log";
36       example = "/var/log/mail.log";
37       description = ''
38         Path where Postfix writes log entries.
39         This file will be truncated by this exporter!
40       '';
41     };
42     showqPath = mkOption {
43       type = types.path;
44       default = "/var/lib/postfix/queue/public/showq";
45       example = "/var/spool/postfix/public/showq";
46       description = ''
47         Path where Postfix places its showq socket.
48       '';
49     };
50     systemd = {
51       enable = mkOption {
52         type = types.bool;
53         default = true;
54         description = ''
55           Whether to enable reading metrics from the systemd journal instead of from a logfile
56         '';
57       };
58       unit = mkOption {
59         type = types.str;
60         default = "postfix.service";
61         description = ''
62           Name of the postfix systemd unit.
63         '';
64       };
65       slice = mkOption {
66         type = types.nullOr types.str;
67         default = null;
68         description = ''
69           Name of the postfix systemd slice.
70           This overrides the {option}`systemd.unit`.
71         '';
72       };
73       journalPath = mkOption {
74         type = types.nullOr types.path;
75         default = null;
76         description = ''
77           Path to the systemd journal.
78         '';
79       };
80     };
81   };
82   serviceOpts = {
83     after = mkIf cfg.systemd.enable [ cfg.systemd.unit ];
84     serviceConfig = {
85       DynamicUser = false;
86       # By default, each prometheus exporter only gets AF_INET & AF_INET6,
87       # but AF_UNIX is needed to read from the `showq`-socket.
88       RestrictAddressFamilies = [ "AF_UNIX" ];
89       SupplementaryGroups = mkIf cfg.systemd.enable [ "systemd-journal" ];
90       ExecStart = ''
91         ${pkgs.prometheus-postfix-exporter}/bin/postfix_exporter \
92           --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
93           --web.telemetry-path ${cfg.telemetryPath} \
94           --postfix.showq_path ${escapeShellArg cfg.showqPath} \
95           ${concatStringsSep " \\\n  " (cfg.extraFlags
96           ++ optional cfg.systemd.enable "--systemd.enable"
97           ++ optional cfg.systemd.enable (if cfg.systemd.slice != null
98                                           then "--systemd.slice ${cfg.systemd.slice}"
99                                           else "--systemd.unit ${cfg.systemd.unit}")
100           ++ optional (cfg.systemd.enable && (cfg.systemd.journalPath != null))
101                        "--systemd.journal_path ${escapeShellArg cfg.systemd.journalPath}"
102           ++ optional (!cfg.systemd.enable) "--postfix.logfile_path ${escapeShellArg cfg.logfilePath}")}
103       '';
104     };
105   };