python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / mail / spamassassin.nix
blob49d1d931598566a2e55b2bb8f2b4479cc8780bff
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.spamassassin;
7   spamassassin-local-cf = pkgs.writeText "local.cf" cfg.config;
9 in
12   options = {
14     services.spamassassin = {
15       enable = mkEnableOption (lib.mdDoc "the SpamAssassin daemon");
17       debug = mkOption {
18         type = types.bool;
19         default = false;
20         description = lib.mdDoc "Whether to run the SpamAssassin daemon in debug mode";
21       };
23       config = mkOption {
24         type = types.lines;
25         description = lib.mdDoc ''
26           The SpamAssassin local.cf config
28           If you are using this configuration:
30               add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_
32           Then you can Use this sieve filter:
34               require ["fileinto", "reject", "envelope"];
36               if header :contains "X-Spam-Flag" "YES" {
37                 fileinto "spam";
38               }
40           Or this procmail filter:
42               :0:
43               * ^X-Spam-Flag: YES
44               /var/vpopmail/domains/lastlog.de/js/.maildir/.spam/new
46           To filter your messages based on the additional mail headers added by spamassassin.
47         '';
48         example = ''
49           #rewrite_header Subject [***** SPAM _SCORE_ *****]
50           required_score          5.0
51           use_bayes               1
52           bayes_auto_learn        1
53           add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_
54         '';
55         default = "";
56       };
58       initPreConf = mkOption {
59         type = with types; either str path;
60         description = lib.mdDoc "The SpamAssassin init.pre config.";
61         apply = val: if builtins.isPath val then val else pkgs.writeText "init.pre" val;
62         default =
63         ''
64           #
65           # to update this list, run this command in the rules directory:
66           # grep 'loadplugin.*Mail::SpamAssassin::Plugin::.*' -o -h * | sort | uniq
67           #
69           #loadplugin Mail::SpamAssassin::Plugin::AccessDB
70           #loadplugin Mail::SpamAssassin::Plugin::AntiVirus
71           loadplugin Mail::SpamAssassin::Plugin::AskDNS
72           # loadplugin Mail::SpamAssassin::Plugin::ASN
73           loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
74           #loadplugin Mail::SpamAssassin::Plugin::AWL
75           loadplugin Mail::SpamAssassin::Plugin::Bayes
76           loadplugin Mail::SpamAssassin::Plugin::BodyEval
77           loadplugin Mail::SpamAssassin::Plugin::Check
78           #loadplugin Mail::SpamAssassin::Plugin::DCC
79           loadplugin Mail::SpamAssassin::Plugin::DKIM
80           loadplugin Mail::SpamAssassin::Plugin::DNSEval
81           loadplugin Mail::SpamAssassin::Plugin::FreeMail
82           loadplugin Mail::SpamAssassin::Plugin::Hashcash
83           loadplugin Mail::SpamAssassin::Plugin::HeaderEval
84           loadplugin Mail::SpamAssassin::Plugin::HTMLEval
85           loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
86           loadplugin Mail::SpamAssassin::Plugin::ImageInfo
87           loadplugin Mail::SpamAssassin::Plugin::MIMEEval
88           loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
89           # loadplugin Mail::SpamAssassin::Plugin::PDFInfo
90           #loadplugin Mail::SpamAssassin::Plugin::PhishTag
91           loadplugin Mail::SpamAssassin::Plugin::Pyzor
92           loadplugin Mail::SpamAssassin::Plugin::Razor2
93           # loadplugin Mail::SpamAssassin::Plugin::RelayCountry
94           loadplugin Mail::SpamAssassin::Plugin::RelayEval
95           loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
96           # loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody
97           # loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
98           loadplugin Mail::SpamAssassin::Plugin::SpamCop
99           loadplugin Mail::SpamAssassin::Plugin::SPF
100           #loadplugin Mail::SpamAssassin::Plugin::TextCat
101           # loadplugin Mail::SpamAssassin::Plugin::TxRep
102           loadplugin Mail::SpamAssassin::Plugin::URIDetail
103           loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
104           loadplugin Mail::SpamAssassin::Plugin::URIEval
105           # loadplugin Mail::SpamAssassin::Plugin::URILocalBL
106           loadplugin Mail::SpamAssassin::Plugin::VBounce
107           loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
108           loadplugin Mail::SpamAssassin::Plugin::WLBLEval
109         '';
110       };
111     };
112   };
114   config = mkIf cfg.enable {
115     environment.etc."mail/spamassassin/init.pre".source = cfg.initPreConf;
116     environment.etc."mail/spamassassin/local.cf".source = spamassassin-local-cf;
118     # Allow users to run 'spamc'.
119     environment.systemPackages = [ pkgs.spamassassin ];
121     users.users.spamd = {
122       description = "Spam Assassin Daemon";
123       uid = config.ids.uids.spamd;
124       group = "spamd";
125     };
127     users.groups.spamd = {
128       gid = config.ids.gids.spamd;
129     };
131     systemd.services.sa-update = {
132       # Needs to be able to contact the update server.
133       wants = [ "network-online.target" ];
134       after = [ "network-online.target" ];
136       serviceConfig = {
137         Type = "oneshot";
138         User = "spamd";
139         Group = "spamd";
140         StateDirectory = "spamassassin";
141         ExecStartPost = "+${config.systemd.package}/bin/systemctl -q --no-block try-reload-or-restart spamd.service";
142       };
144       script = ''
145         set +e
146         ${pkgs.spamassassin}/bin/sa-update --verbose --gpghomedir=/var/lib/spamassassin/sa-update-keys/
147         rc=$?
148         set -e
150         if [[ $rc -gt 1 ]]; then
151           # sa-update failed.
152           exit $rc
153         fi
155         if [[ $rc -eq 1 ]]; then
156           # No update was available, exit successfully.
157           exit 0
158         fi
160         # An update was available and installed. Compile the rules.
161         ${pkgs.spamassassin}/bin/sa-compile
162       '';
163     };
165     systemd.timers.sa-update = {
166       description = "sa-update-service";
167       partOf      = [ "sa-update.service" ];
168       wantedBy    = [ "timers.target" ];
169       timerConfig = {
170         OnCalendar = "1:*";
171         Persistent = true;
172       };
173     };
175     systemd.services.spamd = {
176       description = "SpamAssassin Server";
178       wantedBy = [ "multi-user.target" ];
179       wants = [ "sa-update.service" ];
180       after = [
181         "network.target"
182         "sa-update.service"
183       ];
185       serviceConfig = {
186         User = "spamd";
187         Group = "spamd";
188         ExecStart = "+${pkgs.spamassassin}/bin/spamd ${optionalString cfg.debug "-D"} --username=spamd --groupname=spamd --virtual-config-dir=%S/spamassassin/user-%u --allow-tell --pidfile=/run/spamd.pid";
189         ExecReload = "+${pkgs.coreutils}/bin/kill -HUP $MAINPID";
190         StateDirectory = "spamassassin";
191       };
192     };
193   };