1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 cfg = config.services.openldap; 8 openldap = pkgs.openldap; 9 10 configFile = pkgs.writeText "slapd.conf" cfg.extraConfig; 11 12in 13 14{ 15 16 ###### interface 17 18 options = { 19 20 services.openldap = { 21 22 enable = mkOption { 23 type = types.bool; 24 default = false; 25 description = " 26 Whether to enable the ldap server. 27 "; 28 example = true; 29 }; 30 31 user = mkOption { 32 type = types.string; 33 default = "openldap"; 34 description = "User account under which slapd runs."; 35 }; 36 37 group = mkOption { 38 type = types.string; 39 default = "openldap"; 40 description = "Group account under which slapd runs."; 41 }; 42 43 dataDir = mkOption { 44 type = types.string; 45 default = "/var/db/openldap"; 46 description = "The database directory."; 47 }; 48 49 extraConfig = mkOption { 50 type = types.lines; 51 default = ""; 52 description = " 53 sldapd.conf configuration 54 "; 55 example = '' 56 include ''${pkgs.openldap}/etc/openldap/schema/core.schema 57 include ''${pkgs.openldap}/etc/openldap/schema/cosine.schema 58 include ''${pkgs.openldap}/etc/openldap/schema/inetorgperson.schema 59 include ''${pkgs.openldap}/etc/openldap/schema/nis.schema 60 61 database bdb 62 suffix dc=example,dc=org 63 rootdn cn=admin,dc=example,dc=org 64 # NOTE: change after first start 65 rootpw secret 66 directory /var/db/openldap 67 ''; 68 }; 69 }; 70 71 }; 72 73 74 ###### implementation 75 76 config = mkIf config.services.openldap.enable { 77 78 environment.systemPackages = [ openldap ]; 79 80 systemd.services.openldap = { 81 description = "LDAP server"; 82 wantedBy = [ "multi-user.target" ]; 83 after = [ "network.target" ]; 84 preStart = '' 85 mkdir -p /var/run/slapd 86 chown -R ${cfg.user}:${cfg.group} /var/run/slapd 87 mkdir -p ${cfg.dataDir} 88 chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} 89 ''; 90 serviceConfig.ExecStart = "${openldap}/libexec/slapd -u ${cfg.user} -g ${cfg.group} -d 0 -f ${configFile}"; 91 }; 92 93 users.extraUsers.openldap = 94 { name = cfg.user; 95 group = cfg.group; 96 uid = config.ids.uids.openldap; 97 }; 98 99 users.extraGroups.openldap = 100 { name = cfg.group; 101 gid = config.ids.gids.openldap; 102 }; 103 104 }; 105}