From 645b8a3749d683181736c7ced2a77a5bcd01942a Mon Sep 17 00:00:00 2001 From: rnhmjoj Date: Tue, 24 Nov 2020 00:18:18 +0100 Subject: [PATCH] nixos/wireless: fix failure with no interfaces This resolves issue #101963. When the service is started and no interface is ready yet, wpa_supplicant is being exec'd with no `-i` flags, thus failing. Once the interfaces are ready, the udev rule would fire but wouldn't restart the unit because it wasn't currently running (see systemctl(1) try-restart). The solution is to exit (with a clear error message) but always restart wpa_supplicant when the interfaces are modified. (cherry picked from commit 8f177612b14063b644288a5a1058bf47f44b43a5) --- nixos/modules/services/networking/wpa_supplicant.nix | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix index 395139879036a..3cfcb535ef5b8 100644 --- a/nixos/modules/services/networking/wpa_supplicant.nix +++ b/nixos/modules/services/networking/wpa_supplicant.nix @@ -233,9 +233,10 @@ in { path = [ pkgs.wpa_supplicant ]; script = '' - if [ -f /etc/wpa_supplicant.conf -a "/etc/wpa_supplicant.conf" != "${configFile}" ] - then echo >&2 "<3>/etc/wpa_supplicant.conf present but ignored. Generated ${configFile} is used instead." + if [ -f /etc/wpa_supplicant.conf -a "/etc/wpa_supplicant.conf" != "${configFile}" ]; then + echo >&2 "<3>/etc/wpa_supplicant.conf present but ignored. Generated ${configFile} is used instead." fi + iface_args="-s -u -D${cfg.driver} -c ${configFile}" ${if ifaces == [] then '' for i in $(cd /sys/class/net && echo *); do @@ -248,6 +249,10 @@ in { fi fi done + if [ -z "$args" ]; then + echo >&2 "<3>No wireless interfaces detected (yet)." + exit 1 + fi '' else '' args="${concatMapStringsSep " -N " (i: "-i${i} $iface_args") ifaces}" ''} @@ -261,7 +266,7 @@ in { # Restart wpa_supplicant when a wlan device appears or disappears. services.udev.extraRules = '' - ACTION=="add|remove", SUBSYSTEM=="net", ENV{DEVTYPE}=="wlan", RUN+="/run/current-system/systemd/bin/systemctl try-restart wpa_supplicant.service" + ACTION=="add|remove", SUBSYSTEM=="net", ENV{DEVTYPE}=="wlan", RUN+="/run/current-system/systemd/bin/systemctl restart wpa_supplicant.service" ''; };