vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / hardware / lirc.nix
blob9942b9a97513a97b84866ec3e8f27a3d219e4132
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.lirc;
4 in {
6   ###### interface
8   options = {
9     services.lirc = {
11       enable = lib.mkEnableOption "the LIRC daemon, to receive and send infrared signals";
13       options = lib.mkOption {
14         type = lib.types.lines;
15         example = ''
16           [lircd]
17           nodaemon = False
18         '';
19         description = "LIRC default options described in man:lircd(8) ({file}`lirc_options.conf`)";
20       };
22       configs = lib.mkOption {
23         type = lib.types.listOf lib.types.lines;
24         description = "Configurations for lircd to load, see man:lircd.conf(5) for details ({file}`lircd.conf`)";
25       };
27       extraArguments = lib.mkOption {
28         type = lib.types.listOf lib.types.str;
29         default = [];
30         description = "Extra arguments to lircd.";
31       };
32     };
33   };
35   ###### implementation
37   config = lib.mkIf cfg.enable {
39     # Note: LIRC executables raises a warning, if lirc_options.conf do not exists
40     environment.etc."lirc/lirc_options.conf".text = cfg.options;
42     passthru.lirc.socket = "/run/lirc/lircd";
44     environment.systemPackages = [ pkgs.lirc ];
46     systemd.sockets.lircd = {
47       description = "LIRC daemon socket";
48       wantedBy = [ "sockets.target" ];
49       socketConfig = {
50         ListenStream = config.passthru.lirc.socket;
51         SocketUser = "lirc";
52         SocketMode = "0660";
53       };
54     };
56     systemd.services.lircd = let
57       configFile = pkgs.writeText "lircd.conf" (builtins.concatStringsSep "\n" cfg.configs);
58     in {
59       description = "LIRC daemon service";
60       after = [ "network.target" ];
62       unitConfig.Documentation = [ "man:lircd(8)" ];
64       serviceConfig = {
65         RuntimeDirectory = ["lirc" "lirc/lock"];
67         # Service runtime directory and socket share same folder.
68         # Following hacks are necessary to get everything right:
70         # 1. prevent socket deletion during stop and restart
71         RuntimeDirectoryPreserve = true;
73         # 2. fix runtime folder owner-ship, happens when socket activation
74         #    creates the folder
75         PermissionsStartOnly = true;
76         ExecStartPre = [
77           "${pkgs.coreutils}/bin/chown lirc /run/lirc/"
78         ];
80         ExecStart = ''
81           ${pkgs.lirc}/bin/lircd --nodaemon \
82             ${lib.escapeShellArgs cfg.extraArguments} \
83             ${configFile}
84         '';
85         User = "lirc";
86       };
87     };
89     users.users.lirc = {
90       uid = config.ids.uids.lirc;
91       group = "lirc";
92       description = "LIRC user for lircd";
93     };
95     users.groups.lirc.gid = config.ids.gids.lirc;
96   };