#! /bin/sh # $OpenLDAP$ ## This work is part of OpenLDAP Software . ## ## Copyright 1998-2018 The OpenLDAP Foundation. ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted only as authorized by the OpenLDAP ## Public License. ## ## A copy of this license is available in the file LICENSE in the ## top-level directory of the distribution or, alternatively, at ## . echo "running defines.sh" . $SRCDIR/scripts/defines.sh if test $SYNCPROV = syncprovno; then echo "Syncrepl provider overlay not available, test skipped" exit 0 fi if test $ACCESSLOG = accesslogno; then echo "Accesslog overlay not available, test skipped" exit 0 fi MMR=2 XDIR=$TESTDIR/srv TMP=$TESTDIR/tmp mkdir -p $TESTDIR $SLAPPASSWD -g -n >$CONFIGPWF if test x"$SYNCMODE" = x ; then SYNCMODE=rp fi case "$SYNCMODE" in ro) SYNCTYPE="type=refreshOnly interval=00:00:00:03" ;; rp) SYNCTYPE="type=refreshAndPersist interval=00:00:00:03" ;; *) echo "unknown sync mode $SYNCMODE" exit 1; ;; esac # # Test delta-sync mmr # - start servers # - configure over ldap # - populate over ldap # - configure syncrepl over ldap # - break replication # - modify each server separately # - restore replication # - compare results # nullExclude="" test $BACKEND = null && nullExclude="# " KILLPIDS= echo "Initializing server configurations..." n=1 while [ $n -le $MMR ]; do DBDIR=${XDIR}$n/db CFDIR=${XDIR}$n/slapd.d mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR o=`expr 3 - $n` cat > $TMP <> $TMP dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: $TESTWD/../servers/slapd/overlays EOF if [ "$SYNCPROV" = syncprovmod ]; then echo "olcModuleLoad: syncprov.la" >> $TMP fi if [ "$ACCESSLOG" = accesslogmod ]; then echo "olcModuleLoad: accesslog.la" >> $TMP fi echo "" >> $TMP fi if [ "$BACKENDTYPE" = mod ]; then cat <> $TMP dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND olcModuleLoad: back_$BACKEND.la EOF fi MYURI=`eval echo '$URI'$n` PROVIDERURI=`eval echo '$URI'$o` if test $INDEXDB = indexdb ; then INDEX1="olcDbIndex: objectClass,entryCSN,reqStart,reqDN,reqResult eq" INDEX2="olcDbIndex: objectClass,entryCSN,entryUUID eq" else INDEX1= INDEX2= fi cat >> $TMP < $TESTOUT 2>&1 PORT=`eval echo '$PORT'$n` echo "Starting server $n on TCP/IP port $PORT..." cd ${XDIR}${n} LOG=`eval echo '$LOG'$n` $SLAPD -F slapd.d -h $MYURI -d $LVL > $LOG 2>&1 & PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$PID $KILLPIDS" cd $TESTWD echo "Using ldapsearch to check that server $n is running..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "" -H $MYURI \ 'objectclass=*' > /dev/null 2>&1 RC=$? if test $RC = 0 ; then break fi echo "Waiting 5 seconds for slapd to start..." sleep 5 done if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi if [ $n = 1 ]; then echo "Using ldapadd for context on server 1..." $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDCP \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapadd failed for server $n database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi fi n=`expr $n + 1` done echo "Using ldapadd to populate server 1..." $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDNOCP \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapadd failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." sleep $SLEEP1 n=1 while [ $n -le $MMR ]; do URI=`eval echo '$URI'$n` echo "Using ldapsearch to read all the entries from server $n..." $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD \ 'objectclass=*' > $TESTDIR/server$n.out 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed at server $n ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt n=`expr $n + 1` done n=2 while [ $n -le $MMR ]; do echo "Comparing retrieved entries from server 1 and server $n..." $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT if test $? != 0 ; then echo "test failed - server 1 and server $n databases differ" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit 1 fi n=`expr $n + 1` done echo "Using ldapadd to populate server 2..." $LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD -f $LDIFADD1 \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapadd failed for server 2 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com" sleep 1 for i in 1 2 3; do $LDAPSEARCH -S "" -b "$THEDN" -H $URI1 \ -s base '(objectClass=*)' entryCSN > "${PROVIDEROUT}.$i" 2>&1 RC=$? if test $RC = 0 ; then break fi if test $RC != 32 ; then echo "ldapsearch failed at slave ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." sleep $SLEEP1 done n=1 while [ $n -le $MMR ]; do URI=`eval echo '$URI'$n` echo "Using ldapsearch to read all the entries from server $n..." $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD \ 'objectclass=*' > $TESTDIR/server$n.out 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed at server $n ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt n=`expr $n + 1` done n=2 while [ $n -le $MMR ]; do echo "Comparing retrieved entries from server 1 and server $n..." $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT if test $? != 0 ; then echo "test failed - server 1 and server $n databases differ" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit 1 fi n=`expr $n + 1` done echo "Retrieving syncrepl cookie..." cookie=`$LDAPRSEARCH -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ -E "sync=ro" 'objectclass=*' 1.1 | grep cookie | sed "s/.*cookie: //"` if test -z "$cookie"; then echo "Failed to retrieve cookie from server!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit 1 fi echo "Deleting an entry from server 1..." $LDAPDELETE -D "$MANAGERDN" -H $URI1 -w $PASSWD \ "cn=Mark Elliot,ou=Alumni Association,ou=People,$BASEDN" \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapdelete failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Restarting servers..." kill -HUP $KILLPIDS wait KILLPIDS="" n=1 while [ $n -le $MMR ]; do o=`expr 3 - $n` MYURI=`eval echo '$URI'$n` PROVIDERURI=`eval echo '$URI'$o` echo "Starting server $n again..." cd ${XDIR}${n} LOG=`eval echo '$LOG'$n` echo "RESTART" >> $LOG #if test $n = 2; then #echo $SLAPD -F slapd.d -h $MYURI -d $LVL #else $SLAPD -F slapd.d -h $MYURI -d $LVL > $LOG 2>&1 & #fi PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$PID $KILLPIDS" cd $TESTWD echo "Using ldapsearch to check that server $n is running..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "" -H $MYURI \ 'objectclass=*' > /dev/null 2>&1 RC=$? if test $RC = 0 ; then break fi echo "Waiting 5 seconds for slapd to start..." sleep 5 done echo "Breaking replication between server $n and $o..." $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify add: description description: Amazing EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify add: description description: Stupendous EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 2 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify delete: description description: Outstanding - add: description description: Mindboggling EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify delete: description description: OutStanding - add: description description: Bizarre EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 2 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify add: carLicense carLicense: 123-XYZ - add: employeeNumber employeeNumber: 32 EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify add: employeeType employeeType: deadwood - add: employeeNumber employeeNumber: 64 EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 2 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: $THEDN changetype: modify replace: sn sn: Replaced later - replace: sn sn: Surname EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Deleting an entry from both servers..." $LDAPDELETE -D "$MANAGERDN" -H $URI1 -w $PASSWD \ "cn=John Doe,ou=Information Technology Division,ou=People,$BASEDN" \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapdelete failed for server 1 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPDELETE -D "$MANAGERDN" -H $URI2 -w $PASSWD \ "cn=John Doe,ou=Information Technology Division,ou=People,$BASEDN" \ >> $TESTOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapdelete failed for server 2 database ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Restoring replication between server 1 and 2..." n=1 while [ $n -le $MMR ]; do o=`expr 3 - $n` MYURI=`eval echo '$URI'$n` PROVIDERURI=`eval echo '$URI'$o` $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <$TESTDIR/repl.test echo 1 >>$TESTDIR/repl.test n=1 while [ $n -le $MMR ]; do URI=`eval echo '$URI'$n` echo "Using ldapsearch to read all the entries from server $n..." $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD \ 'objectclass=*' > $TESTDIR/server$n.out 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed at server $n ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt echo "Checking server $n can remember which entries have been deleted even after it's been restarted..." $LDAPRSEARCH -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD \ -E "sync=ro/$cookie" 'objectclass=*' 1.1 | grep syncUUIDs | wc -l >$TESTDIR/repl.out $LDAPRSEARCH -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD \ -E "sync=ro/$cookie" 'objectclass=*' 1.1 | grep SyncDone | grep "refreshDeletes=1" | wc -l >>$TESTDIR/repl.out $CMP $TESTDIR/repl.out $TESTDIR/repl.test > $CMPOUT if test $? != 0 ; then echo "test failed - server did not respond with delete phase" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit 1 fi n=`expr $n + 1` done n=2 while [ $n -le $MMR ]; do echo "Comparing retrieved entries from server 1 and server $n..." $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT if test $? != 0 ; then echo "test failed - server 1 and server $n databases differ" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit 1 fi n=`expr $n + 1` done test $KILLSERVERS != no && kill -HUP $KILLPIDS echo ">>>>> Test succeeded" test $KILLSERVERS != no && wait exit 0