vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / tests / nscd.nix
blob356c6d2e2a5401e8e36966004925753e4a0f5283
1 import ./make-test-python.nix ({ pkgs, ... }:
2 let
3   # build a getent that itself doesn't see anything in /etc/hosts and
4   # /etc/nsswitch.conf, by using libredirect to steer its own requests to
5   # /dev/null.
6   # This means is /has/ to go via nscd to actuallly resolve any of the
7   # additionally configured hosts.
8   getent' = pkgs.writeScript "getent-without-etc-hosts" ''
9     export NIX_REDIRECTS=/etc/hosts=/dev/null:/etc/nsswitch.conf=/dev/null
10     export LD_PRELOAD=${pkgs.libredirect}/lib/libredirect.so
11     exec getent $@
12   '';
15   name = "nscd";
17   nodes.machine = { pkgs, ... }: {
18     imports = [ common/user-account.nix ];
19     networking.extraHosts = ''
20       2001:db8::1 somehost.test
21       192.0.2.1 somehost.test
22     '';
24     systemd.services.sockdump = {
25       wantedBy = [ "multi-user.target" ];
26       path = [
27         # necessary for bcc to unpack kernel headers and invoke modprobe
28         pkgs.gnutar
29         pkgs.xz.bin
30         pkgs.kmod
31       ];
32       environment.PYTHONUNBUFFERED = "1";
34       serviceConfig = {
35         ExecStart = "${pkgs.sockdump}/bin/sockdump /var/run/nscd/socket";
36         Restart = "on-failure";
37         RestartSec = "1";
38         Type = "simple";
39       };
40     };
42     specialisation = {
43       withGlibcNscd.configuration = { ... }: {
44         services.nscd.enableNsncd = false;
45       };
46       withUnscd.configuration = { ... }: {
47         services.nscd.enableNsncd = false;
48         services.nscd.package = pkgs.unscd;
49       };
50     };
51   };
53   testScript = { nodes, ... }:
54     let
55       specialisations = "${nodes.machine.system.build.toplevel}/specialisation";
56     in
57     ''
58       # Regression test for https://github.com/NixOS/nixpkgs/issues/50273
59       def test_dynamic_user():
60           with subtest("DynamicUser actually allocates a user"):
61               assert "iamatest" in machine.succeed(
62                   "systemd-run --pty --property=Type=oneshot --property=DynamicUser=yes --property=User=iamatest whoami"
63               )
65       # Test resolution of somehost.test with getent', to make sure we go via
66       # nscd protocol
67       def test_host_lookups():
68           with subtest("host lookups via nscd protocol"):
69               # ahosts
70               output = machine.succeed("${getent'} ahosts somehost.test")
71               assert "192.0.2.1" in output
72               assert "2001:db8::1" in output
74               # ahostsv4
75               output = machine.succeed("${getent'} ahostsv4 somehost.test")
76               assert "192.0.2.1" in output
77               assert "2001:db8::1" not in output
79               # ahostsv6
80               output = machine.succeed("${getent'} ahostsv6 somehost.test")
81               assert "192.0.2.1" not in output
82               assert "2001:db8::1" in output
84               # reverse lookups (hosts)
85               assert "somehost.test" in machine.succeed("${getent'} hosts 2001:db8::1")
86               assert "somehost.test" in machine.succeed("${getent'} hosts 192.0.2.1")
89       # Test host resolution via nss modules works
90       # We rely on nss-myhostname in this case, which resolves *.localhost and
91       # _gateway.
92       # We don't need to use getent' here, as non-glibc nss modules can only be
93       # discovered via nscd.
94       def test_nss_myhostname():
95           with subtest("nss-myhostname provides hostnames (ahosts)"):
96               # ahosts
97               output = machine.succeed("getent ahosts foobar.localhost")
98               assert "::1" in output
99               assert "127.0.0.1" in output
101               # ahostsv4
102               output = machine.succeed("getent ahostsv4 foobar.localhost")
103               assert "::1" not in output
104               assert "127.0.0.1" in output
106               # ahostsv6
107               output = machine.succeed("getent ahostsv6 foobar.localhost")
108               assert "::1" in output
109               assert "127.0.0.1" not in output
111       start_all()
112       machine.wait_for_unit("default.target")
114       # give sockdump some time to finish attaching.
115       machine.sleep(5)
117       # Test all tests with glibc-nscd.
118       test_dynamic_user()
119       test_host_lookups()
120       test_nss_myhostname()
122       with subtest("glibc-nscd"):
123           machine.succeed('${specialisations}/withGlibcNscd/bin/switch-to-configuration test')
124           machine.wait_for_unit("default.target")
126           test_dynamic_user()
127           test_host_lookups()
128           test_nss_myhostname()
130       with subtest("unscd"):
131           machine.succeed('${specialisations}/withUnscd/bin/switch-to-configuration test')
132           machine.wait_for_unit("default.target")
134           # known to fail, unscd doesn't load external NSS modules
135           # test_dynamic_user()
137           test_host_lookups()
139           # known to fail, unscd doesn't load external NSS modules
140           # test_nss_myhostname()
141     '';