]> git.sur5r.net Git - openldap/blob - tests/scripts/test049-sync-config
Update copyright for next release
[openldap] / tests / scripts / test049-sync-config
1 #! /bin/sh
2 # $OpenLDAP$
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:10"
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="5 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="5 5 300 5" timeout=3
175 -
176 add: olcUpdateRef
177 olcUpdateRef: $URI1
178 EOF
179
180 SLEEP=10
181 echo "Waiting $SLEEP seconds for syncrepl to receive changes..."
182 sleep $SLEEP
183
184 echo "Using ldapsearch to check that syncrepl received config changes..."
185 RC=32
186 for i in 0 1 2 3 4 5; do
187         RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \
188                 -s base -b "olcDatabase={0}config,cn=config" \
189                 '(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
190         if test "x$RESULT" = "xOK" ; then
191                 RC=0
192                 break
193         fi
194         echo "Waiting 5 seconds for syncrepl to receive changes..."
195         sleep 5
196 done
197
198 if test $RC != 0 ; then
199         echo "ldapsearch failed ($RC)!"
200         test $KILLSERVERS != no && kill -HUP $KILLPIDS
201         exit $RC
202 fi
203
204 echo "Adding schema and databases on producer..."
205 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
206 include: file://$ABS_SCHEMADIR/core.ldif
207
208 include: file://$ABS_SCHEMADIR/cosine.ldif
209
210 include: file://$ABS_SCHEMADIR/inetorgperson.ldif
211
212 include: file://$ABS_SCHEMADIR/openldap.ldif
213
214 include: file://$ABS_SCHEMADIR/nis.ldif
215 EOF
216 RC=$?
217 if test $RC != 0 ; then
218         echo "ldapadd failed for schema config ($RC)!"
219         test $KILLSERVERS != no && kill -HUP $KILLPIDS
220         exit $RC
221 fi
222
223 if [ "$BACKENDTYPE" = mod ]; then
224         $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
225 dn: cn=module,cn=config
226 objectClass: olcModuleList
227 cn: module
228 olcModulePath: ../../../servers/slapd/back-$BACKEND
229 olcModuleLoad: back_$BACKEND.la
230 EOF
231         RC=$?
232         if test $RC != 0 ; then
233                 echo "ldapadd failed for backend config ($RC)!"
234                 test $KILLSERVERS != no && kill -HUP $KILLPIDS
235                 exit $RC
236         fi
237 fi
238
239 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
240 dn: olcDatabase={1}$BACKEND,cn=config
241 objectClass: olcDatabaseConfig
242 objectClass: olc${BACKEND}Config
243 olcDatabase: {1}$BACKEND
244 olcSuffix: $BASEDN
245 olcDbDirectory: ./db
246 olcRootDN: $MANAGERDN
247 olcRootPW: $PASSWD
248 olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple
249   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
250   retry="5 5 300 5" timeout=3
251 olcUpdateRef: $URI1
252
253 dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config
254 changetype: add
255 objectClass: olcOverlayConfig
256 objectClass: olcSyncProvConfig
257 olcOverlay: syncprov
258 EOF
259 RC=$?
260 if test $RC != 0 ; then
261         echo "ldapadd failed for database config ($RC)!"
262         test $KILLSERVERS != no && kill -HUP $KILLPIDS
263         exit $RC
264 fi
265
266 case $BACKEND in
267 bdb | hdb)
268         $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
269 dn: olcDatabase={1}$BACKEND,cn=config
270 changetype: modify
271 add: olcDbIndex
272 olcDbIndex: objectClass,entryUUID,entryCSN eq
273 olcDbIndex: cn,uid pres,eq,sub
274 EOF
275         RC=$?
276         if test $RC != 0 ; then
277                 echo "ldapadd modify for database config ($RC)!"
278                 test $KILLSERVERS != no && kill -HUP $KILLPIDS
279                 exit $RC
280         fi
281         ;;
282 esac
283
284 echo "Using ldapadd to populate producer..."
285 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \
286         >> $TESTOUT 2>&1
287 RC=$?
288 if test $RC != 0 ; then
289         echo "ldapadd failed for database config ($RC)!"
290         test $KILLSERVERS != no && kill -HUP $KILLPIDS
291         exit $RC
292 fi
293
294 SLEEP=20
295 echo "Waiting $SLEEP seconds for syncrepl to receive changes..."
296 sleep $SLEEP
297
298 echo "Using ldapsearch to check that syncrepl received database changes..."
299 RC=32
300 for i in 0 1 2 3 4 5; do
301         RESULT=`$LDAPSEARCH -H $URI2 \
302                 -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \
303                 '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
304         if test "x$RESULT" = "xOK" ; then
305                 RC=0
306                 break
307         fi
308         echo "Waiting 5 seconds for syncrepl to receive changes..."
309         sleep 5
310 done
311
312 if test $RC != 0 ; then
313         echo "ldapsearch failed ($RC)!"
314         test $KILLSERVERS != no && kill -HUP $KILLPIDS
315         exit $RC
316 fi
317
318 echo "Using ldapsearch to read config from the producer..."
319 $LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF  \
320         'objectclass=*' > $MASTEROUT 2>&1
321 RC=$?
322
323 if test $RC != 0 ; then
324         echo "ldapsearch failed at producer ($RC)!"
325         test $KILLSERVERS != no && kill -HUP $KILLPIDS
326         exit $RC
327 fi
328
329 echo "Using ldapsearch to read config from the consumer..."
330 $LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \
331         'objectclass=*' > $SLAVEOUT 2>&1
332 RC=$?
333
334 if test $RC != 0 ; then
335         echo "ldapsearch failed at consumer ($RC)!"
336         test $KILLSERVERS != no && kill -HUP $KILLPIDS
337         exit $RC
338 fi
339
340 echo "Filtering producer results..."
341 . $LDIFFILTER < $MASTEROUT > $MASTERFLT
342 echo "Filtering consumer results..."
343 . $LDIFFILTER < $SLAVEOUT > $SLAVEFLT
344
345 echo "Comparing retrieved configs from producer and consumer..."
346 $CMP $MASTERFLT $SLAVEFLT > $CMPOUT
347
348 if test $? != 0 ; then
349         echo "test failed - producer and consumer configs differ"
350         test $KILLSERVERS != no && kill -HUP $KILLPIDS
351         exit 1
352 fi
353
354 echo "Using ldapsearch to read all the entries from the producer..."
355 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD  \
356         'objectclass=*' > $MASTEROUT 2>&1
357 RC=$?
358
359 if test $RC != 0 ; then
360         echo "ldapsearch failed at producer ($RC)!"
361         test $KILLSERVERS != no && kill -HUP $KILLPIDS
362         exit $RC
363 fi
364
365 echo "Using ldapsearch to read all the entries from the consumer..."
366 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD  \
367         'objectclass=*' > $SLAVEOUT 2>&1
368 RC=$?
369
370 if test $RC != 0 ; then
371         echo "ldapsearch failed at consumer ($RC)!"
372         test $KILLSERVERS != no && kill -HUP $KILLPIDS
373         exit $RC
374 fi
375
376 test $KILLSERVERS != no && kill -HUP $KILLPIDS
377
378 echo "Filtering producer results..."
379 . $LDIFFILTER < $MASTEROUT > $MASTERFLT
380 echo "Filtering consumer results..."
381 . $LDIFFILTER < $SLAVEOUT > $SLAVEFLT
382
383 echo "Comparing retrieved entries from producer and consumer..."
384 $CMP $MASTERFLT $SLAVEFLT > $CMPOUT
385
386 if test $? != 0 ; then
387         echo "test failed - producer and consumer databases differ"
388         exit 1
389 fi
390
391 echo ">>>>> Test succeeded"
392
393 test $KILLSERVERS != no && wait
394
395 exit 0