#!/bin/bash

SLAPD=slapd
LDAPADD=ldapadd
LDAPSEARCH=ldapsearch
LDAPMODIFY=ldapmodify
MANAGERDN="cn=admin,cn=config"
PASSWD="secret"
SCHEMADIR=/etc/opt/six/hpxldap/schema
MODULEDIR=/opt/six/lib/hpxldap
TESTDIR=/tmp/openldap-test2
BASEPORT=10000
LOCALHOST=127.0.0.1
LVL="-1"
MMR=${MMR-2}

if [ $MMR -gt 9 ]; then
MMR=9
fi

XDIR=$TESTDIR/srv
TMP=$TESTDIR/tmp

mkdir -p $TESTDIR

echo "Initializing server configurations..."
n=1
while [ $n -le $MMR ]; do
	WKDIR=${TESTDIR}/srv${n}
	DBDIR=${WKDIR}/db
	CFDIR=${WKDIR}/slapd.d
	
	PORT=`expr $BASEPORT + $n`
	URI="ldap://${LOCALHOST}:$PORT"

	mkdir -p ${WKDIR} $DBDIR $CFDIR

	cat > ${WKDIR}/slapd.conf <<EOC
include		$SCHEMADIR/corba.schema
include		$SCHEMADIR/core.schema
include		$SCHEMADIR/cosine.schema
include		$SCHEMADIR/duaconf.schema
include		$SCHEMADIR/dyngroup.schema
include		$SCHEMADIR/inetorgperson.schema
include		$SCHEMADIR/java.schema
include		$SCHEMADIR/misc.schema
include		$SCHEMADIR/nis.schema
include		$SCHEMADIR/openldap.schema
include		$SCHEMADIR/ppolicy.schema
include		$SCHEMADIR/collective.schema

allow bind_v2 bind_anon_dn

sizelimit 2000 size.pr=500 size.prtotal=10000
idletimeout 1800
conn_max_pending 1024
conn_max_pending_auth 1024
timelimit 900
writetimeout 900
threads 32
loglevel 0

serverid 00$n $URI 

pidfile		${WKDIR}/slapd.pid
argsfile	${WKDIR}/slapd.args

modulepath	$MODULEDIR
moduleload	back_bdb
moduleload	back_monitor
moduleload	back_relay

moduleload	memberof
#moduleload	dyngroup
moduleload	dynlist
moduleload	rwm
moduleload	syncprov
moduleload 	translucent
moduleload	unique
moduleload	valsort


access to * by * read

#DBs
database config
rootdn "cn=admin,cn=config"
rootpw  $PASSWD

database monitor

EOC

	echo "Starting slapd on TCP/IP port $PORT..."
	$SLAPD -T test -f $WKDIR/slapd.conf -F $CFDIR
	$SLAPD -F $CFDIR -h $URI -d $LVL > ${WKDIR}/slapd.log 2>&1 &
	PID=$! 
	KILLPIDS="$KILLPIDS $PID"

	sleep 5
	$LDAPSEARCH -H $URI -w $PASSWD -D $MANAGERDN -b 'cn=config' -x -s one > /dev/null 2>&1 
	if [ $? -ne 0 ]; then
		echo "slapd did not start on port $PORT1"
		[ -z "$KILLPIDS" ] && kill $KILLPIDS
		exit 1
	fi

	n=`expr $n + 1`
done


cat > $TESTDIR/replica.ldif <<EOR
dn: cn=config
changetype: modify
replace: olcServerID
EOR
n=1
while [ $n -le $MMR ]; do
	PORT=`expr $BASEPORT + $n`
	URI="ldap://${LOCALHOST}:$PORT"
	echo "olcServerID: 00$n $URI" >> $TESTDIR/replica.ldif
	n=`expr $n + 1`
done

cat >> $TESTDIR/replica.ldif <<EOR

dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
EOR

n=1
while [ $n -le $MMR ]; do
	PORT=`expr $BASEPORT + $n`
	URI="ldap://${LOCALHOST}:$PORT"
	echo "olcSyncRepl: rid=00$n provider=$URI binddn=\"$MANAGERDN\" bindmethod=simple credentials=$PASSWD searchbase=\"cn=config\" type=refreshAndPersist  retry=\"3 10 300 5\" timeout=3" >> $TESTDIR/replica.ldif
	n=`expr $n + 1`
done

cat >> $TESTDIR/replica.ldif <<EOR
-
add: olcMirrorMode
olcMirrorMode: TRUE

EOR

n=1
while [ $n -le $MMR ]; do
	PORT=`expr $BASEPORT + $n`
	URI="ldap://${LOCALHOST}:$PORT"
	echo "activating replica on $URI..."
	$LDAPMODIFY -v -x -D "$MANAGERDN" -H $URI -w $PASSWD -f $TESTDIR/replica.ldif
	n=`expr $n + 1`
sleep 3
done

sleep 5 

kill $KILLPIDS
