* 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
This commit is contained in:
Eelco Dolstra 2009-07-16 17:18:54 +00:00
parent f53c9d70ec
commit b58682401e
2 changed files with 121 additions and 120 deletions

View File

@ -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
<option>networking.useDHCP</option> is true, then each interface
not listed here will be configured using DHCP.
";
};
}; };

View File

@ -2,8 +2,15 @@
let let
inherit (pkgs.lib) mkOption; inherit (pkgs.lib) mkOption types;
inherit (pkgs) nettools;
cfg = config.networking;
in
{
###### interface ###### interface
@ -11,53 +18,103 @@ let
networking.hostName = mkOption { networking.hostName = mkOption {
default = "nixos"; default = "nixos";
description = " description = ''
The name of the machine. Leave it empty if you want to obtain The name of the machine. Leave it empty if you want to obtain
it from a DHCP server (if using DHCP). it from a DHCP server (if using DHCP).
"; '';
}; };
networking.nativeIPv6 = mkOption { networking.nativeIPv6 = mkOption {
default = false; default = false;
description = " description = ''
Whether to use IPv6 even though gw6c is not used. For example, Whether to use IPv6 even though gw6c is not used. For example,
for Postfix. for Postfix.
"; '';
}; };
networking.defaultGateway = mkOption { networking.defaultGateway = mkOption {
default = ""; default = "";
example = "131.211.84.1"; example = "131.211.84.1";
description = " description = ''
The default gateway. It can be left empty if it is auto-detected through DHCP. The default gateway. It can be left empty if it is auto-detected through DHCP.
"; '';
}; };
networking.nameservers = mkOption { networking.nameservers = mkOption {
default = []; default = [];
example = ["130.161.158.4" "130.161.33.17"]; 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. The list of nameservers. It can be left empty if it is auto-detected through DHCP.
"; '';
}; };
networking.domain = mkOption { networking.domain = mkOption {
default = ""; default = "";
example = "home"; example = "home";
description = " description = ''
The domain. It can be left empty if it is auto-detected through DHCP. The domain. It can be left empty if it is auto-detected through DHCP.
"; '';
}; };
networking.localCommands = mkOption { networking.localCommands = mkOption {
default = ""; default = "";
example = "text=anything; echo You can put $text here."; example = "text=anything; echo You can put $text here.";
description = " description = ''
Shell commands to be executed at the end of the Shell commands to be executed at the end of the
<literal>network-interfaces</literal> Upstart job. Note that if <literal>network-interfaces</literal> Upstart job. Note that if
you are using DHCP to obtain the network configuration, you are using DHCP to obtain the network configuration,
interfaces may not be fully configured yet. 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.
'';
};
};
}; };
}; };
@ -65,32 +122,16 @@ let
###### implementation ###### implementation
inherit (pkgs) nettools wirelesstools bash writeText; config = {
cfg = config.networking; jobs = pkgs.lib.singleton
{ name = "network-interfaces";
# !!! use XML startOn = "udev";
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;
in preStart =
''
{ export PATH=${config.system.sbin.modprobe}/sbin:$PATH
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 modprobe af_packet || true
for i in $(cd /sys/class/net && ls -d *); do for i in $(cd /sys/class/net && ls -d *); do
@ -99,39 +140,17 @@ in
done done
# Configure the manually specified interfaces. # Configure the manually specified interfaces.
names=(${toString names}) ${pkgs.lib.concatMapStrings (i:
ipAddresses=(${toString ipAddresses}) if i.ipAddress != "" then
subnetMasks=(${toString subnetMasks}) ''
essids=(${toString essids}) echo "Configuring interface ${i.name}..."
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..."
extraFlags= extraFlags=
if test "$subnetMask" != default; then if test -n "${i.subnetMask}"; then
extraFlags="$extraFlags netmask $subnetMask" extraFlags="$extraFlags netmask ${i.subnetMask}"
fi fi
${nettools}/sbin/ifconfig "$name" "$ipAddress" $extraFlags || true ${nettools}/sbin/ifconfig "${i.name}" "${i.ipAddress}" $extraFlags || true
fi ''
else "") cfg.interfaces}
done
# Set the nameservers. # Set the nameservers.
if test -n "${toString cfg.nameservers}"; then if test -n "${toString cfg.nameservers}"; then
@ -150,20 +169,18 @@ in
fi fi
# Run any user-specified commands. # Run any user-specified commands.
${bash}/bin/sh ${writeText "local-net-cmds" cfg.localCommands} || true ${pkgs.stdenv.shell} ${pkgs.writeText "local-net-cmds" cfg.localCommands} || true
'';
end script postStop =
''
# 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 #for i in $(cd /sys/class/net && ls -d *); do
# echo "Taking down network device $i..." # echo "Taking down network device $i..."
# ${nettools}/sbin/ifconfig $i down || true # ${nettools}/sbin/ifconfig $i down || true
#done #done
end script
''; '';
}]; };
};
} }