From 56a53ff458d470e6d2ccf1c2712af0ff594e25c4 Mon Sep 17 00:00:00 2001 From: Robin Gloster Date: Tue, 29 Dec 2015 10:21:38 +0000 Subject: wpa_supplicant module: add networks option --- .../modules/services/networking/wpa_supplicant.nix | 66 ++++++++++++++-------- 1 file changed, 44 insertions(+), 22 deletions(-) (limited to 'nixos/modules/services/networking/wpa_supplicant.nix') diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix index 5979ab7fbe3..1292ca7f08e 100644 --- a/nixos/modules/services/networking/wpa_supplicant.nix +++ b/nixos/modules/services/networking/wpa_supplicant.nix @@ -4,33 +4,29 @@ with lib; let cfg = config.networking.wireless; - configFile = "/etc/wpa_supplicant.conf"; + configFile = if cfg.networks != {} then pkgs.writeText "wpa_supplicant.conf" '' + ${optionalString cfg.userControlled.enable '' + ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=${cfg.userControlled.group} + update_config=1''} + ${concatStringsSep "\n" (mapAttrsToList (ssid: networkConfig: '' + network={ + ssid="${ssid}" + ${optionalString (networkConfig.psk != null) ''psk="${networkConfig.psk}"''} + ${optionalString (networkConfig.psk == null) ''key_mgmt=NONE''} + } + '') cfg.networks)} + '' else "/etc/wpa_supplicant.conf"; in { options = { networking.wireless = { - enable = mkOption { - type = types.bool; - default = false; - description = '' - Whether to start wpa_supplicant to scan for - and associate with wireless networks. Note: NixOS currently - does not manage 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), or use - networking.wireless.userControlled.* to allow users to add entries - through wpa_cli and wpa_gui. - ''; - }; + enable = mkEnableOption "wpa_supplicant"; interfaces = mkOption { type = types.listOf types.str; default = []; example = [ "wlan0" "wlan1" ]; description = '' - The interfaces wpa_supplicant will use. If empty, it will + The interfaces wpa_supplicant will use. If empty, it will automatically use all wireless interfaces. ''; }; @@ -41,6 +37,34 @@ in { description = "Force a specific wpa_supplicant driver."; }; + networks = mkOption { + type = types.attrsOf (types.submodule { + options = { + psk = mkOption { + type = types.nullOr types.str; + default = null; + description = '' + The network's pre-shared key in plaintext defaulting + to being a network without any authentication. + ''; + }; + }; + }); + description = '' + The network definitions to automatically connect to when + wpa_supplicant is running. If this + parameter is left empty wpa_supplicant will use + /etc/wpa_supplicant.conf as the configuration file. + ''; + default = {}; + example = literalExample '' + echelon = { + psk = "abcdefgh"; + }; + "free.wifi" = {}; + ''; + }; + userControlled = { enable = mkOption { type = types.bool; @@ -51,10 +75,8 @@ in { to depend on a large package such as NetworkManager just to pick nearby access points. - When you want to use this, make sure ${configFile} doesn't exist. - It will be created for you. - - Currently it is also necessary to explicitly specify networking.wireless.interfaces. + When using a declarative network specification you cannot persist any + settings via wpa_gui or wpa_cli. ''; }; -- cgit 1.4.1