1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.vdr;
7 libDir = "/var/lib/vdr";
8in {
9
10 ###### interface
11
12 options = {
13
14 services.vdr = {
15 enable = mkEnableOption (lib.mdDoc "VDR. Please put config into ${libDir}");
16
17 package = mkOption {
18 type = types.package;
19 default = pkgs.vdr;
20 defaultText = literalExpression "pkgs.vdr";
21 example = literalExpression "pkgs.wrapVdr.override { plugins = with pkgs.vdrPlugins; [ hello ]; }";
22 description = lib.mdDoc "Package to use.";
23 };
24
25 videoDir = mkOption {
26 type = types.path;
27 default = "/srv/vdr/video";
28 description = lib.mdDoc "Recording directory";
29 };
30
31 extraArguments = mkOption {
32 type = types.listOf types.str;
33 default = [];
34 description = lib.mdDoc "Additional command line arguments to pass to VDR.";
35 };
36
37 enableLirc = mkEnableOption (lib.mdDoc "LIRC");
38 };
39 };
40
41 ###### implementation
42
43 config = mkIf cfg.enable (mkMerge [{
44 systemd.tmpfiles.rules = [
45 "d ${cfg.videoDir} 0755 vdr vdr -"
46 "Z ${cfg.videoDir} - vdr vdr -"
47 ];
48
49 systemd.services.vdr = {
50 description = "VDR";
51 wantedBy = [ "multi-user.target" ];
52 serviceConfig = {
53 ExecStart = ''
54 ${cfg.package}/bin/vdr \
55 --video="${cfg.videoDir}" \
56 --config="${libDir}" \
57 ${escapeShellArgs cfg.extraArguments}
58 '';
59 User = "vdr";
60 CacheDirectory = "vdr";
61 StateDirectory = "vdr";
62 Restart = "on-failure";
63 };
64 };
65
66 users.users.vdr = {
67 group = "vdr";
68 home = libDir;
69 isSystemUser = true;
70 };
71
72 users.groups.vdr = {};
73 }
74
75 (mkIf cfg.enableLirc {
76 services.lirc.enable = true;
77 users.users.vdr.extraGroups = [ "lirc" ];
78 services.vdr.extraArguments = [
79 "--lirc=${config.passthru.lirc.socket}"
80 ];
81 })]);
82}