at 25.11-pre 2.5 kB view raw
1{ 2 config, 3 lib, 4 pkgs, 5 ... 6}: 7let 8 cfg = config.services.vdr; 9 10 inherit (lib) 11 mkEnableOption 12 mkPackageOption 13 mkOption 14 types 15 mkIf 16 optional 17 ; 18in 19{ 20 options = { 21 22 services.vdr = { 23 enable = mkEnableOption "VDR, a video disk recorder"; 24 25 package = mkPackageOption pkgs "vdr" { 26 example = "wrapVdr.override { plugins = with pkgs.vdrPlugins; [ hello ]; }"; 27 }; 28 29 videoDir = mkOption { 30 type = types.path; 31 default = "/srv/vdr/video"; 32 description = "Recording directory"; 33 }; 34 35 extraArguments = mkOption { 36 type = types.listOf types.str; 37 default = [ ]; 38 description = "Additional command line arguments to pass to VDR."; 39 }; 40 41 enableLirc = mkEnableOption "LIRC"; 42 43 user = mkOption { 44 type = types.str; 45 default = "vdr"; 46 description = '' 47 User under which the VDR service runs. 48 ''; 49 }; 50 51 group = mkOption { 52 type = types.str; 53 default = "vdr"; 54 description = '' 55 Group under which the VDRvdr service runs. 56 ''; 57 }; 58 }; 59 60 }; 61 62 config = mkIf cfg.enable { 63 64 systemd.tmpfiles.rules = [ 65 "d ${cfg.videoDir} 0755 ${cfg.user} ${cfg.group} -" 66 "Z ${cfg.videoDir} - ${cfg.user} ${cfg.group} -" 67 ]; 68 69 systemd.services.vdr = { 70 description = "VDR"; 71 wantedBy = [ "multi-user.target" ]; 72 wants = optional cfg.enableLirc "lircd.service"; 73 after = [ "network.target" ] ++ optional cfg.enableLirc "lircd.service"; 74 serviceConfig = { 75 ExecStart = 76 let 77 args = 78 [ 79 "--video=${cfg.videoDir}" 80 ] 81 ++ optional cfg.enableLirc "--lirc=${config.passthru.lirc.socket}" 82 ++ cfg.extraArguments; 83 in 84 "${cfg.package}/bin/vdr ${lib.escapeShellArgs args}"; 85 User = cfg.user; 86 Group = cfg.group; 87 CacheDirectory = "vdr"; 88 StateDirectory = "vdr"; 89 RuntimeDirectory = "vdr"; 90 Restart = "on-failure"; 91 }; 92 }; 93 94 environment.systemPackages = [ cfg.package ]; 95 96 users.users = mkIf (cfg.user == "vdr") { 97 vdr = { 98 inherit (cfg) group; 99 home = "/run/vdr"; 100 isSystemUser = true; 101 extraGroups = [ 102 "video" 103 "audio" 104 ] ++ optional cfg.enableLirc "lirc"; 105 }; 106 }; 107 108 users.groups = mkIf (cfg.group == "vdr") { vdr = { }; }; 109 110 }; 111}