12de962bdSlukem#! /bin/sh 2d11b170bStron# $OpenLDAP$ 32de962bdSlukem## This work is part of OpenLDAP Software <http://www.openldap.org/>. 42de962bdSlukem## 5*e670fd5cSchristos## Copyright 1998-2021 The OpenLDAP Foundation. 62de962bdSlukem## All rights reserved. 72de962bdSlukem## 82de962bdSlukem## Redistribution and use in source and binary forms, with or without 92de962bdSlukem## modification, are permitted only as authorized by the OpenLDAP 102de962bdSlukem## Public License. 112de962bdSlukem## 122de962bdSlukem## A copy of this license is available in the file LICENSE in the 132de962bdSlukem## top-level directory of the distribution or, alternatively, at 142de962bdSlukem## <http://www.OpenLDAP.org/license.html>. 152de962bdSlukem 162de962bdSlukemecho "running defines.sh" 172de962bdSlukem. $SRCDIR/scripts/defines.sh 182de962bdSlukem 192de962bdSlukemif test $SYNCPROV = syncprovno; then 202de962bdSlukem echo "Syncrepl provider overlay not available, test skipped" 212de962bdSlukem exit 0 222de962bdSlukemfi 232de962bdSlukem 242de962bdSlukemPRODIR=$TESTDIR/pro 254e6df137SlukemCONDIR=$TESTDIR/con1 262de962bdSlukemDBPRO=$PRODIR/db 272de962bdSlukemDBCON=$CONDIR/db 282de962bdSlukemCFPRO=$PRODIR/slapd.d 292de962bdSlukemCFCON=$CONDIR/slapd.d 302de962bdSlukem 312de962bdSlukemmkdir -p $TESTDIR $PRODIR $CONDIR $DBPRO $DBCON $CFPRO $CFCON 322de962bdSlukem 332de962bdSlukem$SLAPPASSWD -g -n >$CONFIGPWF 342de962bdSlukem 354e6df137Slukemif test x"$SYNCMODE" = x ; then 364e6df137Slukem SYNCMODE=rp 374e6df137Slukemfi 384e6df137Slukemcase "$SYNCMODE" in 394e6df137Slukem ro) 404e6df137Slukem SYNCTYPE="type=refreshOnly interval=00:00:00:03" 414e6df137Slukem ;; 424e6df137Slukem rp) 434e6df137Slukem SYNCTYPE="type=refreshAndPersist" 444e6df137Slukem ;; 454e6df137Slukem *) 464e6df137Slukem echo "unknown sync mode $SYNCMODE" 474e6df137Slukem exit 1; 484e6df137Slukem ;; 494e6df137Slukemesac 504e6df137Slukem 512de962bdSlukem# 522de962bdSlukem# Test replication of dynamic config: 53d11b170bStron# - start provider 542de962bdSlukem# - start consumer 552de962bdSlukem# - configure over ldap 562de962bdSlukem# - populate over ldap 572de962bdSlukem# - configure syncrepl over ldap 582de962bdSlukem# - retrieve database over ldap and compare against expected results 592de962bdSlukem# 602de962bdSlukem 61d11b170bStronecho "Starting provider slapd on TCP/IP port $PORT1..." 62*e670fd5cSchristos. $CONFFILTER $BACKEND < $DYNAMICCONF > $CONFLDIF 632de962bdSlukem$SLAPADD -F $CFPRO -n 0 -l $CONFLDIF 642de962bdSlukemcd $PRODIR 65*e670fd5cSchristos$SLAPD -F ./slapd.d -h $URI1 -d $LVL > $LOG1 2>&1 & 662de962bdSlukemPID=$! 672de962bdSlukemif test $WAIT != 0 ; then 682de962bdSlukem echo PID $PID 692de962bdSlukem read foo 702de962bdSlukemfi 712de962bdSlukemKILLPIDS="$PID" 722de962bdSlukemcd $TESTWD 732de962bdSlukem 742de962bdSlukemsleep 1 752de962bdSlukem 76d11b170bStronecho "Using ldapsearch to check that provider slapd is running..." 772de962bdSlukemfor i in 0 1 2 3 4 5; do 782de962bdSlukem $LDAPSEARCH -s base -b "" -H $URI1 \ 792de962bdSlukem 'objectclass=*' > /dev/null 2>&1 802de962bdSlukem RC=$? 812de962bdSlukem if test $RC = 0 ; then 822de962bdSlukem break 832de962bdSlukem fi 842de962bdSlukem echo "Waiting 5 seconds for slapd to start..." 852de962bdSlukem sleep 5 862de962bdSlukemdone 872de962bdSlukem 882de962bdSlukemif test $RC != 0 ; then 892de962bdSlukem echo "ldapsearch failed ($RC)!" 902de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 912de962bdSlukem exit $RC 922de962bdSlukemfi 932de962bdSlukem 94d11b170bStronecho "Inserting syncprov overlay on provider..." 952de962bdSlukemif [ "$SYNCPROV" = syncprovmod ]; then 962de962bdSlukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 972de962bdSlukemdn: cn=module,cn=config 982de962bdSlukemobjectClass: olcModuleList 992de962bdSlukemcn: module 100d11b170bStronolcModulePath: $TESTWD/../servers/slapd/overlays 1012de962bdSlukemolcModuleLoad: syncprov.la 1022de962bdSlukemEOF 1032de962bdSlukem RC=$? 1042de962bdSlukem if test $RC != 0 ; then 1052de962bdSlukem echo "ldapadd failed for moduleLoad ($RC)!" 1062de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 1072de962bdSlukem exit $RC 1082de962bdSlukem fi 1092de962bdSlukemfi 1102de962bdSlukemread CONFIGPW < $CONFIGPWF 1112de962bdSlukem$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 1122de962bdSlukemdn: olcDatabase={0}config,cn=config 1132de962bdSlukemchangetype: modify 1142de962bdSlukemadd: olcSyncRepl 1152de962bdSlukemolcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 1164e6df137Slukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 1174e6df137Slukem retry="3 5 300 5" timeout=3 1182de962bdSlukem- 1192de962bdSlukemadd: olcUpdateRef 1202de962bdSlukemolcUpdateRef: $URI1 1212de962bdSlukem 1222de962bdSlukemdn: olcOverlay=syncprov,olcDatabase={0}config,cn=config 1232de962bdSlukemchangetype: add 1242de962bdSlukemobjectClass: olcOverlayConfig 1252de962bdSlukemobjectClass: olcSyncProvConfig 1262de962bdSlukemolcOverlay: syncprov 1272de962bdSlukemEOF 1282de962bdSlukemRC=$? 1292de962bdSlukemif test $RC != 0 ; then 1302de962bdSlukem echo "ldapmodify failed for syncrepl config ($RC)!" 1312de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 1322de962bdSlukem exit $RC 1332de962bdSlukemfi 1342de962bdSlukem 1352de962bdSlukemecho "Starting consumer slapd on TCP/IP port $PORT2..." 1362de962bdSlukem$SLAPADD -F $CFCON -n 0 -l $CONFLDIF 1372de962bdSlukemcd $CONDIR 138*e670fd5cSchristos$SLAPD -F ./slapd.d -h $URI2 -d $LVL > $LOG2 2>&1 & 139*e670fd5cSchristosCONSUMERPID=$! 1402de962bdSlukemif test $WAIT != 0 ; then 141*e670fd5cSchristos echo CONSUMERPID $CONSUMERPID 1422de962bdSlukem read foo 1432de962bdSlukemfi 144*e670fd5cSchristosKILLPIDS="$KILLPIDS $CONSUMERPID" 1452de962bdSlukemcd $TESTWD 1462de962bdSlukem 1472de962bdSlukemsleep 1 1482de962bdSlukem 1492de962bdSlukemecho "Using ldapsearch to check that consumer slapd is running..." 1502de962bdSlukemfor i in 0 1 2 3 4 5; do 1512de962bdSlukem $LDAPSEARCH -s base -b "" -H $URI2 \ 1522de962bdSlukem 'objectclass=*' > /dev/null 2>&1 1532de962bdSlukem RC=$? 1542de962bdSlukem if test $RC = 0 ; then 1552de962bdSlukem break 1562de962bdSlukem fi 1572de962bdSlukem echo "Waiting 5 seconds for slapd to start..." 1582de962bdSlukem sleep 5 1592de962bdSlukemdone 1602de962bdSlukem 1612de962bdSlukemif test $RC != 0 ; then 1622de962bdSlukem echo "ldapsearch failed ($RC)!" 1632de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 1642de962bdSlukem exit $RC 1652de962bdSlukemfi 1662de962bdSlukem 1672de962bdSlukemecho "Configuring syncrepl on consumer..." 1682de962bdSlukem$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 1692de962bdSlukemdn: olcDatabase={0}config,cn=config 1702de962bdSlukemchangetype: modify 1712de962bdSlukemadd: olcSyncRepl 1722de962bdSlukemolcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 1734e6df137Slukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 1744e6df137Slukem retry="3 5 300 5" timeout=3 1752de962bdSlukem- 1762de962bdSlukemadd: olcUpdateRef 1772de962bdSlukemolcUpdateRef: $URI1 1782de962bdSlukemEOF 1792de962bdSlukem 1804e6df137Slukemecho "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 1814e6df137Slukemsleep $SLEEP1 1822de962bdSlukem 1832de962bdSlukemecho "Using ldapsearch to check that syncrepl received config changes..." 1842de962bdSlukemRC=32 1852de962bdSlukemfor i in 0 1 2 3 4 5; do 1862de962bdSlukem RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \ 1872de962bdSlukem -s base -b "olcDatabase={0}config,cn=config" \ 1882de962bdSlukem '(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 1892de962bdSlukem if test "x$RESULT" = "xOK" ; then 1902de962bdSlukem RC=0 1912de962bdSlukem break 1922de962bdSlukem fi 1934e6df137Slukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 1944e6df137Slukem sleep $SLEEP1 1952de962bdSlukemdone 1962de962bdSlukem 1972de962bdSlukemif test $RC != 0 ; then 1982de962bdSlukem echo "ldapsearch failed ($RC)!" 1992de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2002de962bdSlukem exit $RC 2012de962bdSlukemfi 2022de962bdSlukem 203d11b170bStronecho "Adding schema and databases on provider..." 2042de962bdSlukem$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 2052de962bdSlukeminclude: file://$ABS_SCHEMADIR/core.ldif 2062de962bdSlukem 2072de962bdSlukeminclude: file://$ABS_SCHEMADIR/cosine.ldif 2082de962bdSlukem 2092de962bdSlukeminclude: file://$ABS_SCHEMADIR/inetorgperson.ldif 2102de962bdSlukem 2112de962bdSlukeminclude: file://$ABS_SCHEMADIR/openldap.ldif 2122de962bdSlukem 2132de962bdSlukeminclude: file://$ABS_SCHEMADIR/nis.ldif 2142de962bdSlukemEOF 2152de962bdSlukemRC=$? 2162de962bdSlukemif test $RC != 0 ; then 2172de962bdSlukem echo "ldapadd failed for schema config ($RC)!" 2182de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2192de962bdSlukem exit $RC 2202de962bdSlukemfi 2212de962bdSlukem 222ef2f90d3SadamnullExclude="" nullOK="" 223ef2f90d3Sadamtest $BACKEND = null && nullExclude="# " nullOK="OK" 224ef2f90d3Sadam 2252de962bdSlukemif [ "$BACKENDTYPE" = mod ]; then 2262de962bdSlukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 2272de962bdSlukemdn: cn=module,cn=config 2282de962bdSlukemobjectClass: olcModuleList 2292de962bdSlukemcn: module 230d11b170bStronolcModulePath: $TESTWD/../servers/slapd/back-$BACKEND 2312de962bdSlukemolcModuleLoad: back_$BACKEND.la 2322de962bdSlukemEOF 2332de962bdSlukem RC=$? 2342de962bdSlukem if test $RC != 0 ; then 2352de962bdSlukem echo "ldapadd failed for backend config ($RC)!" 2362de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2372de962bdSlukem exit $RC 2382de962bdSlukem fi 2392de962bdSlukemfi 2402de962bdSlukem 2412de962bdSlukem$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 2422de962bdSlukemdn: olcDatabase={1}$BACKEND,cn=config 2432de962bdSlukemobjectClass: olcDatabaseConfig 244ef2f90d3Sadam${nullExclude}objectClass: olc${BACKEND}Config 2452de962bdSlukemolcDatabase: {1}$BACKEND 2462de962bdSlukemolcSuffix: $BASEDN 247ef2f90d3Sadam${nullExclude}olcDbDirectory: ./db 2482de962bdSlukemolcRootDN: $MANAGERDN 2492de962bdSlukemolcRootPW: $PASSWD 2502de962bdSlukemolcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple 2514e6df137Slukem credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE 2524e6df137Slukem retry="3 5 300 5" timeout=3 2532de962bdSlukemolcUpdateRef: $URI1 2542de962bdSlukem 2552de962bdSlukemdn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config 2562de962bdSlukemchangetype: add 2572de962bdSlukemobjectClass: olcOverlayConfig 2582de962bdSlukemobjectClass: olcSyncProvConfig 2592de962bdSlukemolcOverlay: syncprov 2602de962bdSlukemEOF 2612de962bdSlukemRC=$? 2622de962bdSlukemif test $RC != 0 ; then 2632de962bdSlukem echo "ldapadd failed for database config ($RC)!" 2642de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2652de962bdSlukem exit $RC 2662de962bdSlukemfi 2672de962bdSlukem 268d11b170bStronif test $INDEXDB = indexdb ; then 2694e6df137Slukem $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 2704e6df137Slukemdn: olcDatabase={1}$BACKEND,cn=config 2714e6df137Slukemchangetype: modify 2724e6df137Slukemadd: olcDbIndex 2734e6df137SlukemolcDbIndex: objectClass,entryUUID,entryCSN eq 2744e6df137SlukemolcDbIndex: cn,uid pres,eq,sub 2754e6df137SlukemEOF 2764e6df137Slukem RC=$? 2774e6df137Slukem if test $RC != 0 ; then 2784e6df137Slukem echo "ldapadd modify for database config ($RC)!" 2794e6df137Slukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2804e6df137Slukem exit $RC 2814e6df137Slukem fi 282d11b170bStronfi 2834e6df137Slukem 284d11b170bStronecho "Using ldapadd to populate provider..." 2852de962bdSlukem$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \ 2862de962bdSlukem >> $TESTOUT 2>&1 2872de962bdSlukemRC=$? 2882de962bdSlukemif test $RC != 0 ; then 2892de962bdSlukem echo "ldapadd failed for database config ($RC)!" 2902de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 2912de962bdSlukem exit $RC 2922de962bdSlukemfi 2932de962bdSlukem 2944e6df137Slukemecho "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 2954e6df137Slukemsleep $SLEEP1 2962de962bdSlukem 2972de962bdSlukemecho "Using ldapsearch to check that syncrepl received database changes..." 2982de962bdSlukemRC=32 2992de962bdSlukemfor i in 0 1 2 3 4 5; do 3002de962bdSlukem RESULT=`$LDAPSEARCH -H $URI2 \ 3012de962bdSlukem -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \ 3022de962bdSlukem '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 303ef2f90d3Sadam if test "x$RESULT$nullOK" = "xOK" ; then 3042de962bdSlukem RC=0 3052de962bdSlukem break 3062de962bdSlukem fi 3074e6df137Slukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 3084e6df137Slukem sleep $SLEEP1 3092de962bdSlukemdone 3102de962bdSlukem 3112de962bdSlukemif test $RC != 0 ; then 3122de962bdSlukem echo "ldapsearch failed ($RC)!" 3132de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3142de962bdSlukem exit $RC 3152de962bdSlukemfi 3162de962bdSlukem 317d11b170bStronecho "Replacing olcSyncrepl on provider..." 3184e6df137Slukem$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 3194e6df137Slukemdn: olcDatabase={0}config,cn=config 3204e6df137Slukemchangetype: modify 3214e6df137Slukemreplace: olcSyncRepl 322*e670fd5cSchristosolcSyncRepl: rid=003 provider=$URI1 binddn="cn=config" bindmethod=simple 3234e6df137Slukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 3244e6df137Slukem retry="3 5 300 5" timeout=3 3254e6df137SlukemEOF 3264e6df137Slukemecho "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 3274e6df137Slukemsleep $SLEEP1 3284e6df137Slukem 329d11b170bStronecho "Using ldapsearch to read config from the provider..." 3302de962bdSlukem$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF \ 331*e670fd5cSchristos 'objectclass=*' > $PROVIDEROUT 2>&1 3322de962bdSlukemRC=$? 3332de962bdSlukem 3342de962bdSlukemif test $RC != 0 ; then 335d11b170bStron echo "ldapsearch failed at provider ($RC)!" 3362de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3372de962bdSlukem exit $RC 3382de962bdSlukemfi 3392de962bdSlukem 3402de962bdSlukemecho "Using ldapsearch to read config from the consumer..." 3412de962bdSlukem$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \ 342*e670fd5cSchristos 'objectclass=*' > $CONSUMEROUT 2>&1 3432de962bdSlukemRC=$? 3442de962bdSlukem 3452de962bdSlukemif test $RC != 0 ; then 3462de962bdSlukem echo "ldapsearch failed at consumer ($RC)!" 3472de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3482de962bdSlukem exit $RC 3492de962bdSlukemfi 3502de962bdSlukem 351d11b170bStronecho "Filtering provider results..." 352*e670fd5cSchristos$LDIFFILTER < $PROVIDEROUT > $PROVIDERFLT 3532de962bdSlukemecho "Filtering consumer results..." 354*e670fd5cSchristos$LDIFFILTER < $CONSUMEROUT > $CONSUMERFLT 3552de962bdSlukem 356d11b170bStronecho "Comparing retrieved configs from provider and consumer..." 357*e670fd5cSchristos$CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT 3582de962bdSlukem 3592de962bdSlukemif test $? != 0 ; then 360d11b170bStron echo "test failed - provider and consumer configs differ" 3612de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3622de962bdSlukem exit 1 3632de962bdSlukemfi 3642de962bdSlukem 365d11b170bStronecho "Using ldapsearch to read all the entries from the provider..." 3662de962bdSlukem$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ 367*e670fd5cSchristos 'objectclass=*' > $PROVIDEROUT 2>&1 3682de962bdSlukemRC=$? 3692de962bdSlukem 3702de962bdSlukemif test $RC != 0 ; then 371d11b170bStron echo "ldapsearch failed at provider ($RC)!" 3722de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3732de962bdSlukem exit $RC 3742de962bdSlukemfi 3752de962bdSlukem 3762de962bdSlukemecho "Using ldapsearch to read all the entries from the consumer..." 3772de962bdSlukem$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \ 378*e670fd5cSchristos 'objectclass=*' > $CONSUMEROUT 2>&1 3792de962bdSlukemRC=$? 3802de962bdSlukem 3812de962bdSlukemif test $RC != 0 ; then 3822de962bdSlukem echo "ldapsearch failed at consumer ($RC)!" 3832de962bdSlukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 3842de962bdSlukem exit $RC 3852de962bdSlukemfi 3862de962bdSlukem 3872de962bdSlukemtest $KILLSERVERS != no && kill -HUP $KILLPIDS 3882de962bdSlukem 389d11b170bStronecho "Filtering provider results..." 390*e670fd5cSchristos$LDIFFILTER < $PROVIDEROUT > $PROVIDERFLT 3912de962bdSlukemecho "Filtering consumer results..." 392*e670fd5cSchristos$LDIFFILTER < $CONSUMEROUT > $CONSUMERFLT 3932de962bdSlukem 394d11b170bStronecho "Comparing retrieved entries from provider and consumer..." 395*e670fd5cSchristos$CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT 3962de962bdSlukem 3972de962bdSlukemif test $? != 0 ; then 398d11b170bStron echo "test failed - provider and consumer databases differ" 3992de962bdSlukem exit 1 4002de962bdSlukemfi 4012de962bdSlukem 4022de962bdSlukemecho ">>>>> Test succeeded" 4032de962bdSlukem 4042de962bdSlukemtest $KILLSERVERS != no && wait 4052de962bdSlukem 4062de962bdSlukemexit 0 407