From 5fdb6b7d2f6a4276ef958c2bb01b54dd2510a2d2 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Tue, 4 Mar 2025 00:04:25 -0600 Subject: [PATCH] add email stubs --- home/default.nix | 1 + home/email/davmail.nix | 117 +++++++++++++++++++++++++++++++++++++ home/email/default.nix | 31 ++++++++++ hosts/default.nix | 8 +-- hosts/pickwick/default.nix | 14 +++++ hosts/pickwick/home.nix | 16 ----- 6 files changed, 167 insertions(+), 20 deletions(-) create mode 100644 home/email/davmail.nix create mode 100644 home/email/default.nix delete mode 100644 hosts/pickwick/home.nix diff --git a/home/default.nix b/home/default.nix index 6359ae2..b408dd7 100644 --- a/home/default.nix +++ b/home/default.nix @@ -7,6 +7,7 @@ ... }: { imports = [ + ./email ./ssh ./git.nix ./gui.nix diff --git a/home/email/davmail.nix b/home/email/davmail.nix new file mode 100644 index 0000000..3ab3dfc --- /dev/null +++ b/home/email/davmail.nix @@ -0,0 +1,117 @@ +{ + config, + lib, + pkgs, + home-dir, + ... +}: +let + cfg = config.services.davmail; + configType = + with lib.types; + oneOf [ + (attrsOf configType) + str + int + bool + ] + // { + description = "davmail config type (str, int, bool or attribute set thereof)"; + }; + + toStr = val: if lib.isBool val then lib.boolToString val else toString val; + + linesForAttrs = + attrs: + lib.concatMap ( + name: + let + value = attrs.${name}; + in + if lib.isAttrs value then + map (line: name + "." + line) (linesForAttrs value) + else + [ "${name}=${toStr value}" ] + ) (lib.attrNames attrs); + + configFile = pkgs.writeText "davmail.properties" ( + lib.concatStringsSep "\n" (linesForAttrs cfg.config) + ); +in +{ + options.services.davmail = { + enable = lib.mkEnableOption "davmail, an MS Exchange gateway"; + + url = lib.mkOption { + type = lib.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 = lib.mkOption { + type = configType; + default = { }; + description = '' + Davmail configuration. Refer to + + and + for details on supported values. + ''; + example = lib.literalExpression '' + { + 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 = lib.mkIf cfg.enable { + + services.davmail.config = { + davmail = lib.mapAttrs (name: lib.mkDefault) { + server = true; + disableUpdateCheck = true; + logFilePath = "/tmp/davmail.log"; + logFileSize = "1MB"; + mode = "auto"; + url = cfg.url; + caldavPort = 1080; + imapPort = 1143; + ldapPort = 1389; + popPort = 1110; + smtpPort = 1025; + oauth.tokenFilePath = "${home-dir}/.config/davmail/token"; + }; + log4j = { + logger.davmail = lib.mkDefault "WARN"; + logger.httpclient.wire = lib.mkDefault "WARN"; + logger.org.apache.commons.httpclient = lib.mkDefault "WARN"; + rootLogger = lib.mkDefault "WARN"; + }; + }; + + systemd.user.services.davmail = { + Unit = { + Description = "DavMail POP/IMAP/SMTP Exchange Gateway"; + }; + + Install = { + WantedBy = [ "default.target" ]; + }; + + Service = { + Type = "simple"; + ExecStart = "${pkgs.davmail}/bin/davmail ${configFile}"; + Restart = "on-failure"; + }; + }; + + home.packages = [ pkgs.davmail ]; + }; +} diff --git a/home/email/default.nix b/home/email/default.nix new file mode 100644 index 0000000..9acf65e --- /dev/null +++ b/home/email/default.nix @@ -0,0 +1,31 @@ +{ + pkgs, + lib, + config, + user, + home-dir, + ... +}: + +{ + imports = [ + ./davmail.nix + ]; + + options.custom.email = with lib; { + enable = mkEnableOption "Enable email"; + davmail = mkEnableOption "Enable DavMail"; + }; + + config = lib.mkIf config.custom.email.enable { + services.davmail = { + enable = config.custom.email.davmail; + url = "https://outlook.office365.com/EWS/Exchange.asmx"; + config = { + davmail.mode = "O365Manual"; + davmail.keepDelay = 30; + # log4j.logger.davmail = "DEBUG"; + }; + }; + }; +} diff --git a/hosts/default.nix b/hosts/default.nix index 5866d6c..a9eadc1 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -30,24 +30,24 @@ let ./${host} ./${host}/hardware.nix ../nixos - { + ({config, ...}: { home-manager = { useGlobalPkgs = true; useUserPackages = true; extraSpecialArgs = specialArgs // { inherit host user system dots; + home-dir = config.home-manager.users.${user}.home.homeDirectory; }; users.${user} = { imports = [ inputs.nix-index-database.hmModules.nix-index - ./${host}/home.nix ../home - ]; + ] ++ lib.optional(builtins.pathExists ./${host}/home.nix) ./${host}/home.nix; }; }; - } + }) # alias for home-manager (lib.mkAliasOptionModule [ "hm" ] [ "home-manager" diff --git a/hosts/pickwick/default.nix b/hosts/pickwick/default.nix index 6618553..7ffbea8 100644 --- a/hosts/pickwick/default.nix +++ b/hosts/pickwick/default.nix @@ -39,4 +39,18 @@ extraGroups = ["wheel" "video" "audio" "networkmanager"]; }; }; + + # home manager + hm.custom = { + latex.enable = true; + gui = { + default.enable = true; + i3.enable = true; + ghostty.enable = true; + }; + email = { + enable = true; + davmail = true; + }; + }; } diff --git a/hosts/pickwick/home.nix b/hosts/pickwick/home.nix deleted file mode 100644 index 2ff3b32..0000000 --- a/hosts/pickwick/home.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -{ - custom = { - latex.enable = true; - gui = { - default.enable = true; - i3.enable = true; - ghostty.enable = true; - }; - }; -}