1import ./make-test-python.nix ({ lib, pkgs, ... }:
2let
3 fakeReply = pkgs.writeText "namecoin-reply.json" ''
4 { "error": null,
5 "id": 1,
6 "result": {
7 "address": "T31q8ucJ4dI1xzhxQ5QispfECld5c7Xw",
8 "expired": false,
9 "expires_in": 2248,
10 "height": 438155,
11 "name": "d/test",
12 "txid": "db61c0b2540ba0c1a2c8cc92af703a37002e7566ecea4dbf8727c7191421edfb",
13 "value": "{\"ip\": \"1.2.3.4\", \"email\": \"root@test.bit\",\"info\": \"Fake record\"}",
14 "vout": 0
15 }
16 }
17 '';
18
19 # Disabled because DNSSEC does not currently validate,
20 # see https://github.com/namecoin/ncdns/issues/127
21 dnssec = false;
22
23in
24
25{
26 name = "ncdns";
27 meta = with pkgs.lib.maintainers; {
28 maintainers = [ rnhmjoj ];
29 };
30
31 nodes.server = { ... }: {
32 networking.nameservers = [ "127.0.0.1" ];
33
34 services.namecoind.rpc = {
35 address = "127.0.0.1";
36 user = "namecoin";
37 password = "secret";
38 port = 8332;
39 };
40
41 # Fake namecoin RPC server because we can't
42 # run a full node in a test.
43 systemd.services.namecoind = {
44 wantedBy = [ "multi-user.target" ];
45 script = ''
46 while true; do
47 echo -e "HTTP/1.1 200 OK\n\n $(<${fakeReply})\n" \
48 | ${pkgs.netcat}/bin/nc -N -l 127.0.0.1 8332
49 done
50 '';
51 };
52
53 services.ncdns = {
54 enable = true;
55 dnssec.enable = dnssec;
56 identity.hostname = "example.com";
57 identity.hostmaster = "root@example.com";
58 identity.address = "1.0.0.1";
59 };
60
61 services.pdns-recursor = {
62 enable = true;
63 dns.allowFrom = [ "127.0.0.0/8" ];
64 resolveNamecoin = true;
65 };
66
67 environment.systemPackages = [ pkgs.dnsutils ];
68
69 };
70
71 testScript =
72 (lib.optionalString dnssec ''
73 with subtest("DNSSEC keys have been generated"):
74 server.wait_for_unit("ncdns")
75 server.wait_for_file("/var/lib/ncdns/bit.key")
76 server.wait_for_file("/var/lib/ncdns/bit-zone.key")
77
78 with subtest("DNSKEY bit record is present"):
79 server.wait_for_unit("pdns-recursor")
80 server.wait_for_open_port("53")
81 server.succeed("host -t DNSKEY bit")
82 '') +
83 ''
84 with subtest("can resolve a .bit name"):
85 server.wait_for_unit("namecoind")
86 server.wait_for_unit("ncdns")
87 server.wait_for_open_port("8332")
88 assert "1.2.3.4" in server.succeed("dig @localhost -p 5333 test.bit")
89
90 with subtest("SOA record has identity information"):
91 assert "example.com" in server.succeed("dig SOA @localhost -p 5333 bit")
92
93 with subtest("bit. zone forwarding works"):
94 assert "1.2.3.4" in server.succeed("host test.bit")
95 '';
96})