grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / hardware / sane_extra_backends / brscan4.nix
blob8f9998108406b7931a402ac5292a2e07243c41de
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.hardware.sane.brscan4;
8   netDeviceList = attrValues cfg.netDevices;
10   etcFiles = pkgs.callPackage ./brscan4_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 = "MFC-7860DW";
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.brscan4.enable =
71       mkEnableOption "Brother's brscan4 scan backend" // {
72       description = ''
73         When enabled, will automatically register the "brscan4" sane
74         backend and bring configuration files to their expected location.
75       '';
76     };
78     hardware.sane.brscan4.netDevices = mkOption {
79       default = {};
80       example =
81         { office1 = { model = "MFC-7860DW"; ip = "192.168.1.2"; };
82           office2 = { model = "MFC-7860DW"; nodename = "BRW0080927AFBCE"; };
83         };
84       type = with types; attrsOf (submodule netDeviceOpts);
85       description = ''
86         The list of network devices that will be registered against the brscan4
87         sane backend.
88       '';
89     };
90   };
92   config = mkIf (config.hardware.sane.enable && cfg.enable) {
94     hardware.sane.extraBackends = [
95       pkgs.brscan4
96     ];
98     environment.etc."opt/brother/scanner/brscan4" =
99       { source = "${etcFiles}/etc/opt/brother/scanner/brscan4"; };
101     assertions = [
102       { assertion = all (x: !(null != x.ip && null != x.nodename)) netDeviceList;
103         message = ''
104           When describing a network device as part of the attribute list
105           `hardware.sane.brscan4.netDevices`, only one of its `ip` or `nodename`
106           attribute should be specified, not both!
107         '';
108       }
109     ];
111   };