1#! /bin/sh
2# OpenLDAP: pkg/ldap/tests/scripts/test049-sync-config,v 1.4.2.13 2010/04/19 19:14:36 quanah Exp
3## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4##
5## Copyright 1998-2010 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 producer
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 producer 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 producer 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 producer..."
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: ../../../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 producer..."
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: ../../../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
268case $BACKEND in
269bdb | hdb)
270	$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
271dn: olcDatabase={1}$BACKEND,cn=config
272changetype: modify
273add: olcDbIndex
274olcDbIndex: objectClass,entryUUID,entryCSN eq
275olcDbIndex: cn,uid pres,eq,sub
276EOF
277	RC=$?
278	if test $RC != 0 ; then
279		echo "ldapadd modify for database config ($RC)!"
280		test $KILLSERVERS != no && kill -HUP $KILLPIDS
281		exit $RC
282	fi
283	;;
284esac
285
286echo "Using ldapadd to populate producer..."
287$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \
288	>> $TESTOUT 2>&1
289RC=$?
290if test $RC != 0 ; then
291	echo "ldapadd failed for database config ($RC)!"
292	test $KILLSERVERS != no && kill -HUP $KILLPIDS
293	exit $RC
294fi
295
296echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
297sleep $SLEEP1
298
299echo "Using ldapsearch to check that syncrepl received database changes..."
300RC=32
301for i in 0 1 2 3 4 5; do
302	RESULT=`$LDAPSEARCH -H $URI2 \
303		-s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \
304		'(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
305	if test "x$RESULT$nullOK" = "xOK" ; then
306		RC=0
307		break
308	fi
309	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
310	sleep $SLEEP1
311done
312
313if test $RC != 0 ; then
314	echo "ldapsearch failed ($RC)!"
315	test $KILLSERVERS != no && kill -HUP $KILLPIDS
316	exit $RC
317fi
318
319echo "Replacing olcSyncrepl on producer..."
320$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
321dn: olcDatabase={0}config,cn=config
322changetype: modify
323replace: olcSyncRepl
324olcSyncRepl: rid=002 provider=$URI1 binddn="cn=config" bindmethod=simple
325  credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist
326  retry="3 5 300 5" timeout=3
327EOF
328echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
329sleep $SLEEP1
330
331echo "Using ldapsearch to read config from the producer..."
332$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF  \
333	'objectclass=*' > $MASTEROUT 2>&1
334RC=$?
335
336if test $RC != 0 ; then
337	echo "ldapsearch failed at producer ($RC)!"
338	test $KILLSERVERS != no && kill -HUP $KILLPIDS
339	exit $RC
340fi
341
342echo "Using ldapsearch to read config from the consumer..."
343$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \
344	'objectclass=*' > $SLAVEOUT 2>&1
345RC=$?
346
347if test $RC != 0 ; then
348	echo "ldapsearch failed at consumer ($RC)!"
349	test $KILLSERVERS != no && kill -HUP $KILLPIDS
350	exit $RC
351fi
352
353echo "Filtering producer results..."
354$LDIFFILTER < $MASTEROUT > $MASTERFLT
355echo "Filtering consumer results..."
356$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
357
358echo "Comparing retrieved configs from producer and consumer..."
359$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
360
361if test $? != 0 ; then
362	echo "test failed - producer and consumer configs differ"
363	test $KILLSERVERS != no && kill -HUP $KILLPIDS
364	exit 1
365fi
366
367echo "Using ldapsearch to read all the entries from the producer..."
368$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD  \
369	'objectclass=*' > $MASTEROUT 2>&1
370RC=$?
371
372if test $RC != 0 ; then
373	echo "ldapsearch failed at producer ($RC)!"
374	test $KILLSERVERS != no && kill -HUP $KILLPIDS
375	exit $RC
376fi
377
378echo "Using ldapsearch to read all the entries from the consumer..."
379$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD  \
380	'objectclass=*' > $SLAVEOUT 2>&1
381RC=$?
382
383if test $RC != 0 ; then
384	echo "ldapsearch failed at consumer ($RC)!"
385	test $KILLSERVERS != no && kill -HUP $KILLPIDS
386	exit $RC
387fi
388
389test $KILLSERVERS != no && kill -HUP $KILLPIDS
390
391echo "Filtering producer results..."
392$LDIFFILTER < $MASTEROUT > $MASTERFLT
393echo "Filtering consumer results..."
394$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
395
396echo "Comparing retrieved entries from producer and consumer..."
397$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
398
399if test $? != 0 ; then
400	echo "test failed - producer and consumer databases differ"
401	exit 1
402fi
403
404echo ">>>>> Test succeeded"
405
406test $KILLSERVERS != no && wait
407
408exit 0
409