2014-04-14 14:26:48 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
2012-02-20 01:17:53 +00:00
|
|
|
|
2014-04-14 14:26:48 +00:00
|
|
|
with lib;
|
2012-02-20 01:17:53 +00:00
|
|
|
|
|
|
|
let
|
|
|
|
|
2014-04-18 13:36:06 +00:00
|
|
|
dhcpcd = if !config.boot.isContainer then pkgs.dhcpcd else pkgs.dhcpcd.override { udev = null; };
|
2012-02-20 01:17:53 +00:00
|
|
|
|
2014-07-04 20:11:16 +00:00
|
|
|
cfg = config.networking.dhcpcd;
|
|
|
|
|
2013-10-29 16:34:43 +00:00
|
|
|
# Don't start dhcpcd on explicitly configured interfaces or on
|
2014-07-04 20:01:26 +00:00
|
|
|
# interfaces that are part of a bridge, bond or sit device.
|
2012-02-20 01:17:53 +00:00
|
|
|
ignoredInterfaces =
|
2014-08-31 08:58:54 +00:00
|
|
|
map (i: i.name) (filter (i: i.ipAddress != null) (attrValues config.networking.interfaces))
|
2014-07-04 20:01:26 +00:00
|
|
|
++ mapAttrsToList (i: _: i) config.networking.sits
|
2012-05-08 11:46:01 +00:00
|
|
|
++ concatLists (attrValues (mapAttrs (n: v: v.interfaces) config.networking.bridges))
|
2013-12-30 09:14:41 +00:00
|
|
|
++ concatLists (attrValues (mapAttrs (n: v: v.interfaces) config.networking.bonds))
|
2012-05-08 11:46:01 +00:00
|
|
|
++ config.networking.dhcpcd.denyInterfaces;
|
2012-02-20 01:17:53 +00:00
|
|
|
|
2012-02-20 13:13:29 +00:00
|
|
|
# Config file adapted from the one that ships with dhcpcd.
|
|
|
|
dhcpcdConf = pkgs.writeText "dhcpcd.conf"
|
|
|
|
''
|
|
|
|
# Inform the DHCP server of our hostname for DDNS.
|
|
|
|
hostname
|
|
|
|
|
|
|
|
# A list of options to request from the DHCP server.
|
|
|
|
option domain_name_servers, domain_name, domain_search, host_name
|
|
|
|
option classless_static_routes, ntp_servers, interface_mtu
|
|
|
|
|
|
|
|
# A ServerID is required by RFC2131.
|
2012-12-05 21:52:24 +00:00
|
|
|
# Commented out because of many non-compliant DHCP servers in the wild :(
|
|
|
|
#require dhcp_server_identifier
|
2012-02-20 13:13:29 +00:00
|
|
|
|
|
|
|
# A hook script is provided to lookup the hostname if not set by
|
|
|
|
# the DHCP server, but it should not be run by default.
|
|
|
|
nohook lookup-hostname
|
|
|
|
|
|
|
|
# Ignore peth* devices; on Xen, they're renamed physical
|
|
|
|
# Ethernet cards used for bridging. Likewise for vif* and tap*
|
2014-05-07 15:00:46 +00:00
|
|
|
# (Xen) and virbr* and vnet* (libvirt).
|
2014-07-04 20:01:26 +00:00
|
|
|
denyinterfaces ${toString ignoredInterfaces} lo peth* vif* tap* tun* virbr* vnet* vboxnet* sit*
|
2013-07-22 12:16:13 +00:00
|
|
|
|
2014-07-04 20:11:16 +00:00
|
|
|
# Use the list of allowed interfaces if specified
|
2014-07-12 21:53:25 +00:00
|
|
|
${optionalString (cfg.allowInterfaces != null) "allowinterfaces ${toString cfg.allowInterfaces}"}
|
2014-07-04 20:11:16 +00:00
|
|
|
|
|
|
|
${cfg.extraConfig}
|
2012-02-20 13:13:29 +00:00
|
|
|
'';
|
|
|
|
|
2012-02-20 15:19:46 +00:00
|
|
|
# Hook for emitting ip-up/ip-down events.
|
|
|
|
exitHook = pkgs.writeText "dhcpcd.exit-hook"
|
|
|
|
''
|
|
|
|
if [ "$reason" = BOUND -o "$reason" = REBOOT ]; then
|
2012-07-20 22:24:55 +00:00
|
|
|
# Restart ntpd. We need to restart it to make sure that it
|
|
|
|
# will actually do something: if ntpd cannot resolve the
|
|
|
|
# server hostnames in its config file, then it will never do
|
2012-02-20 15:19:46 +00:00
|
|
|
# anything ever again ("couldn't resolve ..., giving up on
|
|
|
|
# it"), so we silently lose time synchronisation.
|
2013-01-16 12:17:57 +00:00
|
|
|
${config.systemd.package}/bin/systemctl try-restart ntpd.service
|
2012-02-20 15:19:46 +00:00
|
|
|
|
2013-01-16 12:17:57 +00:00
|
|
|
${config.systemd.package}/bin/systemctl start ip-up.target
|
2012-02-20 15:19:46 +00:00
|
|
|
fi
|
|
|
|
|
2012-07-20 22:24:55 +00:00
|
|
|
#if [ "$reason" = EXPIRE -o "$reason" = RELEASE -o "$reason" = NOCARRIER ] ; then
|
2013-01-16 12:17:57 +00:00
|
|
|
# ${config.systemd.package}/bin/systemctl start ip-down.target
|
2012-07-20 22:24:55 +00:00
|
|
|
#fi
|
2014-05-12 13:03:42 +00:00
|
|
|
|
|
|
|
${config.networking.dhcpcd.runHook}
|
2012-02-20 15:19:46 +00:00
|
|
|
'';
|
|
|
|
|
2012-02-20 01:17:53 +00:00
|
|
|
in
|
|
|
|
|
|
|
|
{
|
|
|
|
|
2012-05-08 11:46:01 +00:00
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
networking.dhcpcd.denyInterfaces = mkOption {
|
2014-04-18 00:40:01 +00:00
|
|
|
type = types.listOf types.str;
|
2012-05-08 11:46:01 +00:00
|
|
|
default = [];
|
|
|
|
description = ''
|
2013-08-10 21:07:13 +00:00
|
|
|
Disable the DHCP client for any interface whose name matches
|
2012-05-08 11:46:01 +00:00
|
|
|
any of the shell glob patterns in this list. The purpose of
|
2013-08-10 21:07:13 +00:00
|
|
|
this option is to blacklist virtual interfaces such as those
|
2012-05-08 11:46:01 +00:00
|
|
|
created by Xen, libvirt, LXC, etc.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2014-07-04 20:11:16 +00:00
|
|
|
networking.dhcpcd.allowInterfaces = mkOption {
|
2014-07-12 21:53:25 +00:00
|
|
|
type = types.nullOr (types.listOf types.str);
|
|
|
|
default = null;
|
2014-07-04 20:11:16 +00:00
|
|
|
description = ''
|
|
|
|
Enable the DHCP client for any interface whose name matches
|
|
|
|
any of the shell glob patterns in this list. Any interface not
|
|
|
|
explicitly matched by this pattern will be denied. This pattern only
|
2014-07-12 21:53:25 +00:00
|
|
|
applies when non-null.
|
2014-07-04 20:11:16 +00:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2013-07-22 12:16:13 +00:00
|
|
|
networking.dhcpcd.extraConfig = mkOption {
|
2014-04-18 00:40:01 +00:00
|
|
|
type = types.lines;
|
2013-07-22 12:16:13 +00:00
|
|
|
default = "";
|
|
|
|
description = ''
|
|
|
|
Literal string to append to the config file generated for dhcpcd.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2014-05-12 13:03:42 +00:00
|
|
|
networking.dhcpcd.runHook = mkOption {
|
|
|
|
type = types.lines;
|
|
|
|
default = "";
|
|
|
|
example = "if [[ $reason =~ BOUND ]]; then echo $interface: Routers are $new_routers - were $old_routers; fi";
|
|
|
|
description = ''
|
|
|
|
Shell code that will be run after all other hooks. See
|
|
|
|
`man dhcpcd-run-hooks` for details on what is possible.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2012-05-08 11:46:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-02-20 01:17:53 +00:00
|
|
|
###### implementation
|
|
|
|
|
|
|
|
config = mkIf config.networking.useDHCP {
|
|
|
|
|
2013-01-16 11:33:18 +00:00
|
|
|
systemd.services.dhcpcd =
|
2012-08-15 19:38:52 +00:00
|
|
|
{ description = "DHCP Client";
|
|
|
|
|
2012-10-11 21:57:54 +00:00
|
|
|
wantedBy = [ "network.target" ];
|
2012-02-20 01:17:53 +00:00
|
|
|
|
2013-01-05 00:05:25 +00:00
|
|
|
# Stopping dhcpcd during a reconfiguration is undesirable
|
|
|
|
# because it brings down the network interfaces configured by
|
|
|
|
# dhcpcd. So do a "systemctl restart" instead.
|
|
|
|
stopIfChanged = false;
|
|
|
|
|
2012-02-20 01:17:53 +00:00
|
|
|
path = [ dhcpcd pkgs.nettools pkgs.openresolv ];
|
|
|
|
|
2013-11-26 17:17:12 +00:00
|
|
|
unitConfig.ConditionCapability = "CAP_NET_ADMIN";
|
|
|
|
|
2012-08-17 15:01:07 +00:00
|
|
|
serviceConfig =
|
2012-10-01 20:27:42 +00:00
|
|
|
{ Type = "forking";
|
|
|
|
PIDFile = "/run/dhcpcd.pid";
|
2014-04-24 13:08:31 +00:00
|
|
|
ExecStart = "@${dhcpcd}/sbin/dhcpcd dhcpcd --quiet --config ${dhcpcdConf}";
|
2012-10-01 20:27:42 +00:00
|
|
|
ExecReload = "${dhcpcd}/sbin/dhcpcd --rebind";
|
2012-11-02 16:08:11 +00:00
|
|
|
Restart = "always";
|
2012-10-01 20:27:42 +00:00
|
|
|
};
|
2012-02-20 01:17:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
environment.systemPackages = [ dhcpcd ];
|
|
|
|
|
2012-02-20 15:19:46 +00:00
|
|
|
environment.etc =
|
|
|
|
[ { source = exitHook;
|
|
|
|
target = "dhcpcd.exit-hook";
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
2012-02-20 01:17:53 +00:00
|
|
|
powerManagement.resumeCommands =
|
|
|
|
''
|
2012-03-23 21:00:32 +00:00
|
|
|
# Tell dhcpcd to rebind its interfaces if it's running.
|
2013-01-16 12:17:57 +00:00
|
|
|
${config.systemd.package}/bin/systemctl reload dhcpcd.service
|
2012-02-20 01:17:53 +00:00
|
|
|
'';
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|