| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  | # /etc files related to networking, such as /etc/services. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2012-10-19 15:41:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  | let | 
					
						
							| 
									
										
										
										
											2012-10-19 15:41:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-09 21:02:01 +00:00
										 |  |  |   cfg = config.networking; | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   localhostMultiple = any (elem "localhost") (attrValues (removeAttrs cfg.hosts [ "127.0.0.1" "::1" ])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-12-10 02:51:19 +01:00
										 |  |  |   imports = [ | 
					
						
							|  |  |  |     (mkRemovedOptionModule [ "networking" "hostConf" ] "Use environment.etc.\"host.conf\" instead.") | 
					
						
							|  |  |  |   ]; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  |   options = { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-08 21:13:16 +03:00
										 |  |  |     networking.hosts = lib.mkOption { | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  |       type = types.attrsOf (types.listOf types.str); | 
					
						
							| 
									
										
										
										
											2017-07-09 23:12:57 +03:00
										 |  |  |       example = literalExample ''
 | 
					
						
							| 
									
										
										
										
											2017-07-08 21:13:16 +03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2017-07-09 00:28:05 +03:00
										 |  |  |           "127.0.0.1" = [ "foo.bar.baz" ]; | 
					
						
							| 
									
										
										
										
											2017-07-08 21:13:16 +03:00
										 |  |  |           "192.168.0.2" = [ "fileserver.local" "nameserver.local" ]; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2017-07-09 00:28:05 +03:00
										 |  |  |         Locally defined maps of hostnames to IP addresses. | 
					
						
							| 
									
										
										
										
											2017-07-08 21:13:16 +03:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-07-04 01:58:48 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  |     networking.hostFiles = lib.mkOption { | 
					
						
							|  |  |  |       type = types.listOf types.path; | 
					
						
							|  |  |  |       defaultText = lib.literalExample "Hosts from `networking.hosts` and `networking.extraHosts`"; | 
					
						
							|  |  |  |       example = lib.literalExample ''[ "''${pkgs.my-blocklist-package}/share/my-blocklist/hosts" ]''; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Files that should be concatenated together to form <filename>/etc/hosts</filename>. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 14:58:51 -04:00
										 |  |  |     networking.extraHosts = lib.mkOption { | 
					
						
							| 
									
										
										
										
											2013-10-30 17:37:45 +01:00
										 |  |  |       type = types.lines; | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  |       default = ""; | 
					
						
							|  |  |  |       example = "192.168.0.1 lanlocalhost"; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2017-07-08 21:13:16 +03:00
										 |  |  |         Additional verbatim entries to be appended to <filename>/etc/hosts</filename>. | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  |         For adding hosts from derivation results, use <option>networking.hostFiles</option> instead. | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-14 23:49:14 +01:00
										 |  |  |     networking.timeServers = mkOption { | 
					
						
							|  |  |  |       default = [ | 
					
						
							|  |  |  |         "0.nixos.pool.ntp.org" | 
					
						
							|  |  |  |         "1.nixos.pool.ntp.org" | 
					
						
							|  |  |  |         "2.nixos.pool.ntp.org" | 
					
						
							|  |  |  |         "3.nixos.pool.ntp.org" | 
					
						
							|  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2021-01-20 10:54:24 +01:00
										 |  |  |       type = types.listOf types.str; | 
					
						
							| 
									
										
										
										
											2016-12-14 23:49:14 +01:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         The set of NTP servers from which to synchronise. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 20:13:54 +01:00
										 |  |  |     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"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-11 11:17:06 +03:00
										 |  |  |       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"; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 20:13:54 +01:00
										 |  |  |       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. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |   config = { | 
					
						
							| 
									
										
										
										
											2009-05-28 12:43:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  |     assertions = [{ | 
					
						
							|  |  |  |       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. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-23 15:44:14 +01:00
										 |  |  |     # These entries are required for "hostname -f" and to resolve both the | 
					
						
							|  |  |  |     # hostname and FQDN correctly: | 
					
						
							|  |  |  |     networking.hosts = let | 
					
						
							|  |  |  |       hostnames = # Note: The FQDN (canonical hostname) has to come first: | 
					
						
							|  |  |  |         optional (cfg.hostName != "" && cfg.domain != null) "${cfg.hostName}.${cfg.domain}" | 
					
						
							|  |  |  |         ++ optional (cfg.hostName != "") cfg.hostName; # Then the hostname (without the domain) | 
					
						
							|  |  |  |     in { | 
					
						
							|  |  |  |       "127.0.0.2" = hostnames; | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  |     } // optionalAttrs cfg.enableIPv6 { | 
					
						
							| 
									
										
										
										
											2019-12-23 15:44:14 +01:00
										 |  |  |       "::1" = hostnames; | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  |     networking.hostFiles = let | 
					
						
							| 
									
										
										
										
											2019-12-23 15:44:14 +01:00
										 |  |  |       # Note: localhostHosts has to appear first in /etc/hosts so that 127.0.0.1 | 
					
						
							|  |  |  |       # resolves back to "localhost" (as some applications assume) instead of | 
					
						
							|  |  |  |       # the FQDN! By default "networking.hosts" also contains entries for the | 
					
						
							|  |  |  |       # FQDN so that e.g. "hostname -f" works correctly. | 
					
						
							|  |  |  |       localhostHosts = pkgs.writeText "localhost-hosts" ''
 | 
					
						
							|  |  |  |         127.0.0.1 localhost | 
					
						
							|  |  |  |         ${optionalString cfg.enableIPv6 "::1 localhost"} | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  |       stringHosts = | 
					
						
							|  |  |  |         let | 
					
						
							|  |  |  |           oneToString = set: ip: ip + " " + concatStringsSep " " set.${ip} + "\n"; | 
					
						
							|  |  |  |           allToString = set: concatMapStrings (oneToString set) (attrNames set); | 
					
						
							|  |  |  |         in pkgs.writeText "string-hosts" (allToString (filterAttrs (_: v: v != []) cfg.hosts)); | 
					
						
							|  |  |  |       extraHosts = pkgs.writeText "extra-hosts" cfg.extraHosts; | 
					
						
							| 
									
										
										
										
											2019-12-23 15:44:14 +01:00
										 |  |  |     in mkBefore [ localhostHosts stringHosts extraHosts ]; | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |     environment.etc = | 
					
						
							|  |  |  |       { # /etc/services: TCP/UDP port assignments. | 
					
						
							| 
									
										
										
										
											2019-08-13 21:52:01 +00:00
										 |  |  |         services.source = pkgs.iana-etc + "/etc/services"; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # /etc/protocols: IP protocol numbers. | 
					
						
							| 
									
										
										
										
											2019-08-13 21:52:01 +00:00
										 |  |  |         protocols.source  = pkgs.iana-etc + "/etc/protocols"; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # /etc/hosts: Hostname-to-IP mappings. | 
					
						
							| 
									
										
										
										
											2020-03-07 01:53:31 +01:00
										 |  |  |         hosts.source = pkgs.runCommandNoCC "hosts" {} ''
 | 
					
						
							|  |  |  |           cat ${escapeShellArgs cfg.hostFiles} > $out | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2014-11-23 03:04:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 16:03:09 +09:00
										 |  |  |         # /etc/netgroup: Network-wide groups. | 
					
						
							| 
									
										
										
										
											2021-01-24 09:19:10 +00:00
										 |  |  |         netgroup.text = mkDefault ""; | 
					
						
							| 
									
										
										
										
											2020-11-05 16:03:09 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-03 09:17:43 +02:00
										 |  |  |         # /etc/host.conf: resolver configuration file | 
					
						
							| 
									
										
										
										
											2019-11-29 12:08:34 +01:00
										 |  |  |         "host.conf".text = ''
 | 
					
						
							|  |  |  |           multi on | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2016-10-03 09:17:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-22 11:11:02 -07:00
										 |  |  |       } // optionalAttrs (pkgs.stdenv.hostPlatform.libc == "glibc") { | 
					
						
							|  |  |  |         # /etc/rpc: RPC program numbers. | 
					
						
							| 
									
										
										
										
											2020-02-28 12:04:10 -05:00
										 |  |  |         rpc.source = pkgs.stdenv.cc.libc.out + "/etc/rpc"; | 
					
						
							| 
									
										
										
										
											2017-05-31 22:34:06 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 20:13:54 +01:00
										 |  |  |       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; | 
					
						
							| 
									
										
										
										
											2015-12-11 11:17:06 +03:00
										 |  |  |         } // optionalAttrs (cfg.proxy.allProxy != null) { | 
					
						
							|  |  |  |           all_proxy   = cfg.proxy.allProxy; | 
					
						
							| 
									
										
										
										
											2014-11-19 20:13:54 +01:00
										 |  |  |         } // optionalAttrs (cfg.proxy.noProxy != null) { | 
					
						
							|  |  |  |           no_proxy    = cfg.proxy.noProxy; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Install the proxy environment variables | 
					
						
							| 
									
										
										
										
											2014-11-30 14:48:41 +01:00
										 |  |  |     environment.sessionVariables = cfg.proxy.envVars; | 
					
						
							| 
									
										
										
										
											2014-11-19 20:13:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 13:05:09 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-23 15:55:39 +00:00
										 |  |  | } |