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