Merge pull request #103902 from pkern/spamassassin

nixos/spamassassin: Avoid network dependency on boot

Changed files
+38 -31
nixos
modules
services
pkgs
servers
mail
spamassassin
+36 -29
nixos/modules/services/mail/spamassassin.nix
···
};
systemd.services.sa-update = {
+
# Needs to be able to contact the update server.
+
wants = [ "network-online.target" ];
+
after = [ "network-online.target" ];
+
+
serviceConfig = {
+
Type = "oneshot";
+
User = "spamd";
+
Group = "spamd";
+
StateDirectory = "spamassassin";
+
ExecStartPost = "+${pkgs.systemd}/bin/systemctl -q --no-block try-reload-or-restart spamd.service";
+
};
+
script = ''
set +e
-
${pkgs.su}/bin/su -s "${pkgs.bash}/bin/bash" -c "${pkgs.spamassassin}/bin/sa-update --gpghomedir=/var/lib/spamassassin/sa-update-keys/" spamd
+
${pkgs.spamassassin}/bin/sa-update --verbose --gpghomedir=/var/lib/spamassassin/sa-update-keys/
+
rc=$?
+
set -e
-
v=$?
-
set -e
-
if [ $v -gt 1 ]; then
-
echo "sa-update execution error"
-
exit $v
+
if [[ $rc -gt 1 ]]; then
+
# sa-update failed.
+
exit $rc
fi
-
if [ $v -eq 0 ]; then
-
systemctl reload spamd.service
+
+
if [[ $rc -eq 1 ]]; then
+
# No update was available, exit successfully.
+
exit 0
fi
+
+
# An update was available and installed. Compile the rules.
+
${pkgs.spamassassin}/bin/sa-compile
'';
};
···
};
systemd.services.spamd = {
-
description = "Spam Assassin Server";
+
description = "SpamAssassin Server";
wantedBy = [ "multi-user.target" ];
-
after = [ "network.target" ];
+
wants = [ "sa-update.service" ];
+
after = [
+
"network.target"
+
"sa-update.service"
+
];
serviceConfig = {
-
ExecStart = "${pkgs.spamassassin}/bin/spamd ${optionalString cfg.debug "-D"} --username=spamd --groupname=spamd --virtual-config-dir=/var/lib/spamassassin/user-%u --allow-tell --pidfile=/run/spamd.pid";
-
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+
User = "spamd";
+
Group = "spamd";
+
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";
+
ExecReload = "+${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+
StateDirectory = "spamassassin";
};
-
-
# 0 and 1 no error, exitcode > 1 means error:
-
# https://spamassassin.apache.org/full/3.1.x/doc/sa-update.html#exit_codes
-
preStart = ''
-
echo "Recreating '/var/lib/spamasassin' with creating '3.004001' (or similar) and 'sa-update-keys'"
-
mkdir -p /var/lib/spamassassin
-
chown spamd:spamd /var/lib/spamassassin -R
-
set +e
-
${pkgs.su}/bin/su -s "${pkgs.bash}/bin/bash" -c "${pkgs.spamassassin}/bin/sa-update --gpghomedir=/var/lib/spamassassin/sa-update-keys/" spamd
-
v=$?
-
set -e
-
if [ $v -gt 1 ]; then
-
echo "sa-update execution error"
-
exit $v
-
fi
-
chown spamd:spamd /var/lib/spamassassin -R
-
'';
};
};
}
+2 -2
pkgs/servers/mail/spamassassin/default.nix
···
-
{ lib, fetchurl, perlPackages, makeWrapper, gnupg }:
+
{ lib, fetchurl, perlPackages, makeWrapper, gnupg, re2c, gcc, gnumake }:
perlPackages.buildPerlPackage rec {
pname = "SpamAssassin";
···
mv "rules/"* $out/share/spamassassin/
for n in "$out/bin/"*; do
-
wrapProgram "$n" --prefix PERL5LIB : "$PERL5LIB" --prefix PATH : "${gnupg}/bin"
+
wrapProgram "$n" --prefix PERL5LIB : "$PERL5LIB" --prefix PATH : ${lib.makeBinPath [ gnupg re2c gcc gnumake ]}
done
'';