1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.radicale;
8
9 confFile = pkgs.writeText "radicale.conf" cfg.config;
10
11 # This enables us to default to version 2 while still not breaking configurations of people with version 1
12 defaultPackage = if versionAtLeast "17.09" config.system.stateVersion then {
13 pkg = pkgs.radicale2;
14 text = "pkgs.radicale2";
15 } else {
16 pkg = pkgs.radicale1;
17 text = "pkgs.radicale1";
18 };
19in
20
21{
22
23 options = {
24 services.radicale.enable = mkOption {
25 type = types.bool;
26 default = false;
27 description = ''
28 Enable Radicale CalDAV and CardDAV server.
29 '';
30 };
31
32 services.radicale.package = mkOption {
33 type = types.package;
34 default = defaultPackage.pkg;
35 defaultText = defaultPackage.text;
36 description = ''
37 Radicale package to use. This defaults to version 1.x if
38 <literal>system.stateVersion < 17.09</literal> and version 2.x
39 otherwise.
40 '';
41 };
42
43 services.radicale.config = mkOption {
44 type = types.string;
45 default = "";
46 description = ''
47 Radicale configuration, this will set the service
48 configuration file.
49 '';
50 };
51 };
52
53 config = mkIf cfg.enable {
54 environment.systemPackages = [ cfg.package ];
55
56 users.extraUsers = singleton
57 { name = "radicale";
58 uid = config.ids.uids.radicale;
59 description = "radicale user";
60 home = "/var/lib/radicale";
61 createHome = true;
62 };
63
64 users.extraGroups = singleton
65 { name = "radicale";
66 gid = config.ids.gids.radicale;
67 };
68
69 systemd.services.radicale = {
70 description = "A Simple Calendar and Contact Server";
71 after = [ "network.target" ];
72 wantedBy = [ "multi-user.target" ];
73 serviceConfig = {
74 ExecStart = "${cfg.package}/bin/radicale -C ${confFile} -f";
75 User = "radicale";
76 Group = "radicale";
77 };
78 };
79 };
80
81 meta.maintainers = with lib.maintainers; [ aneeshusa infinisil ];
82}