at 23.11-pre 2.0 kB view raw
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}