#! /bin/sh # $OpenLDAP$ ## This work is part of OpenLDAP Software . ## ## Copyright 1998-2022 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 ## . # This script tests a bug where syncprov used on a glue database # with a subordinate syncrepl consumer database looses a read-lock # on the glue suffix entry when a modification is received on the # syncrepl consumer. The bug is only triggered when there is an # active syncrepl consumers of the glue suffix entry. echo "running defines.sh" . $SRCDIR/scripts/defines.sh if test $SYNCPROV = syncprovno; then echo "Syncrepl provider overlay not available, test skipped" exit 0 fi PRODDIR=$TESTDIR/prod PRO2DIR=$TESTDIR/pro2 CONSDIR=$TESTDIR/cons CFPROD=$PRODDIR/slapd.d CFPRO2=$PRO2DIR/slapd.d CFCONS=$CONSDIR/slapd.d mkdir -p $TESTDIR mkdir -p $PRODDIR $CFPROD $PRODDIR/db $PRODDIR/ou1 mkdir -p $PRO2DIR $CFPRO2 $PRO2DIR/db mkdir -p $CONSDIR $CFCONS $CONSDIR/db cd $TESTDIR KILLPIDS= $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" ;; *) echo "unknown sync mode $SYNCMODE" exit 1; ;; esac echo "Initializing provider configurations..." $SLAPADD -F $CFPROD -n 0 < $LOG1 2>&1 & PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$KILLPIDS $PID" cd $TESTWD sleep 1 echo "Using ldapsearch to check that provider slapd is running..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "" -H $URI1 \ '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 echo "Starting provider2 slapd on TCP/IP port $PORT2..." cd $PRO2DIR $SLAPD -F slapd.d -h $URI2 -d $LVL > $LOG2 2>&1 & PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$KILLPIDS $PID" cd $TESTWD sleep 1 echo "Using ldapsearch to check that provider slapd is running..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "" -H $URI2 \ '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 echo "Starting consumer slapd on TCP/IP port $PORT3..." cd $CONSDIR $SLAPD -F slapd.d -h $URI3 -d $LVL > $LOG3 2>&1 & PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$KILLPIDS $PID" cd $TESTWD sleep 1 echo "Using ldapsearch to check that consumer slapd is running..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "" -H $URI3 \ '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 for uri in $URI1 $URI2 $URI3; do echo "Adding schema on $uri..." $LDAPADD -D cn=config -H $uri -y $CONFIGPWF < $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 <>$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 databases on provider..." if [ "$SYNCPROV" = syncprovmod ]; then $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <> $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="" test $BACKEND = null && nullExclude="# " nullOK="OK" $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <> $TESTOUT 2>&1 dn: olcDatabase={1}$BACKEND,cn=config objectClass: olcDatabaseConfig ${nullExclude}objectClass: olc${BACKEND}Config olcDatabase: {1}$BACKEND ${nullExclude}olcDbDirectory: $PRODDIR/db olcSuffix: $BASEDN olcRootDN: $MANAGERDN olcRootPW: $PASSWD EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed for provider database config1 ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <> $TESTOUT 2>&1 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: $PRODDIR/ou1 olcSubordinate: TRUE olcSuffix: ou=ou1,$BASEDN olcRootDN: $MANAGERDN EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed for provider database config ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Adding databases on provider2..." if [ "$SYNCPROV" = syncprovmod ]; then $LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <> $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 <> $TESTOUT 2>&1 dn: olcDatabase={1}$BACKEND,cn=config objectClass: olcDatabaseConfig ${nullExclude}objectClass: olc${BACKEND}Config olcDatabase: {1}$BACKEND ${nullExclude}olcDbDirectory: $PRO2DIR/db olcSuffix: $BASEDN olcRootDN: $MANAGERDN olcRootPW: $PASSWD dn: olcOverlay={0}syncprov,olcDatabase={1}$BACKEND,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: {0}syncprov EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed for provider database config ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Adding databases on consumer..." $LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <> $TESTOUT 2>&1 dn: olcDatabase={1}$BACKEND,cn=config objectClass: olcDatabaseConfig ${nullExclude}objectClass: olc${BACKEND}Config olcDatabase: {1}$BACKEND ${nullExclude}olcDbDirectory: $CONSDIR/db olcSuffix: $BASEDN olcRootDN: $MANAGERDN EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed for consumer database config ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Populating provider..." $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD <> $TESTOUT 2>&1 dn: dc=example,dc=com objectClass: top objectClass: organization objectClass: dcObject dc: example o: Example, Inc dn: ou=ou1,dc=example,dc=com objectClass: top objectClass: organizationalUnit ou: ou1 EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed to populate provider entry ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Populating provider2..." $LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD <> $TESTOUT 2>&1 dn: dc=example,dc=com objectClass: top objectClass: organization objectClass: dcObject dc: example o: Example, Inc dn: ou=ou1,dc=example,dc=com objectClass: top objectClass: organizationalUnit ou: ou1 EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed to populate provider entry ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Adding syncrepl on provider..." $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <> $TESTOUT 2>&1 dn: olcDatabase={1}$BACKEND,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=1 provider=$URI2 searchbase="ou=ou1,$BASEDN" binddn="$MANAGERDN" bindmethod=simple credentials=$PASSWD $SYNCTYPE retry="3 5 300 5" timeout=1 EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed to add syncrepl consumer ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Adding syncrepl consumer on consumer..." $LDAPMODIFY -D cn=config -H $URI3 -y $CONFIGPWF <> $TESTOUT 2>&1 dn: olcDatabase={1}$BACKEND,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=1 provider=$URI1 searchbase="$BASEDN" binddn="$MANAGERDN" bindmethod=simple credentials=$PASSWD $SYNCTYPE retry="3 5 300 5" timeout=1 EOF RC=$? if test $RC != 0 ; then echo "ldapmodify failed to add syncrepl consumer ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Using ldapsearch to check that consumer received changes..." RC=32 for i in 0 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 $SLEEP1 seconds for syncrepl to receive changes..." sleep $SLEEP1 done if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Using ldapmodify to modify provider2..." $LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD <> $TESTOUT 2>&1 dn: ou=ou1,dc=example,dc=com changetype: modify add: description description: Modify1 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 that consumer received changes..." RC=32 for i in 0 1 2 3 4 5; do RESULT=`$LDAPSEARCH -H $URI3 \ -s base -b "ou=ou1,$BASEDN" \ '(description=Modify1)' 2>&1 | awk '/^dn:/ {print "OK"}'` if test "x$RESULT$nullOK" = "xOK" ; then RC=0 break fi echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." sleep $SLEEP1 done if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Using ldapmodify to modify glue suffix on provider..." $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD <> $TESTOUT 2>&1 dn: dc=example,dc=com changetype: modify add: description description: Test1 EOF RC=$? if test $RC != 0 ; then echo "ldapadd failed to modify suffix ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi test $KILLSERVERS != no && kill -HUP $KILLPIDS test "$lock_bug" = 2 && exit 2 echo ">>>>> Test succeeded" exit 0