diff --git a/modules/services/networking/dhclient.nix b/modules/services/networking/dhclient.nix
index aea5a8f9c0c..658c25b6726 100644
--- a/modules/services/networking/dhclient.nix
+++ b/modules/services/networking/dhclient.nix
@@ -53,22 +53,6 @@ in
";
};
- networking.interfaces = mkOption {
- default = [];
- merge = mergeListOption;
- example = [
- { name = "eth0";
- ipAddress = "131.211.84.78";
- subnetMask = "255.255.255.128";
- }
- ];
- description = "
- The configuration for each network interface. If
- is true, then each interface
- not listed here will be configured using DHCP.
- ";
- };
-
};
diff --git a/modules/tasks/network-interfaces.nix b/modules/tasks/network-interfaces.nix
index d075d04ed6b..d2e01370668 100644
--- a/modules/tasks/network-interfaces.nix
+++ b/modules/tasks/network-interfaces.nix
@@ -2,168 +2,185 @@
let
- inherit (pkgs.lib) mkOption;
+ inherit (pkgs.lib) mkOption types;
+ inherit (pkgs) nettools;
-###### interface
+ cfg = config.networking;
+
+in
+
+{
+
+ ###### interface
options = {
networking.hostName = mkOption {
default = "nixos";
- description = "
+ description = ''
The name of the machine. Leave it empty if you want to obtain
it from a DHCP server (if using DHCP).
- ";
+ '';
};
networking.nativeIPv6 = mkOption {
default = false;
- description = "
+ description = ''
Whether to use IPv6 even though gw6c is not used. For example,
for Postfix.
- ";
+ '';
};
networking.defaultGateway = mkOption {
default = "";
example = "131.211.84.1";
- description = "
+ description = ''
The default gateway. It can be left empty if it is auto-detected through DHCP.
- ";
+ '';
};
networking.nameservers = mkOption {
default = [];
example = ["130.161.158.4" "130.161.33.17"];
- description = "
+ description = ''
The list of nameservers. It can be left empty if it is auto-detected through DHCP.
- ";
+ '';
};
networking.domain = mkOption {
default = "";
example = "home";
- description = "
+ description = ''
The domain. It can be left empty if it is auto-detected through DHCP.
- ";
+ '';
};
networking.localCommands = mkOption {
default = "";
example = "text=anything; echo You can put $text here.";
- description = "
+ description = ''
Shell commands to be executed at the end of the
network-interfaces Upstart job. Note that if
you are using DHCP to obtain the network configuration,
interfaces may not be fully configured yet.
- ";
+ '';
+ };
+
+ networking.interfaces = mkOption {
+ default = [];
+ example = [
+ { name = "eth0";
+ ipAddress = "131.211.84.78";
+ subnetMask = "255.255.255.128";
+ }
+ ];
+ description = ''
+ The configuration for each network interface. If
+ is true, then every
+ interface not listed here will be configured using DHCP.
+ '';
+
+ type = types.list types.optionSet;
+
+ options = {
+
+ name = mkOption {
+ example = "eth0";
+ type = types.string;
+ description = ''
+ Name of the interface.
+ '';
+ };
+
+ ipAddress = mkOption {
+ default = "";
+ example = "10.0.0.1";
+ type = types.string;
+ description = ''
+ IP address of the interface. Leave empty to configure the
+ interface using DHCP.
+ '';
+ };
+
+ subnetMask = mkOption {
+ default = "";
+ example = "255.255.255.0";
+ type = types.string;
+ description = ''
+ Subnet mask of the interface. Leave empty to use the
+ default subnet mask.
+ '';
+ };
+
+ };
+
};
};
-###### implementation
+ ###### implementation
- inherit (pkgs) nettools wirelesstools bash writeText;
+ config = {
- cfg = config.networking;
+ jobs = pkgs.lib.singleton
+ { name = "network-interfaces";
- # !!! use XML
- names = map (i: i.name) cfg.interfaces;
- ipAddresses = map (i: if i ? ipAddress then i.ipAddress else "dhcp") cfg.interfaces;
- subnetMasks = map (i: if i ? subnetMask then i.subnetMask else "default") cfg.interfaces;
- essids = map (i: if i ? essid then i.essid else "default") cfg.interfaces;
- wepKeys = map (i: if i ? wepKey then i.wepKey else "nokey") cfg.interfaces;
- modprobe = config.system.sbin.modprobe;
+ startOn = "udev";
-in
+ preStart =
+ ''
+ export PATH=${config.system.sbin.modprobe}/sbin:$PATH
+ modprobe af_packet || true
-{
- require = [options];
+ for i in $(cd /sys/class/net && ls -d *); do
+ echo "Bringing up network device $i..."
+ ${nettools}/sbin/ifconfig $i up || true
+ done
- services.extraJobs = [{
- name = "network-interfaces";
-
- job = ''
- start on udev
- stop on shutdown
-
- start script
- export PATH=${modprobe}/sbin:$PATH
- modprobe af_packet || true
-
- for i in $(cd /sys/class/net && ls -d *); do
- echo "Bringing up network device $i..."
- ${nettools}/sbin/ifconfig $i up || true
- done
-
- # Configure the manually specified interfaces.
- names=(${toString names})
- ipAddresses=(${toString ipAddresses})
- subnetMasks=(${toString subnetMasks})
- essids=(${toString essids})
- wepKeys=(${toString wepKeys})
-
- for ((n = 0; n < ''${#names[*]}; n++)); do
- name=''${names[$n]}
- ipAddress=''${ipAddresses[$n]}
- subnetMask=''${subnetMasks[$n]}
- essid=''${essids[$n]}
- wepKey=''${wepKeys[$n]}
-
- # Set wireless networking stuff.
- if test "$essid" != default; then
- ${wirelesstools}/sbin/iwconfig "$name" essid "$essid" || true
- fi
-
- if test "$wepKey" != nokey; then
- ${wirelesstools}/sbin/iwconfig "$name" key "$(cat "$wepKey")" || true
- fi
-
- # Set IP address / netmask.
- if test "$ipAddress" != dhcp; then
- echo "Configuring interface $name..."
+ # Configure the manually specified interfaces.
+ ${pkgs.lib.concatMapStrings (i:
+ if i.ipAddress != "" then
+ ''
+ echo "Configuring interface ${i.name}..."
extraFlags=
- if test "$subnetMask" != default; then
- extraFlags="$extraFlags netmask $subnetMask"
+ if test -n "${i.subnetMask}"; then
+ extraFlags="$extraFlags netmask ${i.subnetMask}"
fi
- ${nettools}/sbin/ifconfig "$name" "$ipAddress" $extraFlags || true
- fi
+ ${nettools}/sbin/ifconfig "${i.name}" "${i.ipAddress}" $extraFlags || true
+ ''
+ else "") cfg.interfaces}
- done
+ # Set the nameservers.
+ if test -n "${toString cfg.nameservers}"; then
+ rm -f /etc/resolv.conf
+ if test -n "${cfg.domain}"; then
+ echo "domain ${cfg.domain}" >> /etc/resolv.conf
+ fi
+ for i in ${toString cfg.nameservers}; do
+ echo "nameserver $i" >> /etc/resolv.conf
+ done
+ fi
- # Set the nameservers.
- if test -n "${toString cfg.nameservers}"; then
- rm -f /etc/resolv.conf
- if test -n "${cfg.domain}"; then
- echo "domain ${cfg.domain}" >> /etc/resolv.conf
- fi
- for i in ${toString cfg.nameservers}; do
- echo "nameserver $i" >> /etc/resolv.conf
- done
- fi
+ # Set the default gateway.
+ if test -n "${cfg.defaultGateway}"; then
+ ${nettools}/sbin/route add default gw "${cfg.defaultGateway}" || true
+ fi
- # Set the default gateway.
- if test -n "${cfg.defaultGateway}"; then
- ${nettools}/sbin/route add default gw "${cfg.defaultGateway}" || true
- fi
+ # Run any user-specified commands.
+ ${pkgs.stdenv.shell} ${pkgs.writeText "local-net-cmds" cfg.localCommands} || true
+ '';
- # Run any user-specified commands.
- ${bash}/bin/sh ${writeText "local-net-cmds" cfg.localCommands} || true
+ postStop =
+ ''
+ #for i in $(cd /sys/class/net && ls -d *); do
+ # echo "Taking down network device $i..."
+ # ${nettools}/sbin/ifconfig $i down || true
+ #done
+ '';
+ };
- end script
-
- # Hack: Upstart doesn't yet support what we want: a service that
- # doesn't have a running process associated with it.
- respawn sleep 100000
-
- stop script
- #for i in $(cd /sys/class/net && ls -d *); do
- # echo "Taking down network device $i..."
- # ${nettools}/sbin/ifconfig $i down || true
- #done
- end script
- '';
- }];
+ };
+
}