| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  | let | 
					
						
							|  |  |  |   common = { pkgs, ... }: { | 
					
						
							|  |  |  |     networking.firewall.enable = false; | 
					
						
							|  |  |  |     networking.useDHCP = false; | 
					
						
							|  |  |  |     # for a host utility with IPv6 support | 
					
						
							|  |  |  |     environment.systemPackages = [ pkgs.bind ]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | in import ./make-test.nix ({ pkgs, ...} : { | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |   name = "nsd"; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							|  |  |  |     maintainers = [ aszlig ]; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   nodes = { | 
					
						
							|  |  |  |     clientv4 = { lib, nodes, ... }: { | 
					
						
							|  |  |  |       imports = [ common ]; | 
					
						
							|  |  |  |       networking.nameservers = lib.mkForce [ | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         (lib.head nodes.server.config.networking.interfaces.eth1.ipv4.addresses).address | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |       networking.interfaces.eth1.ipv4.addresses = [ | 
					
						
							|  |  |  |         { address = "192.168.0.2"; prefixLength = 24; } | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     clientv6 = { lib, nodes, ... }: { | 
					
						
							|  |  |  |       imports = [ common ]; | 
					
						
							|  |  |  |       networking.nameservers = lib.mkForce [ | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         (lib.head nodes.server.config.networking.interfaces.eth1.ipv6.addresses).address | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |       networking.interfaces.eth1.ipv4.addresses = [ | 
					
						
							|  |  |  |         { address = "dead:beef::2"; prefixLength = 24; } | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |       ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     server = { lib, ... }: { | 
					
						
							|  |  |  |       imports = [ common ]; | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |       networking.interfaces.eth1.ipv4.addresses = [ | 
					
						
							|  |  |  |         { address = "192.168.0.1"; prefixLength = 24; } | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |       networking.interfaces.eth1.ipv6.addresses = [ | 
					
						
							|  |  |  |         { address = "dead:beef::1"; prefixLength = 64; } | 
					
						
							|  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |       services.nsd.enable = true; | 
					
						
							| 
									
										
										
										
											2018-05-07 03:59:38 +02:00
										 |  |  |       services.nsd.rootServer = true; | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |       services.nsd.interfaces = lib.mkForce []; | 
					
						
							|  |  |  |       services.nsd.zones."example.com.".data = ''
 | 
					
						
							|  |  |  |         @ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600 | 
					
						
							|  |  |  |         ipv4 A 1.2.3.4 | 
					
						
							|  |  |  |         ipv6 AAAA abcd::eeff | 
					
						
							|  |  |  |         deleg NS ns.example.com | 
					
						
							|  |  |  |         ns A 192.168.0.1 | 
					
						
							|  |  |  |         ns AAAA dead:beef::1 | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       services.nsd.zones."deleg.example.com.".data = ''
 | 
					
						
							|  |  |  |         @ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600 | 
					
						
							|  |  |  |         @ A 9.8.7.6 | 
					
						
							|  |  |  |         @ AAAA fedc::bbaa | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2018-05-07 03:59:38 +02:00
										 |  |  |       services.nsd.zones.".".data = ''
 | 
					
						
							|  |  |  |         @ SOA ns.example.com noc.example.com 666 7200 3600 1209600 3600 | 
					
						
							|  |  |  |         root A 1.8.7.4 | 
					
						
							|  |  |  |         root AAAA acbd::4 | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testScript = ''
 | 
					
						
							|  |  |  |     startAll; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $clientv4->waitForUnit("network.target"); | 
					
						
							|  |  |  |     $clientv6->waitForUnit("network.target"); | 
					
						
							|  |  |  |     $server->waitForUnit("nsd.service"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sub assertHost { | 
					
						
							|  |  |  |       my ($type, $rr, $query, $expected) = @_; | 
					
						
							|  |  |  |       my $self = $type eq 4 ? $clientv4 : $clientv6; | 
					
						
							|  |  |  |       my $out = $self->succeed("host -$type -t $rr $query"); | 
					
						
							|  |  |  |       $self->log("output: $out"); | 
					
						
							|  |  |  |       chomp $out; | 
					
						
							|  |  |  |       die "DNS IPv$type query on $query gave '$out' instead of '$expected'" | 
					
						
							|  |  |  |         if ($out !~ $expected); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     foreach (4, 6) { | 
					
						
							|  |  |  |       subtest "ipv$_", sub { | 
					
						
							|  |  |  |         assertHost($_, "a", "example.com", qr/has no [^ ]+ record/); | 
					
						
							|  |  |  |         assertHost($_, "aaaa", "example.com", qr/has no [^ ]+ record/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         assertHost($_, "soa", "example.com", qr/SOA.*?noc\.example\.com/); | 
					
						
							|  |  |  |         assertHost($_, "a", "ipv4.example.com", qr/address 1.2.3.4$/); | 
					
						
							|  |  |  |         assertHost($_, "aaaa", "ipv6.example.com", qr/address abcd::eeff$/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         assertHost($_, "a", "deleg.example.com", qr/address 9.8.7.6$/); | 
					
						
							|  |  |  |         assertHost($_, "aaaa", "deleg.example.com", qr/address fedc::bbaa$/); | 
					
						
							| 
									
										
										
										
											2018-05-07 03:59:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         assertHost($_, "a", "root", qr/address 1.8.7.4$/); | 
					
						
							|  |  |  |         assertHost($_, "aaaa", "root", qr/address acbd::4$/); | 
					
						
							| 
									
										
										
										
											2014-09-05 02:52:05 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  | }) |