From f2730d881b18e114e36b627639eeb5e14a355877 Mon Sep 17 00:00:00 2001 From: Sean Haugh Date: Fri, 14 Dec 2018 12:25:27 -0600 Subject: [PATCH] nixos/davmail: init Co-authored-by: Aaron Andersen Co-authored-by: Silvan Mosberger --- nixos/modules/module-list.nix | 1 + nixos/modules/services/mail/davmail.nix | 91 +++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 nixos/modules/services/mail/davmail.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 5ffb0c5ab223..c7850ad2bb30 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -316,6 +316,7 @@ ./services/logging/syslog-ng.nix ./services/logging/syslogd.nix ./services/mail/clamsmtp.nix + ./services/mail/davmail.nix ./services/mail/dkimproxy-out.nix ./services/mail/dovecot.nix ./services/mail/dspam.nix diff --git a/nixos/modules/services/mail/davmail.nix b/nixos/modules/services/mail/davmail.nix new file mode 100644 index 000000000000..a0cb81f84dac --- /dev/null +++ b/nixos/modules/services/mail/davmail.nix @@ -0,0 +1,91 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.davmail; + + configType = with types; + either (either (attrsOf configType) str) (either int bool) // { + description = "davmail config type (str, int, bool or attribute set thereof)"; + }; + + toStr = val: if isBool val then boolToString val else toString val; + + linesForAttrs = attrs: concatMap (name: let value = attrs.${name}; in + if isAttrs value + then map (line: name + "." + line) (linesForAttrs value) + else [ "${name}=${toStr value}" ] + ) (attrNames attrs); + + configFile = pkgs.writeText "davmail.properties" (concatStringsSep "\n" (linesForAttrs cfg.config)); + +in + + { + options.services.davmail = { + enable = mkEnableOption "davmail, an MS Exchange gateway"; + + url = mkOption { + type = types.str; + description = "Outlook Web Access URL to access the exchange server, i.e. the base webmail URL."; + example = "https://outlook.office365.com/EWS/Exchange.asmx"; + }; + + config = mkOption { + type = configType; + default = {}; + description = '' + Davmail configuration. Refer to + + and + for details on supported values. + ''; + example = literalExample '' + { + davmail.allowRemote = true; + davmail.imapPort = 55555; + davmail.bindAddress = "10.0.1.2"; + davmail.smtpSaveInSent = true; + davmail.folderSizeLimit = 10; + davmail.caldavAutoSchedule = false; + log4j.logger.rootLogger = "DEBUG"; + } + ''; + }; + }; + + config = mkIf cfg.enable { + + services.davmail.config.davmail = mapAttrs (name: mkDefault) { + server = true; + disableUpdateCheck = true; + logFilePath = "/var/log/davmail/davmail.log"; + logFileSize = "1MB"; + mode = "auto"; + url = cfg.url; + caldavPort = 1080; + imapPort = 1143; + ldapPort = 1389; + popPort = 1110; + smtpPort = 1025; + }; + + systemd.services.davmail = { + description = "DavMail POP/IMAP/SMTP Exchange Gateway"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Type = "simple"; + ExecStart = "${pkgs.davmail}/bin/davmail ${configFile}"; + Restart = "on-failure"; + DynamicUser = "yes"; + LogsDirectory = "davmail"; + }; + }; + + environment.systemPackages = [ pkgs.davmail ]; + }; + }