mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-05-28 04:35:57 -04:00
Also improve KILLPIDS tracking. Waiting on multiple jobs and relying on wait exit code being != 0 if at least one process returned != 0 might not be portable but is the best we can do for now. We can address that in the future.
517 lines
12 KiB
Bash
Executable file
517 lines
12 KiB
Bash
Executable file
#! /bin/sh
|
|
# $OpenLDAP$
|
|
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
##
|
|
## Copyright 1998-2026 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 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 <<EOF
|
|
dn: cn=config
|
|
objectClass: olcGlobal
|
|
cn: config
|
|
olcServerID: 1
|
|
|
|
dn: olcDatabase={0}config,cn=config
|
|
objectClass: olcDatabaseConfig
|
|
olcDatabase: {0}config
|
|
olcRootPW:< file://$CONFIGPWF
|
|
|
|
EOF
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "slapadd failed ($RC)!"
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Initializing provider2 configurations..."
|
|
$SLAPADD -F $CFPRO2 -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
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "slapadd failed ($RC)!"
|
|
exit $RC
|
|
fi
|
|
|
|
$SLAPADD -F $CFCONS -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
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "slapadd failed ($RC)!"
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Starting provider slapd on TCP/IP port $PORT1..."
|
|
cd $PRODDIR
|
|
$SLAPD -F slapd.d -h $URI1 -d $LVL > $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 <<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 databases on provider..."
|
|
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=""
|
|
test $BACKEND = null && nullExclude="# " nullOK="OK"
|
|
|
|
$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: $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 <<EOF >> $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 <<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: $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 <<EOF >> $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 <<EOF >> $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 <<EOF >> $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 <<EOF >> $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 <<EOF >> $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 <<EOF >> $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 <<EOF >> $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 && wait $KILLPIDS || exit $?; }
|
|
test "$lock_bug" = 2 && exit 2
|
|
|
|
echo ">>>>> Test succeeded"
|
|
|
|
exit 0
|