{ config, pkgs, ... }: with pkgs.lib; let configFile = "/etc/wpa_supplicant.conf"; ifaces = config.networking.wireless.interfaces ++ optional (config.networking.WLANInterface != "") config.networking.WLANInterface; in { ###### interface options = { networking.wireless.enable = mkOption { default = false; description = '' Whether to start wpa_supplicant to scan for and associate with wireless networks. Note: NixOS currently does not generate wpa_supplicant's configuration file, ${configFile}. You should edit this file yourself to define wireless networks, WPA keys and so on (see wpa_supplicant.conf 5). ''; }; networking.WLANInterface = mkOption { default = ""; description = "Obsolete. Use instead."; }; networking.wireless.interfaces = mkOption { default = []; example = [ "wlan0" "wlan1" ]; description = '' The interfaces wpa_supplicant will use. If empty, it will automatically use all wireless interfaces. ''; }; }; ###### implementation config = mkIf config.networking.wireless.enable { environment.systemPackages = [ pkgs.wpa_supplicant ]; services.dbus.packages = [ pkgs.wpa_supplicant ]; jobs.wpa_supplicant = { startOn = "started network-interfaces"; stopOn = "stopping network-interfaces"; path = [ pkgs.wpa_supplicant ]; preStart = '' touch -a ${configFile} chmod 600 ${configFile} ''; script = '' ${if ifaces == [] then '' for i in $(cd /sys/class/net && echo *); do if [ -e /sys/class/net/$i/wireless ]; then ifaces="$ifaces''${ifaces:+ -N} -i$i" fi done '' else '' ifaces="${concatStringsSep " -N " (map (i: "-i${i}") ifaces)}" ''} exec wpa_supplicant -s -u -c ${configFile} $ifaces ''; }; powerManagement.resumeCommands = '' ${config.system.build.upstart}/sbin/restart wpa_supplicant ''; }; }