#!/bin/bash -e

if ! [[ "$0" =~ "scripts/slapd.sh" ]]; then
	echo "This script must be run in a toplevel dex directory"
	exit 255
fi

command -v slapd >/dev/null 2>&1 || { 
    echo >&2 "OpenLDAP not installed. Install using one of the following commands:

   brew install openldap

   sudo dnf -y install openldap-servers openldap-clients 

   sudo apt-get install slapd ldap-utils
"; exit 1;
}

TEMPDIR=$( mktemp -d )

trap "{ rm -r $TEMPDIR ; exit 255; }" EXIT

CONFIG_DIR=$PWD/connector/ldap/testdata

# Include the schema files in the connector test directory. Installing OpenLDAP installs
# these in /etc somewhere, but the path isn't reliable across installs. Easier to ship
# the schema files directly.
for config in $( ls $CONFIG_DIR/*.schema ); do
    echo "include $config" >> $TEMPDIR/config
done

DATA_DIR=$TEMPDIR/data
mkdir $DATA_DIR

# Config template copied from:
# http://www.zytrax.com/books/ldap/ch5/index.html#step1-slapd
cat << EOF >> $TEMPDIR/config
# MODULELOAD definitions
# not required (comment out) before version 2.3
moduleload back_bdb.la

database bdb
suffix "dc=example,dc=org"

# root or superuser
rootdn "cn=admin,dc=example,dc=org"
rootpw admin
# The database directory MUST exist prior to running slapd AND 
# change path as necessary
directory	$DATA_DIR

# Indices to maintain for this directory
# unique id so equality match only
index	uid	eq
# allows general searching on commonname, givenname and email
index	cn,gn,mail eq,sub
# allows multiple variants on surname searching
index sn eq,sub
# sub above includes subintial,subany,subfinal
# optimise department searches
index ou eq
# if searches will include objectClass uncomment following
# index objectClass eq
# shows use of default index parameter
index default eq,sub
# indices missing - uses default eq,sub
index telephonenumber

# other database parameters
# read more in slapd.conf reference section
cachesize 10000
checkpoint 128 15
EOF

SLAPD_PID=""
trap "kill $SLAPD_PID" SIGINT

# Background the LDAP daemon so we can run an LDAP add command.
slapd \
    -d any \
    -h "ldap://localhost:10389/" \
    -f $TEMPDIR/config &
SLAPD_PID=$!

# Wait for server to come up.
time sleep 1

# Seed the initial set of users. Edit these values to change the initial
# set of users.
ldapadd \
    -x \
    -D "cn=admin,dc=example,dc=org" \
    -w admin \
    -H ldap://localhost:10389/ \
    -f $PWD/examples/config-ldap.ldif 

# Wait for slapd to exit.
wait $SLAPD_PID