]> git.sur5r.net Git - openldap/blob - tests/scripts/test070-delta-multimaster-ldaps
ITS#8842 Do some printability checks on the dc RDN
[openldap] / tests / scripts / test070-delta-multimaster-ldaps
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 '$SURIP'$n`
123 PROVIDERURI=`eval echo '$SURIP'$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 olcMirrorMode: TRUE
181 $INDEX2
182
183 dn: olcOverlay=syncprov,olcDatabase={2}$BACKEND,cn=config
184 objectClass: olcOverlayConfig
185 objectClass: olcSyncProvConfig
186 olcOverlay: syncprov
187
188 dn: olcOverlay=accesslog,olcDatabase={2}$BACKEND,cn=config
189 objectClass: olcOverlayConfig
190 objectClass: olcAccessLogConfig
191 olcOverlay: accesslog
192 olcAccessLogDB: cn=log
193 olcAccessLogOps: writes
194 olcAccessLogSuccess: TRUE
195
196 EOF
197 $SLAPADD -F $CFDIR -n 0  -d-1< $TMP > $TESTOUT 2>&1
198 PORT=`eval echo '$PORT'$n`
199 echo "Starting server $n on TCP/IP port $PORT..."
200 cd ${XDIR}${n}
201 LOG=`eval echo '$LOG'$n`
202 $SLAPD -F slapd.d -h $MYURI -d $LVL $TIMING > $LOG 2>&1 &
203 PID=$!
204 if test $WAIT != 0 ; then
205     echo PID $PID
206     read foo
207 fi
208 KILLPIDS="$PID $KILLPIDS"
209 cd $TESTWD
210
211 echo "Using ldapsearch to check that server $n is running..."
212 for i in 0 1 2 3 4 5; do
213         $LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -s base -b "" -H $MYURI \
214                 'objectclass=*' > /dev/null 2>&1
215         RC=$?
216         if test $RC = 0 ; then
217                 break
218         fi
219         echo "Waiting 5 seconds for slapd to start..."
220         sleep 5
221 done
222
223 if test $RC != 0 ; then
224         echo "ldapsearch failed ($RC)!"
225         test $KILLSERVERS != no && kill -HUP $KILLPIDS
226         exit $RC
227 fi
228
229 if [ $n = 1 ]; then
230 echo "Using ldapadd for context on server 1..."
231 $LDAPADD -D "$MANAGERDN" -H $SURIP1 -w $PASSWD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -f $LDIFORDEREDCP \
232         >> $TESTOUT 2>&1
233 RC=$?
234 if test $RC != 0 ; then
235         echo "ldapadd failed for server $n database ($RC)!"
236         test $KILLSERVERS != no && kill -HUP $KILLPIDS
237         exit $RC
238 fi
239 fi
240
241 n=`expr $n + 1`
242 done
243
244 echo "Using ldapadd to populate server 1..."
245 $LDAPADD -D "$MANAGERDN" -H $SURIP1 -w $PASSWD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -f $LDIFORDEREDNOCP \
246         >> $TESTOUT 2>&1
247 RC=$?
248 if test $RC != 0 ; then
249         echo "ldapadd failed for server $n database ($RC)!"
250         test $KILLSERVERS != no && kill -HUP $KILLPIDS
251         exit $RC
252 fi
253
254 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
255 sleep $SLEEP1
256
257 n=1
258 while [ $n -le $MMR ]; do
259 PORT=`expr $BASEPORT + $n`
260 URI="ldaps://${LOCALIP}:$PORT/"
261
262 echo "Using ldapsearch to read all the entries from server $n..."
263 $LDAPSEARCH -S "" -b "$BASEDN" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $URI -w $PASSWD  \
264         'objectclass=*' > $TESTDIR/server$n.out 2>&1
265 RC=$?
266
267 if test $RC != 0 ; then
268         echo "ldapsearch failed at server $n ($RC)!"
269         test $KILLSERVERS != no && kill -HUP $KILLPIDS
270         exit $RC
271 fi
272 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
273 n=`expr $n + 1`
274 done
275
276 n=2
277 while [ $n -le $MMR ]; do
278 echo "Comparing retrieved entries from server 1 and server $n..."
279 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
280
281 if test $? != 0 ; then
282         echo "test failed - server 1 and server $n databases differ"
283         test $KILLSERVERS != no && kill -HUP $KILLPIDS
284         exit 1
285 fi
286 n=`expr $n + 1`
287 done
288
289 echo "Using ldapadd to populate server 2..."
290 $LDAPADD -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD -f $LDIFADD1 \
291         >> $TESTOUT 2>&1
292 RC=$?
293 if test $RC != 0 ; then
294         echo "ldapadd failed for server 2 database ($RC)!"
295         test $KILLSERVERS != no && kill -HUP $KILLPIDS
296         exit $RC
297 fi
298
299 THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com"
300 sleep 1
301 for i in 1 2 3; do
302         $LDAPSEARCH -S "" -b "$THEDN" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -H $SURIP1 \
303                 -s base '(objectClass=*)' entryCSN > "${MASTEROUT}.$i" 2>&1
304         RC=$?
305
306         if test $RC = 0 ; then
307                 break
308         fi
309
310         if test $RC != 32 ; then
311                 echo "ldapsearch failed at slave ($RC)!"
312                 test $KILLSERVERS != no && kill -HUP $KILLPIDS
313                 exit $RC
314         fi
315
316         echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
317         sleep $SLEEP1
318 done
319
320 n=1
321 while [ $n -le $MMR ]; do
322 PORT=`expr $BASEPORT + $n`
323 URI="ldaps://${LOCALIP}:$PORT/"
324
325 echo "Using ldapsearch to read all the entries from server $n..."
326 $LDAPSEARCH -S "" -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
327         'objectclass=*' > $TESTDIR/server$n.out 2>&1
328 RC=$?
329
330 if test $RC != 0 ; then
331         echo "ldapsearch failed at server $n ($RC)!"
332         test $KILLSERVERS != no && kill -HUP $KILLPIDS
333         exit $RC
334 fi
335 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
336 n=`expr $n + 1`
337 done
338
339 n=2
340 while [ $n -le $MMR ]; do
341 echo "Comparing retrieved entries from server 1 and server $n..."
342 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
343
344 if test $? != 0 ; then
345         echo "test failed - server 1 and server $n databases differ"
346         test $KILLSERVERS != no && kill -HUP $KILLPIDS
347         exit 1
348 fi
349 n=`expr $n + 1`
350 done
351
352 echo "Breaking replication between server 1 and 2..."
353 n=1
354 while [ $n -le $MMR ]; do
355 o=`expr 3 - $n`
356 MYURI=`eval echo '$SURIP'$n`
357 PROVIDERURI=`eval echo '$SURIP'$o`
358 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <<EOF
359 dn: olcDatabase={2}$BACKEND,cn=config
360 changetype: modify
361 replace: olcSyncRepl
362 olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
363   credentials=InvalidPw searchbase="$BASEDN" $SYNCTYPE
364   retry="3 +" timeout=3 logbase="cn=log"
365   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
366   syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
367 -
368 replace: olcMirrorMode
369 olcMirrorMode: TRUE
370
371 EOF
372 RC=$?
373 if test $RC != 0 ; then
374         echo "ldapmodify failed for server $n config ($RC)!"
375         test $KILLSERVERS != no && kill -HUP $KILLPIDS
376         exit $RC
377 fi
378 n=`expr $n + 1`
379 done
380
381 echo "Using ldapmodify to force conflicts between server 1 and 2..."
382 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
383         >> $TESTOUT 2>&1 << EOF
384 dn: $THEDN
385 changetype: modify
386 add: description
387 description: Amazing
388
389 EOF
390 RC=$?
391 if test $RC != 0 ; then
392         echo "ldapmodify failed for server 1 database ($RC)!"
393         test $KILLSERVERS != no && kill -HUP $KILLPIDS
394         exit $RC
395 fi
396
397 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
398         >> $TESTOUT 2>&1 << EOF
399 dn: $THEDN
400 changetype: modify
401 add: description
402 description: Stupendous
403
404 EOF
405 RC=$?
406 if test $RC != 0 ; then
407         echo "ldapmodify failed for server 2 database ($RC)!"
408         test $KILLSERVERS != no && kill -HUP $KILLPIDS
409         exit $RC
410 fi
411
412 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
413         >> $TESTOUT 2>&1 << EOF
414 dn: $THEDN
415 changetype: modify
416 delete: description
417 description: Outstanding
418 -
419 add: description
420 description: Mindboggling
421
422 EOF
423 RC=$?
424 if test $RC != 0 ; then
425         echo "ldapmodify failed for server 1 database ($RC)!"
426         test $KILLSERVERS != no && kill -HUP $KILLPIDS
427         exit $RC
428 fi
429
430 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
431         >> $TESTOUT 2>&1 << EOF
432 dn: $THEDN
433 changetype: modify
434 delete: description
435 description: OutStanding
436 -
437 add: description
438 description: Bizarre
439
440 EOF
441 RC=$?
442 if test $RC != 0 ; then
443         echo "ldapmodify failed for server 2 database ($RC)!"
444         test $KILLSERVERS != no && kill -HUP $KILLPIDS
445         exit $RC
446 fi
447
448 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
449         >> $TESTOUT 2>&1 << EOF
450 dn: $THEDN
451 changetype: modify
452 add: carLicense
453 carLicense: 123-XYZ
454 -
455 add: employeeNumber
456 employeeNumber: 32
457
458 EOF
459 RC=$?
460 if test $RC != 0 ; then
461         echo "ldapmodify failed for server 1 database ($RC)!"
462         test $KILLSERVERS != no && kill -HUP $KILLPIDS
463         exit $RC
464 fi
465
466 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP2 -w $PASSWD \
467         >> $TESTOUT 2>&1 << EOF
468 dn: $THEDN
469 changetype: modify
470 add: employeeType
471 employeeType: deadwood
472 -
473 add: employeeNumber
474 employeeNumber: 64
475
476 EOF
477 RC=$?
478 if test $RC != 0 ; then
479         echo "ldapmodify failed for server 2 database ($RC)!"
480         test $KILLSERVERS != no && kill -HUP $KILLPIDS
481         exit $RC
482 fi
483
484 $LDAPMODIFY -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -D "$MANAGERDN" -H $SURIP1 -w $PASSWD \
485         >> $TESTOUT 2>&1 << EOF
486 dn: $THEDN
487 changetype: modify
488 replace: sn
489 sn: Replaced later
490 -
491 replace: sn
492 sn: Surname
493 EOF
494 RC=$?
495 if test $RC != 0 ; then
496         echo "ldapmodify failed for server 1 database ($RC)!"
497         test $KILLSERVERS != no && kill -HUP $KILLPIDS
498         exit $RC
499 fi
500
501 echo "Restoring replication between server 1 and 2..."
502 n=1
503 while [ $n -le $MMR ]; do
504 o=`expr 3 - $n`
505 MYURI=`eval echo '$SURIP'$n`
506 PROVIDERURI=`eval echo '$SURIP'$o`
507 $LDAPMODIFY -D cn=config -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <<EOF
508 dn: olcDatabase={2}$BACKEND,cn=config
509 changetype: modify
510 replace: olcSyncRepl
511 olcSyncRepl: rid=001 provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
512   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
513   retry="3 +" timeout=3 logbase="cn=log"
514   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
515   syncdata=accesslog tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt
516 -
517 replace: olcMirrorMode
518 olcMirrorMode: TRUE
519
520 EOF
521 RC=$?
522 if test $RC != 0 ; then
523         echo "ldapmodify failed for server $n config ($RC)!"
524         test $KILLSERVERS != no && kill -HUP $KILLPIDS
525         exit $RC
526 fi
527 n=`expr $n + 1`
528 done
529
530 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
531 sleep $SLEEP1
532
533 n=1
534 while [ $n -le $MMR ]; do
535 PORT=`expr $BASEPORT + $n`
536 URI="ldaps://${LOCALIP}:$PORT/"
537
538 echo "Using ldapsearch to read all the entries from server $n..."
539 $LDAPSEARCH -o tls_cacert=$TESTDIR/tls/ca/certs/testsuiteCA.crt -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
540         'objectclass=*' > $TESTDIR/server$n.out 2>&1
541 RC=$?
542
543 if test $RC != 0 ; then
544         echo "ldapsearch failed at server $n ($RC)!"
545         test $KILLSERVERS != no && kill -HUP $KILLPIDS
546         exit $RC
547 fi
548 $LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
549 n=`expr $n + 1`
550 done
551
552 n=2
553 while [ $n -le $MMR ]; do
554 echo "Comparing retrieved entries from server 1 and server $n..."
555 $CMP $MASTERFLT $TESTDIR/server$n.flt > $CMPOUT
556
557 if test $? != 0 ; then
558         echo "test failed - server 1 and server $n databases differ"
559         test $KILLSERVERS != no && kill -HUP $KILLPIDS
560         exit 1
561 fi
562 n=`expr $n + 1`
563 done
564
565 test $KILLSERVERS != no && kill -HUP $KILLPIDS
566
567 echo ">>>>> Test succeeded"
568
569 test $KILLSERVERS != no && wait
570
571 exit 0