diff options
author | Tad Fisher <tadfisher@gmail.com> | 2020-02-20 23:30:59 -0800 |
---|---|---|
committer | Robert Helgesson <robert@rycee.net> | 2020-03-07 15:13:50 +0100 |
commit | 9f46d516fa13df70768a3211827d14f456fa6e85 (patch) | |
tree | 27cc1c12e61b3cc29f64847d171ffd2ef69b0dac /modules | |
parent | 60a939bd01dc66d1cbdc85a3f6dc78e4ca092537 (diff) |
services.lieer: add module
Add 'services.lieer', which generates systemd timer and service units
to synchronize a Gmail account with lieer. Per-account configuration
lives in 'accounts.email.accounts.<name>.lieer.sync'.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/accounts/email.nix | 6 | ||||
-rw-r--r-- | modules/misc/news.nix | 8 | ||||
-rw-r--r-- | modules/modules.nix | 1 | ||||
-rw-r--r-- | modules/services/lieer-accounts.nix | 25 | ||||
-rw-r--r-- | modules/services/lieer.nix | 62 |
5 files changed, 100 insertions, 2 deletions
diff --git a/modules/accounts/email.nix b/modules/accounts/email.nix index f45e57472af..b347e5bb1a2 100644 --- a/modules/accounts/email.nix +++ b/modules/accounts/email.nix @@ -384,7 +384,7 @@ in }; accounts = mkOption { - type = types.attrsOf (types.submodule [ + type = types.attrsOf (types.submodule ([ mailAccountOpts (import ../programs/alot-accounts.nix pkgs) (import ../programs/astroid-accounts.nix) @@ -395,7 +395,9 @@ in (import ../programs/neomutt-accounts.nix) (import ../programs/notmuch-accounts.nix) (import ../programs/offlineimap-accounts.nix) - ]); + ] ++ optionals pkgs.stdenv.hostPlatform.isLinux [ + (import ../services/lieer-accounts.nix) + ])); default = {}; description = "List of email accounts."; }; diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 048f9cbe558..6a5cce7e085 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1373,6 +1373,14 @@ in A new module is available: 'programs.lieer'. ''; } + + { + time = "2020-03-07T14:12:50+00:00"; + condition = hostPlatform.isLinux; + message = '' + A new module is available: 'services.lieer'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index 3d1283e380c..bca1e8ed9ca 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -128,6 +128,7 @@ let (loadModule ./services/kdeconnect.nix { }) (loadModule ./services/keepassx.nix { }) (loadModule ./services/keybase.nix { }) + (loadModule ./services/lieer.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/lorri.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/mbsync.nix { }) (loadModule ./services/mpd.nix { }) diff --git a/modules/services/lieer-accounts.nix b/modules/services/lieer-accounts.nix new file mode 100644 index 00000000000..187f7dff980 --- /dev/null +++ b/modules/services/lieer-accounts.nix @@ -0,0 +1,25 @@ +{ lib, ... }: + +with lib; + +{ + options.lieer.sync = { + enable = mkEnableOption "lieer synchronization service"; + + frequency = mkOption { + type = types.str; + default = "*:0/5"; + description = '' + How often to synchronize the account. + </para><para> + This value is passed to the systemd timer configuration as the + onCalendar option. See + <citerefentry> + <refentrytitle>systemd.time</refentrytitle> + <manvolnum>7</manvolnum> + </citerefentry> + for more information about the format. + ''; + }; + }; +} diff --git a/modules/services/lieer.nix b/modules/services/lieer.nix new file mode 100644 index 00000000000..35ac7d643cc --- /dev/null +++ b/modules/services/lieer.nix @@ -0,0 +1,62 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.lieer; + + syncAccounts = filter (a: a.lieer.enable && a.lieer.sync.enable) + (attrValues config.accounts.email.accounts); + + escapeUnitName = name: + let + good = upperChars ++ lowerChars ++ stringToCharacters "0123456789-_"; + subst = c: if any (x: x == c) good then c else "-"; + in stringAsChars subst name; + + serviceUnit = account: { + name = escapeUnitName "lieer-${account.name}"; + value = { + Unit = { + Description = "lieer Gmail synchronization for ${account.name}"; + ConditionPathExists = "${account.maildir.absPath}/.gmailieer.json"; + }; + + Service = { + Type = "oneshot"; + ExecStart = "${pkgs.gmailieer}/bin/gmi sync"; + WorkingDirectory = account.maildir.absPath; + }; + }; + }; + + timerUnit = account: { + name = escapeUnitName "lieer-${account.name}"; + value = { + Unit = { + Description = "lieer Gmail synchronization for ${account.name}"; + }; + + Timer = { + OnCalendar = account.lieer.sync.frequency; + RandomizedDelaySec = 30; + }; + + Install = { WantedBy = [ "timers.target" ]; }; + }; + }; + +in { + meta.maintainers = [ maintainers.tadfisher ]; + + options = { + services.lieer.enable = + mkEnableOption "lieer Gmail synchronization service"; + }; + + config = mkIf cfg.enable { + programs.lieer.enable = true; + systemd.user.services = listToAttrs (map serviceUnit syncAccounts); + systemd.user.timers = listToAttrs (map timerUnit syncAccounts); + }; +} |