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