grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / mail / dspam.nix
blob76bcc0af7e8b3a8d3a2758603a63b2a740c49cb4
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.services.dspam;
6   dspam = pkgs.dspam;
8   defaultSock = "/run/dspam/dspam.sock";
10   cfgfile = pkgs.writeText "dspam.conf" ''
11     Home /var/lib/dspam
12     StorageDriver ${dspam}/lib/dspam/lib${cfg.storageDriver}_drv.so
14     Trust root
15     Trust ${cfg.user}
16     SystemLog on
17     UserLog on
19     ${lib.optionalString (cfg.domainSocket != null) ''
20       ServerDomainSocketPath "${cfg.domainSocket}"
21       ClientHost "${cfg.domainSocket}"
22     ''}
24     ${cfg.extraConfig}
25   '';
27 in {
29   ###### interface
31   options = {
33     services.dspam = {
35       enable = lib.mkOption {
36         type = lib.types.bool;
37         default = false;
38         description = "Whether to enable the dspam spam filter.";
39       };
41       user = lib.mkOption {
42         type = lib.types.str;
43         default = "dspam";
44         description = "User for the dspam daemon.";
45       };
47       group = lib.mkOption {
48         type = lib.types.str;
49         default = "dspam";
50         description = "Group for the dspam daemon.";
51       };
53       storageDriver = lib.mkOption {
54         type = lib.types.str;
55         default = "hash";
56         description = "Storage driver backend to use for dspam.";
57       };
59       domainSocket = lib.mkOption {
60         type = lib.types.nullOr lib.types.path;
61         default = defaultSock;
62         description = "Path to local domain socket which is used for communication with the daemon. Set to null to disable UNIX socket.";
63       };
65       extraConfig = lib.mkOption {
66         type = lib.types.lines;
67         default = "";
68         description = "Additional dspam configuration.";
69       };
71       maintenanceInterval = lib.mkOption {
72         type = lib.types.nullOr lib.types.str;
73         default = null;
74         description = "If set, maintenance script will be run at specified (in systemd.timer format) interval";
75       };
77     };
79   };
82   ###### implementation
84   config = lib.mkIf cfg.enable (lib.mkMerge [
85     {
86       users.users = lib.optionalAttrs (cfg.user == "dspam") {
87         dspam = {
88           group = cfg.group;
89           uid = config.ids.uids.dspam;
90         };
91       };
93       users.groups = lib.optionalAttrs (cfg.group == "dspam") {
94         dspam.gid = config.ids.gids.dspam;
95       };
97       environment.systemPackages = [ dspam ];
99       environment.etc."dspam/dspam.conf".source = cfgfile;
101       systemd.services.dspam = {
102         description = "dspam spam filtering daemon";
103         wantedBy = [ "multi-user.target" ];
104         after = [ "postgresql.service" ];
105         restartTriggers = [ cfgfile ];
107         serviceConfig = {
108           ExecStart = "${dspam}/bin/dspam --daemon --nofork";
109           User = cfg.user;
110           Group = cfg.group;
111           RuntimeDirectory = lib.optional (cfg.domainSocket == defaultSock) "dspam";
112           RuntimeDirectoryMode = lib.optional (cfg.domainSocket == defaultSock) "0750";
113           StateDirectory = "dspam";
114           StateDirectoryMode = "0750";
115           LogsDirectory = "dspam";
116           LogsDirectoryMode = "0750";
117           # DSPAM segfaults on just about every error
118           Restart = "on-abort";
119           RestartSec = "1s";
120         };
121       };
122     }
124     (lib.mkIf (cfg.maintenanceInterval != null) {
125       systemd.timers.dspam-maintenance = {
126         description = "Timer for dspam maintenance script";
127         wantedBy = [ "timers.target" ];
128         timerConfig = {
129           OnCalendar = cfg.maintenanceInterval;
130           Unit = "dspam-maintenance.service";
131         };
132       };
134       systemd.services.dspam-maintenance = {
135         description = "dspam maintenance script";
136         restartTriggers = [ cfgfile ];
138         serviceConfig = {
139           ExecStart = "${dspam}/bin/dspam_maintenance --verbose";
140           Type = "oneshot";
141           User = cfg.user;
142           Group = cfg.group;
143         };
144       };
145     })
146   ]);