From 4fa107f1c9bcf0af6eaea23e30f37c69296ff7bc Mon Sep 17 00:00:00 2001 From: rnhmjoj Date: Sun, 21 Apr 2024 02:05:12 +0200 Subject: [PATCH 1/2] nixos/wireless: create empty config for imperative setup If allowAuxiliaryImperativeNetworks is enabled, the wpa_supplicant daemon complains fails to start if /etc/wpa_supplicant.conf does not exist. As this can be created using wpa_cli (or similar) later, it shouldn't matter, so let's create an empty one. This fixes issues #157537, #299466. --- nixos/modules/services/networking/wpa_supplicant.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix index c9dd1d1b0f01..2804e3ecf177 100644 --- a/nixos/modules/services/networking/wpa_supplicant.nix +++ b/nixos/modules/services/networking/wpa_supplicant.nix @@ -124,6 +124,11 @@ let fi ''} + # ensure wpa_supplicant.conf exists, or the daemon will fail to start + ${optionalString cfg.allowAuxiliaryImperativeNetworks '' + touch /etc/wpa_supplicant.conf + ''} + # substitute environment variables if [ -f "${configFile}" ]; then ${pkgs.gawk}/bin/awk '{ From 4d2f457f6e02a08c9a6e8b879236facd8dd15fd7 Mon Sep 17 00:00:00 2001 From: rnhmjoj Date: Sun, 21 Apr 2024 02:08:48 +0200 Subject: [PATCH 2/2] nixos/tests/wpa_supplicant: test allowAuxiliaryImperativeNetworks --- nixos/tests/wpa_supplicant.nix | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/nixos/tests/wpa_supplicant.nix b/nixos/tests/wpa_supplicant.nix index 8c701ca7d5f7..9288eba189c8 100644 --- a/nixos/tests/wpa_supplicant.nix +++ b/nixos/tests/wpa_supplicant.nix @@ -113,6 +113,21 @@ import ./make-test-python.nix ({ pkgs, lib, ...}: }; }; + imperative = { ... }: { + imports = [ ../modules/profiles/minimal.nix ]; + + # add a virtual wlan interface + boot.kernelModules = [ "mac80211_hwsim" ]; + + # wireless client + networking.wireless = { + enable = lib.mkOverride 0 true; + userControlled.enable = true; + allowAuxiliaryImperativeNetworks = true; + interfaces = [ "wlan1" ]; + }; + }; + # Test connecting to the SAE-only hotspot using SAE machineSae = machineWithHostapd { networking.wireless = { @@ -185,6 +200,15 @@ import ./make-test-python.nix ({ pkgs, lib, ...}: assert "Failed to connect" not in status, \ "Failed to connect to the daemon" + with subtest("Daemon can be configured imperatively"): + imperative.wait_for_unit("wpa_supplicant-wlan1.service") + imperative.wait_until_succeeds("wpa_cli -i wlan1 status") + imperative.succeed("wpa_cli -i wlan1 add_network") + imperative.succeed("wpa_cli -i wlan1 set_network 0 ssid '\"nixos-test\"'") + imperative.succeed("wpa_cli -i wlan1 set_network 0 psk '\"reproducibility\"'") + imperative.succeed("wpa_cli -i wlan1 save_config") + imperative.succeed("grep -q nixos-test /etc/wpa_supplicant.conf") + machineSae.wait_for_unit("hostapd.service") machineSae.copy_from_vm("/run/hostapd/wlan0.hostapd.conf") with subtest("Daemon can connect to the SAE access point using SAE"):