tor-browser: fix desktop icon (#365780)
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / exporters / rtl_433.nix
blobd07497686cf140bb020814b4aed39b684c07254c
2   config,
3   lib,
4   pkgs,
5   options,
6   ...
7 }:
9 let
10   cfg = config.services.prometheus.exporters.rtl_433;
13   port = 9550;
15   extraOpts =
16     let
17       mkMatcherOptionType =
18         field: description:
19         with lib.types;
20         listOf (submodule {
21           options = {
22             name = lib.mkOption {
23               type = str;
24               description = "Name to match.";
25             };
26             "${field}" = lib.mkOption {
27               type = int;
28               description = description;
29             };
30             location = lib.mkOption {
31               type = str;
32               description = "Location to match.";
33             };
34           };
35         });
36     in
37     {
38       rtl433Flags = lib.mkOption {
39         type = lib.types.str;
40         default = "-C si";
41         example = "-C si -R 19";
42         description = ''
43           Flags passed verbatim to rtl_433 binary.
44           Having `-C si` (the default) is recommended since only Celsius temperatures are parsed.
45         '';
46       };
47       channels = lib.mkOption {
48         type = mkMatcherOptionType "channel" "Channel to match.";
49         default = [ ];
50         example = [
51           {
52             name = "Acurite";
53             channel = 6543;
54             location = "Kitchen";
55           }
56         ];
57         description = ''
58           List of channel matchers to export.
59         '';
60       };
61       ids = lib.mkOption {
62         type = mkMatcherOptionType "id" "ID to match.";
63         default = [ ];
64         example = [
65           {
66             name = "Nexus";
67             id = 1;
68             location = "Bedroom";
69           }
70         ];
71         description = ''
72           List of ID matchers to export.
73         '';
74       };
75     };
77   serviceOpts = {
78     serviceConfig = {
79       # rtl-sdr udev rules make supported USB devices +rw by plugdev.
80       SupplementaryGroups = "plugdev";
81       # rtl_433 needs rw access to the USB radio.
82       PrivateDevices = lib.mkForce false;
83       DeviceAllow = lib.mkForce "char-usb_device rw";
84       RestrictAddressFamilies = [ "AF_NETLINK" ];
86       ExecStart =
87         let
88           matchers =
89             (map (m: "--channel_matcher '${m.name},${toString m.channel},${m.location}'") cfg.channels)
90             ++ (map (m: "--id_matcher '${m.name},${toString m.id},${m.location}'") cfg.ids);
91         in
92         ''
93           ${pkgs.prometheus-rtl_433-exporter}/bin/rtl_433_prometheus \
94             -listen ${cfg.listenAddress}:${toString cfg.port} \
95             -subprocess "${pkgs.rtl_433}/bin/rtl_433 -F json ${cfg.rtl433Flags}" \
96             ${lib.concatStringsSep " \\\n  " matchers} \
97             ${lib.concatStringsSep " \\\n  " cfg.extraFlags}
98         '';
99     };
100   };