1#! /bin/sh
2# OpenLDAP: pkg/ldap/tests/scripts/test018-syncreplication-persist,v 1.38.2.13 2010/04/19 19:24:42 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
19OPATTRS="entryUUID creatorsName createTimestamp modifiersName modifyTimestamp"
20
21if test $SYNCPROV = syncprovno; then
22	echo "Syncrepl provider overlay not available, test skipped"
23	exit 0
24fi
25
26mkdir -p $TESTDIR $DBDIR1 $DBDIR4
27
28#
29# Test replication:
30# - start producer
31# - start consumer
32# - populate over ldap
33# - perform some modifies and deleted
34# - attempt to modify the consumer (referral or chain)
35# - retrieve database over ldap and compare against expected results
36#
37
38echo "Starting producer slapd on TCP/IP port $PORT1..."
39. $CONFFILTER $BACKEND $MONITORDB < $SRMASTERCONF > $CONF1
40$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
41PID=$!
42if test $WAIT != 0 ; then
43    echo PID $PID
44    read foo
45fi
46KILLPIDS="$PID"
47
48sleep 1
49
50echo "Using ldapsearch to check that producer slapd is running..."
51for i in 0 1 2 3 4 5; do
52	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
53		'objectclass=*' > /dev/null 2>&1
54	RC=$?
55	if test $RC = 0 ; then
56		break
57	fi
58	echo "Waiting 5 seconds for slapd to start..."
59	sleep 5
60done
61
62if test $RC != 0 ; then
63	echo "ldapsearch failed ($RC)!"
64	test $KILLSERVERS != no && kill -HUP $KILLPIDS
65	exit $RC
66fi
67
68echo "Using ldapadd to create the context prefix entry in the producer..."
69$LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
70	$LDIFORDEREDCP > /dev/null 2>&1
71RC=$?
72if test $RC != 0 ; then
73	echo "ldapadd failed ($RC)!"
74	test $KILLSERVERS != no && kill -HUP $KILLPIDS
75	exit $RC
76fi
77
78echo "Starting consumer slapd on TCP/IP port $PORT4..."
79. $CONFFILTER $BACKEND $MONITORDB < $P1SRSLAVECONF > $CONF4
80$SLAPD -f $CONF4 -h $URI4 -d $LVL $TIMING > $LOG4 2>&1 &
81SLAVEPID=$!
82if test $WAIT != 0 ; then
83    echo SLAVEPID $SLAVEPID
84    read foo
85fi
86KILLPIDS="$KILLPIDS $SLAVEPID"
87
88sleep 1
89
90echo "Using ldapsearch to check that consumer slapd is running..."
91for i in 0 1 2 3 4 5; do
92	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT4 \
93		'objectclass=*' > /dev/null 2>&1
94	RC=$?
95	if test $RC = 0 ; then
96		break
97	fi
98	echo "Waiting 5 seconds for slapd to start..."
99	sleep 5
100done
101
102if test $RC != 0 ; then
103	echo "ldapsearch failed ($RC)!"
104	test $KILLSERVERS != no && kill -HUP $KILLPIDS
105	exit $RC
106fi
107
108echo "Using ldapadd to populate the producer directory..."
109$LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
110	$LDIFORDEREDNOCP > /dev/null 2>&1
111RC=$?
112if test $RC != 0 ; then
113	echo "ldapadd failed ($RC)!"
114	test $KILLSERVERS != no && kill -HUP $KILLPIDS
115	exit $RC
116fi
117
118echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
119sleep $SLEEP1
120
121echo "Using ldapsearch to read all the entries from the producer..."
122$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
123	'(objectclass=*)' '*' $OPATTRS > $MASTEROUT 2>&1
124RC=$?
125
126if test $RC != 0 ; then
127	echo "ldapsearch failed at producer ($RC)!"
128	test $KILLSERVERS != no && kill -HUP $KILLPIDS
129	exit $RC
130fi
131
132echo "Using ldapsearch to read all the entries from the consumer..."
133$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT4 \
134	'(objectclass=*)' '*' $OPATTRS > $SLAVEOUT 2>&1
135RC=$?
136
137if test $RC != 0 ; then
138	echo "ldapsearch failed at consumer ($RC)!"
139	test $KILLSERVERS != no && kill -HUP $KILLPIDS
140	exit $RC
141fi
142
143echo "Filtering producer results..."
144$LDIFFILTER < $MASTEROUT > $MASTERFLT
145echo "Filtering consumer results..."
146$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
147
148echo "Comparing retrieved entries from producer and consumer..."
149$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
150
151if test $? != 0 ; then
152	echo "test failed - producer and consumer databases differ"
153	test $KILLSERVERS != no && kill -HUP $KILLPIDS
154	exit 1
155fi
156
157echo "Stopping the provider, sleeping 10 seconds and restarting it..."
158kill -HUP "$PID"
159wait $PID
160sleep 10
161echo "RESTART" >> $LOG1
162$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 &
163PID=$!
164if test $WAIT != 0 ; then
165    echo PID $PID
166    read foo
167fi
168KILLPIDS="$PID $SLAVEPID"
169
170sleep 1
171
172echo "Using ldapsearch to check that producer slapd is running..."
173for i in 0 1 2 3 4 5; do
174	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
175		'objectclass=*' > /dev/null 2>&1
176	RC=$?
177	if test $RC = 0 ; then
178		break
179	fi
180	echo "Waiting 5 seconds for slapd to start..."
181	sleep 5
182done
183
184echo "Waiting $SLEEP1 seconds for consumer to reconnect..."
185sleep $SLEEP1
186
187if test $RC != 0 ; then
188	echo "ldapsearch failed ($RC)!"
189	test $KILLSERVERS != no && kill -HUP $KILLPIDS
190	exit $RC
191fi
192
193echo "Using ldapmodify to modify producer directory..."
194
195#
196# Do some modifications
197#
198
199$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \
200	$TESTOUT 2>&1 << EOMODS
201dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
202changetype: modify
203add: drink
204drink: Orange Juice
205-
206delete: sn
207sn: Jones
208-
209add: sn
210sn: Jones
211
212dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
213changetype: modify
214replace: drink
215drink: Iced Tea
216
217dn: cn=ITD Staff,ou=Groups,dc=example,dc=com
218changetype: modify
219delete: uniquemember
220uniquemember: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
221uniquemember: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
222-
223add: uniquemember
224uniquemember: cn=Dorothy Stevens, ou=Alumni Association, ou=People, dc=example,dc=com
225uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
226
227dn: cn=All Staff,ou=Groups,dc=example,dc=com
228changetype: modify
229delete: description
230
231dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
232changetype: add
233objectclass: OpenLDAPperson
234cn: Gern Jensen
235sn: Jensen
236uid: gjensen
237title: Chief Investigator, ITD
238postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103
239seealso: cn=All Staff, ou=Groups, dc=example,dc=com
240drink: Coffee
241homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104
242description: Very odd
243facsimiletelephonenumber: +1 313 555 7557
244facsimiletelephonenumber: +1 313 555 9998
245facsimiletelephonenumber: +1 313 555 9999
246telephonenumber: +1 313 555 8343
247mail: gjensen@mailgw.example.com
248homephone: +1 313 555 8844
249
250# modify attribute with no matching rule (ITS#6458)
251dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
252changetype: modify
253replace: facsimiletelephonenumber
254facsimiletelephonenumber: +1 313 555 9998
255facsimiletelephonenumber: +1 313 555 9999
256
257dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
258changetype: modify
259replace: facsimiletelephonenumber
260facsimiletelephonenumber: +1 313 555 9998
261facsimiletelephonenumber: +1 313 555 9999
262facsimiletelephonenumber: +1 313 555 7557
263
264dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
265changetype: modify
266replace: facsimiletelephonenumber
267facsimiletelephonenumber: +1 313 555 9998
268facsimiletelephonenumber: +1 313 555 9999
269
270dn: ou=Retired, ou=People, dc=example,dc=com
271changetype: add
272objectclass: organizationalUnit
273ou: Retired
274
275dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
276changetype: add
277objectclass: OpenLDAPperson
278cn: Rosco P. Coltrane
279sn: Coltrane
280uid: rosco
281description: Fat tycoon
282
283dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
284changetype: modrdn
285newrdn: cn=Rosco P. Coltrane
286deleteoldrdn: 1
287newsuperior: ou=Retired, ou=People, dc=example,dc=com
288
289dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
290changetype: delete
291
292dn: dc=testdomain1,dc=example,dc=com
293changetype: modrdn
294newrdn: dc=itsdomain1
295deleteoldrdn: 1
296
297dn: dc=itsdomain1,dc=example,dc=com
298changetype: modify
299replace: description
300description: Example, Inc. ITS test domain
301
302dn: dc=testdomain2,dc=example,dc=com
303changetype: modrdn
304newrdn: dc=itsdomain2
305deleteoldrdn: 1
306
307EOMODS
308
309RC=$?
310if test $RC != 0 ; then
311	echo "ldapmodify failed ($RC)!"
312	test $KILLSERVERS != no && kill -HUP $KILLPIDS
313	exit $RC
314fi
315
316echo "Using ldappasswd to change some passwords..."
317$LDAPPASSWD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \
318	'cn=Bjorn Jensen,ou=Information Technology Division,ou=People,dc=example,dc=com' \
319	> $TESTOUT 2>&1
320RC=$?
321if test $RC != 0 ; then
322	echo "ldapmodify failed ($RC)!"
323	test $KILLSERVERS != no && kill -HUP $KILLPIDS
324	exit $RC
325fi
326
327echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
328sleep $SLEEP1
329
330echo "Using ldapsearch to read all the entries from the producer..."
331$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
332	'(objectclass=*)' '*' $OPATTRS > $MASTEROUT 2>&1
333RC=$?
334
335if test $RC != 0 ; then
336	echo "ldapsearch failed at producer ($RC)!"
337	test $KILLSERVERS != no && kill -HUP $KILLPIDS
338	exit $RC
339fi
340
341echo "Using ldapsearch to read all the entries from the consumer..."
342$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT4 \
343	'(objectclass=*)' '*' $OPATTRS > $SLAVEOUT 2>&1
344RC=$?
345
346if test $RC != 0 ; then
347	echo "ldapsearch failed at consumer ($RC)!"
348	test $KILLSERVERS != no && kill -HUP $KILLPIDS
349	exit $RC
350fi
351
352echo "Filtering producer results..."
353$LDIFFILTER < $MASTEROUT > $MASTERFLT
354echo "Filtering consumer results..."
355$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
356
357echo "Comparing retrieved entries from producer and consumer..."
358$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
359
360if test $? != 0 ; then
361	echo "test failed - producer and consumer databases differ"
362	test $KILLSERVERS != no && kill -HUP $KILLPIDS
363	exit 1
364fi
365
366echo "Stopping consumer to test recovery..."
367kill -HUP $SLAVEPID
368wait $SLAVEPID
369
370echo "Modifying more entries on the producer..."
371$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD >> \
372	$TESTOUT 2>&1 << EOMODS
373dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
374changetype: delete
375
376dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
377changetype: modify
378add: drink
379drink: Mad Dog 20/20
380
381dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
382changetype: add
383objectclass: OpenLDAPperson
384sn: Coltrane
385uid: rosco
386cn: Rosco P. Coltrane
387
388dn: dc=itsdomain2,dc=example,dc=com
389changetype: modify
390replace: description
391description: Example, Inc. itsdomain2 test domain
392
393# rename with a newly added newSuperior while the consumer is down (ITS#6472)
394dn: ou=New Branch,dc=example,dc=com
395changetype: add
396objectClass: organizationalUnit
397ou: New Branch
398
399dn: cn=Dorothy Stevens, ou=Alumni Association, ou=People, dc=example,dc=com
400changetype: modrdn
401newrdn: cn=Dorothy Stevens
402deleteoldrdn: 0
403newsuperior: ou=New Branch,dc=example,dc=com
404
405EOMODS
406
407RC=$?
408if test $RC != 0 ; then
409	echo "ldapmodify failed ($RC)!"
410	test $KILLSERVERS != no && kill -HUP $KILLPIDS
411	exit $RC
412fi
413
414echo "Restarting consumer..."
415echo "RESTART" >> $LOG4
416$SLAPD -f $CONF4 -h $URI4 -d $LVL $TIMING >> $LOG4 2>&1 &
417SLAVEPID=$!
418if test $WAIT != 0 ; then
419    echo SLAVEPID $SLAVEPID
420    read foo
421fi
422KILLPIDS="$PID $SLAVEPID"
423
424echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
425sleep $SLEEP1
426
427echo "Using ldapsearch to read all the entries from the producer..."
428$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
429	'(objectclass=*)' '*' $OPATTRS > $MASTEROUT 2>&1
430RC=$?
431
432if test $RC != 0 ; then
433	echo "ldapsearch failed at producer ($RC)!"
434	test $KILLSERVERS != no && kill -HUP $KILLPIDS
435	exit $RC
436fi
437
438echo "Using ldapsearch to read all the entries from the consumer..."
439$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT4 \
440	'(objectclass=*)' '*' $OPATTRS > $SLAVEOUT 2>&1
441RC=$?
442
443if test $RC != 0 ; then
444	echo "ldapsearch failed at consumer ($RC)!"
445	test $KILLSERVERS != no && kill -HUP $KILLPIDS
446	exit $RC
447fi
448
449echo "Filtering producer results..."
450$LDIFFILTER < $MASTEROUT > $MASTERFLT
451echo "Filtering consumer results..."
452$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
453
454echo "Comparing retrieved entries from producer and consumer..."
455$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
456
457if test $? != 0 ; then
458	echo "test failed - producer and consumer databases differ"
459	test $KILLSERVERS != no && kill -HUP $KILLPIDS
460	exit 1
461fi
462
463if test ! $BACKLDAP = "ldapno" ; then
464	echo "Try updating the consumer slapd..."
465	$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT4 -w $PASSWD > \
466		$TESTOUT 2>&1 << EOMODS
467dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com
468changetype: modify
469add: description
470description: This write must fail because directed to a shadow context,
471description: unless the chain overlay is configured appropriately ;)
472
473EOMODS
474
475	RC=$?
476	if test $RC != 0 ; then
477		echo "ldapmodify failed ($RC)!"
478		test $KILLSERVERS != no && kill -HUP $KILLPIDS
479		exit $RC
480	fi
481
482	# ITS#4964
483	echo "Trying to change some passwords on the consumer..."
484	$LDAPPASSWD -D "$MANAGERDN" -h $LOCALHOST -p $PORT4 -w $PASSWD \
485		'cn=Barbara Jensen,ou=Information Technology Division,ou=People,dc=example,dc=com' \
486		> $TESTOUT 2>&1
487	RC=$?
488	if test $RC != 0 ; then
489		echo "ldapmodify failed ($RC)!"
490		test $KILLSERVERS != no && kill -HUP $KILLPIDS
491		exit $RC
492	fi
493
494	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
495	sleep $SLEEP1
496fi
497
498echo "Using ldapsearch to read all the entries from the producer..."
499$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
500	'(objectclass=*)' '*' $OPATTRS > $MASTEROUT 2>&1
501RC=$?
502
503if test $RC != 0 ; then
504	echo "ldapsearch failed at producer ($RC)!"
505	test $KILLSERVERS != no && kill -HUP $KILLPIDS
506	exit $RC
507fi
508
509echo "Using ldapsearch to read all the entries from the consumer..."
510$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT4 \
511	'(objectclass=*)' '*' $OPATTRS > $SLAVEOUT 2>&1
512RC=$?
513
514if test $RC != 0 ; then
515	echo "ldapsearch failed at consumer ($RC)!"
516	test $KILLSERVERS != no && kill -HUP $KILLPIDS
517	exit $RC
518fi
519
520echo "Filtering producer results..."
521$LDIFFILTER < $MASTEROUT > $MASTERFLT
522echo "Filtering consumer results..."
523$LDIFFILTER < $SLAVEOUT > $SLAVEFLT
524
525echo "Comparing retrieved entries from producer and consumer..."
526$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
527
528if test $? != 0 ; then
529	echo "test failed - producer and consumer databases differ"
530	test $KILLSERVERS != no && kill -HUP $KILLPIDS
531	exit 1
532fi
533
534test $KILLSERVERS != no && kill -HUP $KILLPIDS
535
536echo ">>>>> Test succeeded"
537
538test $KILLSERVERS != no && wait
539
540exit 0
541