]> git.sur5r.net Git - openldap/blob - tests/scripts/test069-delta-multimaster-starttls
2dfbb30a129d0a7a2171112ec914149080cc0eb1
[openldap] / tests / scripts / test069-delta-multimaster-starttls
1 #! /bin/sh
2 # $OpenLDAP$
3 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 ##
5 ## Copyright 1998-2017 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 $WITH_TLS = no ; then
20         echo "TLS support not available, test skipped"
21         exit 0
22 fi
23
24 if test $SYNCPROV = syncprovno; then
25         echo "Syncrepl provider overlay not available, test skipped"
26         exit 0
27 fi
28 if test $ACCESSLOG = accesslogno; then
29         echo "Accesslog overlay not available, test skipped"
30         exit 0
31 fi
32
33 MMR=2
34
35 XDIR=$TESTDIR/srv
36 TMP=$TESTDIR/tmp
37
38 mkdir -p $TESTDIR
39 cp -r $DATADIR/tls $TESTDIR
40
41 $SLAPPASSWD -g -n >$CONFIGPWF
42
43 if test x"$SYNCMODE" = x ; then
44         SYNCMODE=rp
45 fi
46 case "$SYNCMODE" in
47         ro)
48                 SYNCTYPE="type=refreshOnly interval=00:00:00:03"
49                 ;;
50         rp)
51                 SYNCTYPE="type=refreshAndPersist interval=00:00:00:03"
52                 ;;
53         *)
54                 echo "unknown sync mode $SYNCMODE"
55                 exit 1;
56                 ;;
57 esac
58
59 #
60 # Test delta-sync mmr
61 # - start servers
62 # - configure over ldap
63 # - populate over ldap
64 # - configure syncrepl over ldap
65 # - break replication
66 # - modify each server separately
67 # - restore replication
68 # - compare results
69 #
70
71 nullExclude=""
72 test $BACKEND = null && nullExclude="# "
73
74 KILLPIDS=
75
76 echo "Initializing server configurations..."
77 n=1
78 while [ $n -le $MMR ]; do
79
80 DBDIR=${XDIR}$n/db
81 CFDIR=${XDIR}$n/slapd.d
82
83 mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR
84
85 o=`expr 3 - $n`
86 cat > $TMP <<EOF
87 dn: cn=config
88 objectClass: olcGlobal
89 cn: config
90 olcServerID: $n
91 olcTLSCertificateFile: $TESTDIR/tls/certs/localhost.crt
92 olcTLSCertificateKeyFile: $TESTDIR/tls/private/localhost.key
93
94 EOF
95
96 if [ "$SYNCPROV" = syncprovmod -o "$ACCESSLOG" = accesslogmod ]; then
97   cat <<EOF >> $TMP
98 dn: cn=module,cn=config
99 objectClass: olcModuleList
100 cn: module
101 olcModulePath: $TESTWD/../servers/slapd/overlays
102 EOF
103   if [ "$SYNCPROV" = syncprovmod ]; then
104   echo "olcModuleLoad: syncprov.la" >> $TMP
105   fi
106   if [ "$ACCESSLOG" = accesslogmod ]; then
107   echo "olcModuleLoad: accesslog.la" >> $TMP
108   fi
109   echo "" >> $TMP
110 fi
111
112 if [ "$BACKENDTYPE" = mod ]; then
113 cat <<EOF >> $TMP
114 dn: cn=module,cn=config
115 objectClass: olcModuleList
116 cn: module
117 olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
118 olcModuleLoad: back_$BACKEND.la
119
120 EOF
121 fi
122 MYURI=`eval echo '$URI'$n`
123 PROVIDERURI=`eval echo '$URIP'$o`
124 if test $INDEXDB = indexdb ; then
125 INDEX1="olcDbIndex: objectClass,entryCSN,reqStart,reqDN,reqResult eq"
126 INDEX2="olcDbIndex: objectClass,entryCSN,entryUUID eq"
127 else
128 INDEX1=
129 INDEX2=
130 fi
131 cat >> $TMP <<EOF
132 dn: cn=schema,cn=config
133 objectclass: olcSchemaconfig
134 cn: schema
135
136 include: file://$ABS_SCHEMADIR/core.ldif
137
138 include: file://$ABS_SCHEMADIR/cosine.ldif
139
140 include: file://$ABS_SCHEMADIR/inetorgperson.ldif
141
142 include: file://$ABS_SCHEMADIR/openldap.ldif
143
144 include: file://$ABS_SCHEMADIR/nis.ldif
145
146 dn: olcDatabase={0}config,cn=config
147 objectClass: olcDatabaseConfig
148 olcDatabase: {0}config
149 olcRootPW:< file://$CONFIGPWF
150
151 dn: olcDatabase={1}$BACKEND,cn=config
152 objectClass: olcDatabaseConfig
153 ${nullExclude}objectClass: olc${BACKEND}Config
154 olcDatabase: {1}$BACKEND
155 olcSuffix: cn=log
156 ${nullExclude}olcDbDirectory: ${DBDIR}.1
157 olcRootDN: $MANAGERDN
158 $INDEX1
159
160 dn: olcOverlay=syncprov,olcDatabase={1}$BACKEND,cn=config
161 objectClass: olcOverlayConfig
162 objectClass: olcSyncProvConfig
163 olcOverlay: syncprov
164 olcSpNoPresent: TRUE
165 olcSpReloadHint: TRUE
166
167 dn: olcDatabase={2}$BACKEND,cn=config
168 objectClass: olcDatabaseConfig
169 ${nullExclude}objectClass: olc${BACKEND}Config
170 olcDatabase: {2}$BACKEND
171 olcSuffix: $BASEDN
172 ${nullExclude}olcDbDirectory: ${DBDIR}.2
173 olcRootDN: $MANAGERDN
174 olcRootPW: $PASSWD
175 olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
176   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
177   retry="3 +" timeout=3 logbase="cn=log"
178   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
179   syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
180   starttls=critical
181 olcMirrorMode: TRUE
182 $INDEX2
183
184 dn: olcOverlay=syncprov,olcDatabase={2}$BACKEND,cn=config
185 objectClass: olcOverlayConfig
186 objectClass: olcSyncProvConfig
187 olcOverlay: syncprov
188
189 dn: olcOverlay=accesslog,olcDatabase={2}$BACKEND,cn=config
190 objectClass: olcOverlayConfig
191 objectClass: olcAccessLogConfig
192 olcOverlay: accesslog
193 olcAccessLogDB: cn=log
194 olcAccessLogOps: writes
195 olcAccessLogSuccess: TRUE
196
197 EOF
198 $SLAPADD -F $CFDIR -n 0  -d-1< $TMP > $TESTOUT 2>&1
199 PORT=`eval echo '$PORT'$n`
200 echo "Starting server $n on TCP/IP port $PORT..."
201 cd ${XDIR}${n}
202 LOG=`eval echo '$LOG'$n`
203 $SLAPD -F slapd.d -h $MYURI -d $LVL $TIMING > $LOG 2>&1 &
204 PID=$!
205 if test $WAIT != 0 ; then
206     echo PID $PID
207     read foo
208 fi
209 KILLPIDS="$PID $KILLPIDS"
210 cd $TESTWD
211
212 echo "Using ldapsearch to check that server $n is running..."
213 for i in 0 1 2 3 4 5; do
214         $LDAPSEARCH -s base -b "" -H $MYURI \
215                 'objectclass=*' > /dev/null 2>&1
216         RC=$?
217         if test $RC = 0 ; then
218                 break
219         fi
220         echo "Waiting 5 seconds for slapd to start..."
221         sleep 5
222 done
223
224 if test $RC != 0 ; then
225         echo "ldapsearch failed ($RC)!"
226         test $KILLSERVERS != no && kill -HUP $KILLPIDS
227         exit $RC
228 fi
229
230 if [ $n = 1 ]; then
231 echo "Using ldapadd for context on server 1..."
232 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDCP \
233         >> $TESTOUT 2>&1
234 RC=$?
235 if test $RC != 0 ; then
236         echo "ldapadd failed for server $n database ($RC)!"
237         test $KILLSERVERS != no && kill -HUP $KILLPIDS
238         exit $RC
239 fi
240 fi
241
242 n=`expr $n + 1`
243 done
244
245 echo "Using ldapadd to populate server 1..."
246 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDNOCP \
247         >> $TESTOUT 2>&1
248 RC=$?
249 if test $RC != 0 ; then
250         echo "ldapadd failed for server $n database ($RC)!"
251         test $KILLSERVERS != no && kill -HUP $KILLPIDS
252         exit $RC
253 fi
254
255 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
256 sleep $SLEEP1
257
258 n=1
259 while [ $n -le $MMR ]; do
260 PORT=`expr $BASEPORT + $n`
261 URI="ldap://${LOCALHOST}:$PORT/"
262
263 echo "Using ldapsearch to read all the entries from server $n..."
264 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
265         'objectclass=*' > $TESTDIR/server$n.out 2>&1
266 RC=$?
267
268 if test $RC != 0 ; then
269         echo "ldapsearch failed at server $n ($RC)!"
270         test $KILLSERVERS != no && kill -HUP $KILLPIDS
271         exit $RC
272 fi
273 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
274 n=`expr $n + 1`
275 done
276
277 n=2
278 while [ $n -le $MMR ]; do
279 echo "Comparing retrieved entries from server 1 and server $n..."
280 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
281
282 if test $? != 0 ; then
283         echo "test failed - server 1 and server $n databases differ"
284         test $KILLSERVERS != no && kill -HUP $KILLPIDS
285         exit 1
286 fi
287 n=`expr $n + 1`
288 done
289
290 echo "Using ldapadd to populate server 2..."
291 $LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD -f $LDIFADD1 \
292         >> $TESTOUT 2>&1
293 RC=$?
294 if test $RC != 0 ; then
295         echo "ldapadd failed for server 2 database ($RC)!"
296         test $KILLSERVERS != no && kill -HUP $KILLPIDS
297         exit $RC
298 fi
299
300 THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com"
301 sleep 1
302 for i in 1 2 3; do
303         $LDAPSEARCH -S "" -b "$THEDN" -H $URI1 \
304                 -s base '(objectClass=*)' entryCSN > "${MASTEROUT}.$i" 2>&1
305         RC=$?
306
307         if test $RC = 0 ; then
308                 break
309         fi
310
311         if test $RC != 32 ; then
312                 echo "ldapsearch failed at slave ($RC)!"
313                 test $KILLSERVERS != no && kill -HUP $KILLPIDS
314                 exit $RC
315         fi
316
317         echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
318         sleep $SLEEP1
319 done
320
321 n=1
322 while [ $n -le $MMR ]; do
323 PORT=`expr $BASEPORT + $n`
324 URI="ldap://${LOCALHOST}:$PORT/"
325
326 echo "Using ldapsearch to read all the entries from server $n..."
327 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
328         'objectclass=*' > $TESTDIR/server$n.out 2>&1
329 RC=$?
330
331 if test $RC != 0 ; then
332         echo "ldapsearch failed at server $n ($RC)!"
333         test $KILLSERVERS != no && kill -HUP $KILLPIDS
334         exit $RC
335 fi
336 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
337 n=`expr $n + 1`
338 done
339
340 n=2
341 while [ $n -le $MMR ]; do
342 echo "Comparing retrieved entries from server 1 and server $n..."
343 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
344
345 if test $? != 0 ; then
346         echo "test failed - server 1 and server $n databases differ"
347         test $KILLSERVERS != no && kill -HUP $KILLPIDS
348         exit 1
349 fi
350 n=`expr $n + 1`
351 done
352
353 echo "Breaking replication between server 1 and 2..."
354 n=1
355 while [ $n -le $MMR ]; do
356 o=`expr 3 - $n`
357 MYURI=`eval echo '$URI'$n`
358 PROVIDERURI=`eval echo '$URIP'$o`
359 $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <<EOF
360 dn: olcDatabase={2}$BACKEND,cn=config
361 changetype: modify
362 replace: olcSyncRepl
363 olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
364   credentials=InvalidPw searchbase="$BASEDN" $SYNCTYPE
365   retry="3 +" timeout=3 logbase="cn=log"
366   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
367   syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
368   starttls=critical
369 -
370 replace: olcMirrorMode
371 olcMirrorMode: TRUE
372
373 EOF
374 RC=$?
375 if test $RC != 0 ; then
376         echo "ldapmodify failed for server $n config ($RC)!"
377         test $KILLSERVERS != no && kill -HUP $KILLPIDS
378         exit $RC
379 fi
380 n=`expr $n + 1`
381 done
382
383 echo "Using ldapmodify to force conflicts between server 1 and 2..."
384 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
385         >> $TESTOUT 2>&1 << EOF
386 dn: $THEDN
387 changetype: modify
388 add: description
389 description: Amazing
390
391 EOF
392 RC=$?
393 if test $RC != 0 ; then
394         echo "ldapmodify failed for server 1 database ($RC)!"
395         test $KILLSERVERS != no && kill -HUP $KILLPIDS
396         exit $RC
397 fi
398
399 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
400         >> $TESTOUT 2>&1 << EOF
401 dn: $THEDN
402 changetype: modify
403 add: description
404 description: Stupendous
405
406 EOF
407 RC=$?
408 if test $RC != 0 ; then
409         echo "ldapmodify failed for server 2 database ($RC)!"
410         test $KILLSERVERS != no && kill -HUP $KILLPIDS
411         exit $RC
412 fi
413
414 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
415         >> $TESTOUT 2>&1 << EOF
416 dn: $THEDN
417 changetype: modify
418 delete: description
419 description: Outstanding
420 -
421 add: description
422 description: Mindboggling
423
424 EOF
425 RC=$?
426 if test $RC != 0 ; then
427         echo "ldapmodify failed for server 1 database ($RC)!"
428         test $KILLSERVERS != no && kill -HUP $KILLPIDS
429         exit $RC
430 fi
431
432 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
433         >> $TESTOUT 2>&1 << EOF
434 dn: $THEDN
435 changetype: modify
436 delete: description
437 description: OutStanding
438 -
439 add: description
440 description: Bizarre
441
442 EOF
443 RC=$?
444 if test $RC != 0 ; then
445         echo "ldapmodify failed for server 2 database ($RC)!"
446         test $KILLSERVERS != no && kill -HUP $KILLPIDS
447         exit $RC
448 fi
449
450 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
451         >> $TESTOUT 2>&1 << EOF
452 dn: $THEDN
453 changetype: modify
454 add: carLicense
455 carLicense: 123-XYZ
456 -
457 add: employeeNumber
458 employeeNumber: 32
459
460 EOF
461 RC=$?
462 if test $RC != 0 ; then
463         echo "ldapmodify failed for server 1 database ($RC)!"
464         test $KILLSERVERS != no && kill -HUP $KILLPIDS
465         exit $RC
466 fi
467
468 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
469         >> $TESTOUT 2>&1 << EOF
470 dn: $THEDN
471 changetype: modify
472 add: employeeType
473 employeeType: deadwood
474 -
475 add: employeeNumber
476 employeeNumber: 64
477
478 EOF
479 RC=$?
480 if test $RC != 0 ; then
481         echo "ldapmodify failed for server 2 database ($RC)!"
482         test $KILLSERVERS != no && kill -HUP $KILLPIDS
483         exit $RC
484 fi
485
486 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
487         >> $TESTOUT 2>&1 << EOF
488 dn: $THEDN
489 changetype: modify
490 replace: sn
491 sn: Replaced later
492 -
493 replace: sn
494 sn: Surname
495 EOF
496 RC=$?
497 if test $RC != 0 ; then
498         echo "ldapmodify failed for server 1 database ($RC)!"
499         test $KILLSERVERS != no && kill -HUP $KILLPIDS
500         exit $RC
501 fi
502
503 echo "Restoring replication between server 1 and 2..."
504 n=1
505 while [ $n -le $MMR ]; do
506 o=`expr 3 - $n`
507 MYURI=`eval echo '$URI'$n`
508 PROVIDERURI=`eval echo '$URIP'$o`
509 $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <<EOF
510 dn: olcDatabase={2}$BACKEND,cn=config
511 changetype: modify
512 replace: olcSyncRepl
513 olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
514   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
515   retry="3 +" timeout=3 logbase="cn=log"
516   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
517   syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
518   starttls=critical
519 -
520 replace: olcMirrorMode
521 olcMirrorMode: TRUE
522
523 EOF
524 RC=$?
525 if test $RC != 0 ; then
526         echo "ldapmodify failed for server $n config ($RC)!"
527         test $KILLSERVERS != no && kill -HUP $KILLPIDS
528         exit $RC
529 fi
530 n=`expr $n + 1`
531 done
532
533 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
534 sleep $SLEEP1
535
536 n=1
537 while [ $n -le $MMR ]; do
538 PORT=`expr $BASEPORT + $n`
539 URI="ldap://${LOCALHOST}:$PORT/"
540
541 echo "Using ldapsearch to read all the entries from server $n..."
542 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
543         'objectclass=*' > $TESTDIR/server$n.out 2>&1
544 RC=$?
545
546 if test $RC != 0 ; then
547         echo "ldapsearch failed at server $n ($RC)!"
548         test $KILLSERVERS != no && kill -HUP $KILLPIDS
549         exit $RC
550 fi
551 $LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
552 n=`expr $n + 1`
553 done
554
555 n=2
556 while [ $n -le $MMR ]; do
557 echo "Comparing retrieved entries from server 1 and server $n..."
558 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
559
560 if test $? != 0 ; then
561         echo "test failed - server 1 and server $n databases differ"
562         test $KILLSERVERS != no && kill -HUP $KILLPIDS
563         exit 1
564 fi
565 n=`expr $n + 1`
566 done
567
568 test $KILLSERVERS != no && kill -HUP $KILLPIDS
569
570 echo ">>>>> Test succeeded"
571
572 test $KILLSERVERS != no && wait
573
574 exit 0