diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-07-16 17:18:54 +0000 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2009-07-16 17:18:54 +0000 |
commit | b58682401ede3842ba41fd6665f27630650413bd (patch) | |
tree | 6952c62b2b3f444d14f45d006d8a47d028ad6e90 /modules/tasks/network-interfaces.nix | |
parent | f53c9d70ec2f056957151ea4198bbdc836da65bd (diff) | |
download | nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.gz nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.bz2 nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.lz nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.xz nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.zst nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.zip |
* Give a type to networking.interfaces.
* Simplified the pre-start script of the network-interfaces module. * Removed wireless support from the network-interfaces module. It only worked for static WEP configurations anyway, and AFAIK nobody used it. svn path=/nixos/branches/modular-nixos/; revision=16406
Diffstat (limited to 'modules/tasks/network-interfaces.nix')
-rw-r--r-- | modules/tasks/network-interfaces.nix | 237 |
1 files changed, 127 insertions, 110 deletions
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 <literal>network-interfaces</literal> 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 + <option>networking.useDHCP</option> 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]; - - 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..." + 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. + ${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 - - 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 default gateway. - if test -n "${cfg.defaultGateway}"; then - ${nettools}/sbin/route add default gw "${cfg.defaultGateway}" || true - fi - - # Run any user-specified commands. - ${bash}/bin/sh ${writeText "local-net-cmds" cfg.localCommands} || true - - 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 - ''; - }]; + ${nettools}/sbin/ifconfig "${i.name}" "${i.ipAddress}" $extraFlags || true + '' + else "") cfg.interfaces} + + # 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 + + # Run any user-specified commands. + ${pkgs.stdenv.shell} ${pkgs.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 + ''; + }; + + }; + } |