grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / hardware / sane_extra_backends / brscan5.nix
blob5236970337d84512e7048520b5d040250b42929e
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.hardware.sane.brscan5;
8   netDeviceList = attrValues cfg.netDevices;
10   etcFiles = pkgs.callPackage ./brscan5_etc_files.nix { netDevices = netDeviceList; };
12   netDeviceOpts = { name, ... }: {
14     options = {
16       name = mkOption {
17         type = types.str;
18         description = ''
19           The friendly name you give to the network device. If undefined,
20           the name of attribute will be used.
21         '';
23         example = "office1";
24       };
26       model = mkOption {
27         type = types.str;
28         description = ''
29           The model of the network device.
30         '';
32         example = "ADS-1200";
33       };
35       ip = mkOption {
36         type = with types; nullOr str;
37         default = null;
38         description = ''
39           The ip address of the device. If undefined, you will have to
40           provide a nodename.
41         '';
43         example = "192.168.1.2";
44       };
46       nodename = mkOption {
47         type = with types; nullOr str;
48         default = null;
49         description = ''
50           The node name of the device. If undefined, you will have to
51           provide an ip.
52         '';
54         example = "BRW0080927AFBCE";
55       };
57     };
60     config =
61       { name = mkDefault name;
62       };
63   };
68   options = {
70     hardware.sane.brscan5.enable =
71       mkEnableOption "the Brother brscan5 sane backend";
73     hardware.sane.brscan5.netDevices = mkOption {
74       default = {};
75       example =
76         { office1 = { model = "MFC-7860DW"; ip = "192.168.1.2"; };
77           office2 = { model = "MFC-7860DW"; nodename = "BRW0080927AFBCE"; };
78         };
79       type = with types; attrsOf (submodule netDeviceOpts);
80       description = ''
81         The list of network devices that will be registered against the brscan5
82         sane backend.
83       '';
84     };
85   };
87   config = mkIf (config.hardware.sane.enable && cfg.enable) {
89     hardware.sane.extraBackends = [
90       pkgs.brscan5
91     ];
93     environment.etc."opt/brother/scanner/brscan5" =
94       { source = "${etcFiles}/etc/opt/brother/scanner/brscan5"; };
95     environment.etc."opt/brother/scanner/models" =
96       { source = "${etcFiles}/etc/opt/brother/scanner/brscan5/models"; };
97     environment.etc."sane.d/dll.d/brother5.conf".source = "${pkgs.brscan5}/etc/sane.d/dll.d/brother5.conf";
99     assertions = [
100       { assertion = all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
101         message = ''
102           When describing a network device as part of the attribute list
103           `hardware.sane.brscan5.netDevices`, only one of its `ip` or `nodename`
104           attribute should be specified, not both!
105         '';
106       }
107     ];
109   };