Skip to content

Commit

Permalink
services.lieer: add module
Browse files Browse the repository at this point in the history
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'.
  • Loading branch information
tadfisher authored and rycee committed Mar 7, 2020
1 parent 60a939b commit 9f46d51
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 2 deletions.
6 changes: 4 additions & 2 deletions modules/accounts/email.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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.";
};
Expand Down
8 changes: 8 additions & 0 deletions modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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'.
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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 { })
Expand Down
25 changes: 25 additions & 0 deletions modules/services/lieer-accounts.nix
Original file line number Diff line number Diff line change
@@ -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.
'';
};
};
}
62 changes: 62 additions & 0 deletions modules/services/lieer.nix
Original file line number Diff line number Diff line change
@@ -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);
};
}
1 change: 1 addition & 0 deletions tests/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import nmt {
./modules/programs/abook
./modules/programs/firefox
./modules/programs/getmail
./modules/services/lieer
./modules/programs/rofi
./modules/services/polybar
./modules/services/sxhkd
Expand Down
1 change: 1 addition & 0 deletions tests/modules/services/lieer/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ lieer-service = ./lieer-service.nix; }
8 changes: 8 additions & 0 deletions tests/modules/services/lieer/lieer-service-expected.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[Service]
ExecStart=@lieer@/bin/gmi sync
Type=oneshot
WorkingDirectory=/home/hm-user/Mail/[email protected]

[Unit]
ConditionPathExists=/home/hm-user/Mail/[email protected]/.gmailieer.json
Description=lieer Gmail synchronization for [email protected]
9 changes: 9 additions & 0 deletions tests/modules/services/lieer/lieer-service-expected.timer
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[Install]
WantedBy=timers.target

[Timer]
OnCalendar=*:0/5
RandomizedDelaySec=30

[Unit]
Description=lieer Gmail synchronization for [email protected]
35 changes: 35 additions & 0 deletions tests/modules/services/lieer/lieer-service.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{ config, lib, pkgs, ... }:

with lib;

{
imports = [ ../../accounts/email-test-accounts.nix ];

config = {
home.username = "hm-user";
home.homeDirectory = "/home/hm-user";

services.lieer.enable = true;

accounts.email.accounts = {
"[email protected]".lieer.enable = true;
"[email protected]".lieer.sync.enable = true;
};

nixpkgs.overlays = [
(self: super: {
gmailieer = super.gmailieer // { outPath = "@lieer@"; };
})
];

nmt.script = ''
assertFileExists home-files/.config/systemd/user/lieer-hm-example-com.service
assertFileExists home-files/.config/systemd/user/lieer-hm-example-com.timer
assertFileContent home-files/.config/systemd/user/lieer-hm-example-com.service \
${./lieer-service-expected.service}
assertFileContent home-files/.config/systemd/user/lieer-hm-example-com.timer \
${./lieer-service-expected.timer}
'';
};
}

0 comments on commit 9f46d51

Please sign in to comment.