1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.calibre-server;
8
9in
10
11{
12 imports = [
13 (mkChangedOptionModule [ "services" "calibre-server" "libraryDir" ] [ "services" "calibre-server" "libraries" ]
14 (config:
15 let libraryDir = getAttrFromPath [ "services" "calibre-server" "libraryDir" ] config;
16 in [ libraryDir ]
17 )
18 )
19 ];
20
21 ###### interface
22
23 options = {
24 services.calibre-server = {
25
26 enable = mkEnableOption (lib.mdDoc "calibre-server");
27
28 libraries = mkOption {
29 description = lib.mdDoc ''
30 The directories of the libraries to serve. They must be readable for the user under which the server runs.
31 '';
32 type = types.listOf types.path;
33 };
34
35 user = mkOption {
36 description = lib.mdDoc "The user under which calibre-server runs.";
37 type = types.str;
38 default = "calibre-server";
39 };
40
41 group = mkOption {
42 description = lib.mdDoc "The group under which calibre-server runs.";
43 type = types.str;
44 default = "calibre-server";
45 };
46
47 };
48 };
49
50
51 ###### implementation
52
53 config = mkIf cfg.enable {
54
55 systemd.services.calibre-server = {
56 description = "Calibre Server";
57 after = [ "network.target" ];
58 wantedBy = [ "multi-user.target" ];
59 serviceConfig = {
60 User = cfg.user;
61 Restart = "always";
62 ExecStart = "${pkgs.calibre}/bin/calibre-server ${lib.concatStringsSep " " cfg.libraries}";
63 };
64
65 };
66
67 environment.systemPackages = [ pkgs.calibre ];
68
69 users.users = optionalAttrs (cfg.user == "calibre-server") {
70 calibre-server = {
71 home = "/var/lib/calibre-server";
72 createHome = true;
73 uid = config.ids.uids.calibre-server;
74 group = cfg.group;
75 };
76 };
77
78 users.groups = optionalAttrs (cfg.group == "calibre-server") {
79 calibre-server = {
80 gid = config.ids.gids.calibre-server;
81 };
82 };
83
84 };
85
86}