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'.
This commit is contained in:
Tad Fisher 2020-02-20 23:30:59 -08:00 committed by Robert Helgesson
parent 60a939bd01
commit 9f46d516fa
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
10 changed files with 154 additions and 2 deletions

View file

@ -384,7 +384,7 @@ in
}; };
accounts = mkOption { accounts = mkOption {
type = types.attrsOf (types.submodule [ type = types.attrsOf (types.submodule ([
mailAccountOpts mailAccountOpts
(import ../programs/alot-accounts.nix pkgs) (import ../programs/alot-accounts.nix pkgs)
(import ../programs/astroid-accounts.nix) (import ../programs/astroid-accounts.nix)
@ -395,7 +395,9 @@ in
(import ../programs/neomutt-accounts.nix) (import ../programs/neomutt-accounts.nix)
(import ../programs/notmuch-accounts.nix) (import ../programs/notmuch-accounts.nix)
(import ../programs/offlineimap-accounts.nix) (import ../programs/offlineimap-accounts.nix)
]); ] ++ optionals pkgs.stdenv.hostPlatform.isLinux [
(import ../services/lieer-accounts.nix)
]));
default = {}; default = {};
description = "List of email accounts."; description = "List of email accounts.";
}; };

View file

@ -1373,6 +1373,14 @@ in
A new module is available: 'programs.lieer'. 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'.
'';
}
]; ];
}; };
} }

View file

@ -128,6 +128,7 @@ let
(loadModule ./services/kdeconnect.nix { }) (loadModule ./services/kdeconnect.nix { })
(loadModule ./services/keepassx.nix { }) (loadModule ./services/keepassx.nix { })
(loadModule ./services/keybase.nix { }) (loadModule ./services/keybase.nix { })
(loadModule ./services/lieer.nix { condition = hostPlatform.isLinux; })
(loadModule ./services/lorri.nix { condition = hostPlatform.isLinux; }) (loadModule ./services/lorri.nix { condition = hostPlatform.isLinux; })
(loadModule ./services/mbsync.nix { }) (loadModule ./services/mbsync.nix { })
(loadModule ./services/mpd.nix { }) (loadModule ./services/mpd.nix { })

View file

@ -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.
'';
};
};
}

View file

@ -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);
};
}

View file

@ -51,6 +51,7 @@ import nmt {
./modules/programs/abook ./modules/programs/abook
./modules/programs/firefox ./modules/programs/firefox
./modules/programs/getmail ./modules/programs/getmail
./modules/services/lieer
./modules/programs/rofi ./modules/programs/rofi
./modules/services/polybar ./modules/services/polybar
./modules/services/sxhkd ./modules/services/sxhkd

View file

@ -0,0 +1 @@
{ lieer-service = ./lieer-service.nix; }

View file

@ -0,0 +1,8 @@
[Service]
ExecStart=@lieer@/bin/gmi sync
Type=oneshot
WorkingDirectory=/home/hm-user/Mail/hm@example.com
[Unit]
ConditionPathExists=/home/hm-user/Mail/hm@example.com/.gmailieer.json
Description=lieer Gmail synchronization for hm@example.com

View file

@ -0,0 +1,9 @@
[Install]
WantedBy=timers.target
[Timer]
OnCalendar=*:0/5
RandomizedDelaySec=30
[Unit]
Description=lieer Gmail synchronization for hm@example.com

View file

@ -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 = {
"hm@example.com".lieer.enable = true;
"hm@example.com".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}
'';
};
}