Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nixos/networkmanager: Allow overriding installed plug-ins #164531

Merged
merged 1 commit into from
Apr 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
106 changes: 55 additions & 51 deletions nixos/modules/services/networking/networkmanager.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,6 @@ with lib;
let
cfg = config.networking.networkmanager;

basePackages = with pkgs; [
modemmanager
networkmanager
networkmanager-fortisslvpn
networkmanager-iodine
networkmanager-l2tp
networkmanager-openconnect
networkmanager-openvpn
networkmanager-vpnc
networkmanager-sstp
] ++ optional (!delegateWireless && !enableIwd) wpa_supplicant;

delegateWireless = config.networking.wireless.enable == true && cfg.unmanaged != [];

enableIwd = cfg.wifi.backend == "iwd";
Expand Down Expand Up @@ -145,6 +133,15 @@ let
'';
};

packages = [
pkgs.modemmanager
pkgs.networkmanager
]
++ cfg.plugins
++ lib.optionals (!delegateWireless && !enableIwd) [
pkgs.wpa_supplicant
];

in {

meta = {
Expand Down Expand Up @@ -227,13 +224,29 @@ in {
'';
};

packages = mkOption {
type = types.listOf types.package;
plugins = mkOption {
type =
let
networkManagerPluginPackage = types.package // {
description = "NetworkManager plug-in";
check =
p:
lib.assertMsg
(types.package.check p
&& p ? networkManagerPlugin
&& lib.isString p.networkManagerPlugin)
''
Package ‘${p.name}’, is not a NetworkManager plug-in.
Those need to have a ‘networkManagerPlugin’ attribute.
'';
};
in
types.listOf networkManagerPluginPackage;
default = [ ];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it might be helpful to add a defaultText listing the plugins added by default. if the docs say Default: [ ] we'd assume that no plugins would be loaded, which is not what's happening.

Copy link
Contributor Author

@jtojnar jtojnar Mar 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a note to the description (defaultText IMO would not be not right since we do not set the default value but rather the regular value).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This whole thing looks really off to me. Why have an option with no default if it effectively has one? If there is a default value, then shouldn't it be set at the option declaration location and not somewhere else?

Copy link
Contributor Author

@jtojnar jtojnar Mar 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you use default, and user sets networking.networkmanager.plugins, the default will not be used. Whereas this way, it will be merged. And people will be able to use lib.mkForce to replace the pseudo-default value.

description = ''
Extra packages that provide NetworkManager plugins.
List of NetworkManager plug-ins to enable.
Some plug-ins are enabled by the NetworkManager module by default.
'';
apply = list: basePackages ++ list;
};

dhcp = mkOption {
Expand Down Expand Up @@ -380,7 +393,7 @@ in {
</para><para>
If you enable this option the
<literal>networkmanager_strongswan</literal> plugin will be added to
the <option>networking.networkmanager.packages</option> option
the <option>networking.networkmanager.plugins</option> option
so you don't need to to that yourself.
'';
};
Expand All @@ -399,6 +412,9 @@ in {
};

imports = [
(mkRenamedOptionModule
[ "networking" "networkmanager" "packages" ]
[ "networking" "networkmanager" "plugins" ])
(mkRenamedOptionModule [ "networking" "networkmanager" "useDnsmasq" ] [ "networking" "networkmanager" "dns" ])
(mkRemovedOptionModule ["networking" "networkmanager" "dynamicHosts"] ''
This option was removed because allowing (multiple) regular users to
Expand Down Expand Up @@ -426,31 +442,12 @@ in {

hardware.wirelessRegulatoryDatabase = true;

environment.etc = with pkgs; {
"NetworkManager/NetworkManager.conf".source = configFile;

"NetworkManager/VPN/nm-openvpn-service.name".source =
"${networkmanager-openvpn}/lib/NetworkManager/VPN/nm-openvpn-service.name";

"NetworkManager/VPN/nm-vpnc-service.name".source =
"${networkmanager-vpnc}/lib/NetworkManager/VPN/nm-vpnc-service.name";

"NetworkManager/VPN/nm-openconnect-service.name".source =
"${networkmanager-openconnect}/lib/NetworkManager/VPN/nm-openconnect-service.name";

"NetworkManager/VPN/nm-fortisslvpn-service.name".source =
"${networkmanager-fortisslvpn}/lib/NetworkManager/VPN/nm-fortisslvpn-service.name";

"NetworkManager/VPN/nm-l2tp-service.name".source =
"${networkmanager-l2tp}/lib/NetworkManager/VPN/nm-l2tp-service.name";

"NetworkManager/VPN/nm-iodine-service.name".source =
"${networkmanager-iodine}/lib/NetworkManager/VPN/nm-iodine-service.name";

"NetworkManager/VPN/nm-sstp-service.name".source =
"${networkmanager-sstp}/lib/NetworkManager/VPN/nm-sstp-service.name";

environment.etc = {
"NetworkManager/NetworkManager.conf".source = configFile;
}
// builtins.listToAttrs (map (pkg: nameValuePair "NetworkManager/${pkg.networkManagerPlugin}" {
source = "${pkg}/lib/NetworkManager/${pkg.networkManagerPlugin}";
}) cfg.plugins)
// optionalAttrs cfg.enableFccUnlock
{
"ModemManager/fcc-unlock.d".source =
Expand All @@ -460,18 +457,13 @@ in {
{
"NetworkManager/dispatcher.d/02overridedns".source = overrideNameserversScript;
}
// optionalAttrs cfg.enableStrongSwan
{
"NetworkManager/VPN/nm-strongswan-service.name".source =
"${pkgs.networkmanager_strongswan}/lib/NetworkManager/VPN/nm-strongswan-service.name";
}
// listToAttrs (lib.imap1 (i: s:
{
name = "NetworkManager/dispatcher.d/${dispatcherTypesSubdirMap.${s.type}}03userscript${lib.fixedWidthNumber 4 i}";
value = { mode = "0544"; inherit (s) source; };
}) cfg.dispatcherScripts);

environment.systemPackages = cfg.packages;
environment.systemPackages = packages;

users.groups = {
networkmanager.gid = config.ids.gids.networkmanager;
Expand All @@ -490,7 +482,7 @@ in {
};
};

systemd.packages = cfg.packages;
systemd.packages = packages;

systemd.tmpfiles.rules = [
"d /etc/NetworkManager/system-connections 0700 root root -"
Expand Down Expand Up @@ -534,8 +526,20 @@ in {
useDHCP = false;
})

{
networkmanager.plugins = with pkgs; [
networkmanager-fortisslvpn
networkmanager-iodine
networkmanager-l2tp
networkmanager-openconnect
networkmanager-openvpn
networkmanager-vpnc
networkmanager-sstp
];
}

(mkIf cfg.enableStrongSwan {
networkmanager.packages = [ pkgs.networkmanager_strongswan ];
networkmanager.plugins = [ pkgs.networkmanager_strongswan ];
})

(mkIf enableIwd {
Expand All @@ -559,10 +563,10 @@ in {
security.polkit.enable = true;
security.polkit.extraConfig = polkitConf;

services.dbus.packages = cfg.packages
services.dbus.packages = packages
++ optional cfg.enableStrongSwan pkgs.strongswanNM
++ optional (cfg.dns == "dnsmasq") pkgs.dnsmasq;

services.udev.packages = cfg.packages;
services.udev.packages = packages;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ stdenv.mkDerivation rec {
attrPath = "networkmanager-fortisslvpn";
versionPolicy = "odd-unstable";
};
networkManagerPlugin = "VPN/nm-fortisslvpn-service.name";
};

meta = with lib; {
Expand Down
1 change: 1 addition & 0 deletions pkgs/tools/networking/networkmanager/iodine/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ in stdenv.mkDerivation {
packageName = pname;
attrPath = "networkmanager-iodine";
};
networkManagerPlugin = "VPN/nm-iodine-service.name";
};

meta = with lib; {
Expand Down
4 changes: 4 additions & 0 deletions pkgs/tools/networking/networkmanager/l2tp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ stdenv.mkDerivation rec {

enableParallelBuilding = true;

passthru = {
networkManagerPlugin = "VPN/nm-l2tp-service.name";
};

meta = with lib; {
description = "L2TP plugin for NetworkManager";
inherit (networkmanager.meta) platforms;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ in stdenv.mkDerivation {
attrPath = "networkmanager-openconnect";
versionPolicy = "odd-unstable";
};
networkManagerPlugin = "VPN/nm-openconnect-service.name";
};

meta = with lib; {
Expand Down
1 change: 1 addition & 0 deletions pkgs/tools/networking/networkmanager/openvpn/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ in stdenv.mkDerivation {
attrPath = "networkmanager-openvpn";
versionPolicy = "odd-unstable";
};
networkManagerPlugin = "VPN/nm-openvpn-service.name";
};

meta = with lib; {
Expand Down
1 change: 1 addition & 0 deletions pkgs/tools/networking/networkmanager/sstp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ in stdenv.mkDerivation {
packageName = pname;
attrPath = "networkmanager-sstp";
};
networkManagerPlugin = "VPN/nm-sstp-service.name";
};

meta = with lib; {
Expand Down
4 changes: 4 additions & 0 deletions pkgs/tools/networking/networkmanager/strongswan/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ stdenv.mkDerivation rec {
"--with-nm-plugindir=$(out)/lib/NetworkManager"
];

passthru = {
networkManagerPlugin = "VPN/nm-strongswan-service.name";
};

PKG_CONFIG_LIBNM_VPNSERVICEDIR = "$(out)/lib/NetworkManager/VPN";

meta = with lib; {
Expand Down
1 change: 1 addition & 0 deletions pkgs/tools/networking/networkmanager/vpnc/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ in stdenv.mkDerivation {
attrPath = "networkmanager-vpnc";
versionPolicy = "odd-unstable";
};
networkManagerPlugin = "VPN/nm-vpnc-service.name";
};

meta = with lib; {
Expand Down