network-manager: Big overhaul

* Add group 'networkmanager' and implement polkit configuration
    that allows users in this group to make persistent, system-wide
    changes to NetworkManager settings.

  * Add support for ModemManager. 3G modems should work out of the
    box now (it does for me...). This introduces a dependency on
    pkgs.modemmanager.

  * Write NetworkManger config file to Nix store, and let the
    daemon use it from there.
This commit is contained in:
Rickard Nilsson 2012-09-19 14:13:34 +02:00
parent 2d6d678bb9
commit 65c1c6525b
2 changed files with 79 additions and 42 deletions

View File

@ -126,6 +126,7 @@ in
clamav = 51; clamav = 51;
fprot = 52; fprot = 52;
wwwrun = 54; wwwrun = 54;
networkmanager = 56;
# When adding a gid, make sure it doesn't match an existing uid. # When adding a gid, make sure it doesn't match an existing uid.

View File

@ -3,12 +3,47 @@
with pkgs.lib; with pkgs.lib;
let let
cfg = config.networking.networkmanager;
stateDir = "/var/lib/NetworkManager"; stateDirs = "/var/lib/NetworkManager /var/lib/dhclient";
in configFile = pkgs.writeText "NetworkManager.conf" ''
[main]
plugins=keyfile
{ [keyfile]
${optionalString (config.networking.hostName != "") ''
hostname=${config.networking.hostName}
''}
[logging]
level=WARN
'';
polkitConf = ''
[network-manager]
Identity=unix-group:networkmanager
Action=org.freedesktop.NetworkManager.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
[modem-manager]
Identity=unix-group:networkmanager
Action=org.freedesktop.ModemManager.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
'';
ipUpScript = pkgs.writeScript "01nixos-ip-up" ''
#!/bin/sh
if test "$2" = "up"; then
${pkgs.upstart}/sbin/initctl emit ip-up "IFACE=$1"
fi
'';
in {
###### interface ###### interface
@ -20,61 +55,62 @@ in
description = '' description = ''
Whether to use NetworkManager to obtain an IP adress and other Whether to use NetworkManager to obtain an IP adress and other
configuration for all network interfaces that are not manually configuration for all network interfaces that are not manually
configured. configured. If enabled, a group <literal>networkmanager</literal>
will be created. Add all users that should have permission
to change network settings to this group.
''; '';
}; };
networking.networkmanager.packages = mkOption { networking.networkmanager.packages = mkOption {
default = [ pkgs.networkmanager ]; default = [ ];
description = description = ''
'' Extra packages that provide NetworkManager plugins.
Packages providing NetworkManager plugins. '';
''; merge = mergeListOption;
apply = list: [ pkgs.networkmanager pkgs.modemmanager ] ++ list;
}; };
}; };
###### implementation ###### implementation
config = mkIf config.networking.networkmanager.enable { config = mkIf cfg.enable {
jobs.networkmanager = environment.etc = singleton {
{ startOn = "started network-interfaces"; source = ipUpScript;
stopOn = "stopping network-interfaces"; target = "NetworkManager/dispatcher.d/01nixos-ip-up";
};
script = environment.systemPackages = cfg.packages;
''
mkdir -m 755 -p /etc/NetworkManager
mkdir -m 700 -p /etc/NetworkManager/system-connections
mkdir -m 755 -p ${stateDir}
if [[ ! -f /etc/NetworkManager/NetworkManager.conf ]]; then users.extraGroups = singleton {
cat <<-EOF > /etc/NetworkManager/NetworkManager.conf name = "networkmanager";
[main] gid = config.ids.gids.networkmanager;
plugins=keyfile };
EOF
fi
exec ${pkgs.networkmanager}/sbin/NetworkManager --no-daemon jobs.networkmanager = {
''; startOn = "started network-interfaces";
}; stopOn = "stopping network-interfaces";
path = [ pkgs.networkmanager ];
preStart = ''
mkdir -m 755 -p /etc/NetworkManager
mkdir -m 700 -p /etc/NetworkManager/system-connections
mkdir -m 755 -p ${stateDirs}
'';
exec = "NetworkManager --config=${configFile} --no-daemon";
};
environment.systemPackages = config.networking.networkmanager.packages;
services.dbus.packages = config.networking.networkmanager.packages;
networking.useDHCP = false; networking.useDHCP = false;
environment.etc = [ networking.wireless.enable = true;
{
source = pkgs.writeScript "01nixos-ip-up" security.polkit.permissions = polkitConf;
''
#!/bin/sh services.dbus.packages = cfg.packages;
if test "$2" = "up"; then
${pkgs.upstart}/sbin/initctl emit ip-up "IFACE=$1" services.udev.packages = cfg.packages;
fi
'';
target = "NetworkManager/dispatcher.d/01nixos-ip-up";
}
];
}; };
} }