1#! /bin/sh
2# $OpenLDAP$
3## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4##
5## Copyright 1998-2011 The OpenLDAP Foundation.
6## All rights reserved.
7##
8## Redistribution and use in source and binary forms, with or without
9## modification, are permitted only as authorized by the OpenLDAP
10## Public License.
11##
12## A copy of this license is available in the file LICENSE in the
13## top-level directory of the distribution or, alternatively, at
14## <http://www.OpenLDAP.org/license.html>.
15
16echo "running defines.sh"
17. $SRCDIR/scripts/defines.sh
18
19if test $SYNCPROV = syncprovno; then 
20	echo "Syncrepl provider overlay not available, test skipped"
21	exit 0
22fi 
23
24PRODIR=$TESTDIR/pro
25CONDIR=$TESTDIR/con1
26DBPRO=$PRODIR/db
27DBCON=$CONDIR/db
28CFPRO=$PRODIR/slapd.d
29CFCON=$CONDIR/slapd.d
30
31mkdir -p $TESTDIR $PRODIR $CONDIR $DBPRO $DBCON $CFPRO $CFCON
32
33$SLAPPASSWD -g -n >$CONFIGPWF
34
35if test x"$SYNCMODE" = x ; then
36	SYNCMODE=rp
37fi
38case "$SYNCMODE" in
39	ro)
40		SYNCTYPE="type=refreshOnly interval=00:00:00:03"
41		;;
42	rp)
43		SYNCTYPE="type=refreshAndPersist"
44		;;
45	*)
46		echo "unknown sync mode $SYNCMODE"
47		exit 1;
48		;;
49esac
50
51#
52# Test replication of dynamic config:
53# - start provider
54# - start consumer
55# - configure over ldap
56# - populate over ldap
57# - configure syncrepl over ldap
58# - retrieve database over ldap and compare against expected results
59#
60
61echo "Starting provider slapd on TCP/IP port $PORT1..."
62. $CONFFILTER $BACKEND $MONITORDB < $DYNAMICCONF > $CONFLDIF
63$SLAPADD -F $CFPRO -n 0 -l $CONFLDIF
64cd $PRODIR
65$SLAPD -F ./slapd.d -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
66PID=$!
67if test $WAIT != 0 ; then
68    echo PID $PID
69    read foo
70fi
71KILLPIDS="$PID"
72cd $TESTWD
73
74sleep 1
75
76echo "Using ldapsearch to check that provider slapd is running..."
77for i in 0 1 2 3 4 5; do
78	$LDAPSEARCH -s base -b "" -H $URI1 \
79		'objectclass=*' > /dev/null 2>&1
80	RC=$?
81	if test $RC = 0 ; then
82		break
83	fi
84	echo "Waiting 5 seconds for slapd to start..."
85	sleep 5
86done
87
88if test $RC != 0 ; then
89	echo "ldapsearch failed ($RC)!"
90	test $KILLSERVERS != no && kill -HUP $KILLPIDS
91	exit $RC
92fi
93
94echo "Inserting syncprov overlay on provider..."
95if [ "$SYNCPROV" = syncprovmod ]; then
96	$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
97dn: cn=module,cn=config
98objectClass: olcModuleList
99cn: module
100olcModulePath: $TESTWD/../servers/slapd/overlays
101olcModuleLoad: syncprov.la
102EOF
103	RC=$?
104	if test $RC != 0 ; then
105		echo "ldapadd failed for moduleLoad ($RC)!"
106		test $KILLSERVERS != no && kill -HUP $KILLPIDS
107		exit $RC
108	fi
109fi
110read CONFIGPW < $CONFIGPWF
111$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
112dn: olcDatabase={0}config,cn=config
113changetype: modify
114add: olcSyncRepl
115olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple
116  credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
117  retry="3 5 300 5" timeout=3
118-
119add: olcUpdateRef
120olcUpdateRef: $URI1
121
122dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
123changetype: add
124objectClass: olcOverlayConfig
125objectClass: olcSyncProvConfig
126olcOverlay: syncprov
127EOF
128RC=$?
129if test $RC != 0 ; then
130	echo "ldapmodify failed for syncrepl config ($RC)!"
131	test $KILLSERVERS != no && kill -HUP $KILLPIDS
132	exit $RC
133fi
134
135echo "Starting consumer slapd on TCP/IP port $PORT2..."
136$SLAPADD -F $CFCON -n 0 -l $CONFLDIF
137cd $CONDIR
138$SLAPD -F ./slapd.d -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 &
139SLAVEPID=$!
140if test $WAIT != 0 ; then
141    echo SLAVEPID $SLAVEPID
142    read foo
143fi
144KILLPIDS="$KILLPIDS $SLAVEPID"
145cd $TESTWD
146
147sleep 1
148
149echo "Using ldapsearch to check that consumer slapd is running..."
150for i in 0 1 2 3 4 5; do
151	$LDAPSEARCH -s base -b "" -H $URI2 \
152		'objectclass=*' > /dev/null 2>&1
153	RC=$?
154	if test $RC = 0 ; then
155		break
156	fi
157	echo "Waiting 5 seconds for slapd to start..."
158	sleep 5
159done
160
161if test $RC != 0 ; then
162	echo "ldapsearch failed ($RC)!"
163	test $KILLSERVERS != no && kill -HUP $KILLPIDS
164	exit $RC
165fi
166
167echo "Configuring syncrepl on consumer..."
168$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
169dn: olcDatabase={0}config,cn=config
170changetype: modify
171add: olcSyncRepl
172olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple
173  credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
174  retry="3 5 300 5" timeout=3
175-
176add: olcUpdateRef
177olcUpdateRef: $URI1
178EOF
179
180echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
181sleep $SLEEP1
182
183echo "Using ldapsearch to check that syncrepl received config changes..."
184RC=32
185for i in 0 1 2 3 4 5; do
186	RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \
187		-s base -b "olcDatabase={0}config,cn=config" \
188		'(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
189	if test "x$RESULT" = "xOK" ; then
190		RC=0
191		break
192	fi
193	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
194	sleep $SLEEP1
195done
196
197if test $RC != 0 ; then
198	echo "ldapsearch failed ($RC)!"
199	test $KILLSERVERS != no && kill -HUP $KILLPIDS
200	exit $RC
201fi
202
203echo "Adding schema and databases on provider..."
204$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
205include: file://$ABS_SCHEMADIR/core.ldif
206
207include: file://$ABS_SCHEMADIR/cosine.ldif
208
209include: file://$ABS_SCHEMADIR/inetorgperson.ldif
210
211include: file://$ABS_SCHEMADIR/openldap.ldif
212
213include: file://$ABS_SCHEMADIR/nis.ldif
214EOF
215RC=$?
216if test $RC != 0 ; then
217	echo "ldapadd failed for schema config ($RC)!"
218	test $KILLSERVERS != no && kill -HUP $KILLPIDS
219	exit $RC
220fi
221
222nullExclude="" nullOK=""
223test $BACKEND = null && nullExclude="# " nullOK="OK"
224
225if [ "$BACKENDTYPE" = mod ]; then
226	$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
227dn: cn=module,cn=config
228objectClass: olcModuleList
229cn: module
230olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
231olcModuleLoad: back_$BACKEND.la
232EOF
233	RC=$?
234	if test $RC != 0 ; then
235		echo "ldapadd failed for backend config ($RC)!"
236		test $KILLSERVERS != no && kill -HUP $KILLPIDS
237		exit $RC
238	fi
239fi
240
241$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
242dn: olcDatabase={1}$BACKEND,cn=config
243objectClass: olcDatabaseConfig
244${nullExclude}objectClass: olc${BACKEND}Config
245olcDatabase: {1}$BACKEND
246olcSuffix: $BASEDN
247${nullExclude}olcDbDirectory: ./db
248olcRootDN: $MANAGERDN
249olcRootPW: $PASSWD
250olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple
251  credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
252  retry="3 5 300 5" timeout=3
253olcUpdateRef: $URI1
254
255dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config
256changetype: add
257objectClass: olcOverlayConfig
258objectClass: olcSyncProvConfig
259olcOverlay: syncprov
260EOF
261RC=$?
262if test $RC != 0 ; then
263	echo "ldapadd failed for database config ($RC)!"
264	test $KILLSERVERS != no && kill -HUP $KILLPIDS
265	exit $RC
266fi
267
268if test $INDEXDB = indexdb ; then
269	$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
270dn: olcDatabase={1}$BACKEND,cn=config
271changetype: modify
272add: olcDbIndex
273olcDbIndex: objectClass,entryUUID,entryCSN eq
274olcDbIndex: cn,uid pres,eq,sub
275EOF
276	RC=$?
277	if test $RC != 0 ; then
278		echo "ldapadd modify for database config ($RC)!"
279		test $KILLSERVERS != no && kill -HUP $KILLPIDS
280		exit $RC
281	fi
282fi
283
284echo "Using ldapadd to populate provider..."
285$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \
286	>> $TESTOUT 2>&1
287RC=$?
288if test $RC != 0 ; then
289	echo "ldapadd failed for database config ($RC)!"
290	test $KILLSERVERS != no && kill -HUP $KILLPIDS
291	exit $RC
292fi
293
294echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
295sleep $SLEEP1
296
297echo "Using ldapsearch to check that syncrepl received database changes..."
298RC=32
299for i in 0 1 2 3 4 5; do
300	RESULT=`$LDAPSEARCH -H $URI2 \
301		-s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \
302		'(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
303	if test "x$RESULT$nullOK" = "xOK" ; then
304		RC=0
305		break
306	fi
307	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
308	sleep $SLEEP1
309done
310
311if test $RC != 0 ; then
312	echo "ldapsearch failed ($RC)!"
313	test $KILLSERVERS != no && kill -HUP $KILLPIDS
314	exit $RC
315fi
316
317echo "Replacing olcSyncrepl on provider..."
318$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
319dn: olcDatabase={0}config,cn=config
320changetype: modify
321replace: olcSyncRepl
322olcSyncRepl: rid=002 provider=$URI1 binddn="cn=config" bindmethod=simple
323  credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
324  retry="3 5 300 5" timeout=3
325EOF
326echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
327sleep $SLEEP1
328
329echo "Using ldapsearch to read config from the provider..."
330$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF  \
331	'objectclass=*' > $MASTEROUT 2>&1
332RC=$?
333
334if test $RC != 0 ; then
335	echo "ldapsearch failed at provider ($RC)!"
336	test $KILLSERVERS != no && kill -HUP $KILLPIDS
337	exit $RC
338fi
339
340echo "Using ldapsearch to read config from the consumer..."
341$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \
342	'objectclass=*' > $SLAVEOUT 2>&1
343RC=$?
344
345if test $RC != 0 ; then
346	echo "ldapsearch failed at consumer ($RC)!"
347	test $KILLSERVERS != no && kill -HUP $KILLPIDS
348	exit $RC
349fi
350
351echo "Filtering provider results..."
352$LDIFFILTER < $MASTEROUT > $MASTERFLT
353echo "Filtering consumer results..."
354$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
355
356echo "Comparing retrieved configs from provider and consumer..."
357$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
358
359if test $? != 0 ; then
360	echo "test failed - provider and consumer configs differ"
361	test $KILLSERVERS != no && kill -HUP $KILLPIDS
362	exit 1
363fi
364
365echo "Using ldapsearch to read all the entries from the provider..."
366$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD  \
367	'objectclass=*' > $MASTEROUT 2>&1
368RC=$?
369
370if test $RC != 0 ; then
371	echo "ldapsearch failed at provider ($RC)!"
372	test $KILLSERVERS != no && kill -HUP $KILLPIDS
373	exit $RC
374fi
375
376echo "Using ldapsearch to read all the entries from the consumer..."
377$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD  \
378	'objectclass=*' > $SLAVEOUT 2>&1
379RC=$?
380
381if test $RC != 0 ; then
382	echo "ldapsearch failed at consumer ($RC)!"
383	test $KILLSERVERS != no && kill -HUP $KILLPIDS
384	exit $RC
385fi
386
387test $KILLSERVERS != no && kill -HUP $KILLPIDS
388
389echo "Filtering provider results..."
390$LDIFFILTER < $MASTEROUT > $MASTERFLT
391echo "Filtering consumer results..."
392$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
393
394echo "Comparing retrieved entries from provider and consumer..."
395$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
396
397if test $? != 0 ; then
398	echo "test failed - provider and consumer databases differ"
399	exit 1
400fi
401
402echo ">>>>> Test succeeded"
403
404test $KILLSERVERS != no && wait
405
406exit 0
407