forked from mirrors/nixpkgs
01b90dce78
This is a refactor of how resolvconf is managed on NixOS. We split it into a separate service which is enabled internally depending on whether we want /etc/resolv.conf to be managed by it. Various services now take advantage of those configuration options. We also now use systemd instead of activation scripts to update resolv.conf. NetworkManager now uses the right option for rc-manager DNS automatically, so the configuration option shouldn't be exposed.
220 lines
6.5 KiB
Nix
220 lines
6.5 KiB
Nix
# /etc files related to networking, such as /etc/services.
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.networking;
|
|
|
|
localhostMapped4 = cfg.hosts ? "127.0.0.1" && elem "localhost" cfg.hosts."127.0.0.1";
|
|
localhostMapped6 = cfg.hosts ? "::1" && elem "localhost" cfg.hosts."::1";
|
|
|
|
localhostMultiple = any (elem "localhost") (attrValues (removeAttrs cfg.hosts [ "127.0.0.1" "::1" ]));
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options = {
|
|
|
|
networking.hosts = lib.mkOption {
|
|
type = types.attrsOf (types.listOf types.str);
|
|
example = literalExample ''
|
|
{
|
|
"127.0.0.1" = [ "foo.bar.baz" ];
|
|
"192.168.0.2" = [ "fileserver.local" "nameserver.local" ];
|
|
};
|
|
'';
|
|
description = ''
|
|
Locally defined maps of hostnames to IP addresses.
|
|
'';
|
|
};
|
|
|
|
networking.extraHosts = lib.mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
example = "192.168.0.1 lanlocalhost";
|
|
description = ''
|
|
Additional verbatim entries to be appended to <filename>/etc/hosts</filename>.
|
|
'';
|
|
};
|
|
|
|
networking.hostConf = lib.mkOption {
|
|
type = types.lines;
|
|
default = "multi on";
|
|
example = ''
|
|
multi on
|
|
reorder on
|
|
trim lan
|
|
'';
|
|
description = ''
|
|
The contents of <filename>/etc/host.conf</filename>. See also <citerefentry><refentrytitle>host.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
|
|
'';
|
|
};
|
|
|
|
networking.timeServers = mkOption {
|
|
default = [
|
|
"0.nixos.pool.ntp.org"
|
|
"1.nixos.pool.ntp.org"
|
|
"2.nixos.pool.ntp.org"
|
|
"3.nixos.pool.ntp.org"
|
|
];
|
|
description = ''
|
|
The set of NTP servers from which to synchronise.
|
|
'';
|
|
};
|
|
|
|
networking.proxy = {
|
|
|
|
default = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = null;
|
|
description = ''
|
|
This option specifies the default value for httpProxy, httpsProxy, ftpProxy and rsyncProxy.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
httpProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = cfg.proxy.default;
|
|
description = ''
|
|
This option specifies the http_proxy environment variable.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
httpsProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = cfg.proxy.default;
|
|
description = ''
|
|
This option specifies the https_proxy environment variable.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
ftpProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = cfg.proxy.default;
|
|
description = ''
|
|
This option specifies the ftp_proxy environment variable.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
rsyncProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = cfg.proxy.default;
|
|
description = ''
|
|
This option specifies the rsync_proxy environment variable.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
allProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = cfg.proxy.default;
|
|
description = ''
|
|
This option specifies the all_proxy environment variable.
|
|
'';
|
|
example = "http://127.0.0.1:3128";
|
|
};
|
|
|
|
noProxy = lib.mkOption {
|
|
type = types.nullOr types.str;
|
|
default = null;
|
|
description = ''
|
|
This option specifies the no_proxy environment variable.
|
|
If a default proxy is used and noProxy is null,
|
|
then noProxy will be set to 127.0.0.1,localhost.
|
|
'';
|
|
example = "127.0.0.1,localhost,.localdomain";
|
|
};
|
|
|
|
envVars = lib.mkOption {
|
|
type = types.attrs;
|
|
internal = true;
|
|
default = {};
|
|
description = ''
|
|
Environment variables used for the network proxy.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
config = {
|
|
|
|
assertions = [{
|
|
assertion = localhostMapped4;
|
|
message = ''`networking.hosts` doesn't map "127.0.0.1" to "localhost"'';
|
|
} {
|
|
assertion = !cfg.enableIPv6 || localhostMapped6;
|
|
message = ''`networking.hosts` doesn't map "::1" to "localhost"'';
|
|
} {
|
|
assertion = !localhostMultiple;
|
|
message = ''
|
|
`networking.hosts` maps "localhost" to something other than "127.0.0.1"
|
|
or "::1". This will break some applications. Please use
|
|
`networking.extraHosts` if you really want to add such a mapping.
|
|
'';
|
|
}];
|
|
|
|
networking.hosts = {
|
|
"127.0.0.1" = [ "localhost" ];
|
|
} // optionalAttrs (cfg.hostName != "") {
|
|
"127.0.1.1" = [ cfg.hostName ];
|
|
} // optionalAttrs cfg.enableIPv6 {
|
|
"::1" = [ "localhost" ];
|
|
};
|
|
|
|
environment.etc =
|
|
{ # /etc/services: TCP/UDP port assignments.
|
|
"services".source = pkgs.iana-etc + "/etc/services";
|
|
|
|
# /etc/protocols: IP protocol numbers.
|
|
"protocols".source = pkgs.iana-etc + "/etc/protocols";
|
|
|
|
# /etc/hosts: Hostname-to-IP mappings.
|
|
"hosts".text = let
|
|
oneToString = set: ip: ip + " " + concatStringsSep " " set.${ip};
|
|
allToString = set: concatMapStringsSep "\n" (oneToString set) (attrNames set);
|
|
in ''
|
|
${allToString (filterAttrs (_: v: v != []) cfg.hosts)}
|
|
${cfg.extraHosts}
|
|
'';
|
|
|
|
# /etc/host.conf: resolver configuration file
|
|
"host.conf".text = cfg.hostConf;
|
|
|
|
} // optionalAttrs (pkgs.stdenv.hostPlatform.libc == "glibc") {
|
|
# /etc/rpc: RPC program numbers.
|
|
"rpc".source = pkgs.glibc.out + "/etc/rpc";
|
|
};
|
|
|
|
networking.proxy.envVars =
|
|
optionalAttrs (cfg.proxy.default != null) {
|
|
# other options already fallback to proxy.default
|
|
no_proxy = "127.0.0.1,localhost";
|
|
} // optionalAttrs (cfg.proxy.httpProxy != null) {
|
|
http_proxy = cfg.proxy.httpProxy;
|
|
} // optionalAttrs (cfg.proxy.httpsProxy != null) {
|
|
https_proxy = cfg.proxy.httpsProxy;
|
|
} // optionalAttrs (cfg.proxy.rsyncProxy != null) {
|
|
rsync_proxy = cfg.proxy.rsyncProxy;
|
|
} // optionalAttrs (cfg.proxy.ftpProxy != null) {
|
|
ftp_proxy = cfg.proxy.ftpProxy;
|
|
} // optionalAttrs (cfg.proxy.allProxy != null) {
|
|
all_proxy = cfg.proxy.allProxy;
|
|
} // optionalAttrs (cfg.proxy.noProxy != null) {
|
|
no_proxy = cfg.proxy.noProxy;
|
|
};
|
|
|
|
# Install the proxy environment variables
|
|
environment.sessionVariables = cfg.proxy.envVars;
|
|
|
|
};
|
|
|
|
}
|