#! /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 ## . 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 $DYNLIST = dynlistno; then echo "Dynlist overlay not available, test skipped" exit 0 fi if test $MEMBEROF = memberofno; then echo "Memberof 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 echo "This test tracks a case where changes are incorrectly skipped" echo "See https://bugs.openldap.org/show_bug.cgi?id=8444 for more information." MPR=4 XDIR=$TESTDIR/srv mkdir -p $TESTDIR $SLAPPASSWD -g -n >$CONFIGPWF ITS=8444 ITSDIR=$DATADIR/regressions/its$ITS echo "Initializing server configurations..." n=1 while [ $n -le $MPR ]; do DBDIR=${XDIR}$n/db CFDIR=${XDIR}$n/slapd.d mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR . $CONFFILTER $BACKEND < $ITSDIR/slapd-provider${n}.ldif > $CONFLDIF $SLAPADD -F $CFDIR -n 0 -l $CONFLDIF n=`expr $n + 1` done KILLPIDS= n=1 while [ $n -le $MPR ]; do MYURI=`eval echo '$URI'$n` MYLOG=`eval echo '$LOG'$n` CFDIR=${XDIR}$n/slapd.d echo "Starting provider slapd on TCP/IP URI $MYURI" $SLAPD -F $CFDIR -h $MYURI -d $LVL > $MYLOG 2>&1 & PID=$! if test $WAIT != 0 ; then echo PID $PID read foo fi KILLPIDS="$PID $KILLPIDS" 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 $MYURI \ 'objectclass=*' > /dev/null 2>&1 RC=$? if test $RC = 0 ; then break fi echo "Waiting 5 seconds for slapd to start..." sleep 5 done if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi n=`expr $n + 1` done echo "Populating database on first provider..." $LDAPADD -D $MANAGERDN -H $URI1 -w $PASSWD << EOMODS >> $TESTOUT 2>&1 dn: $BASEDN objectClass: organization objectClass: dcObject o: Example, Inc. dc: example dn: ou=People,$BASEDN objectClass: organizationalUnit ou: People dn: ou=Groups,$BASEDN objectClass: organizationalUnit ou: Groups dn: cn=Roger Rabbit,ou=People,$BASEDN objectClass: inetOrgPerson cn: Roger Rabbit sn: Rabbit dn: cn=Baby Herman,ou=People,$BASEDN objectClass: inetOrgPerson cn: Baby Herman sn: Herman dn: cn=Jessica_Rabbit,ou=People,$BASEDN objectClass: inetOrgPerson cn: Jessica_Rabbit sn: Rabbit dn: cn=Bugs_Bunny,ou=People,$BASEDN objectClass: inetOrgPerson cn: Bugs_Bunny sn: Bunny dn: cn=Daffy_Duck,ou=People,$BASEDN objectClass: inetOrgPerson cn: Daffy_Duck sn: Duck dn: cn=Elmer_Fudd,ou=People,$BASEDN objectClass: inetOrgPerson cn: Elmer_Fudd sn: Fudd dn: cn=Cartoonia,ou=Groups,$BASEDN objectClass: groupOfNames cn: Cartoonia member: cn=Roger Rabbit,ou=People,$BASEDN member: cn=Baby Herman,ou=People,$BASEDN EOMODS RC=$? if test $RC != 0 ; then echo "ldapadd failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Sleeping 10 seconds to allow replication to initiate..." sleep 10 echo "Looping 50 times adding and deleting members to the Cartoonia group..." modloop=1 while [ $modloop -le 50 ]; do echo "Adding new members to the group (${modloop}/50)..." $LDAPMODIFY -H $URI1 \ -D "cn=Manager,$BASEDN" -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: cn=Cartoonia,ou=Groups,$BASEDN changetype: modify add: member member: cn=Jessica_Rabbit,ou=People,$BASEDN member: cn=Elmer_Fudd,ou=People,$BASEDN member: cn=Daffy_Duck,ou=People,$BASEDN member: cn=Bugs_Bunny,ou=People,$BASEDN EOF sleep 3 echo "Deleting new members from the group..." $LDAPMODIFY -H $URI1 \ -D "cn=Manager,$BASEDN" -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: cn=Cartoonia,ou=Groups,$BASEDN changetype: modify delete: member member: cn=Jessica_Rabbit,ou=People,$BASEDN member: cn=Elmer_Fudd,ou=People,$BASEDN member: cn=Daffy_Duck,ou=People,$BASEDN member: cn=Bugs_Bunny,ou=People,$BASEDN EOF sleep 3 echo "Searching new members to see if they still have memberOf present..." TOON1="cn=Jessica_Rabbit,ou=People,$BASEDN" TOON2="cn=Elmer_Fudd,ou=People,$BASEDN" TOON3="cn=Daffy_Duck,ou=People,$BASEDN" TOON4="cn=Bugs_Bunny,ou=People,$BASEDN" for member in $TOON1 $TOON2 $TOON3 $TOON4; do n=1 while [ $n -le $MPR ]; do >$SEARCHOUT echo "# Searching member $member after removal from Cartoonia group, provider $n" >> $SEARCHOUT MYURI=`eval echo '$URI'$n` $LDAPSEARCH -S "" -b "$member" -s base -H $MYURI -D "cn=manager,$BASEDN" -w $PASSWD \ '(objectClass=*)' 'memberOf' >> $SEARCHOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi grep "memberOf:" $SEARCHOUT >/dev/null 2>&1 RC=$? if test $RC != 1 ; then echo "User delete failed on one or more consumer." test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi n=`expr $n + 1` done done modloop=`expr $modloop + 1` done echo "Looping 50 times deleting and adding Cartoonia group..." modloop=1 while [ $modloop -le 50 ]; do >$SEARCHOUT echo "Running ldapdelete to remove a group (${modloop}/50)..." $LDAPMODIFY -H $URI1 \ -D "cn=Manager,$BASEDN" -w $PASSWD \ >> $TESTOUT 2>&1 << EOF dn: cn=Cartoonia,ou=Groups,$BASEDN changetype: delete EOF sleep 3 echo "Searching entire database on each provider after deleting Cartoonia group" n=1 while [ $n -le $MPR ]; do echo "# Searching the entire database after deleting Cartoonia, provider $n" >> $SEARCHOUT MYURI=`eval echo '$URI'$n` $LDAPSEARCH -S "" -b "$BASEDN" -H $MYURI -D "cn=manager,$BASEDN" -w $PASSWD \ '(objectClass=*)' '*' >> $SEARCHOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi n=`expr $n + 1` done grep "cn=Cartoonia" $SEARCHOUT >/dev/null 2>&1 RC=$? if test $RC != 1 ; then echo "Group delete failed on one or more consumer." test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi echo "Running ldapmodify to add the group back..." $LDAPMODIFY -H $URI1 \ -D "cn=Manager,$BASEDN" -w $PASSWD \ >> $TESTOUT 2>&1 <$SEARCHOUT echo "# Searching the entire database after re-adding Cartoonia, provider $n" >> $SEARCHOUT MYURI=`eval echo '$URI'$n` $LDAPSEARCH -S "" -b "$BASEDN" -H $MYURI -D "cn=manager,$BASEDN" -w $PASSWD \ '(objectClass=*)' '*' memberOf>> $SEARCHOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi grep "memberOf:" $SEARCHOUT >/dev/null 2>&1 RC=$? if test $RC != 0 ; then echo "Group add failed on one or more consumer." test $KILLSERVERS != no && kill -HUP $KILLPIDS exit $RC fi n=`expr $n + 1` done modloop=`expr $modloop + 1` done test $KILLSERVERS != no && kill -HUP $KILLPIDS echo ">>>>> Test succeeded" test $KILLSERVERS != no && wait exit 0