mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-22 23:59:34 -05:00
Make two successive modifications of the same attribute separate. This lets the consumer interpret the log entry the same way as the server that produced it. Still depends on the log entry attributes being read in the same order as they were written.
399 lines
10 KiB
Bash
Executable file
399 lines
10 KiB
Bash
Executable file
#! /bin/sh
|
|
# $OpenLDAP$
|
|
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
##
|
|
## Copyright 1998-2017 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>.
|
|
|
|
echo "running defines.sh"
|
|
. $SRCDIR/scripts/defines.sh
|
|
|
|
if test $SYNCPROV = syncprovno; then
|
|
echo "Syncrepl provider overlay not available, test skipped"
|
|
exit 0
|
|
fi
|
|
if test $ACCESSLOG = accesslogno; then
|
|
echo "Accesslog overlay not available, test skipped"
|
|
exit 0
|
|
fi
|
|
if test $BACKEND = ldif ; then
|
|
# Onelevel search does not return entries in order of creation or CSN.
|
|
echo "$BACKEND backend unsuitable for syncprov logdb, test skipped"
|
|
exit 0
|
|
fi
|
|
|
|
mkdir -p $TESTDIR $DBDIR1A $DBDIR1B $DBDIR2
|
|
|
|
SPEC="mdb=a,bdb=a,hdb=a"
|
|
|
|
#
|
|
# Test replication:
|
|
# - start provider
|
|
# - start consumer
|
|
# - populate over ldap
|
|
# - perform some modifies and deleted
|
|
# - attempt to modify the consumer (referral or chain)
|
|
# - retrieve database over ldap and compare against expected results
|
|
#
|
|
|
|
echo "Starting provider slapd on TCP/IP port $PORT1..."
|
|
. $CONFFILTER $BACKEND $MONITORDB < $DSRMASTERCONF > $CONF1
|
|
$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
|
|
PID=$!
|
|
if test $WAIT != 0 ; then
|
|
echo PID $PID
|
|
read foo
|
|
fi
|
|
KILLPIDS="$PID"
|
|
|
|
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 "$MONITOR" -h $LOCALHOST -p $PORT1 \
|
|
'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 "Using ldapadd to create the context prefix entries in the provider..."
|
|
$LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
|
|
$LDIFORDEREDCP > /dev/null 2>&1
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "ldapadd failed ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Starting consumer slapd on TCP/IP port $PORT2..."
|
|
. $CONFFILTER $BACKEND $MONITORDB < $DSRSLAVECONF > $CONF2
|
|
$SLAPD -f $CONF2 -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 &
|
|
SLAVEPID=$!
|
|
if test $WAIT != 0 ; then
|
|
echo SLAVEPID $SLAVEPID
|
|
read foo
|
|
fi
|
|
KILLPIDS="$KILLPIDS $SLAVEPID"
|
|
|
|
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 "$MONITOR" -h $LOCALHOST -p $PORT2 \
|
|
'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 "Using ldapadd to populate the provider directory..."
|
|
$LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
|
|
$LDIFORDEREDNOCP > /dev/null 2>&1
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "ldapadd failed ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
|
|
sleep $SLEEP1
|
|
|
|
echo "Stopping the provider, sleeping 10 seconds and restarting it..."
|
|
kill -HUP "$PID"
|
|
sleep 10
|
|
echo "RESTART" >> $LOG1
|
|
$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 &
|
|
PID=$!
|
|
if test $WAIT != 0 ; then
|
|
echo PID $PID
|
|
read foo
|
|
fi
|
|
KILLPIDS="$PID $SLAVEPID"
|
|
|
|
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 "$MONITOR" -h $LOCALHOST -p $PORT1 \
|
|
'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 "Using ldapmodify to modify provider directory..."
|
|
|
|
#
|
|
# Do some modifications
|
|
#
|
|
|
|
$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \
|
|
$TESTOUT 2>&1 << EOMODS
|
|
dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
|
|
changetype: modify
|
|
add: drink
|
|
drink: Orange Juice
|
|
-
|
|
delete: sn
|
|
sn: Jones
|
|
-
|
|
add: sn
|
|
sn: Jones
|
|
|
|
dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: modify
|
|
replace: drink
|
|
drink: Iced Tea
|
|
|
|
dn: cn=ITD Staff,ou=Groups,dc=example,dc=com
|
|
changetype: modify
|
|
delete: uniquemember
|
|
uniquemember: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
uniquemember: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
-
|
|
add: uniquemember
|
|
uniquemember: cn=Dorothy Stevens, ou=Alumni Association, ou=People, dc=example,dc=com
|
|
uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
|
|
|
|
dn: cn=All Staff,ou=Groups,dc=example,dc=com
|
|
changetype: modify
|
|
delete: description
|
|
|
|
dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: add
|
|
objectclass: OpenLDAPperson
|
|
cn: Gern Jensen
|
|
sn: Jensen
|
|
uid: gjensen
|
|
title: Chief Investigator, ITD
|
|
postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103
|
|
seealso: cn=All Staff, ou=Groups, dc=example,dc=com
|
|
drink: Coffee
|
|
homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104
|
|
description: Very odd
|
|
facsimiletelephonenumber: +1 313 555 7557
|
|
telephonenumber: +1 313 555 8343
|
|
mail: gjensen@mailgw.example.com
|
|
homephone: +1 313 555 8844
|
|
|
|
dn: ou=Retired, ou=People, dc=example,dc=com
|
|
changetype: add
|
|
objectclass: organizationalUnit
|
|
ou: Retired
|
|
|
|
dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: add
|
|
objectclass: OpenLDAPperson
|
|
cn: Rosco P. Coltrane
|
|
sn: Coltrane
|
|
uid: rosco
|
|
description: Fat tycoon
|
|
|
|
dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: modrdn
|
|
newrdn: cn=Rosco P. Coltrane
|
|
deleteoldrdn: 1
|
|
newsuperior: ou=Retired, ou=People, dc=example,dc=com
|
|
|
|
dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: delete
|
|
|
|
EOMODS
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "ldapmodify failed ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
|
|
sleep $SLEEP1
|
|
|
|
echo "Using ldapsearch to read all the entries from the provider..."
|
|
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
|
|
'objectclass=*' \* + > $MASTEROUT 2>&1
|
|
RC=$?
|
|
|
|
if test $RC != 0 ; then
|
|
echo "ldapsearch failed at provider ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Using ldapsearch to read all the entries from the consumer..."
|
|
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT2 \
|
|
'objectclass=*' \* + > $SLAVEOUT 2>&1
|
|
RC=$?
|
|
|
|
if test $RC != 0 ; then
|
|
echo "ldapsearch failed at consumer ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Filtering provider results..."
|
|
$LDIFFILTER -b $BACKEND -s $SPEC < $MASTEROUT | grep -iv "^auditcontext:" > $MASTERFLT
|
|
echo "Filtering consumer results..."
|
|
$LDIFFILTER -b $BACKEND -s $SPEC < $SLAVEOUT | grep -iv "^auditcontext:" > $SLAVEFLT
|
|
|
|
echo "Comparing retrieved entries from provider and consumer..."
|
|
$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
|
|
|
|
if test $? != 0 ; then
|
|
echo "test failed - provider and consumer databases differ"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit 1
|
|
fi
|
|
|
|
echo "Stopping consumer to test recovery..."
|
|
kill -HUP $SLAVEPID
|
|
sleep 10
|
|
|
|
echo "Modifying more entries on the provider..."
|
|
$LDAPMODIFY -v -D "$BJORNSDN" -h $LOCALHOST -p $PORT1 -w bjorn >> \
|
|
$TESTOUT 2>&1 << EOMODS
|
|
dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
|
|
changetype: delete
|
|
|
|
dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
|
|
changetype: modify
|
|
add: drink
|
|
drink: Mad Dog 20/20
|
|
|
|
dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
|
|
changetype: add
|
|
objectclass: OpenLDAPperson
|
|
sn: Coltrane
|
|
uid: rosco
|
|
cn: Rosco P. Coltrane
|
|
|
|
dn: cn=Mark Elliot,ou=Alumni Association,ou=People,dc=example,dc=com
|
|
changetype: modify
|
|
replace: drink
|
|
drink: Red Wine
|
|
-
|
|
replace: drink
|
|
|
|
dn: cn=All Staff,ou=Groups,dc=example,dc=com
|
|
changetype: modrdn
|
|
newrdn: cn=Some Staff
|
|
deleteoldrdn: 1
|
|
|
|
EOMODS
|
|
|
|
echo "Restarting consumer..."
|
|
echo "RESTART" >> $LOG2
|
|
$SLAPD -f $CONF2 -h $URI2 -d $LVL $TIMING >> $LOG2 2>&1 &
|
|
SLAVEPID=$!
|
|
if test $WAIT != 0 ; then
|
|
echo SLAVEPID $SLAVEPID
|
|
read foo
|
|
fi
|
|
KILLPIDS="$PID $SLAVEPID"
|
|
|
|
echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
|
|
sleep $SLEEP1
|
|
|
|
if test ! $BACKLDAP = "ldapno" ; then
|
|
echo "Try updating the consumer slapd..."
|
|
$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT2 -w $PASSWD > \
|
|
$TESTOUT 2>&1 << EOMODS
|
|
dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com
|
|
changetype: modify
|
|
add: description
|
|
description: This write must fail because directed to a shadow context,
|
|
description: unless the chain overlay is configured appropriately ;)
|
|
|
|
EOMODS
|
|
|
|
RC=$?
|
|
if test $RC != 0 ; then
|
|
echo "ldapmodify failed ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
|
|
sleep $SLEEP1
|
|
fi
|
|
|
|
echo "Using ldapsearch to read all the entries from the provider..."
|
|
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
|
|
'objectclass=*' \* + > $MASTEROUT 2>&1
|
|
RC=$?
|
|
|
|
if test $RC != 0 ; then
|
|
echo "ldapsearch failed at provider ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
echo "Using ldapsearch to read all the entries from the consumer..."
|
|
$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT2 \
|
|
'objectclass=*' \* + > $SLAVEOUT 2>&1
|
|
RC=$?
|
|
|
|
if test $RC != 0 ; then
|
|
echo "ldapsearch failed at consumer ($RC)!"
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
exit $RC
|
|
fi
|
|
|
|
test $KILLSERVERS != no && kill -HUP $KILLPIDS
|
|
|
|
echo "Filtering provider results..."
|
|
$LDIFFILTER -b $BACKEND -s $SPEC < $MASTEROUT | grep -iv "^auditcontext:" > $MASTERFLT
|
|
echo "Filtering consumer results..."
|
|
$LDIFFILTER -b $BACKEND -s $SPEC < $SLAVEOUT | grep -iv "^auditcontext:" > $SLAVEFLT
|
|
|
|
echo "Comparing retrieved entries from provider and consumer..."
|
|
$CMP $MASTERFLT $SLAVEFLT > $CMPOUT
|
|
|
|
if test $? != 0 ; then
|
|
echo "test failed - provider and consumer databases differ"
|
|
exit 1
|
|
fi
|
|
|
|
echo ">>>>> Test succeeded"
|
|
|
|
test $KILLSERVERS != no && wait
|
|
|
|
exit 0
|