python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / video / mirakurun.nix
blob5484515e7cb4fe678d095b6e2f81a022d88ad7ff
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.mirakurun;
7   mirakurun = pkgs.mirakurun;
8   username = config.users.users.mirakurun.name;
9   groupname = config.users.users.mirakurun.group;
10   settingsFmt = pkgs.formats.yaml {};
12   polkitRule = pkgs.writeTextDir "share/polkit-1/rules.d/10-mirakurun.rules" ''
13     polkit.addRule(function (action, subject) {
14       if (
15         (action.id == "org.debian.pcsc-lite.access_pcsc" ||
16           action.id == "org.debian.pcsc-lite.access_card") &&
17         subject.user == "${username}"
18       ) {
19         return polkit.Result.YES;
20       }
21     });
22   '';
24   {
25     options = {
26       services.mirakurun = {
27         enable = mkEnableOption (lib.mdDoc "the Mirakurun DVR Tuner Server");
29         port = mkOption {
30           type = with types; nullOr port;
31           default = 40772;
32           description = lib.mdDoc ''
33             Port to listen on. If `null`, it won't listen on
34             any port.
35           '';
36         };
38         openFirewall = mkOption {
39           type = types.bool;
40           default = false;
41           description = lib.mdDoc ''
42             Open ports in the firewall for Mirakurun.
44             ::: {.warning}
45             Exposing Mirakurun to the open internet is generally advised
46             against. Only use it inside a trusted local network, or
47             consider putting it behind a VPN if you want remote access.
48             :::
49           '';
50         };
52         unixSocket = mkOption {
53           type = with types; nullOr path;
54           default = "/var/run/mirakurun/mirakurun.sock";
55           description = lib.mdDoc ''
56             Path to unix socket to listen on. If `null`, it
57             won't listen on any unix sockets.
58           '';
59         };
61         allowSmartCardAccess = mkOption {
62           type = types.bool;
63           default = true;
64           description = lib.mdDoc ''
65             Install polkit rules to allow Mirakurun to access smart card readers
66             which is commonly used along with tuner devices.
67           '';
68         };
70         serverSettings = mkOption {
71           type = settingsFmt.type;
72           default = {};
73           example = literalExpression ''
74             {
75               highWaterMark = 25165824;
76               overflowTimeLimit = 30000;
77             };
78           '';
79           description = lib.mdDoc ''
80             Options for server.yml.
82             Documentation:
83             <https://github.com/Chinachu/Mirakurun/blob/master/doc/Configuration.md>
84           '';
85         };
87         tunerSettings = mkOption {
88           type = with types; nullOr settingsFmt.type;
89           default = null;
90           example = literalExpression ''
91             [
92               {
93                 name = "tuner-name";
94                 types = [ "GR" "BS" "CS" "SKY" ];
95                 dvbDevicePath = "/dev/dvb/adapterX/dvrX";
96               }
97             ];
98           '';
99           description = lib.mdDoc ''
100             Options which are added to tuners.yml. If none is specified, it will
101             automatically be generated at runtime.
103             Documentation:
104             <https://github.com/Chinachu/Mirakurun/blob/master/doc/Configuration.md>
105           '';
106         };
108         channelSettings = mkOption {
109           type = with types; nullOr settingsFmt.type;
110           default = null;
111           example = literalExpression ''
112             [
113               {
114                 name = "channel";
115                 types = "GR";
116                 channel = "0";
117               }
118             ];
119           '';
120           description = lib.mdDoc ''
121             Options which are added to channels.yml. If none is specified, it
122             will automatically be generated at runtime.
124             Documentation:
125             <https://github.com/Chinachu/Mirakurun/blob/master/doc/Configuration.md>
126           '';
127         };
128       };
129     };
131     config = mkIf cfg.enable {
132       environment.systemPackages = [ mirakurun ] ++ optional cfg.allowSmartCardAccess polkitRule;
133       environment.etc = {
134         "mirakurun/server.yml".source = settingsFmt.generate "server.yml" cfg.serverSettings;
135         "mirakurun/tuners.yml" = mkIf (cfg.tunerSettings != null) {
136           source = settingsFmt.generate "tuners.yml" cfg.tunerSettings;
137           mode = "0644";
138           user = username;
139           group = groupname;
140         };
141         "mirakurun/channels.yml" = mkIf (cfg.channelSettings != null) {
142           source = settingsFmt.generate "channels.yml" cfg.channelSettings;
143           mode = "0644";
144           user = username;
145           group = groupname;
146         };
147       };
149       networking.firewall = mkIf cfg.openFirewall {
150         allowedTCPPorts = mkIf (cfg.port != null) [ cfg.port ];
151       };
153       users.users.mirakurun = {
154         description = "Mirakurun user";
155         group = "video";
156         isSystemUser = true;
157       };
159       services.mirakurun.serverSettings = {
160         logLevel = mkDefault 2;
161         path = mkIf (cfg.unixSocket != null) cfg.unixSocket;
162         port = mkIf (cfg.port != null) cfg.port;
163       };
165       systemd.tmpfiles.rules = [
166         "d '/etc/mirakurun' - ${username} ${groupname} - -"
167       ];
169       systemd.services.mirakurun = {
170         description = mirakurun.meta.description;
171         wantedBy = [ "multi-user.target" ];
172         after = [ "network.target" ];
173         serviceConfig = {
174           ExecStart = "${mirakurun}/bin/mirakurun-start";
175           User = username;
176           Group = groupname;
177           RuntimeDirectory="mirakurun";
178           StateDirectory="mirakurun";
179           Nice = -10;
180           IOSchedulingClass = "realtime";
181           IOSchedulingPriority = 7;
182         };
184         environment = {
185           SERVER_CONFIG_PATH = "/etc/mirakurun/server.yml";
186           TUNERS_CONFIG_PATH = "/etc/mirakurun/tuners.yml";
187           CHANNELS_CONFIG_PATH = "/etc/mirakurun/channels.yml";
188           SERVICES_DB_PATH = "/var/lib/mirakurun/services.json";
189           PROGRAMS_DB_PATH = "/var/lib/mirakurun/programs.json";
190           LOGO_DATA_DIR_PATH = "/var/lib/mirakurun/logos";
191           NODE_ENV = "production";
192         };
194         restartTriggers = let
195           getconf = target: config.environment.etc."mirakurun/${target}.yml".source;
196           targets = [
197             "server"
198           ] ++ optional (cfg.tunerSettings != null) "tuners"
199             ++ optional (cfg.channelSettings != null) "channels";
200         in (map getconf targets);
201       };
202     };
203   }