| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2009-10-12 17:27:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |   cfg = config.networking.wireless; | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  |   configFile = "/etc/wpa_supplicant.conf"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |   ifaces = | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |     cfg.interfaces ++ | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |     optional (config.networking.WLANInterface != "") config.networking.WLANInterface; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   options = { | 
					
						
							| 
									
										
										
										
											2012-06-29 11:53:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 20:30:40 +00:00
										 |  |  |     networking.WLANInterface = mkOption { | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |       default = ""; | 
					
						
							|  |  |  |       description = "Obsolete. Use <option>networking.wireless.interfaces</option> instead."; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |     networking.wireless = { | 
					
						
							|  |  |  |       enable = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-29 13:04:26 +01:00
										 |  |  |         type = types.bool; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |         default = false; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           Whether to start <command>wpa_supplicant</command> to scan for | 
					
						
							|  |  |  |           and associate with wireless networks.  Note: NixOS currently | 
					
						
							|  |  |  |           does not generate <command>wpa_supplicant</command>'s | 
					
						
							|  |  |  |           configuration file, <filename>${configFile}</filename>.  You | 
					
						
							|  |  |  |           should edit this file yourself to define wireless networks, | 
					
						
							|  |  |  |           WPA keys and so on (see | 
					
						
							|  |  |  |           <citerefentry><refentrytitle>wpa_supplicant.conf</refentrytitle> | 
					
						
							|  |  |  |           <manvolnum>5</manvolnum></citerefentry>). | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       interfaces = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-29 13:04:26 +01:00
										 |  |  |         type = types.listOf types.string; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |         default = []; | 
					
						
							|  |  |  |         example = [ "wlan0" "wlan1" ]; | 
					
						
							|  |  |  |         description = ''
 | 
					
						
							|  |  |  |           The interfaces <command>wpa_supplicant</command> will use.  If empty, it will | 
					
						
							| 
									
										
										
										
											2014-04-24 18:16:12 +02:00
										 |  |  |           automatically use all wireless interfaces. | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       driver = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-30 11:02:04 +01:00
										 |  |  |         type = types.str; | 
					
						
							| 
									
										
										
										
											2013-01-22 12:32:19 +01:00
										 |  |  |         default = "nl80211,wext"; | 
					
						
							| 
									
										
										
										
											2012-11-02 17:05:30 +01:00
										 |  |  |         description = "Force a specific wpa_supplicant driver."; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2009-12-09 20:30:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |       userControlled = { | 
					
						
							|  |  |  |         enable = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-29 13:04:26 +01:00
										 |  |  |           type = types.bool; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |           default = false; | 
					
						
							|  |  |  |           description = ''
 | 
					
						
							|  |  |  |             Allow normal users to control wpa_supplicant through wpa_gui or wpa_cli. | 
					
						
							|  |  |  |             This is useful for laptop users that switch networks a lot. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             When you want to use this, make sure ${configFile} doesn't exist. | 
					
						
							|  |  |  |             It will be created for you. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-02 17:05:30 +01:00
										 |  |  |             Currently it is also necessary to explicitly specify networking.wireless.interfaces. | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |           '';
 | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         group = mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-30 11:02:04 +01:00
										 |  |  |           type = types.str; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |           default = "wheel"; | 
					
						
							|  |  |  |           example = "network"; | 
					
						
							| 
									
										
										
										
											2012-11-02 17:05:30 +01:00
										 |  |  |           description = "Members of this group can control wpa_supplicant."; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ###### implementation | 
					
						
							| 
									
										
										
										
											2012-06-29 11:53:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |   config = mkIf cfg.enable { | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-21 11:37:52 +00:00
										 |  |  |     environment.systemPackages =  [ pkgs.wpa_supplicant ]; | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-19 23:16:32 +00:00
										 |  |  |     services.dbus.packages = [ pkgs.wpa_supplicant ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-28 20:10:49 +02:00
										 |  |  |     # FIXME: start a separate wpa_supplicant instance per interface. | 
					
						
							| 
									
										
										
										
											2012-06-29 11:53:08 +02:00
										 |  |  |     jobs.wpa_supplicant = | 
					
						
							| 
									
										
										
										
											2013-01-10 13:46:34 +01:00
										 |  |  |       { description = "WPA Supplicant"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         wantedBy = [ "network.target" ]; | 
					
						
							| 
									
										
										
										
											2009-07-24 00:31:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-25 16:32:54 +00:00
										 |  |  |         path = [ pkgs.wpa_supplicant ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |         preStart = ''
 | 
					
						
							|  |  |  |           touch -a ${configFile} | 
					
						
							|  |  |  |           chmod 600 ${configFile} | 
					
						
							|  |  |  |         '' + optionalString cfg.userControlled.enable '' | 
					
						
							|  |  |  |           if [ ! -s ${configFile} ]; then | 
					
						
							|  |  |  |             echo "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=${cfg.userControlled.group}" >> ${configFile} | 
					
						
							|  |  |  |             echo "update_config=1" >> ${configFile} | 
					
						
							|  |  |  |           fi | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |         script = | 
					
						
							|  |  |  |           ''
 | 
					
						
							|  |  |  |             ${if ifaces == [] then ''
 | 
					
						
							|  |  |  |               for i in $(cd /sys/class/net && echo *); do | 
					
						
							| 
									
										
										
										
											2013-07-15 13:52:46 +02:00
										 |  |  |                 DEVTYPE= | 
					
						
							|  |  |  |                 source /sys/class/net/$i/uevent | 
					
						
							|  |  |  |                 if [ "$DEVTYPE" = "wlan" -o -e /sys/class/net/$i/wireless ]; then | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |                   ifaces="$ifaces''${ifaces:+ -N} -i$i" | 
					
						
							|  |  |  |                 fi | 
					
						
							|  |  |  |               done | 
					
						
							|  |  |  |             '' else '' | 
					
						
							|  |  |  |               ifaces="${concatStringsSep " -N " (map (i: "-i${i}") ifaces)}" | 
					
						
							|  |  |  |             ''}
 | 
					
						
							| 
									
										
										
										
											2013-01-23 22:07:40 +01:00
										 |  |  |             exec wpa_supplicant -s -u -D${cfg.driver} -c ${configFile} $ifaces | 
					
						
							| 
									
										
										
										
											2012-03-04 17:21:14 +00:00
										 |  |  |           '';
 | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2012-06-29 11:53:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-19 22:53:25 +00:00
										 |  |  |     powerManagement.resumeCommands = | 
					
						
							|  |  |  |       ''
 | 
					
						
							| 
									
										
										
										
											2013-01-16 13:17:57 +01:00
										 |  |  |         ${config.systemd.package}/bin/systemctl try-restart wpa_supplicant | 
					
						
							| 
									
										
										
										
											2012-02-19 22:53:25 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-29 11:53:08 +02:00
										 |  |  |     assertions = [{ assertion = !cfg.userControlled.enable || cfg.interfaces != []; | 
					
						
							| 
									
										
										
										
											2012-04-01 10:54:10 +00:00
										 |  |  |                     message = "user controlled wpa_supplicant needs explicit networking.wireless.interfaces";}]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-28 20:10:49 +02:00
										 |  |  |     # Restart wpa_supplicant when a wlan device appears or disappears. | 
					
						
							|  |  |  |     services.udev.extraRules = | 
					
						
							|  |  |  |       ''
 | 
					
						
							|  |  |  |         ACTION=="add|remove", SUBSYSTEM=="net", ENV{DEVTYPE}=="wlan", RUN+="${config.systemd.package}/bin/systemctl try-restart wpa_supplicant.service" | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 21:08:32 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |