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 CFPRO=$TESTDIR/cfpro.d 29 CFCON=$TESTDIR/cfcon.d 30 31 mkdir -p $TESTDIR $DBDIR1A $DBDIR1B $DBDIR1C $DBDIR1D $DBDIR2A $CFPRO $CFCON 32 33 $SLAPPASSWD -g -n >$CONFIGPWF 34 35 if test x"$SYNCMODE" = x ; then 36 SYNCMODE=rp 37 fi 38 case "$SYNCMODE" in 39 ro) 40 SYNCTYPE="type=refreshOnly interval=00:00:00:03" 41 ;; 42 rp) 43 SYNCTYPE="type=refreshAndPersist" 44 ;; 45 *) 46 echo "unknown sync mode $SYNCMODE" 47 exit 1; 48 ;; 49 esac 50 51 # 52 # Test replication of dynamic config with alternate consumer config: 53 # - start provider 54 # - start consumer 55 # - configure over ldap 56 # - populate over ldap 57 # - configure syncrepl over ldap 58 # - retrieve database over ldap and compare against expected results 59 # 60 61 echo "Starting provider slapd on TCP/IP port $PORT1..." 62 . $CONFFILTER $BACKEND < $DYNAMICCONF > $CONFLDIF 63 $SLAPADD -F $CFPRO -n 0 -l $CONFLDIF 64 RC=$? 65 if test $RC != 0 ; then 66 echo "slapadd failed ($RC)!" 67 exit $RC 68 fi 69 70 $SLAPD -F $CFPRO -h $URI1 -d $LVL > $LOG1 2>&1 & 71 PID=$! 72 if test $WAIT != 0 ; then 73 echo PID $PID 74 read foo 75 fi 76 KILLPIDS="$PID" 77 78 sleep 1 79 80 echo "Using ldapsearch to check that provider slapd is running..." 81 for i in 0 1 2 3 4 5; do 82 $LDAPSEARCH -s base -b "" -H $URI1 \ 83 'objectclass=*' > /dev/null 2>&1 84 RC=$? 85 if test $RC = 0 ; then 86 break 87 fi 88 echo "Waiting 5 seconds for slapd to start..." 89 sleep 5 90 done 91 92 if test $RC != 0 ; then 93 echo "ldapsearch failed ($RC)!" 94 test $KILLSERVERS != no && kill -HUP $KILLPIDS 95 exit $RC 96 fi 97 98 echo "Inserting syncprov and accesslog overlays on provider..." 99 if [ "$SYNCPROV" = syncprovmod -a "$ACCESSLOG" = accesslogmod ]; then 100 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 101 dn: cn=module,cn=config 102 objectClass: olcModuleList 103 cn: module 104 olcModulePath: ../servers/slapd/overlays 105 olcModuleLoad: syncprov.la 106 olcModuleLoad: accesslog.la 107 EOF 108 RC=$? 109 if test $RC != 0 ; then 110 echo "ldapadd failed for moduleLoad of syncprov and accesslog ($RC)!" 111 test $KILLSERVERS != no && kill -HUP $KILLPIDS 112 exit $RC 113 fi 114 elif [ "$SYNCPROV" = syncprovmod ]; then 115 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 116 dn: cn=module,cn=config 117 objectClass: olcModuleList 118 cn: module 119 olcModulePath: ../servers/slapd/overlays 120 olcModuleLoad: syncprov.la 121 EOF 122 RC=$? 123 if test $RC != 0 ; then 124 echo "ldapadd failed for moduleLoad of syncprov ($RC)!" 125 test $KILLSERVERS != no && kill -HUP $KILLPIDS 126 exit $RC 127 fi 128 elif [ "$ACCESSLOG" = accesslogmod ]; then 129 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 130 dn: cn=module,cn=config 131 objectClass: olcModuleList 132 cn: module 133 olcModulePath: ../servers/slapd/overlays 134 olcModuleLoad: accesslog.la 135 EOF 136 RC=$? 137 if test $RC != 0 ; then 138 echo "ldapadd failed for moduleLoad of accesslog ($RC)!" 139 test $KILLSERVERS != no && kill -HUP $KILLPIDS 140 exit $RC 141 fi 142 fi 143 144 echo "Adding backend accesslog databases using $BACKEND..." 145 if [ "$BACKENDTYPE" = mod ]; then 146 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 147 dn: cn=module,cn=config 148 objectClass: olcModuleList 149 cn: module 150 olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND 151 olcModuleLoad: back_$BACKEND.la 152 EOF 153 RC=$? 154 if test $RC != 0 ; then 155 echo "ldapadd failed for moduleLoad of $BACKEND ($RC)!" 156 test $KILLSERVERS != no && kill -HUP $KILLPIDS 157 exit $RC 158 fi 159 fi 160 161 read CONFIGPW < $CONFIGPWF 162 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 163 dn: olcDatabase={1}$BACKEND,cn=config 164 objectClass: olcDatabaseConfig 165 objectClass: olc${BACKEND}Config 166 olcDatabase: {1}$BACKEND 167 olcSuffix: cn=accesslog 168 ${nullExclude}olcDbDirectory: $DBDIR1C 169 olcRootDN: cn=config 170 olcSizeLimit: unlimited 171 olcTimeLimit: unlimited 172 olcDbIndex: default eq 173 olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart,reqDN 174 175 dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config 176 changetype: add 177 objectClass: olcOverlayConfig 178 objectClass: olcSyncProvConfig 179 olcOverlay: syncprov 180 olcSpNoPresent: TRUE 181 olcSpReloadHint: TRUE 182 183 dn: olcDatabase={2}$BACKEND,cn=config 184 objectClass: olcDatabaseConfig 185 objectClass: olc${BACKEND}Config 186 olcDatabase: {2}$BACKEND 187 olcSuffix: cn=consumer-accesslog 188 ${nullExclude}olcDbDirectory: $DBDIR1D 189 olcRootDN: cn=consumer,cn=config 190 olcSizeLimit: unlimited 191 olcTimeLimit: unlimited 192 olcDbIndex: default eq 193 olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart,reqDN 194 195 dn: olcOverlay=syncprov,olcDatabase={2}${BACKEND},cn=config 196 changetype: add 197 objectClass: olcOverlayConfig 198 objectClass: olcSyncProvConfig 199 olcOverlay: syncprov 200 olcSpNoPresent: TRUE 201 olcSpReloadHint: TRUE 202 EOF 203 204 RC=$? 205 if test $RC != 0 ; then 206 echo "ldapadd failed for accesslog databases using $BACKEND ($RC)!" 207 test $KILLSERVERS != no && kill -HUP $KILLPIDS 208 exit $RC 209 fi 210 211 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 212 dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config 213 changetype: add 214 objectClass: olcOverlayConfig 215 objectClass: olcSyncProvConfig 216 olcOverlay: syncprov 217 218 dn: olcOverlay=accesslog,olcDatabase={0}config,cn=config 219 changetype: add 220 objectClass: olcOverlayConfig 221 objectClass: olcAccessLogConfig 222 olcOverlay: accesslog 223 olcAccessLogDB: cn=accesslog 224 olcAccessLogOps: writes 225 olcAccessLogPurge: 07+00:00 01+00:00 226 olcAccessLogSuccess: TRUE 227 EOF 228 229 RC=$? 230 if test $RC != 0 ; then 231 echo "ldapmodify failed for syncprov and accesslog overlay config ($RC)!" 232 test $KILLSERVERS != no && kill -HUP $KILLPIDS 233 exit $RC 234 fi 235 236 # Consumers will not replicate the provider's actual cn=config. 237 # Instead, they will use an alternate DB so that they may be 238 # configured differently from the provider. This alternate DB 239 # will also be a consumer for the real cn=schema,cn=config tree. 240 # It has multi-provider enabled so that it can be written directly 241 # while being a consumer of the main schema. 242 echo "Configuring accesslog config DB on provider..." 243 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 244 dn: cn=config 245 changetype: modify 246 add: olcServerID 247 olcServerID: 1 248 249 dn: olcDatabase={1}ldif,cn=config 250 changetype: add 251 objectClass: olcDatabaseConfig 252 objectClass: olcLdifConfig 253 olcDatabase: {1}ldif 254 olcDbDirectory: $DBDIR1A 255 olcSuffix: cn=config,cn=consumer 256 olcRootDN: cn=config,cn=consumer 257 olcRootPW: repsecret 258 olcAccess: to * by dn.base="cn=config" write 259 260 dn: olcOverlay=syncprov,olcDatabase={1}ldif,cn=config 261 changetype: add 262 objectClass: olcOverlayConfig 263 objectClass: olcSyncProvConfig 264 olcOverlay: syncprov 265 266 dn: olcOverlay=accesslog,olcDatabase={1}ldif,cn=config 267 changetype: add 268 objectClass: olcOverlayConfig 269 objectClass: olcAccessLogConfig 270 olcOverlay: accesslog 271 olcAccessLogDB: cn=consumer-accesslog 272 olcAccessLogOps: writes 273 olcAccessLogPurge: 07+00:00 01+00:00 274 olcAccessLogSuccess: TRUE 275 EOF 276 277 RC=$? 278 if test $RC != 0 ; then 279 echo "ldapmodify failed for consumer DB config ($RC)!" 280 test $KILLSERVERS != no && kill -HUP $KILLPIDS 281 exit $RC 282 fi 283 284 echo "Waiting 3 seconds for syncrepl to make root accesslog entry..." 285 sleep 3 286 287 echo "Configuring consumer config DB on provider..." 288 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 289 dn: cn=config,cn=consumer 290 changetype: add 291 objectClass: olcGlobal 292 cn: consumerconfig 293 294 dn: olcDatabase={0}config,cn=config,cn=consumer 295 changetype: add 296 objectClass: olcDatabaseConfig 297 olcDatabase: {0}config 298 olcRootPW: topsecret 299 olcSyncrepl: {0}rid=001 provider=$URI1 binddn="cn=config,cn=consumer" 300 bindmethod=simple credentials=repsecret searchbase="cn=config,cn=consumer" 301 $SYNCTYPE retry="3 5 300 5" timeout=3 suffixmassage="cn=config" 302 olcUpdateRef: $URI1 303 304 dn: olcDatabase={1}ldif,cn=config 305 changetype: modify 306 add: olcSyncrepl 307 olcSyncrepl: {0}rid=001 provider=$URI1 binddn="cn=config" 308 bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config" 309 $SYNCTYPE retry="3 5 300 5" timeout=3 310 suffixmassage="cn=schema,cn=config,cn=consumer" 311 # a dummy stanza we add to the beginning and remove again 312 olcSyncrepl: {0}rid=006 provider=$URI6 binddn="cn=config" 313 bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config" 314 $SYNCTYPE retry="3 5 300 5" timeout=3 315 suffixmassage="cn=schema,cn=config,cn=consumer" 316 - 317 delete: olcSyncrepl 318 olcSyncrepl: {0} 319 - 320 add: olcMultiProvider 321 olcMultiProvider: TRUE 322 323 EOF 324 RC=$? 325 if test $RC != 0 ; then 326 echo "ldapmodify failed for consumer DB config ($RC)!" 327 test $KILLSERVERS != no && kill -HUP $KILLPIDS 328 exit $RC 329 fi 330 331 echo "Starting consumer slapd on TCP/IP port $PORT2..." 332 $SLAPADD -F $CFCON -n 0 -l $CONFLDIF 333 RC=$? 334 if test $RC != 0 ; then 335 echo "slapadd failed ($RC)!" 336 test $KILLSERVERS != no && kill -HUP $KILLPIDS 337 exit $RC 338 fi 339 340 $SLAPD -F $CFCON -h $URI2 -d $LVL > $LOG2 2>&1 & 341 CONSUMERPID=$! 342 if test $WAIT != 0 ; then 343 echo CONSUMERPID $CONSUMERPID 344 read foo 345 fi 346 KILLPIDS="$KILLPIDS $CONSUMERPID" 347 348 sleep 1 349 350 echo "Using ldapsearch to check that consumer slapd is running..." 351 for i in 0 1 2 3 4 5; do 352 $LDAPSEARCH -s base -b "" -H $URI2 \ 353 'objectclass=*' > /dev/null 2>&1 354 RC=$? 355 if test $RC = 0 ; then 356 break 357 fi 358 echo "Waiting 5 seconds for slapd to start..." 359 sleep 5 360 done 361 362 if test $RC != 0 ; then 363 echo "ldapsearch failed ($RC)!" 364 test $KILLSERVERS != no && kill -HUP $KILLPIDS 365 exit $RC 366 fi 367 368 echo "Configuring syncrepl on consumer..." 369 $LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 370 dn: olcDatabase={0}config,cn=config 371 changetype: modify 372 add: olcSyncRepl 373 olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config,cn=consumer" 374 bindmethod=simple credentials=repsecret searchbase="cn=config,cn=consumer" 375 $SYNCTYPE retry="3 5 300 5" timeout=3 logbase="cn=consumer-accesslog" 376 logfilter="(&(objectclass=auditWriteObject)(reqresult=0))" 377 syncdata=accesslog suffixmassage="cn=config" 378 - 379 add: olcUpdateRef 380 olcUpdateRef: $URI1 381 EOF 382 383 sleep 1 384 385 echo "Using ldapsearch to check that syncrepl received config changes..." 386 RC=32 387 for i in 0 1 2 3 4 5; do 388 RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \ 389 -s base -b "olcDatabase={0}config,cn=config" \ 390 '(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 391 if test "x$RESULT" = "xOK" ; then 392 RC=0 393 break 394 fi 395 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 396 sleep $SLEEP1 397 done 398 399 if test $RC != 0 ; then 400 echo "ldapsearch failed ($RC)!" 401 test $KILLSERVERS != no && kill -HUP $KILLPIDS 402 exit $RC 403 fi 404 405 echo "Adding schema and databases on provider..." 406 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 407 include: file://$ABS_SCHEMADIR/core.ldif 408 409 include: file://$ABS_SCHEMADIR/cosine.ldif 410 411 include: file://$ABS_SCHEMADIR/inetorgperson.ldif 412 413 include: file://$ABS_SCHEMADIR/openldap.ldif 414 415 include: file://$ABS_SCHEMADIR/nis.ldif 416 EOF 417 RC=$? 418 if test $RC != 0 ; then 419 echo "ldapadd failed for schema config ($RC)!" 420 test $KILLSERVERS != no && kill -HUP $KILLPIDS 421 exit $RC 422 fi 423 424 echo "Using ldapsearch to check that syncrepl received the schema changes..." 425 RC=32 426 for i in 0 1 2 3 4 5; do 427 RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \ 428 -s sub -b "cn=schema,cn=config" \ 429 '(cn=*openldap)' 2>&1 | awk '/^dn:/ {print "OK"}'` 430 if test "x$RESULT" = "xOK" ; then 431 RC=0 432 break 433 fi 434 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 435 sleep $SLEEP1 436 done 437 438 if test "x$RESULT" != "xOK" ; then 439 echo "consumer never received complete schema!" 440 test $KILLSERVERS != no && kill -HUP $KILLPIDS 441 exit 1 442 fi 443 444 nullExclude="" nullOK="" 445 test $BACKEND = null && nullExclude="# " nullOK="OK" 446 447 if [ "$BACKENDTYPE" = mod ]; then 448 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 449 dn: cn=module,cn=config,cn=consumer 450 objectClass: olcModuleList 451 cn: module 452 olcModulePath: ../servers/slapd/back-$BACKEND 453 olcModuleLoad: back_$BACKEND.la 454 EOF 455 RC=$? 456 if test $RC != 0 ; then 457 echo "ldapadd failed for backend config ($RC)!" 458 test $KILLSERVERS != no && kill -HUP $KILLPIDS 459 exit $RC 460 fi 461 fi 462 463 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 464 dn: olcDatabase={2}$BACKEND,cn=config 465 objectClass: olcDatabaseConfig 466 ${nullExclude}objectClass: olc${BACKEND}Config 467 olcDatabase: {2}$BACKEND 468 olcSuffix: $BASEDN 469 ${nullExclude}olcDbDirectory: $DBDIR1B 470 olcRootDN: $MANAGERDN 471 olcRootPW: $PASSWD 472 olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple 473 credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE 474 retry="3 5 300 5" timeout=3 475 olcUpdateRef: $URI1 476 477 dn: olcOverlay=syncprov,olcDatabase={2}${BACKEND},cn=config 478 changetype: add 479 objectClass: olcOverlayConfig 480 objectClass: olcSyncProvConfig 481 olcOverlay: syncprov 482 483 dn: olcDatabase={1}$BACKEND,cn=config,cn=consumer 484 objectClass: olcDatabaseConfig 485 ${nullExclude}objectClass: olc${BACKEND}Config 486 olcDatabase: {1}$BACKEND 487 olcSuffix: $BASEDN 488 ${nullExclude}olcDbDirectory: $DBDIR2A 489 olcRootDN: $MANAGERDN 490 olcRootPW: $PASSWD 491 olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple 492 credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE 493 retry="3 5 300 5" timeout=3 494 olcUpdateRef: $URI1 495 496 EOF 497 RC=$? 498 if test $RC != 0 ; then 499 echo "ldapadd failed for database config ($RC)!" 500 test $KILLSERVERS != no && kill -HUP $KILLPIDS 501 exit $RC 502 fi 503 504 if test $INDEXDB = indexdb ; then 505 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 506 dn: olcDatabase={2}$BACKEND,cn=config 507 changetype: modify 508 add: olcDbIndex 509 olcDbIndex: objectClass,entryUUID,entryCSN eq 510 olcDbIndex: cn,uid pres,eq,sub 511 EOF 512 RC=$? 513 if test $RC != 0 ; then 514 echo "ldapadd modify for database config ($RC)!" 515 test $KILLSERVERS != no && kill -HUP $KILLPIDS 516 exit $RC 517 fi 518 fi 519 520 echo "Using ldapadd to populate provider..." 521 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \ 522 >> $TESTOUT 2>&1 523 RC=$? 524 if test $RC != 0 ; then 525 echo "ldapadd failed for database config ($RC)!" 526 test $KILLSERVERS != no && kill -HUP $KILLPIDS 527 exit $RC 528 fi 529 530 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 531 sleep $SLEEP1 532 533 echo "Using ldapsearch to check that syncrepl received database changes..." 534 RC=32 535 for i in 0 1 2 3 4 5; do 536 RESULT=`$LDAPSEARCH -H $URI2 \ 537 -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \ 538 '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 539 if test "x$RESULT$nullOK" = "xOK" ; then 540 RC=0 541 break 542 fi 543 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 544 sleep $SLEEP1 545 done 546 547 if test $RC != 0 ; then 548 echo "ldapsearch failed ($RC)!" 549 test $KILLSERVERS != no && kill -HUP $KILLPIDS 550 exit $RC 551 fi 552 553 echo "Using ldapsearch to read all the entries from the provider..." 554 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ 555 'objectclass=*' > $PROVIDEROUT 2>&1 556 RC=$? 557 558 if test $RC != 0 ; then 559 echo "ldapsearch failed at provider ($RC)!" 560 test $KILLSERVERS != no && kill -HUP $KILLPIDS 561 exit $RC 562 fi 563 564 echo "Using ldapsearch to read all the entries from the consumer..." 565 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \ 566 'objectclass=*' > $CONSUMEROUT 2>&1 567 RC=$? 568 569 if test $RC != 0 ; then 570 echo "ldapsearch failed at consumer ($RC)!" 571 test $KILLSERVERS != no && kill -HUP $KILLPIDS 572 exit $RC 573 fi 574 575 test $KILLSERVERS != no && kill -HUP $KILLPIDS 576 577 echo "Filtering provider results..." 578 $LDIFFILTER < $PROVIDEROUT > $PROVIDERFLT 579 echo "Filtering consumer results..." 580 $LDIFFILTER < $CONSUMEROUT > $CONSUMERFLT 581 582 echo "Comparing retrieved entries from provider and consumer..." 583 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT 584 585 if test $? != 0 ; then 586 echo "test failed - provider and consumer databases differ" 587 exit 1 588 fi 589 590 echo ">>>>> Test succeeded" 591 592 test $KILLSERVERS != no && wait 593 594 exit 0 595