···
stateDir = "/var/lib/clamav";
+
runDir = "/var/run/clamav";
+
logDir = "/var/log/clamav";
clamavGroup = clamavUser;
cfg = config.services.clamav;
+
clamdConfigFile = pkgs.writeText "clamd.conf" ''
+
DatabaseDirectory ${stateDir}
+
LocalSocket ${runDir}/clamd.ctl
+
LogFile ${logDir}/clamav.log
+
PidFile ${runDir}/clamd.pid
+
${cfg.daemon.extraConfig}
+
enable = mkEnableOption "clamd daemon";
+
extraConfig = mkOption {
+
Extra configuration for clamd. Contents will be added verbatim to the
+
enable = mkEnableOption "freshclam updater";
···
+
config = mkIf cfg.updater.enable or cfg.daemon.enable {
environment.systemPackages = [ pkgs.clamav ];
+
users.extraUsers = singleton {
+
uid = config.ids.uids.clamav;
+
description = "ClamAV daemon user";
+
users.extraGroups = singleton {
+
gid = config.ids.gids.clamav;
+
services.clamav.updater.config = mkIf cfg.updater.enable ''
DatabaseDirectory ${stateDir}
Checks ${toString cfg.updater.frequency}
DatabaseMirror database.clamav.net
+
systemd.services.clamd = mkIf cfg.daemon.enable {
+
description = "ClamAV daemon (clamd)";
+
path = [ pkgs.clamav ];
+
after = [ "network.target" "freshclam.service" ];
+
requires = [ "freshclam.service" ];
+
wantedBy = [ "multi-user.target" ];
+
mkdir -m 0755 -p ${logDir}
+
mkdir -m 0755 -p ${runDir}
+
chown ${clamavUser}:${clamavGroup} ${logDir}
+
chown ${clamavUser}:${clamavGroup} ${runDir}
+
ExecStart = "${pkgs.clamav}/bin/clamd --config-file=${clamdConfigFile}";
+
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+
Restart = "on-failure";
+
StartLimitInterval = "1min";
+
systemd.services.freshclam = mkIf cfg.updater.enable {
+
description = "ClamAV updater (freshclam)";
+
after = [ "network.target" ];
+
wantedBy = [ "multi-user.target" ];
+
path = [ pkgs.clamav ];
+
mkdir -m 0755 -p ${stateDir}
+
chown ${clamavUser}:${clamavGroup} ${stateDir}
+
ExecStart = "${pkgs.clamav}/bin/freshclam --daemon --config-file=${pkgs.writeText "freshclam.conf" cfg.updater.config}";
+
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+
Restart = "on-failure";
+
StartLimitInterval = "1min";