grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / mail / opensmtpd.nix
blob07cf189fb28e5e47c1d3fae764ecc803d20dc44d
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.services.opensmtpd;
5   conf = pkgs.writeText "smtpd.conf" cfg.serverConfiguration;
6   args = lib.concatStringsSep " " cfg.extraServerArgs;
8   sendmail = pkgs.runCommand "opensmtpd-sendmail" { preferLocalBuild = true; } ''
9     mkdir -p $out/bin
10     ln -s ${cfg.package}/sbin/smtpctl $out/bin/sendmail
11   '';
13 in {
15   ###### interface
17   imports = [
18     (lib.mkRenamedOptionModule [ "services" "opensmtpd" "addSendmailToSystemPath" ] [ "services" "opensmtpd" "setSendmail" ])
19   ];
21   options = {
23     services.opensmtpd = {
25       enable = lib.mkOption {
26         type = lib.types.bool;
27         default = false;
28         description = "Whether to enable the OpenSMTPD server.";
29       };
31       package = lib.mkPackageOption pkgs "opensmtpd" { };
33       setSendmail = lib.mkOption {
34         type = lib.types.bool;
35         default = true;
36         description = "Whether to set the system sendmail to OpenSMTPD's.";
37       };
39       extraServerArgs = lib.mkOption {
40         type = lib.types.listOf lib.types.str;
41         default = [];
42         example = [ "-v" "-P mta" ];
43         description = ''
44           Extra command line arguments provided when the smtpd process
45           is started.
46         '';
47       };
49       serverConfiguration = lib.mkOption {
50         type = lib.types.lines;
51         example = ''
52           listen on lo
53           accept for any deliver to lmtp localhost:24
54         '';
55         description = ''
56           The contents of the smtpd.conf configuration file. See the
57           OpenSMTPD documentation for syntax information.
58         '';
59       };
61       procPackages = lib.mkOption {
62         type = lib.types.listOf lib.types.package;
63         default = [];
64         description = ''
65           Packages to search for filters, tables, queues, and schedulers.
67           Add OpenSMTPD-extras here if you want to use the filters, etc. from
68           that package.
69         '';
70       };
71     };
73   };
76   ###### implementation
78   config = lib.mkIf cfg.enable rec {
79     users.groups = {
80       smtpd.gid = config.ids.gids.smtpd;
81       smtpq.gid = config.ids.gids.smtpq;
82     };
84     users.users = {
85       smtpd = {
86         description = "OpenSMTPD process user";
87         uid = config.ids.uids.smtpd;
88         group = "smtpd";
89       };
90       smtpq = {
91         description = "OpenSMTPD queue user";
92         uid = config.ids.uids.smtpq;
93         group = "smtpq";
94       };
95     };
97     security.wrappers.smtpctl = {
98       owner = "root";
99       group = "smtpq";
100       setuid = false;
101       setgid = true;
102       source = "${cfg.package}/bin/smtpctl";
103     };
105     services.mail.sendmailSetuidWrapper = lib.mkIf cfg.setSendmail
106       (security.wrappers.smtpctl // { program = "sendmail"; });
108     systemd.tmpfiles.rules = [
109       "d /var/spool/smtpd 711 root - - -"
110       "d /var/spool/smtpd/offline 770 root smtpq - -"
111       "d /var/spool/smtpd/purge 700 smtpq root - -"
112     ];
114     systemd.services.opensmtpd = let
115       procEnv = pkgs.buildEnv {
116         name = "opensmtpd-procs";
117         paths = [ cfg.package ] ++ cfg.procPackages;
118         pathsToLink = [ "/libexec/opensmtpd" ];
119       };
120     in {
121       wantedBy = [ "multi-user.target" ];
122       after = [ "network.target" ];
123       serviceConfig.ExecStart = "${cfg.package}/sbin/smtpd -d -f ${conf} ${args}";
124       environment.OPENSMTPD_PROC_PATH = "${procEnv}/libexec/opensmtpd";
125     };
126   };