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 
     17 # test now handles known issues
     18 #if test x"$PROXYSYNC" = x ; then
     19 #	echo "Test disabled; set PROXYSYNC=yes to enable"
     20 #	exit 0
     21 #fi
     22 
     23 echo "running defines.sh"
     24 . $SRCDIR/scripts/defines.sh
     25 
     26 if test $BACKLDAP = ldapno; then 
     27 	echo "LDAP backend not available, test skipped"
     28 	exit 0
     29 fi 
     30 
     31 if test $SYNCPROV = syncprovno; then 
     32 	echo "Syncrepl provider overlay not available, test skipped"
     33 	exit 0
     34 fi 
     35 
     36 mkdir -p $TESTDIR $DBDIR1 $DBDIR2
     37 
     38 #
     39 # Test replication:
     40 # - start provider
     41 # - start consumer
     42 # - populate over ldap
     43 # - perform some modifies and deleted
     44 # - attempt to modify the consumer (referral or chain)
     45 # - retrieve database over ldap and compare against expected results
     46 #
     47 
     48 echo "Starting provider slapd on TCP/IP port $PORT1..."
     49 . $CONFFILTER $BACKEND < $SRPROVIDERCONF > $CONF1
     50 $SLAPD -f $CONF1 -h $URI1 -d $LVL > $LOG1 2>&1 &
     51 PROVIDERPID=$!
     52 if test $WAIT != 0 ; then
     53     echo PROVIDERPID $PROVIDERPID
     54     read foo
     55 fi
     56 KILLPIDS="$PROVIDERPID"
     57 
     58 sleep 1
     59 
     60 echo "Using ldapsearch to check that provider slapd is running..."
     61 for i in 0 1 2 3 4 5; do
     62 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \
     63 		'(objectClass=*)' > /dev/null 2>&1
     64 	RC=$?
     65 	if test $RC = 0 ; then
     66 		break
     67 	fi
     68 	echo "Waiting 5 seconds for slapd to start..."
     69 	sleep 5
     70 done
     71 
     72 if test $RC != 0 ; then
     73 	echo "ldapsearch failed ($RC)!"
     74 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     75 	exit $RC
     76 fi
     77 
     78 echo "Using ldapadd to create the context prefix entry in the provider..."
     79 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD < \
     80 	$LDIFORDEREDCP > /dev/null 2>&1
     81 RC=$?
     82 if test $RC != 0 ; then
     83 	echo "ldapadd failed ($RC)!"
     84 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     85 	exit $RC
     86 fi
     87 
     88 echo "Starting consumer slapd on TCP/IP port $PORT2..."
     89 . $CONFFILTER $BACKEND < $RCONSUMERCONF > $CONF2
     90 $SLAPD -f $CONF2 -h $URI2 -d $LVL > $LOG2 2>&1 &
     91 CONSUMERPID=$!
     92 if test $WAIT != 0 ; then
     93     echo CONSUMERPID $CONSUMERPID
     94     read foo
     95 fi
     96 KILLPIDS="$PROVIDERPID $CONSUMERPID"
     97 
     98 sleep 1
     99 
    100 echo "Using ldapsearch to check that consumer slapd is running..."
    101 for i in 0 1 2 3 4 5; do
    102 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI2 \
    103 		'(objectClass=*)' > /dev/null 2>&1
    104 	RC=$?
    105 	if test $RC = 0 ; then
    106 		break
    107 	fi
    108 	echo "Waiting 5 seconds for slapd to start..."
    109 	sleep 5
    110 done
    111 
    112 if test $RC != 0 ; then
    113 	echo "ldapsearch failed ($RC)!"
    114 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    115 	exit $RC
    116 fi
    117 
    118 echo "Starting proxy slapd on TCP/IP port $PORT3..."
    119 . $CONFFILTER $BACKEND < $PLSRCONSUMERCONF > $CONF3
    120 $SLAPD -f $CONF3 -h $URI3 -d $LVL > $LOG3 2>&1 &
    121 PROXYPID=$!
    122 if test $WAIT != 0 ; then
    123     echo PROXYPID $PROXYPID
    124     read foo
    125 fi
    126 KILLPIDS="$PROVIDERPID $CONSUMERPID $PROXYPID"
    127 
    128 sleep 1
    129 
    130 echo "Using ldapsearch to check that proxy slapd is running..."
    131 for i in 0 1 2 3 4 5; do
    132 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI3 \
    133 		'(objectClass=*)' > /dev/null 2>&1
    134 	RC=$?
    135 	if test $RC = 0 || test $RC = 53 ; then
    136 		break
    137 	fi
    138 	echo "Waiting 5 seconds for slapd to start..."
    139 	sleep 5
    140 done
    141 
    142 case $RC in
    143 0 )
    144 	echo "ldapsearch should have failed ($RC)!"
    145 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    146 	exit 1
    147 	;;
    148 53)
    149 	;;
    150 *)
    151 	echo "ldapsearch failed ($RC)!"
    152 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    153 	exit $RC
    154 	;;
    155 esac
    156 
    157 CHECK=1
    158 echo "$CHECK > Using ldapadd to populate the provider directory..."
    159 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD < \
    160 	$LDIFORDEREDNOCP > /dev/null 2>&1
    161 RC=$?
    162 if test $RC != 0 ; then
    163 	echo "ldapadd failed ($RC)!"
    164 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    165 	exit $RC
    166 fi
    167 
    168 # get provider contextCSN
    169 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    170 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    171 RC=$?
    172 if test $RC != 0 ; then
    173 	echo "ldapsearch failed at provider ($RC)!"
    174 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    175 	exit $RC
    176 fi
    177 
    178 # check consumer contextCSN
    179 sleep 1
    180 for i in 1 2 3; do
    181 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    182 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    183 	RC=$?
    184 
    185 	if test $RC != 0 ; then
    186 		echo "ldapsearch failed at consumer ($RC)!"
    187 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    188 		exit $RC
    189 	fi
    190 
    191 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    192 
    193 	if test $? = 0 ; then
    194 		break
    195 	fi
    196 
    197 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    198 	sleep $SLEEP1
    199 done
    200 
    201 #echo "Using ldapsearch to read all the entries from the provider..."
    202 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    203 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    204 RC=$?
    205 
    206 if test $RC != 0 ; then
    207 	echo "ldapsearch failed at provider ($RC)!"
    208 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    209 	exit $RC
    210 fi
    211 
    212 #echo "Using ldapsearch to read all the entries from the consumer..."
    213 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    214 	'(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    215 RC=$?
    216 
    217 if test $RC != 0 ; then
    218 	echo "ldapsearch failed at consumer ($RC)!"
    219 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    220 	exit $RC
    221 fi
    222 
    223 #echo "Filtering provider results..."
    224 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    225 #echo "Filtering consumer results..."
    226 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    227 
    228 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    229 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    230 
    231 if test $? != 0 ; then
    232 	echo "test failed - provider and consumer databases differ"
    233 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    234 	exit 1
    235 fi
    236 
    237 CHECK=`expr $CHECK + 1`
    238 echo "$CHECK > Stopping the provider, sleeping $SLEEP2 seconds and restarting it..."
    239 kill -HUP "$PROVIDERPID"
    240 wait $PROVIDERPID
    241 sleep $SLEEP2
    242 
    243 echo "======================= RESTART =======================" >> $LOG1
    244 $SLAPD -f $CONF1 -h $URI1 -d $LVL >> $LOG1 2>&1 &
    245 PROVIDERPID=$!
    246 if test $WAIT != 0 ; then
    247     echo PROVIDERPID $PROVIDERPID
    248     read foo
    249 fi
    250 KILLPIDS="$PROVIDERPID $CONSUMERPID $PROXYPID"
    251 
    252 sleep 1
    253 
    254 echo "Using ldapsearch to check that provider slapd is running..."
    255 for i in 0 1 2 3 4 5; do
    256 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \
    257 		'(objectClass=*)' > /dev/null 2>&1
    258 	RC=$?
    259 	if test $RC = 0 ; then
    260 		break
    261 	fi
    262 	echo "Waiting 5 seconds for slapd to start..."
    263 	sleep 5
    264 done
    265 
    266 if test $RC != 0 ; then
    267 	echo "ldapsearch failed ($RC)!"
    268 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    269 	exit $RC
    270 fi
    271 
    272 echo "Using ldapmodify to modify provider directory..."
    273 
    274 #
    275 # Do some modifications
    276 #
    277 
    278 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD > \
    279 	$TESTOUT 2>&1 << EOMODS
    280 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
    281 changetype: modify
    282 add: drink
    283 drink: Orange Juice
    284 -
    285 delete: sn
    286 sn: Jones
    287 -
    288 add: sn
    289 sn: Jones
    290 
    291 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    292 changetype: modify
    293 replace: drink
    294 drink: Iced Tea
    295 
    296 dn: cn=ITD Staff,ou=Groups,dc=example,dc=com
    297 changetype: modify
    298 delete: uniquemember
    299 uniquemember: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
    300 uniquemember: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    301 -
    302 add: uniquemember
    303 uniquemember: cn=Dorothy Stevens, ou=Alumni Association, ou=People, dc=example,dc=com
    304 uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
    305 
    306 dn: cn=Bjorn Jensen,ou=Information Technology Division,ou=People,dc=example,dc
    307  =com
    308 changetype: modify
    309 delete: cn
    310 cn: Biiff Jensen
    311 
    312 dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    313 changetype: add
    314 objectclass: OpenLDAPperson
    315 cn: Gern Jensen
    316 sn: Jensen
    317 uid: gjensen
    318 title: Chief Investigator, ITD
    319 postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103
    320 seealso: cn=All Staff, ou=Groups, dc=example,dc=com
    321 drink: Coffee
    322 homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104
    323 description: Very odd
    324 facsimiletelephonenumber: +1 313 555 7557
    325 telephonenumber: +1 313 555 8343
    326 mail: gjensen@mailgw.example.com
    327 homephone: +1 313 555 8844
    328 
    329 dn: ou=Retired, ou=People, dc=example,dc=com
    330 changetype: add
    331 objectclass: organizationalUnit
    332 ou: Retired
    333 
    334 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
    335 changetype: add
    336 objectclass: OpenLDAPperson
    337 cn: Rosco P. Coltrane
    338 sn: Coltrane
    339 uid: rosco
    340 description: Fat tycoon
    341 
    342 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
    343 changetype: modrdn
    344 newrdn: cn=Rosco P. Coltrane
    345 deleteoldrdn: 1
    346 newsuperior: ou=Retired, ou=People, dc=example,dc=com
    347 
    348 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
    349 changetype: delete
    350 EOMODS
    351 
    352 RC=$?
    353 if test $RC != 0 ; then
    354 	echo "ldapmodify failed ($RC)!"
    355 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    356 	exit $RC
    357 fi
    358 
    359 # get provider contextCSN
    360 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    361 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    362 RC=$?
    363 if test $RC != 0 ; then
    364 	echo "ldapsearch failed at provider ($RC)!"
    365 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    366 	exit $RC
    367 fi
    368 
    369 # check consumer contextCSN
    370 for i in 1 2 3; do
    371 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    372 	sleep $SLEEP1
    373 
    374 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    375 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    376 	RC=$?
    377 
    378 	if test $RC != 0 ; then
    379 		echo "ldapsearch failed at consumer ($RC)!"
    380 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    381 		exit $RC
    382 	fi
    383 
    384 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    385 
    386 	if test $? = 0 ; then
    387 		break
    388 	fi
    389 done
    390 
    391 #echo "Using ldapsearch to read all the entries from the provider..."
    392 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    393 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    394 RC=$?
    395 
    396 if test $RC != 0 ; then
    397 	echo "ldapsearch failed at provider ($RC)!"
    398 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    399 	exit $RC
    400 fi
    401 
    402 #echo "Using ldapsearch to read all the entries from the consumer..."
    403 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    404 	'(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    405 RC=$?
    406 
    407 if test $RC != 0 ; then
    408 	echo "ldapsearch failed at consumer ($RC)!"
    409 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    410 	exit $RC
    411 fi
    412 
    413 #echo "Filtering provider results..."
    414 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    415 #echo "Filtering consumer results..."
    416 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    417 
    418 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    419 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    420 
    421 if test $? != 0 ; then
    422 	echo "test failed - provider and consumer databases differ"
    423 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    424 	exit 1
    425 fi
    426 
    427 CHECK=`expr $CHECK + 1`
    428 echo "$CHECK > Stopping proxy to test recovery..."
    429 kill -HUP $PROXYPID
    430 wait $PROXYPID
    431 
    432 echo "Modifying more entries on the provider..."
    433 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD >> \
    434 	$TESTOUT 2>&1 << EOMODS
    435 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    436 changetype: modify
    437 add: description
    438 description: proxy is down...
    439 
    440 dn: cn=James T. Kirk, ou=Retired, ou=People, dc=example,dc=com
    441 changetype: add
    442 objectclass: OpenLDAPperson
    443 sn: Kirk
    444 uid: jtk
    445 cn: James T. Kirk
    446 
    447 dn: cn=Tiberius J. Hooker, ou=Retired, ou=People, dc=example,dc=com
    448 changetype: add
    449 objectclass: OpenLDAPperson
    450 sn: Hooker
    451 uid: tjh
    452 cn: Tiberius J. Hooker
    453 
    454 EOMODS
    455 
    456 echo "Restarting proxy..."
    457 echo "======================= RESTART =======================" >> $LOG3
    458 $SLAPD -f $CONF3 -h $URI3 -d $LVL >> $LOG3 2>&1 &
    459 PROXYPID=$!
    460 if test $WAIT != 0 ; then
    461     echo PROXYPID $PROXYPID
    462     read foo
    463 fi
    464 KILLPIDS="$PROVIDERPID $CONSUMERPID $PROXYPID"
    465 
    466 # get provider contextCSN
    467 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    468 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    469 RC=$?
    470 if test $RC != 0 ; then
    471 	echo "ldapsearch failed at provider ($RC)!"
    472 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    473 	exit $RC
    474 fi
    475 
    476 # check consumer contextCSN
    477 for i in 1 2 3 4 5; do
    478 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    479 	sleep $SLEEP1
    480 
    481 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    482 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    483 	RC=$?
    484 
    485 	if test $RC != 0 ; then
    486 		echo "ldapsearch failed at consumer ($RC)!"
    487 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    488 		exit $RC
    489 	fi
    490 
    491 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    492 
    493 	if test $? = 0 ; then
    494 		break
    495 	fi
    496 done
    497 
    498 #echo "Using ldapsearch to read all the entries from the provider..."
    499 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    500 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    501 RC=$?
    502 
    503 if test $RC != 0 ; then
    504 	echo "ldapsearch failed at provider ($RC)!"
    505 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    506 	exit $RC
    507 fi
    508 
    509 #echo "Using ldapsearch to read all the entries from the consumer..."
    510 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    511 	'(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    512 RC=$?
    513 
    514 if test $RC != 0 ; then
    515 	echo "ldapsearch failed at consumer ($RC)!"
    516 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    517 	exit $RC
    518 fi
    519 
    520 #echo "Filtering provider results..."
    521 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    522 #echo "Filtering consumer results..."
    523 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    524 
    525 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    526 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    527 
    528 if test $? != 0 ; then
    529 	echo "test failed - provider and consumer databases differ"
    530 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    531 	exit 1
    532 fi
    533 
    534 CHECK=`expr $CHECK + 1`
    535 echo "$CHECK > Try updating the consumer slapd..."
    536 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI2 -w $PASSWD > \
    537 	$TESTOUT 2>&1 << EOMODS
    538 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com
    539 changetype: modify
    540 add: description
    541 description: This write must fail because directed to a shadow context,
    542 description: unless the chain overlay is configured appropriately ;)
    543 
    544 EOMODS
    545 
    546 RC=$?
    547 if test $RC != 0 ; then
    548 	echo "ldapmodify failed ($RC)!"
    549 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    550 	exit $RC
    551 fi
    552 
    553 # get provider contextCSN
    554 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    555 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    556 RC=$?
    557 if test $RC != 0 ; then
    558 	echo "ldapsearch failed at provider ($RC)!"
    559 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    560 	exit $RC
    561 fi
    562 
    563 # check consumer contextCSN
    564 sleep 1
    565 
    566 for i in 1 2 3; do
    567 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    568 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    569 	RC=$?
    570 
    571 	if test $RC != 0 ; then
    572 		echo "ldapsearch failed at consumer ($RC)!"
    573 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    574 		exit $RC
    575 	fi
    576 
    577 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    578 
    579 	if test $? = 0 ; then
    580 		break
    581 	fi
    582 
    583 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    584 	sleep $SLEEP1
    585 done
    586 
    587 #echo "Using ldapsearch to read all the entries from the provider..."
    588 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    589 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    590 RC=$?
    591 
    592 if test $RC != 0 ; then
    593 	echo "ldapsearch failed at provider ($RC)!"
    594 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    595 	exit $RC
    596 fi
    597 
    598 #echo "Using ldapsearch to read all the entries from the consumer..."
    599 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    600 '(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    601 RC=$?
    602 
    603 if test $RC != 0 ; then
    604 	echo "ldapsearch failed at consumer ($RC)!"
    605 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    606 	exit $RC
    607 fi
    608 
    609 #echo "Filtering provider results..."
    610 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    611 #echo "Filtering consumer results..."
    612 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    613 
    614 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    615 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    616 
    617 if test $? != 0 ; then
    618 	echo "test failed - provider and consumer databases differ"
    619 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    620 	exit 1
    621 fi
    622 
    623 CHECK=`expr $CHECK + 1`
    624 echo "$CHECK > Stopping consumer to test recovery..."
    625 kill -HUP $CONSUMERPID
    626 wait $CONSUMERPID
    627 
    628 echo "Modifying more entries on the provider..."
    629 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD >> \
    630 	$TESTOUT 2>&1 << EOMODS
    631 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    632 changetype: modify
    633 add: drink
    634 drink: Mad Dog 20/20
    635 
    636 EOMODS
    637 
    638 echo "Waiting $SLEEP2 seconds for syncrepl to retry..."
    639 sleep $SLEEP2
    640 
    641 echo "Restarting consumer..."
    642 echo "======================= RESTART =======================" >> $LOG2
    643 $SLAPD -f $CONF2 -h $URI2 -d $LVL >> $LOG2 2>&1 &
    644 CONSUMERPID=$!
    645 if test $WAIT != 0 ; then
    646     echo CONSUMERPID $CONSUMERPID
    647     read foo
    648 fi
    649 KILLPIDS="$PROVIDERPID $CONSUMERPID $PROXYPID"
    650 
    651 # get provider contextCSN
    652 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    653 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    654 RC=$?
    655 if test $RC != 0 ; then
    656 	echo "ldapsearch failed at provider ($RC)!"
    657 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    658 	exit $RC
    659 fi
    660 
    661 # check consumer contextCSN
    662 
    663 for i in 1 2 3 4 5; do
    664 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    665 	sleep $SLEEP1
    666 
    667 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    668 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    669 	RC=$?
    670 
    671 	if test $RC != 0 ; then
    672 		echo "ldapsearch failed at consumer ($RC)!"
    673 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    674 		exit $RC
    675 	fi
    676 
    677 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    678 
    679 	if test $? = 0 ; then
    680 		break
    681 	fi
    682 done
    683 
    684 #echo "Using ldapsearch to read all the entries from the provider..."
    685 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    686 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    687 RC=$?
    688 
    689 if test $RC != 0 ; then
    690 	echo "ldapsearch failed at provider ($RC)!"
    691 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    692 	exit $RC
    693 fi
    694 
    695 #echo "Using ldapsearch to read all the entries from the consumer..."
    696 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    697 	'(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    698 RC=$?
    699 
    700 if test $RC != 0 ; then
    701 	echo "ldapsearch failed at consumer ($RC)!"
    702 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    703 	exit $RC
    704 fi
    705 
    706 #echo "Filtering provider results..."
    707 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    708 #echo "Filtering consumer results..."
    709 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    710 
    711 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    712 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    713 
    714 if test $? != 0 ; then
    715 	# FIXME: keep the original workaround in place, in case we needed again
    716 	if test 1 = 1 ; then
    717 		echo "test failed - provider and consumer databases differ"
    718 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    719 		exit 1
    720 	fi
    721 
    722 	echo "	test failed - provider and consumer databases differ (ignored by now)"
    723 	echo "	Stopping proxy to see if it auto-recovers..."
    724 	kill -HUP $PROXYPID
    725 	wait $PROXYPID
    726 
    727 	echo "	${CHECK}.1 > Restarting proxy..."
    728 	echo "======================= RESTART =======================" >> $LOG3
    729 	$SLAPD -f $CONF3 -h $URI3 -d $LVL >> $LOG3 2>&1 &
    730 	PROXYPID=$!
    731 	if test $WAIT != 0 ; then
    732 		echo PROXYPID $PROXYPID
    733 		read foo
    734 	fi
    735 	KILLPIDS="$PROVIDERPID $CONSUMERPID $PROXYPID"
    736 
    737 	echo "	Waiting $SLEEP2 seconds for syncrepl to receive changes..."
    738 	sleep $SLEEP2
    739 
    740 	#echo "Using ldapsearch to read all the entries from the consumer..."
    741 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    742 		'(objectClass=*)' > "${CONSUMEROUT}.5.1" 2>&1
    743 	RC=$?
    744 
    745 	if test $RC != 0 ; then
    746 		echo "	ldapsearch failed at consumer ($RC)!"
    747 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    748 		exit $RC
    749 	fi
    750 
    751 	#echo "Filtering consumer results..."
    752 	$LDIFFILTER < "${CONSUMEROUT}.5.1" > $CONSUMERFLT
    753 
    754 	echo "	${CHECK}.1 < Comparing retrieved entries from provider and consumer..."
    755 	$CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    756 
    757 	if test $? != 0 ; then
    758 		echo "	test failed - provider and consumer databases differ"
    759 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    760 		exit 1
    761 	fi
    762 fi
    763 
    764 #
    765 # Modifications formerly known to fail
    766 #
    767 CHECK=`expr $CHECK + 1`
    768 echo "$CHECK > Performing modifications that were formerly known to fail..."
    769 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD > \
    770 	$TESTOUT 2>&1 << EOMODS
    771 # First, back out previous change
    772 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    773 changetype: modify
    774 delete: drink
    775 drink: Mad Dog 20/20
    776 
    777 # From now on, perform modifications that were formerly known to fail
    778 dn: cn=All Staff,ou=Groups,dc=example,dc=com
    779 changetype: modify
    780 delete: description
    781 
    782 EOMODS
    783 
    784 RC=$?
    785 if test $RC != 0 ; then
    786 	echo "ldapmodify failed ($RC)!"
    787 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    788 	exit $RC
    789 fi
    790 
    791 # get provider contextCSN
    792 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    793 	-s base '(objectClass=*)' contextCSN > "${PROVIDEROUT}.$CHECK" 2>&1
    794 RC=$?
    795 if test $RC != 0 ; then
    796 	echo "ldapsearch failed at provider ($RC)!"
    797 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    798 	exit $RC
    799 fi
    800 
    801 # check consumer contextCSN
    802 sleep 1
    803 for i in 1 2 3; do
    804 	$LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    805 		-s base '(objectClass=*)' contextCSN > "${CONSUMEROUT}.$CHECK" 2>&1
    806 	RC=$?
    807 
    808 	if test $RC != 0 ; then
    809 		echo "ldapsearch failed at consumer ($RC)!"
    810 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    811 		exit $RC
    812 	fi
    813 
    814 	$CMP ${PROVIDEROUT}.$CHECK ${CONSUMEROUT}.$CHECK > $CMPOUT
    815 
    816 	if test $? = 0 ; then
    817 		break
    818 	fi
    819 
    820 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    821 	sleep $SLEEP1
    822 done
    823 
    824 #echo "Using ldapsearch to read all the entries from the provider..."
    825 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    826 	'(objectClass=*)' > "${PROVIDEROUT}.$CHECK" 2>&1
    827 RC=$?
    828 
    829 if test $RC != 0 ; then
    830 	echo "ldapsearch failed at provider ($RC)!"
    831 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    832 	exit $RC
    833 fi
    834 
    835 #echo "Using ldapsearch to read all the entries from the consumer..."
    836 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 \
    837 	'(objectClass=*)' > "${CONSUMEROUT}.$CHECK" 2>&1
    838 RC=$?
    839 
    840 if test $RC != 0 ; then
    841 	echo "ldapsearch failed at consumer ($RC)!"
    842 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    843 	exit $RC
    844 fi
    845 
    846 #echo "Filtering provider results..."
    847 $LDIFFILTER < "${PROVIDEROUT}.$CHECK" > $PROVIDERFLT
    848 #echo "Filtering consumer results..."
    849 $LDIFFILTER < "${CONSUMEROUT}.$CHECK" > $CONSUMERFLT
    850 
    851 echo "$CHECK < Comparing retrieved entries from provider and consumer..."
    852 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    853 
    854 if test $? != 0 ; then
    855 	echo "test failed - provider and consumer databases differ (ignored by now)"
    856 	#echo "test failed - provider and consumer databases differ"
    857 	#test $KILLSERVERS != no && kill -HUP $KILLPIDS
    858 	#exit 1
    859 fi
    860 
    861 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    862 
    863 echo ">>>>> Test succeeded"
    864 
    865 test $KILLSERVERS != no && wait
    866 
    867 exit 0
    868