diff --git a/tests/scripts/test058-syncrepl-asymmetric b/tests/scripts/test058-syncrepl-asymmetric deleted file mode 100755 index 0b8d4363c13e792d90f258ea55d8f327ee0e5283..0000000000000000000000000000000000000000 --- a/tests/scripts/test058-syncrepl-asymmetric +++ /dev/null @@ -1,2471 +0,0 @@ -#! /bin/sh -# $OpenLDAP$ -## This work is part of OpenLDAP Software <http://www.openldap.org/>. -## -## 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 -## <http://www.OpenLDAP.org/license.html>. - -# This script tests a configuration scenario as described in these URLs: -# -# http://www.openldap.org/lists/openldap-devel/200806/msg00041.html -# http://www.openldap.org/lists/openldap-devel/200806/msg00054.html -# -# Search for "TEST:" to find each major test this script performs. - -# The configuration here consist of 3 "sites", each with a "master" and -# a "search" server. One of the sites is the "central", the other two -# are called "site1" and "site2". - -# The following notations are used in variable names below to identify -# these servers, the first number defines the $URL# and $PORT# variable -# that server uses: -# -# 1: SMC_* Site Master Central -# 2: SM1_* Site Master 1 -# 3: SM2_* Site Master 2 -# 4: SSC_* Search Site Central -# 5: SS1_* Search Site 1 -# 6: SS2_* Search Site 2 - -# The master servers all have a set of subordinate databases glued below -# the same suffix database. Each of the masters are the master for at -# least one of these subordinate databases, but there are never more -# than one master for any single database. I.e, this is neither a -# traditional single-master configuration, nor what most people think -# of as multi-master, but more what can be called multiple masters. - -# The central master replicates to the two other masters, and receives -# updates from them of the backends they are the master for. There is -# no direct connection between the other two master servers. All of the -# masters have the syncprov overlay configured on the glue database. - -# The search servers replicates from the master server at their site. -# They all have a single database with the glue suffix, but their -# database configuration doesn't matter much in this test. (This -# database layout was originally created before gluing was introduced -# in OpenLDAP, which is why the search servers doesn't use it). - -# The primary objective for gluing the backend databases is not to make -# them look like one huge database but to create a common search suffix -# for the clients. Searching is mostly done on the search servers, only -# updates are done on the masters. - -# It varies which backends that are replicated to which server (hence -# the name asymmetric in this test). Access control rules on the -# masters are used to control what their consumers receives. The table -# below gives an overview of which backend (the columns) that are -# replicated to which server (the rows). A "M" defines the master for -# the backend, a "S" is a slave, and "-" means it is not replicated -# there. Oh, the table probably looks wrong without the 4-position -# tab-stops OpenLDAP uses... - -# glue ou1 ou2 sm1ou1 sm1ou2 sm2ou1 sm2ou2 -# smc M M M S S S - -# sm1 S S - M M - - -# sm2 S S S S - M M -# ssc S S - - S - - -# ss1 S S - S S - - -# ss2 S S S - - S S - -# On the central master syncrepl is configured on the subordinate -# databases, as it varies which backends that exists on its providers. -# Had it been used on the glue database then syncrepl would have removed -# the backends replicated from site1 but not present on site2 when it -# synchronizes with site2 (and vice versa). -# -# All the other servers uses syncrepl on the glue database, since -# replicating more than one subordinate database from the same master -# creates (as of the writing of this test script) race conditions that -# causes the replication to fail, as the race tests at the end shows. - -# The databases controlled by syncrepl all have $UPDATEDN as their -# RootDN, while the master servers has other RootDN values for the -# backends they are the backend for them self. This violates the current -# guidelines for gluing databases, which states that the same rootdn -# should be used on all of them. Unfortunately, this cannot be done on -# site masters 1 and 2. The backends they manage locally are either not -# present on the central master, or when so they are not replicated back -# to their source, which causes syncrepl to try to remove the content of -# these backends when it synchronizes with the central master. The -# differing rootdn values used on the backends controlled by syncrepl -# and those managed locally prevents it from succeeding in this. As -# noted above, moving syncrepl to the subordinate databases is currently -# not an option since that creates race conditions. - -# The binddn values used in the syncrepl configurations are chosen to -# make the configuration and access control rules easiest to set up. It -# occasionally uses a DN that is also used as a RootDN. This is not a -# good practice and should not be taken as an example for real -# configurations! - -# This script will print the content of any invalid contextCSN values it -# detects if the environment variable CSN_VERBOSE is non-empty. The -# environment variable RACE_TESTS can be set to the number of race test -# iterations the script should perform. - -if test "$BACKEND" = ldif ; then - echo "$BACKEND backend does not support access controls, test skipped" - exit 0 -fi - -#echo "Test 058 is currently disabled" -#exit 0 - -echo "running defines.sh" -. $SRCDIR/scripts/defines.sh - -if test $SYNCPROV = syncprovno; then - echo "Syncrepl provider overlay not available, test skipped" - exit 0 -fi - -SMC_DIR=$TESTDIR/smc -SM1_DIR=$TESTDIR/sm1 -SM2_DIR=$TESTDIR/sm2 -SS1_DIR=$TESTDIR/ss1 -SS2_DIR=$TESTDIR/ss2 -SSC_DIR=$TESTDIR/ssc - -MNUM=1 - -mkdir -p $TESTDIR - -for dir in $SMC_DIR $SM1_DIR $SM2_DIR $SS1_DIR $SS2_DIR $SSC_DIR; do - mkdir -p $dir $dir/slapd.d $dir/db -done - -mkdir -p $SMC_DIR/ou1 $SMC_DIR/sm1ou1 $SMC_DIR/sm1ou2 -mkdir -p $SMC_DIR/ou2 $SMC_DIR/sm2ou1 -mkdir -p $SM1_DIR/ou1 $SM1_DIR/sm1ou1 $SM1_DIR/sm1ou2 -mkdir -p $SM2_DIR/ou2 $SM2_DIR/sm1ou1 $SM2_DIR/sm2ou1 $SM2_DIR/sm2ou2 - -cd $TESTDIR - -KILLPIDS= - -$SLAPPASSWD -g -n >$CONFIGPWF - -ID=1 - -if test $WAIT != 0 ; then - RETRY="1 60" -else - RETRY="1 10" -fi - -echo "Initializing master configurations..." -for dir in $SMC_DIR $SM1_DIR $SM2_DIR; do - $SLAPADD -F $dir/slapd.d -n 0 <<EOF -dn: cn=config -objectClass: olcGlobal -cn: config -olcServerID: $ID - -dn: olcDatabase={0}config,cn=config -objectClass: olcDatabaseConfig -olcDatabase: {0}config -olcRootPW:< file://$CONFIGPWF - -EOF - ID=`expr $ID + 1` -done - -echo "Initializing search configurations..." -for dir in $SS1_DIR $SS2_DIR $SSC_DIR; do - $SLAPADD -F $dir/slapd.d -n 0 <<EOF -dn: cn=config -objectClass: olcGlobal -cn: config - -dn: olcDatabase={0}config,cn=config -objectClass: olcDatabaseConfig -olcDatabase: {0}config -olcRootPW:< file://$CONFIGPWF - -EOF -done - -echo "Starting central master slapd on TCP/IP port $PORT1..." -cd $SMC_DIR -$SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 & -SMC_PID=$! -if test $WAIT != 0 ; then - echo PID $SMC_PID - read foo -fi -KILLPIDS="$KILLPIDS $SMC_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that central master slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI1 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Starting site1 master slapd on TCP/IP port $PORT2..." -cd $SM1_DIR -$SLAPD -F slapd.d -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 & -SM1_PID=$! -if test $WAIT != 0 ; then - echo PID $SM1_PID - read foo -fi -KILLPIDS="$KILLPIDS $SM1_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site1 master is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI2 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Starting site2 master slapd on TCP/IP port $PORT3..." -cd $SM2_DIR -$SLAPD -F slapd.d -h $URI3 -d $LVL $TIMING > $LOG3 2>&1 & -SM2_PID=$! -if test $WAIT != 0 ; then - echo PID $SM2_PID - read foo -fi -KILLPIDS="$KILLPIDS $SM2_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site2 master is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI3 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Starting central search slapd on TCP/IP port $PORT4..." -cd $SSC_DIR -$SLAPD -F slapd.d -h $URI4 -d $LVL $TIMING > $LOG4 2>&1 & -SSC_PID=$! -if test $WAIT != 0 ; then - echo PID $SSC_PID - read foo -fi -KILLPIDS="$KILLPIDS $SSC_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that central search slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI4 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - - -echo "Starting site1 search slapd on TCP/IP port $PORT5..." -cd $SS1_DIR -$SLAPD -F slapd.d -h $URI5 -d $LVL $TIMING > $LOG5 2>&1 & -SS1_PID=$! -if test $WAIT != 0 ; then - echo PID $SS1_PID - read foo -fi -KILLPIDS="$KILLPIDS $SS1_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site1 search slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI5 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - - -echo "Starting site2 search slapd on TCP/IP port $PORT6..." -cd $SS2_DIR -$SLAPD -F slapd.d -h $URI6 -d $LVL $TIMING > $LOG6 2>&1 & -SS2_PID=$! -if test $WAIT != 0 ; then - echo PID $SS2_PID - read foo -fi -KILLPIDS="$KILLPIDS $SS2_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site2 search slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI6 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -for uri in $URI1 $URI2 $URI3 $URI4 $URI5 $URI6; do - echo "Adding schema on $uri..." - $LDAPADD -D cn=config -H $uri -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 -include: file://$ABS_SCHEMADIR/core.ldif - -include: file://$ABS_SCHEMADIR/cosine.ldif - -include: file://$ABS_SCHEMADIR/inetorgperson.ldif - -include: file://$ABS_SCHEMADIR/openldap.ldif - -include: file://$ABS_SCHEMADIR/nis.ldif -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed for schema config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - [ "$BACKENDTYPE" = mod ] || continue - - echo "Adding backend module on $uri..." - $LDAPADD -D cn=config -H $uri -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 -dn: cn=module,cn=config -objectClass: olcModuleList -cn: module -olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND -olcModuleLoad: back_$BACKEND.la -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed for backend module ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -done - -echo "Adding database config on central master..." -if [ "$SYNCPROV" = syncprovmod ]; then - $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: cn=module,cn=config -objectClass: olcModuleList -cn: module -olcModulePath: $TESTWD/../servers/slapd/overlays -olcModuleLoad: syncprov.la - -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed for moduleLoad ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -fi - -nullExclude="" nullOK="" wantNoObj=32 -test $BACKEND = null && nullExclude="# " nullOK="OK" wantNoObj=0 - -$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/db -olcSuffix: $BASEDN -olcRootDN: $MANAGERDN -olcRootPW: $PASSWD - -dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -olcOverlay: {0}glue - -dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -objectClass: olcSyncProvConfig -olcOverlay: {1}syncprov -olcSpCheckpoint: 3 1 - -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/ou1 -olcSubordinate: TRUE -olcSuffix: ou=ou1,$BASEDN -olcRootDN: $MANAGERDN - -dn: olcDatabase={2}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {2}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/ou2 -olcSubordinate: TRUE -olcSuffix: ou=ou2,$BASEDN -olcRootDN: $MANAGERDN - -dn: olcDatabase={3}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {3}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou1 -olcSubordinate: TRUE -olcSuffix: ou=sm1ou1,$BASEDN -olcRootDN: $UPDATEDN - -dn: olcDatabase={4}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {4}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou2 -olcSubordinate: TRUE -olcSuffix: ou=sm1ou2,$BASEDN -olcRootDN: $UPDATEDN - -dn: olcDatabase={5}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {5}$BACKEND -${nullExclude}olcDbDirectory: $SMC_DIR/sm2ou1 -olcSubordinate: TRUE -olcSuffix: ou=sm2ou1,$BASEDN -olcRootDN: $UPDATEDN - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for central master database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding database config on site1 master..." -if [ "$SYNCPROV" = syncprovmod ]; then - $LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: cn=module,cn=config -objectClass: olcModuleList -cn: module -olcModulePath: $TESTWD/../servers/slapd/overlays -olcModuleLoad: syncprov.la - -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed for moduleLoad ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -fi - -$LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SM1_DIR/db -olcSuffix: $BASEDN -olcRootDN: $UPDATEDN - -dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -olcOverlay: {0}glue - -dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -objectClass: olcSyncProvConfig -olcOverlay: {1}syncprov - -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SM1_DIR/ou1 -olcSubordinate: TRUE -olcSuffix: ou=ou1,$BASEDN -olcRootDN: $UPDATEDN - -dn: olcDatabase={2}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {2}$BACKEND -${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou1 -olcSubordinate: TRUE -olcSuffix: ou=sm1ou1,$BASEDN -olcRootDN: ou=sm1ou1,$BASEDN -olcRootPW: $PASSWD - -dn: olcDatabase={3}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {3}$BACKEND -${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou2 -olcSubordinate: TRUE -olcSuffix: ou=sm1ou2,$BASEDN -olcRootDN: ou=sm1ou1,$BASEDN - -EOF - -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for site1 master database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding database config on site2 master..." -if [ "$SYNCPROV" = syncprovmod ]; then - $LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: cn=module,cn=config -objectClass: olcModuleList -cn: module -olcModulePath: $TESTWD/../servers/slapd/overlays -olcModuleLoad: syncprov.la - -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed for moduleLoad ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -fi - -$LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SM2_DIR/db -olcSuffix: $BASEDN -olcRootDN: $UPDATEDN - -dn: olcOverlay={0}glue,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -olcOverlay: {0}glue - -dn: olcOverlay={1}syncprov,olcDatabase={1}$BACKEND,cn=config -objectClass: olcOverlayConfig -objectClass: olcSyncProvConfig -olcOverlay: {1}syncprov -olcSpCheckpoint: 1 1 - -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SM2_DIR/ou2 -olcSubordinate: TRUE -olcSuffix: ou=ou2,$BASEDN -olcRootDN: $UPDATEDN - -dn: olcDatabase={2}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {2}$BACKEND -${nullExclude}olcDbDirectory: $SM2_DIR/sm1ou1 -olcSubordinate: TRUE -olcSuffix: ou=sm1ou1,$BASEDN -olcRootDN: $UPDATEDN - -dn: olcDatabase={3}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {3}$BACKEND -${nullExclude}olcDbDirectory: $SM2_DIR/sm2ou1 -olcSubordinate: TRUE -olcSuffix: ou=sm2ou1,$BASEDN -olcRootDN: ou=sm2ou1,$BASEDN -olcRootPW: $PASSWD - -dn: olcDatabase={4}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {4}$BACKEND -${nullExclude}olcDbDirectory: $SM2_DIR/sm2ou2 -olcSubordinate: TRUE -olcSuffix: ou=sm2ou2,$BASEDN -olcRootDN: ou=sm2ou1,$BASEDN - -EOF - -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for site2 master database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding access rules on central master..." -$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={-1}frontend,cn=config -changetype: modify -add: olcAccess -olcAccess: to dn.exact=dc=example,dc=com - by * read -olcAccess: to dn.subtree=ou=ou1,dc=example,dc=com - by * read -olcAccess: to dn.subtree=ou=ou2,dc=example,dc=com - by dn.exact=ou=ou1,dc=example,dc=com none - by dn.exact=ou=ou2,dc=example,dc=com read - by dn.exact=dc=example,dc=com none - by * read -olcAccess: to dn.subtree=ou=sm1ou1,dc=example,dc=com - by dn.exact=ou=ou1,dc=example,dc=com none - by dn.exact=ou=ou2,dc=example,dc=com read - by dn.exact=dc=example,dc=com none - by * read -olcAccess: to dn.subtree=ou=sm1ou2,dc=example,dc=com - by dn.exact=ou=ou1,dc=example,dc=com none - by dn.exact=ou=ou2,dc=example,dc=com none - by dn.exact=dc=example,dc=com read - by * read -olcAccess: to dn.subtree=ou=sm2ou1,dc=example,dc=com - by dn.exact=ou=ou1,dc=example,dc=com none - by dn.exact=ou=ou2,dc=example,dc=com none - by dn.exact=dc=example,dc=com none - by * read -olcAccess: to * by * read - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed for central master access config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding access rules on site1 master..." -$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={-1}frontend,cn=config -changetype: modify -add: olcAccess -olcAccess: to dn.subtree=dc=example,dc=com - by * read -olcAccess: to * by * read - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed for site1 master access config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding access rules on site2 master..." -$LDAPMODIFY -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={-1}frontend,cn=config -changetype: modify -add: olcAccess -olcAccess: to dn.exact=dc=example,dc=com - by * read -olcAccess: to dn.subtree=ou=ou2,dc=example,dc=com - by * read -olcAccess: to dn.subtree=ou=sm1ou1,dc=example,dc=com - by users none - by * read -olcAccess: to dn.subtree=ou=sm2ou1,dc=example,dc=com - by * read -olcAccess: to dn.subtree=ou=sm2ou2,dc=example,dc=com - by dn.exact=dc=example,dc=com read - by users none - by * read -olcAccess: to * by * read - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed for site2 master access config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding database config on central search..." -$LDAPADD -D cn=config -H $URI4 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SSC_DIR/db -olcSuffix: $BASEDN -olcRootDN: $UPDATEDN - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for central search database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding database config on site1 search..." -$LDAPADD -D cn=config -H $URI5 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SS1_DIR/db -olcSuffix: $BASEDN -olcRootDN: $UPDATEDN - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for site1 search database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding database config on site2 search..." -$LDAPADD -D cn=config -H $URI6 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -objectClass: olcDatabaseConfig -${nullExclude}objectClass: olc${BACKEND}Config -olcDatabase: {1}$BACKEND -${nullExclude}olcDbDirectory: $SS2_DIR/db -olcSuffix: $BASEDN -olcRootDN: $UPDATEDN - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed for site2 search database config ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Populating central master..." -$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: dc=example,dc=com -objectClass: top -objectClass: organization -objectClass: dcObject -dc: example -o: Example, Inc -userPassword: $PASSWD - -dn: ou=ou1,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: ou1 -userPassword: $PASSWD - -dn: ou=ou2,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: ou2 -userPassword: $PASSWD - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed to populate central master entry ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding syncrepl on site1 master..." -$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={4}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=1 provider=$URI1 searchbase="$BASEDN" - binddn="ou=ou1,$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on site1 master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding syncrepl on site2 master..." -$LDAPMODIFY -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={5}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=1 provider=$URI1 searchbase="$BASEDN" - binddn="ou=ou2,$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on site2 master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check that site1 master received changes..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI2 \ - -s base -b "ou=ou1,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site2 master received changes..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI3 \ - -s base -b "ou=ou1,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -sleep 1 - -echo "Populating site1 master..." -$LDAPADD -D "ou=sm1ou1,$BASEDN" -H $URI2 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm1ou1,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: sm1ou1 - -dn: ou=sm1ou2,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: sm1ou2 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed to populate site1 master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -sleep 1 - -echo "Populating site2 master..." -$LDAPADD -D "ou=sm2ou1,$BASEDN" -H $URI3 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm2ou1,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: sm2ou1 - -dn: ou=sm2ou2,dc=example,dc=com -objectClass: top -objectClass: organizationalUnit -ou: sm2ou2 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapadd failed to populate site2 master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -ERRORS=0 - -# TEST: -# Stop site1 master when adding syncrepl to the central master. When -# site1 master is started again both it and the central master will have -# the same number of contextCSN values, but the ones on central master -# will be the newest. The central master will not update its contextCSN -# values unless the bug in ITS#5597 have been fixed. -echo "Stopping site1 master..." -kill -HUP "$SM1_PID" -wait "$SM1_PID" -KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SM1_PID / /"`; -SM1_PID= - -echo "Adding syncrepl on central master..." -$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={3}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=3 provider=$URI2 searchbase="ou=sm1ou1,$BASEDN" - binddn="ou=sm1ou1,$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -dn: olcDatabase={5}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=5 provider=$URI3 searchbase="ou=sm2ou1,$BASEDN" - binddn="ou=sm2ou1,$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on central master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 -echo "Using ldapsearch to check that central master received site2 entries..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm2ou1,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -# Test for ITS#6716, modify on central master to ensure that the CSN -# order is "sid2 < sid3 < sid1". When site1 master starts it is likely -# to sync with central master before it syncs with site1 master. When -# central master syncs with site1 master they will share the sid1 and -# sid3 CSNs, the additonal sid2 CSN hold by site1 master will be the -# oldest. Central master will not receive the changes made on site1 -# master unless it completely ignores the CSNs presented by central -# master. -echo "Using ldapmodify to modify central master..." -$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -if test -z "$SM1_PID" ; then - echo "Restarting site1 master slapd on TCP/IP port $PORT2..." - cd $SM1_DIR - $SLAPD -F slapd.d -h $URI2 -d $LVL $TIMING >> $LOG2 2>&1 & - SM1_PID=$! - if test $WAIT != 0 ; then - echo PID $SM1_PID - read foo - fi - KILLPIDS="$KILLPIDS $SM1_PID" - cd $TESTWD - sleep 1 -fi -sleep 1 -echo "Using ldapsearch to check that site1 master is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI2 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that central master received site1 entries..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm1ou1,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site1 master received central master update..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI2 \ - -s base -b "$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site2 master received central master update..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI3 \ - -s base -b "$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -# Test done, now some more intialization... - -echo "Adding syncrepl consumer on central search..." -$LDAPMODIFY -D cn=config -H $URI4 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=1 provider=$URI1 searchbase="$BASEDN" - binddn="$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on site1 search ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding syncrepl consumer on site1 search..." -$LDAPMODIFY -D cn=config -H $URI5 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=1 provider=$URI2 searchbase="$BASEDN" - binddn="$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on site1 search ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Adding syncrepl consumer on site2 search..." -$LDAPMODIFY -D cn=config -H $URI6 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={1}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=1 provider=$URI3 searchbase="$BASEDN" - binddn="$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on site2 search ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check that central search received changes..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site1 search received changes..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI5 \ - -s base -b "$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site2 search received changes..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -# Create a script that will check the contextCSN values of all servers, -# and restart them to re-synchronize if it finds any errors: -cat > $TESTDIR/checkcsn.sh <<'EOF' -#!/bin/sh - -CSN_ERRORS=0 - -CSN1=`$LDAPSEARCH -H $URI1 -b $BASEDN -s base contextCSN | grep contextCSN | sort` -CSN2=`$LDAPSEARCH -H $URI2 -b $BASEDN -s base contextCSN | grep contextCSN | sort` -CSN3=`$LDAPSEARCH -H $URI3 -b $BASEDN -s base contextCSN | grep contextCSN | sort` -CSN4=`$LDAPSEARCH -H $URI4 -b $BASEDN -s base contextCSN | grep contextCSN | sort` -CSN5=`$LDAPSEARCH -H $URI5 -b $BASEDN -s base contextCSN | grep contextCSN | sort` -CSN6=`$LDAPSEARCH -H $URI6 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - -if test -z "$CSN1" ; then - echo "ERROR: contextCSN empty on central master" - CSN_ERRORS=`expr $CSN_ERRORS + 1` -fi -nCSN=`echo "$CSN1" | wc -l` -if test "$nCSN" -ne 3 ; then - echo "ERROR: Wrong contextCSN count on central master, should be 3" - CSN_ERRORS=`expr $CSN_ERRORS + 1` - if test -n "$CSN_VERBOSE"; then - echo "$CSN1" - fi -fi -if test -z "$CSN2" -o "$CSN1" != "$CSN2" ; then - echo "ERROR: contextCSN mismatch between central master and site1 master" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on site1 master:" - echo "$CSN2" - fi -fi -if test -z "$CSN3" -o "$CSN1" != "$CSN3" ; then - echo "ERROR: contextCSN mismatch between central master and site2 master" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on site2 master:" - echo "$CSN3" - fi -fi -if test -z "$CSN4" -o "$CSN1" != "$CSN4" ; then - echo "ERROR: contextCSN mismatch between central master and central search" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on central search:" - echo "$CSN4" - fi -fi -if test -z "$CSN5" -o "$CSN2" != "$CSN5" ; then - echo "ERROR: contextCSN mismatch between site1 master and site1 search" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on site1 master:" - echo "$CSN2" - echo "contextCSN on site1 search:" - echo "$CSN5" - fi -fi -if test -z "$CSN6" -o "$CSN3" != "$CSN6" ; then - echo "ERROR: contextCSN mismatch between site2 master and site2 search:" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on site2 master:" - echo "$CSN3" - echo "contextCSN on site2 search:" - echo "$CSN6" - fi -fi - -if test $CSN_ERRORS != 0 ; then - echo "Stopping all servers to synchronize contextCSN..." - kill -HUP $KILLPIDS - for pid in $KILLPIDS ; do wait $pid ; done - KILLPIDS= - - echo "Restarting site1 master slapd on TCP/IP port $PORT2..." - cd $SM1_DIR - $SLAPD -F slapd.d -h $URI2 -d $LVL $TIMING >> $LOG2 2>&1 & - SM1_PID=$! - if test $WAIT != 0 ; then - echo PID $SM1_PID - read foo - fi - KILLPIDS="$KILLPIDS $SM1_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site1 master is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI2 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Restarting site2 master slapd on TCP/IP port $PORT3..." - cd $SM2_DIR - $SLAPD -F slapd.d -h $URI3 -d $LVL $TIMING >> $LOG3 2>&1 & - SM2_PID=$! - if test $WAIT != 0 ; then - echo PID $SM2_PID - read foo - fi - KILLPIDS="$KILLPIDS $SM2_PID " - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site2 master is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI3 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Restarting central master slapd on TCP/IP port $PORT1..." - cd $SMC_DIR - $SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 & - SMC_PID=$! - if test $WAIT != 0 ; then - echo PID $SMC_PID - read foo - fi - KILLPIDS="$KILLPIDS $SMC_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that central master slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI1 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Sleeping 5 seconds to allow contextCSN to synchronize..." - sleep 5 - - echo "Stopping site1 and site2 master..." - kill -HUP $SM1_PID $SM2_PID - for pid in $SM1_PID $SM2_PID ; do wait $pid ; done - KILLPIDS=" $SMC_PID" - - echo "Restarting site1 master slapd on TCP/IP port $PORT2..." - cd $SM1_DIR - $SLAPD -F slapd.d -h $URI2 -d $LVL $TIMING >> $LOG2 2>&1 & - SM1_PID=$! - if test $WAIT != 0 ; then - echo PID $SM1_PID - read foo - fi - KILLPIDS="$KILLPIDS $SM1_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site1 master is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI2 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Restarting site2 master slapd on TCP/IP port $PORT3..." - cd $SM2_DIR - $SLAPD -F slapd.d -h $URI3 -d $LVL $TIMING >> $LOG3 2>&1 & - SM2_PID=$! - if test $WAIT != 0 ; then - echo PID $SM2_PID - read foo - fi - KILLPIDS="$KILLPIDS $SM2_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site2 master is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI3 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Sleeping 5 seconds to allow contextCSN to synchronize..." - sleep 5 - - echo "Restarting central search slapd on TCP/IP port $PORT4..." - cd $SSC_DIR - $SLAPD -F slapd.d -h $URI4 -d $LVL $TIMING >> $LOG4 2>&1 & - SSC_PID=$! - if test $WAIT != 0 ; then - echo PID $SSC_PID - read foo - fi - KILLPIDS="$KILLPIDS $SSC_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that central search slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI4 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Restarting site1 search slapd on TCP/IP port $PORT5..." - cd $SS1_DIR - $SLAPD -F slapd.d -h $URI5 -d $LVL $TIMING >> $LOG5 2>&1 & - SS1_PID=$! - if test $WAIT != 0 ; then - echo PID $SS1_PID - read foo - fi - KILLPIDS="$KILLPIDS $SS1_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site1 search slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI5 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Restarting site2 search slapd on TCP/IP port $PORT6..." - cd $SS2_DIR - $SLAPD -F slapd.d -h $URI6 -d $LVL $TIMING >> $LOG6 2>&1 & - SS2_PID=$! - if test $WAIT != 0 ; then - echo PID $SS2_PID - read foo - fi - KILLPIDS="$KILLPIDS $SS2_PID" - cd $TESTWD - sleep 1 - echo "Using ldapsearch to check that site2 search slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI6 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Sleeping 5 seconds to allow contextCSN to synchronize..." - sleep 5 - - echo "Checking contextCSN after restart..." - CSN1=`$LDAPSEARCH -H $URI1 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - CSN2=`$LDAPSEARCH -H $URI2 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - CSN3=`$LDAPSEARCH -H $URI3 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - CSN4=`$LDAPSEARCH -H $URI4 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - CSN5=`$LDAPSEARCH -H $URI5 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - CSN6=`$LDAPSEARCH -H $URI6 -b $BASEDN -s base contextCSN | grep contextCSN | sort` - if test -z "$CSN1" ; then - echo "ERROR: contextCSN empty on central master" - CSN_ERRORS=`expr $CSN_ERRORS + 1` - fi - - if test -z "$CSN2" -o "$CSN1" != "$CSN2" ; then - echo "ERROR: contextCSN mismatch between central master and site1 master" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on site1 master:" - echo "$CSN2" - fi - fi - if test -z "$CSN3" -o "$CSN1" != "$CSN3" ; then - echo "ERROR: contextCSN mismatch between central master and site2 master" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on site2 master:" - echo "$CSN3" - fi - fi - if test -z "$CSN4" -o "$CSN1" != "$CSN4" ; then - echo "ERROR: contextCSN mismatch between central master and central search" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on central master:" - echo "$CSN1" - echo "contextCSN on central search:" - echo "$CSN4" - fi - fi - if test -z "$CSN5" -o "$CSN2" != "$CSN5" ; then - echo "ERROR: contextCSN mismatch between site1 master and site1 search" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on site1 master:" - echo "$CSN2" - echo "contextCSN on site1 search:" - echo "$CSN5" - fi - fi - if test -z "$CSN6" -o "$CSN3" != "$CSN6" ; then - echo "ERROR: contextCSN mismatch between site2 master and site2 search:" - CSN_ERRORS=`expr $CSN_ERRORS + 1`; - if test -n "$CSN_VERBOSE"; then - echo "contextCSN on site2 master:" - echo "$CSN3" - echo "contextCSN on site2 search:" - echo "$CSN6" - fi - fi -fi - -ERRORS=`expr $ERRORS + $CSN_ERRORS` - -EOF - -test $BACKEND = null && echo : > $TESTDIR/checkcsn.sh - -chmod +x $TESTDIR/checkcsn.sh - - -echo "Checking contextCSN after initial replication..." -. $TESTDIR/checkcsn.sh - -# TEST: -# Test that updates to the first backend on central master, which should -# be replicated to all servers actually is so, and that the contextCSN is -# updated everywhere: -echo "Using ldapmodify to modify first backend on central master..." -$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=ou1,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check replication to central search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check replication to site1 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI5 \ - -s base -b "ou=ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check replication to site2 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "ou=ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Checking contextCSN after modify of first backend on central master..." -. $TESTDIR/checkcsn.sh - -# TEST: -# Test that updates to the second backend on central master is only -# replicated to those search servers that should receive that backend. -# The contextCSN should still be updated everywhere: -MNUM=`expr $MNUM + 1` -echo "Using ldapmodify to modify second backend on central master..." -$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=ou2,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check replication to site2 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "ou=ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check no replication to site1 master..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI2 \ - -s base -b "ou=ou2,$BASEDN" \ - "(description=Modify$NMUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to site1 search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Using ldapsearch to check no replication to central search..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to central search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Checking contextCSN after modify of second backend on central master..." -. $TESTDIR/checkcsn.sh - -# TEST: -# Test that updates to the first backend on site1 master, which should be -# replicated everywhere except to central and site2 search. The contextCSN -# should be updated on all servers: -MNUM=`expr $MNUM + 1` -echo "Using ldapmodify to modify first backend on site1 master..." -$LDAPMODIFY -D "ou=sm1ou1,$BASEDN" -H $URI2 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm1ou1,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check replication to site1 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI5 \ - -s base -b "ou=sm1ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check replication to site2 master..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI3 \ - -s base -b "ou=sm1ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check no replication to site2 search..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to central search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Using ldapsearch to check no replication to central search..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to central search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Checking contextCSN after modify of first backend on site1 master..." -. $TESTDIR/checkcsn.sh - - -# TEST: -# Test updates to the second backend on site1 master, which should only be -# replicated to site1 search. The contextCSN should be updated everywhere. -MNUM=`expr $MNUM + 1` -echo "Using ldapmodify to modify second backend on site1 master..." -$LDAPMODIFY -D "ou=sm1ou1,$BASEDN" -H $URI2 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm1ou2,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - - -echo "Using ldapsearch to check replication to site1 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI5 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check no replication to central master..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - "(description=Modify$NMUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to site2 search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Checking contextCSN after modify of second backend on site1 master..." -. $TESTDIR/checkcsn.sh - - -# TEST: -# Test updates to first backend on site2 master, which should be -# replicated to the central servers, but not site1. The contextCSN -# should be updated everywhere: -MNUM=`expr $MNUM + 1` -echo "Using ldapmodify to modify first backend on site2 master..." -$LDAPMODIFY -D "ou=sm2ou1,$BASEDN" -H $URI3 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm2ou1,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check replication to central master..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm2ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check replication to site2 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "ou=sm2ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check no replication to site1 master..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI2 \ - -s base -b "ou=sm2ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to site2 search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Using ldapsearch to check no replication to central search..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=sm2ou1,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to site2 search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Checking contextCSN after modify of first backend on site2 master..." -. $TESTDIR/checkcsn.sh - - -# TEST: -# Test updates to the second backend on site2 master, which should only be -# replicated to site2 search. As always, contextCSN should be updated -# everywhere: -MNUM=`expr $MNUM + 1` -echo "Using ldapmodify to modify second backend on site2 master..." -$LDAPMODIFY -D "ou=sm2ou1,$BASEDN" -H $URI3 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: ou=sm2ou2,dc=example,dc=com -changetype: modify -add: description -description: Modify$MNUM - -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check replication to site2 search..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "ou=sm2ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check no replication to central master..." -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=sm2ou2,$BASEDN" \ - "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "NOK"}'` - if test "x$RESULT" = "xNOK" ; then - echo "Change was replicated to central search!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit 1 - fi - sleep 1 -done - -echo "Checking contextCSN after modify of second backend on site2 master..." -. $TESTDIR/checkcsn.sh - -# TEST: -# Test that all contextCSN values are updated on the slaves when they -# starts with an empty database. Start site2 master first, then site2 -# search and finally central master so that the site2 search's syncrepl -# connection has been set up when site2 master receives the database: -echo "Stopping central master and site2 servers to test start with empty db..." -kill -HUP $SMC_PID $SM2_PID $SS2_PID -for pid in $SMC_PID $SM2_PID $SS2_PID; do wait $pid ; done -KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SMC_PID / /"`; -KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SM2_PID / /"`; -KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SS2_PID / /"`; -SMC_PID= -SM2_PID= -SS2_PID= -rm -rf $SM2_DIR/db/* -rm -rf $SS2_DIR/db/* - -echo "Starting site2 master slapd on TCP/IP port $PORT3..." -cd $SM2_DIR -$SLAPD -F slapd.d -h $URI3 -d $LVL $TIMING >> $LOG3 2>&1 & -SM2_PID=$! -if test $WAIT != 0 ; then - echo PID $SM2_PID - read foo -fi -KILLPIDS="$KILLPIDS $SM2_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site2 master slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI3 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Starting site2 search slapd on TCP/IP port $PORT6..." -cd $SS2_DIR -$SLAPD -F slapd.d -h $URI6 -d $LVL $TIMING >> $LOG6 2>&1 & -SS2_PID=$! -if test $WAIT != 0 ; then - echo PID $SS2_PID - read foo -fi -KILLPIDS="$KILLPIDS $SS2_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that site2 search slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI6 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Starting central master slapd on TCP/IP port $PORT1..." -cd $SMC_DIR -$SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 & -SMC_PID=$! -if test $WAIT != 0 ; then - echo PID $SMC_PID - read foo -fi -KILLPIDS="$KILLPIDS $SMC_PID" -cd $TESTWD -sleep 1 -echo "Using ldapsearch to check that central master slapd is running..." -for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI1 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site2 master received base..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI3 \ - -s base -b "$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -echo "Using ldapsearch to check that site2 search received base..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI6 \ - -s base -b "$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi - -sleep $SLEEP1 - -echo "Checking contextCSN after site2 servers repopulated..." -. $TESTDIR/checkcsn.sh - -if test $ERRORS -ne 0; then - test $KILLSERVERS != no && kill -HUP $KILLPIDS - echo "Found $ERRORS errors" - exit $ERRORS -fi - -# TEST: -# Adding syncrepl of the second site1 master backend on central master -# will not initialize the database unless the contextCSN attribute is -# stored in the suffix of the database and not the suffix of the glue -# database: -echo "Adding syncrepl of second site1 master backend on central master..." -$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 -dn: olcDatabase={4}$BACKEND,cn=config -changetype: modify -add: olcSyncRepl -olcSyncRepl: rid=4 provider=$URI2 searchbase="ou=sm1ou2,$BASEDN" - binddn="ou=sm1ou1,$BASEDN" bindmethod=simple credentials=$PASSWD - type=refreshAndPersist retry="$RETRY" timeout=1 -EOF -RC=$? -if test $RC != 0 ; then - echo "ldapmodify failed to add syncrepl on central master ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC -fi -sleep 1 - -echo "Using ldapsearch to check that central master received second site1 backend..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ERROR: Second site1 backend not replicated to central master" - ERRORS=`expr $ERRORS + 1` - - echo "Restarting central master slapd on TCP/IP port $PORT1..." - kill -HUP $SMC_PID - wait $SMC_PID - KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SMC_PID / /"`; - - cd $SMC_DIR - $SLAPD -F slapd.d -h $URI1 -c rid=4,csn=0 -d $LVL $TIMING >> $LOG1 2>&1 & - SMC_PID=$! - if test $WAIT != 0 ; then - echo PID $SMC_PID - read foo - fi - KILLPIDS="$KILLPIDS $SMC_PID" - cd $TESTWD - echo "Using ldapsearch to check that central master slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI1 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Using ldapsearch to check that central master received second site1 backend..." - RC=32 - for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI1 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -fi - -echo "Using ldapsearch to check that central search received second site1 backend..." -RC=32 -for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i -done -if test $RC != 0 ; then - echo "ERROR: Second site1 backend not replicated to central search" - ERRORS=`expr $ERRORS + 1` - - echo "Restarting central search slapd on TCP/IP port $PORT4..." - kill -HUP $SSC_PID - wait $SSC_PID - KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SSC_PID / /"`; - - cd $SSC_DIR - $SLAPD -F slapd.d -h $URI4 -c rid=1,csn=0 -d $LVL $TIMING >> $LOG4 2>&1 & - SSC_PID=$! - if test $WAIT != 0 ; then - echo PID $SSC_PID - read foo - fi - KILLPIDS="$KILLPIDS $SSC_PID" - cd $TESTWD - echo "Using ldapsearch to check that central search slapd is running..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "" -H $URI4 \ - 'objectclass=*' > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - echo "Waiting $i seconds for slapd to start..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Using ldapsearch to check that central search received second site1 backend..." - RC=32 - for i in 1 2 3 4 5; do - RESULT=`$LDAPSEARCH -H $URI4 \ - -s base -b "ou=sm1ou2,$BASEDN" \ - '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` - if test "x$RESULT$nullOK" = "xOK" ; then - RC=0 - break - fi - echo "Waiting $i seconds for syncrepl to receive changes..." - sleep $i - done - if test $RC != 0 ; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi -fi - - -# TEST: -# Run race tests when more than one backend is replicated from the same -# provider. This will usually fail long before 100 iterations unless -# syncrepl stores the contextCSN in the suffix of its own database, and -# that syncprov follows these rules before updating its own CSN when it -# detects updates from syncrepl: -# 1) A contextCSN value must have been stored in the suffix of all the -# syncrepl configured databases within the glued syncprov database. -# 2) Of all contextCSN values stored by syncrepl with the same SID, -# syncprov must always select the one with the lowest csn value. -test -z "$RACE_TESTS" && RACE_TESTS=10 -RACE_NUM=0 -RACE_ERROR=0 - -SUB_DN=ou=sub,ou=sm1ou2,dc=example,dc=com - -while test $RACE_ERROR -eq 0 -a $RACE_NUM -lt $RACE_TESTS ; do - RACE_NUM=`expr $RACE_NUM + 1` - echo "Running $RACE_NUM of $RACE_TESTS syncrepl race tests..." - - echo "Stopping central master..." - kill -HUP $SMC_PID - wait $SMC_PID - KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SMC_PID / /"`; - - MNUM=`expr $MNUM + 1` - echo "Using ldapadd to add entry on site1 master..." - $LDAPADD -D "ou=sm1ou1,$BASEDN" -H $URI2 -w $PASSWD <<EOF >> $TESTOUT 2>&1 -dn: $SUB_DN -objectClass: top -objectClass: organizationalUnit -ou: sub - -EOF - RC=$? - if test $RC != 0 ; then - echo "ldapadd failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Starting central master again..." - cd $SMC_DIR - $SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 & - SMC_PID=$! - KILLPIDS="$KILLPIDS $SMC_PID" - cd $TESTWD - echo "Using ldapsearch to check that central master received entry..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "$SUB_DN" -H $URI1 > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - sleep $i - done - if test $RC != 0 ; then - echo "ERROR: entry not replicated to central master!" - RACE_ERROR=1 - break - fi - - echo "Using ldapsearch to check that central search received entry..." - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "$SUB_DN" -H $URI4 > /dev/null 2>&1 - RC=$? - test $RC = 0 && break - sleep $i - done - if test $RC != 0 ; then - echo "ERROR: entry not replicated to central master!" - RACE_ERROR=1 - break - fi - - echo "Stopping central master..." - kill -HUP $SMC_PID - wait $SMC_PID - KILLPIDS=`echo "$KILLPIDS " | sed -e "s/ $SMC_PID / /"`; - - echo "Using ldapdelete to delete entry on site1 master..." - $LDAPDELETE -D "ou=sm1ou1,$BASEDN" -H $URI2 -w $PASSWD "$SUB_DN" - RC=$? - if test $RC != 0 ; then - echo "ldapdelete failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - - echo "Starting central master again..." - cd $SMC_DIR - $SLAPD -F slapd.d -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 & - SMC_PID=$! - KILLPIDS="$KILLPIDS $SMC_PID" - cd $TESTWD - - echo "Using ldapsearch to check that entry was deleted on central master..." - RC=0 - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "$SUB_DN" -H $URI1 > /dev/null 2>&1 - RC=$? - if test $RC = $wantNoObj; then break; fi - sleep $i - done - - if test $RC != $wantNoObj; then - if test $RC != 0; then - echo "ldapsearch failed ($RC)!" - test $KILLSERVERS != no && kill -HUP $KILLPIDS - exit $RC - fi - echo "ERROR: Entry not removed on central master!" - RACE_ERROR=1 - break - fi - - echo "Using ldapsearch to check that entry was deleted on central search..." - RC=0 - for i in 1 2 3 4 5; do - $LDAPSEARCH -s base -b "$SUB_DN" -H $URI4 > /dev/null 2>&1 - RC=$? - if test $RC != 0; then break; fi - sleep $i - done - - if test $RC != $wantNoObj; then - echo "ERROR: Entry not removed on central search! (RC=$RC)" - RACE_ERROR=1 - break - fi -done - -if test $RACE_ERROR != 0; then - echo "Race error found after $RACE_NUM of $RACE_TESTS iterations" - ERRORS=`expr $ERRORS + $RACE_ERROR` -else - echo "No race errors found after $RACE_TESTS iterations" -fi - -test $KILLSERVERS != no && kill -HUP $KILLPIDS - -if test $ERRORS -ne 0; then - echo "Found $ERRORS errors" - echo ">>>>>> Exiting with a false success status for now" - exit 0 -fi - -echo ">>>>> Test succeeded" - -exit 0