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