| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-03 03:31:38 +01:00
										 |  |  |   pkg = if config.hardware.sane.snapshot | 
					
						
							|  |  |  |     then pkgs.sane-backends-git | 
					
						
							|  |  |  |     else pkgs.sane-backends; | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sanedConf = pkgs.writeTextFile { | 
					
						
							|  |  |  |     name = "saned.conf"; | 
					
						
							|  |  |  |     destination = "/etc/sane.d/saned.conf"; | 
					
						
							|  |  |  |     text = ''
 | 
					
						
							|  |  |  |       localhost | 
					
						
							|  |  |  |       ${config.services.saned.extraConfig} | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 04:12:04 +03:00
										 |  |  |   netConf = pkgs.writeTextFile { | 
					
						
							|  |  |  |     name = "net.conf"; | 
					
						
							|  |  |  |     destination = "/etc/sane.d/net.conf"; | 
					
						
							|  |  |  |     text = ''
 | 
					
						
							|  |  |  |       ${lib.optionalString config.services.saned.enable "localhost"} | 
					
						
							|  |  |  |       ${config.hardware.sane.netConf} | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |   env = { | 
					
						
							|  |  |  |     SANE_CONFIG_DIR = config.hardware.sane.configDir; | 
					
						
							|  |  |  |     LD_LIBRARY_PATH = [ "${saneConfig}/lib/sane" ]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 04:12:04 +03:00
										 |  |  |   backends = [ pkg netConf ] ++ optional config.services.saned.enable sanedConf ++ config.hardware.sane.extraBackends; | 
					
						
							| 
									
										
										
										
											2014-05-11 13:31:21 -05:00
										 |  |  |   saneConfig = pkgs.mkSaneConfig { paths = backends; }; | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |   enabled = config.hardware.sane.enable || config.services.saned.enable; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     hardware.sane.enable = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  |       type = types.bool; | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  |       default = false; | 
					
						
							| 
									
										
										
										
											2016-02-21 19:55:39 +00:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         Enable support for SANE scanners. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <note><para> | 
					
						
							| 
									
										
										
										
											2017-02-03 15:29:20 -02:00
										 |  |  |           Users in the "scanner" group will gain access to the scanner, or the "lp" group if it's also a printer. | 
					
						
							| 
									
										
										
										
											2016-02-21 19:55:39 +00:00
										 |  |  |         </para></note> | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     hardware.sane.snapshot = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  |       type = types.bool; | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  |       default = false; | 
					
						
							|  |  |  |       description = "Use a development snapshot of SANE scanner drivers."; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-11 13:31:21 -05:00
										 |  |  |     hardware.sane.extraBackends = mkOption { | 
					
						
							|  |  |  |       type = types.listOf types.path; | 
					
						
							|  |  |  |       default = []; | 
					
						
							| 
									
										
										
										
											2016-02-21 19:55:39 +00:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         Packages providing extra SANE backends to enable. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <note><para> | 
					
						
							|  |  |  |           The example contains the package for HP scanners. | 
					
						
							|  |  |  |         </para></note> | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       example = literalExample "[ pkgs.hplipWithPlugin ]"; | 
					
						
							| 
									
										
										
										
											2014-05-11 13:31:21 -05:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-24 10:52:12 +02:00
										 |  |  |     hardware.sane.configDir = mkOption { | 
					
						
							|  |  |  |       type = types.string; | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |       internal = true; | 
					
						
							| 
									
										
										
										
											2014-06-24 10:52:12 +02:00
										 |  |  |       description = "The value of SANE_CONFIG_DIR."; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 04:12:04 +03:00
										 |  |  |     hardware.sane.netConf = mkOption { | 
					
						
							|  |  |  |       type = types.lines; | 
					
						
							|  |  |  |       default = ""; | 
					
						
							|  |  |  |       example = "192.168.0.16"; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Network hosts that should be probed for remote scanners. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |     services.saned.enable = mkOption { | 
					
						
							|  |  |  |       type = types.bool; | 
					
						
							|  |  |  |       default = false; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Enable saned network daemon for remote connection to scanners. | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |         saned would be runned from <literal>scanner</literal> user; to allow | 
					
						
							|  |  |  |         access to hardware that doesn't have <literal>scanner</literal> group | 
					
						
							|  |  |  |         you should add needed groups to this user. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |     services.saned.extraConfig = mkOption { | 
					
						
							|  |  |  |       type = types.lines; | 
					
						
							|  |  |  |       default = ""; | 
					
						
							|  |  |  |       example = "192.168.0.0/24"; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Extra saned configuration lines. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-09-24 11:42:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |   ###### implementation | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |   config = mkMerge [ | 
					
						
							|  |  |  |     (mkIf enabled { | 
					
						
							|  |  |  |       hardware.sane.configDir = mkDefault "${saneConfig}/etc/sane.d"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       environment.systemPackages = backends; | 
					
						
							|  |  |  |       environment.sessionVariables = env; | 
					
						
							|  |  |  |       services.udev.packages = backends; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |       users.groups."scanner".gid = config.ids.gids.scanner; | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     (mkIf config.services.saned.enable { | 
					
						
							|  |  |  |       networking.firewall.connectionTrackingModules = [ "sane" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       systemd.services."saned@" = { | 
					
						
							|  |  |  |         description = "Scanner Service"; | 
					
						
							|  |  |  |         environment = mapAttrs (name: val: toString val) env; | 
					
						
							|  |  |  |         serviceConfig = { | 
					
						
							|  |  |  |           User = "scanner"; | 
					
						
							|  |  |  |           Group = "scanner"; | 
					
						
							|  |  |  |           ExecStart = "${pkg}/bin/saned"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       systemd.sockets.saned = { | 
					
						
							|  |  |  |         description = "saned incoming socket"; | 
					
						
							|  |  |  |         wantedBy = [ "sockets.target" ]; | 
					
						
							|  |  |  |         listenStreams = [ "0.0.0.0:6566" "[::]:6566" ]; | 
					
						
							|  |  |  |         socketConfig = { | 
					
						
							|  |  |  |           # saned needs to distinguish between IPv4 and IPv6 to open matching data sockets. | 
					
						
							|  |  |  |           BindIPv6Only = "ipv6-only"; | 
					
						
							|  |  |  |           Accept = true; | 
					
						
							|  |  |  |           MaxConnections = 1; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |       users.users."scanner" = { | 
					
						
							| 
									
										
										
										
											2016-11-11 03:49:02 +03:00
										 |  |  |         uid = config.ids.uids.scanner; | 
					
						
							|  |  |  |         group = "scanner"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ]; | 
					
						
							| 
									
										
										
										
											2011-12-05 17:32:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |