From f26cc3b957ef77374f8b5275c1fc62217d13c6e3 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 26 Apr 2018 14:36:09 -0700 Subject: [PATCH] mbsync: add module --- modules/misc/news.nix | 7 +++ modules/modules.nix | 1 + modules/services/mbsync.nix | 111 ++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 modules/services/mbsync.nix diff --git a/modules/misc/news.nix b/modules/misc/news.nix index af122a23..1ece1114 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -634,6 +634,13 @@ in appended to the main Git configuration file. ''; } + + { + time = "2018-05-01T20:49:31+00:00"; + message = '' + A new module is available: 'services.mbsync'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index ff48a435..897fd6a1 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -56,6 +56,7 @@ let ./services/kbfs.nix ./services/keepassx.nix ./services/keybase.nix + ./services/mbsync.nix ./services/network-manager-applet.nix ./services/owncloud-client.nix ./services/parcellite.nix diff --git a/modules/services/mbsync.nix b/modules/services/mbsync.nix new file mode 100644 index 00000000..a14e2523 --- /dev/null +++ b/modules/services/mbsync.nix @@ -0,0 +1,111 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.services.mbsync; + + mbsyncOptions = + [ "--all" + ] ++ optional (cfg.verbose) "--verbose" + ++ optional (cfg.configFile != null) "--config ${cfg.configFile}"; + +in + +{ + meta.maintainers = [ maintainers.pjones ]; + + options.services.mbsync = { + enable = mkEnableOption "mbsync"; + + package = mkOption { + type = types.package; + default = pkgs.isync; + defaultText = "pkgs.isync"; + example = literalExample "pkgs.isync"; + description = "The package to use for the mbsync binary."; + }; + + frequency = mkOption { + type = types.str; + default = "*:0/5"; + description = '' + How often to run mbsync. This value is passed to the systemd + timer configuration as the onCalendar option. See + + systemd.time + 7 + + for more information about the format. + ''; + }; + + verbose = mkOption { + type = types.bool; + default = true; + description = '' + Whether mbsync should produce verbose output. + ''; + }; + + configFile = mkOption { + type = types.nullOr types.path; + default = null; + description = '' + Optional configuration file to link to use instead of + the default file (~/.mbsyncrc). + ''; + }; + + preExec = mkOption { + type = types.nullOr types.str; + default = null; + example = "mkdir -p %h/mail"; + description = '' + An optional command to run before mbsync executes. This is + useful for creating the directories mbsync is going to use. + ''; + }; + + postExec = mkOption { + type = types.nullOr types.str; + default = null; + example = "mu index"; + description = '' + An optional command to run after mbsync executes successfully. + This is useful for running mailbox indexing tools. + ''; + }; + }; + + config = mkIf cfg.enable { + systemd.user.services.mbsync = { + Unit = { + Description = "mbsync mailbox synchronization"; + PartOf = [ "network-online.target" ]; + }; + + Service = { + Type = "simple"; + ExecStart = "${cfg.package}/bin/mbsync ${concatStringsSep " " mbsyncOptions}"; + } // (optionalAttrs (cfg.postExec != null) { ExecStartPost = cfg.postExec; }) + // (optionalAttrs (cfg.preExec != null) { ExecStartPre = cfg.preExec; }); + }; + + systemd.user.timers.mbsync = { + Unit = { + Description = "mbsync mailbox synchronization"; + }; + + Timer = { + OnCalendar = cfg.frequency; + Unit = "mbsync.service"; + }; + + Install = { + WantedBy = [ "timers.target" ]; + }; + }; + }; +}