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" ];
+ };
+ };
+ };
+}