services/wifi: migrate to NetworkManager

This commit is contained in:
DavHau
2025-05-26 17:44:50 +07:00
parent 7503784699
commit 6d6a0521ff
2 changed files with 53 additions and 48 deletions

View File

@@ -1,5 +1,12 @@
{ packages }: { packages }:
{ lib, ... }: { lib, ... }:
let
inherit (lib)
concatMapAttrsStringSep
flip
mapAttrs
;
in
{ {
_class = "clan.service"; _class = "clan.service";
manifest.name = "wifi"; manifest.name = "wifi";
@@ -30,17 +37,19 @@
default = { }; default = { };
description = "Wifi networks to predefine"; description = "Wifi networks to predefine";
}; };
}; };
perInstance = perInstance =
{ settings, ... }: { settings, ... }:
{ {
nixosModule = nixosModule =
{ config, pkgs, ... }: { pkgs, config, ... }:
let let
secret_path = password_path =
network_name: config.clan.core.vars.generators."iwd.${network_name}".files.password.path; network_name: config.clan.core.vars.generators."iwd.${network_name}".files.password.path;
ssid_path = network_name: config.clan.core.vars.generators."iwd.${network_name}".files.ssid.path; ssid_path = network_name: config.clan.core.vars.generators."iwd.${network_name}".files.ssid.path;
secret_generator = name: value: { secret_generator = name: value: {
name = "iwd.${name}"; name = "iwd.${name}";
value = { value = {
@@ -52,59 +61,55 @@
}; };
}; };
in in
{ lib.mkIf (settings.networks != { }) {
clan.core.vars.generators = lib.mapAttrs' secret_generator settings.networks; clan.core.vars.generators = lib.mapAttrs' secret_generator settings.networks;
systemd.services.iwd.partOf = [ "nixos-activation.service" ]; networking.networkmanager.enable = true;
/* networking.networkmanager.ensureProfiles.environmentFiles = [
script that generates iwd config files inside /var/lib/iwd/clan and symlinks "/run/secrets/NetworkManager/wifi-secrets"
them to /var/lib/iwd. ];
*/
systemd.services.iwd.serviceConfig.ExecStartPre = pkgs.writeShellScript "clan-iwd-setup" ''
set -e
rm -rf /var/lib/iwd/clan networking.networkmanager.ensureProfiles.profiles = flip mapAttrs settings.networks (
mkdir -p /var/lib/iwd/clan name: _network: {
connection.id = "$ssid_${name}";
connection.type = "wifi";
wifi.mode = "infrastructure";
wifi.ssid = "$ssid_${name}";
wifi-security.psk = "$pw_${name}";
wifi-security.key-mgmt = "wpa-psk";
}
);
# remove all existing symlinks in /var/lib/iwd # service to generate the environment file containing all secrets, as
${pkgs.findutils}/bin/find /var/lib/iwd -type l -exec rm {} \; # expected by the nixos NetworkManager-ensure-profile service
systemd.services.NetworkManager-setup-secrets = {
description = "Generate wifi secrets for NetworkManager";
requiredBy = [ "NetworkManager-ensure-profiles.service" ];
partOf = [ "NetworkManager-ensure-profiles.service" ];
before = [ "NetworkManager-ensure-profiles.service" ];
serviceConfig = {
Type = "oneshot";
ExecStart = pkgs.writeShellScript "wifi-secrets" ''
set -euo pipefail
${toString ( env_file=/run/secrets/NetworkManager/wifi-secrets
lib.mapAttrsToList (name: network: '' mkdir -p $(dirname "$env_file")
passwd=$(cat "${secret_path name}") : > "$env_file"
ssid=$(cat "${ssid_path name}")
echo "
[Settings]
autoConnect=${if network.autoConnect then "true" else "false"}
[Security]
Passphrase=$passwd
" > "/var/lib/iwd/clan/$ssid.psk"
'') settings.networks
)}
# link all files in /var/lib/iwd/clan to /var/lib/iwd # Generate the secrets file
${pkgs.findutils}/bin/find /var/lib/iwd/clan -type f -exec ln -s {} /var/lib/iwd \; echo "Generating wifi secrets file: $env_file"
''; ${flip (concatMapAttrsStringSep "\n") settings.networks (
# disable wpa supplicant name: _network: ''
networking.wireless.enable = false; echo "ssid_${name}=\"$(cat "${ssid_path name}")\"" >> /run/secrets/NetworkManager/wifi-secrets
echo "pw_${name}=\"$(cat "${password_path name}")\"" >> /run/secrets/NetworkManager/wifi-secrets
# Set the network manager backend to iwd ''
networking.networkmanager.wifi.backend = "iwd"; )}
'';
# Use iwd instead of wpa_supplicant. It has a user friendly CLI
networking.wireless.iwd = {
enable = true;
settings = {
Network = {
EnableIPv6 = true;
RoutePriorityOffset = 300;
};
Settings.autoConnect = true;
}; };
}; };
}; };
}; };
}; };
} }

View File

@@ -34,8 +34,8 @@ clanLib.test.makeTestClan {
testScript = '' testScript = ''
start_all() start_all()
test.wait_for_unit("iwd.service") test.wait_for_unit("NetworkManager.service")
psk = test.succeed("cat /var/lib/iwd/ssid-one.psk") psk = test.succeed("cat /run/NetworkManager/system-connections/one.nmconnection")
assert "password-eins" in psk, "Password is incorrect" assert "password-eins" in psk, "Password is incorrect"
''; '';
} }