1{ pkgs ? (import ../.. { inherit system; config = { }; })
2, system ? builtins.currentSystem
3, ...
4}:
5
6let
7 dbContents = ''
8 dn: dc=example
9 objectClass: domain
10 dc: example
11
12 dn: ou=users,dc=example
13 objectClass: organizationalUnit
14 ou: users
15 '';
16 testScript = ''
17 machine.wait_for_unit("openldap.service")
18 machine.succeed(
19 'ldapsearch -LLL -D "cn=root,dc=example" -w notapassword -b "dc=example"',
20 )
21 '';
22in {
23 # New-style configuration
24 current = import ./make-test-python.nix ({ pkgs, ... }: {
25 inherit testScript;
26 name = "openldap";
27
28 machine = { pkgs, ... }: {
29 environment.etc."openldap/root_password".text = "notapassword";
30 services.openldap = {
31 enable = true;
32 settings = {
33 children = {
34 "cn=schema".includes = [
35 "${pkgs.openldap}/etc/schema/core.ldif"
36 "${pkgs.openldap}/etc/schema/cosine.ldif"
37 "${pkgs.openldap}/etc/schema/inetorgperson.ldif"
38 "${pkgs.openldap}/etc/schema/nis.ldif"
39 ];
40 "olcDatabase={1}mdb" = {
41 # This tests string, base64 and path values, as well as lists of string values
42 attrs = {
43 objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
44 olcDatabase = "{1}mdb";
45 olcDbDirectory = "/var/db/openldap";
46 olcSuffix = "dc=example";
47 olcRootDN = {
48 # cn=root,dc=example
49 base64 = "Y249cm9vdCxkYz1leGFtcGxl";
50 };
51 olcRootPW = {
52 path = "/etc/openldap/root_password";
53 };
54 };
55 };
56 };
57 };
58 declarativeContents."dc=example" = dbContents;
59 };
60 };
61 }) { inherit pkgs system; };
62
63 # Old-style configuration
64 oldOptions = import ./make-test-python.nix ({ pkgs, ... }: {
65 inherit testScript;
66 name = "openldap";
67
68 machine = { pkgs, ... }: {
69 services.openldap = {
70 enable = true;
71 logLevel = "stats acl";
72 defaultSchemas = true;
73 database = "mdb";
74 suffix = "dc=example";
75 rootdn = "cn=root,dc=example";
76 rootpw = "notapassword";
77 declarativeContents."dc=example" = dbContents;
78 };
79 };
80 }) { inherit system pkgs; };
81
82 # Manually managed configDir, for example if dynamic config is essential
83 manualConfigDir = import ./make-test-python.nix ({ pkgs, ... }: {
84 name = "openldap";
85
86 machine = { pkgs, ... }: {
87 services.openldap = {
88 enable = true;
89 configDir = "/var/db/slapd.d";
90 };
91 };
92
93 testScript = let
94 contents = pkgs.writeText "data.ldif" dbContents;
95 config = pkgs.writeText "config.ldif" ''
96 dn: cn=config
97 cn: config
98 objectClass: olcGlobal
99 olcLogLevel: stats
100 olcPidFile: /run/slapd/slapd.pid
101
102 dn: cn=schema,cn=config
103 cn: schema
104 objectClass: olcSchemaConfig
105
106 include: file://${pkgs.openldap}/etc/schema/core.ldif
107 include: file://${pkgs.openldap}/etc/schema/cosine.ldif
108 include: file://${pkgs.openldap}/etc/schema/inetorgperson.ldif
109
110 dn: olcDatabase={1}mdb,cn=config
111 objectClass: olcDatabaseConfig
112 objectClass: olcMdbConfig
113 olcDatabase: {1}mdb
114 olcDbDirectory: /var/db/openldap
115 olcDbIndex: objectClass eq
116 olcSuffix: dc=example
117 olcRootDN: cn=root,dc=example
118 olcRootPW: notapassword
119 '';
120 in ''
121 machine.succeed(
122 "mkdir -p /var/db/slapd.d /var/db/openldap",
123 "slapadd -F /var/db/slapd.d -n0 -l ${config}",
124 "slapadd -F /var/db/slapd.d -n1 -l ${contents}",
125 "chown -R openldap:openldap /var/db/slapd.d /var/db/openldap",
126 "systemctl restart openldap",
127 )
128 '' + testScript;
129 }) { inherit system pkgs; };
130}