at master 2.6 kB view raw
1{ pkgs, lib, ... }: 2{ 3 name = "systemd-resolved"; 4 meta.maintainers = [ lib.maintainers.elvishjerricco ]; 5 6 nodes.server = 7 { lib, config, ... }: 8 let 9 exampleZone = pkgs.writeTextDir "example.com.zone" '' 10 @ SOA ns.example.com. noc.example.com. 2019031301 86400 7200 3600000 172800 11 @ A ${(lib.head config.networking.interfaces.eth1.ipv4.addresses).address} 12 @ AAAA ${(lib.head config.networking.interfaces.eth1.ipv6.addresses).address} 13 ''; 14 in 15 { 16 networking.firewall.enable = false; 17 networking.useDHCP = false; 18 19 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [ 20 { 21 address = "fd00::1"; 22 prefixLength = 64; 23 } 24 ]; 25 26 services.knot = { 27 enable = true; 28 settings = { 29 server.listen = [ 30 "0.0.0.0@53" 31 "::@53" 32 ]; 33 template.default.storage = exampleZone; 34 zone."example.com".file = "example.com.zone"; 35 }; 36 }; 37 }; 38 39 nodes.client = 40 { nodes, ... }: 41 let 42 inherit (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses) address; 43 in 44 { 45 networking.nameservers = [ address ]; 46 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [ 47 { 48 address = "fd00::2"; 49 prefixLength = 64; 50 } 51 ]; 52 services.resolved.enable = true; 53 services.resolved.fallbackDns = [ ]; 54 networking.useNetworkd = true; 55 networking.useDHCP = false; 56 systemd.network.networks."40-eth0".enable = false; 57 58 testing.initrdBackdoor = true; 59 boot.initrd = { 60 systemd.enable = true; 61 systemd.initrdBin = [ pkgs.iputils ]; 62 network.enable = true; 63 services.resolved.enable = true; 64 }; 65 }; 66 67 testScript = 68 { nodes, ... }: 69 let 70 address4 = (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses).address; 71 address6 = (lib.head nodes.server.networking.interfaces.eth1.ipv6.addresses).address; 72 in 73 '' 74 start_all() 75 server.wait_for_unit("multi-user.target") 76 77 def test_client(): 78 query = client.succeed("resolvectl query example.com") 79 assert "${address4}" in query 80 assert "${address6}" in query 81 client.succeed("ping -4 -c 1 example.com") 82 client.succeed("ping -6 -c 1 example.com") 83 84 client.wait_for_unit("initrd.target") 85 test_client() 86 client.switch_root() 87 88 client.wait_for_unit("multi-user.target") 89 test_client() 90 ''; 91}