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