1#! /bin/sh
2# OpenLDAP: pkg/ldap/tests/scripts/test057-memberof-refint,v 1.3.2.6 2010/04/19 19:14:36 quanah Exp
3## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4##
5## Copyright 1998-2010 The OpenLDAP Foundation.
6## Portions Copyright 2008 Red Hat, Inc.
7## All rights reserved.
8##
9## Redistribution and use in source and binary forms, with or without
10## modification, are permitted only as authorized by the OpenLDAP
11## Public License.
12##
13## A copy of this license is available in the file LICENSE in the
14## top-level directory of the distribution or, alternatively, at
15## <http://www.OpenLDAP.org/license.html>.
16
17echo "running defines.sh"
18. $SRCDIR/scripts/defines.sh
19
20if test $MEMBEROF = memberofno; then
21	echo "Memberof overlay not available, test skipped"
22	exit 0
23fi
24
25if test $REFINT = refintno; then
26	echo "Referential Integrity overlay not available, test skipped"
27	exit 0
28fi
29
30if test $BACKEND = bdb; then
31	echo "$BACKEND backend does not support subtree rename, test skipped"
32	exit 0
33fi
34
35mkdir -p $TESTDIR $DBDIR1 $TESTDIR/confdir
36
37$SLAPPASSWD -g -n >$CONFIGPWF
38echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf
39
40echo "Starting slapd on TCP/IP port $PORT1..."
41. $CONFFILTER $BACKEND $MONITORDB < $NAKEDCONF > $CONF1
42$SLAPD -f $CONF1 -F $TESTDIR/confdir -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
43PID=$!
44if test $WAIT != 0 ; then
45    echo PID $PID
46    read foo
47fi
48KILLPIDS="$PID"
49
50sleep 1
51for i in 0 1 2 3 4 5; do
52	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
53		'objectclass=*' > /dev/null 2>&1
54	RC=$?
55	if test $RC = 0 ; then
56		break
57	fi
58	echo "Waiting 5 seconds for slapd to start..."
59	sleep 5
60done
61if test $RC != 0 ; then
62	echo "ldapsearch failed ($RC)!"
63	test $KILLSERVERS != no && kill -HUP $KILLPIDS
64	exit $RC
65fi
66
67cat /dev/null > $TESTOUT
68
69bdbInclude="# " nullExclude=""
70case $BACKEND in
71bdb | hdb) bdbInclude="" ;;
72null) nullExclude="# " ;;
73esac
74
75if [ "$MEMBEROF" = memberofmod ]; then
76	echo "Inserting memberof overlay on producer..."
77	$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
78dn: cn=module,cn=config
79objectClass: olcModuleList
80cn: module
81olcModulePath: ../servers/slapd/overlays
82olcModuleLoad: memberof.la
83olcModuleLoad: refint.la
84EOF
85	RC=$?
86	if test $RC != 0 ; then
87		echo "ldapadd failed for moduleLoad ($RC)!"
88		test $KILLSERVERS != no && kill -HUP $KILLPIDS
89		exit $RC
90	fi
91fi
92
93echo "Running ldapadd to build slapd config database..."
94$LDAPADD -h $LOCALHOST -p $PORT1 -D 'cn=config' -w `cat $CONFIGPWF` \
95	>> $TESTOUT 2>&1 <<EOF
96dn: olcDatabase={1}$BACKEND,cn=config
97objectClass: olcDatabaseConfig
98${nullExclude}objectClass: olc${BACKEND}Config
99olcDatabase: {1}$BACKEND
100olcSuffix: $BASEDN
101olcRootDN: cn=Manager,$BASEDN
102olcRootPW:: c2VjcmV0
103olcMonitoring: TRUE
104${nullExclude}olcDbDirectory: $TESTDIR/db.1.a/
105${bdbInclude}olcDbCacheSize: 1000
106${bdbInclude}olcDbIndex: objectClass eq
107${bdbInclude}olcDbIndex: cn pres,eq,sub
108${bdbInclude}olcDbIndex: uid pres,eq,sub
109${bdbInclude}olcDbIndex: sn pres,eq,sub
110${bdbInclude}olcDbMode: 384
111
112# {0}memberof, {1}$BACKEND, config
113dn: olcOverlay={0}memberof,olcDatabase={1}$BACKEND,cn=config
114objectClass: olcOverlayConfig
115objectClass: olcMemberOf
116olcOverlay: {0}memberof
117olcMemberOfRefInt: TRUE
118olcMemberOfGroupOC: groupOfNames
119olcMemberOfMemberAD: member
120olcMemberOfMemberOfAD: memberOf
121
122# {1}refint, {1}$BACKEND, config
123dn: olcOverlay={1}refint,olcDatabase={1}$BACKEND,cn=config
124objectClass: olcOverlayConfig
125objectClass: olcRefintConfig
126olcOverlay: {1}refint
127olcRefintAttribute: member
128olcRefintAttribute: memberOf
129EOF
130RC=$?
131if test $RC != 0 ; then
132	echo "ldapadd failed ($RC)!"
133	test $KILLSERVERS != no && kill -HUP $KILLPIDS
134	exit $RC
135fi
136
137echo "Running ldapadd to build slapd database..."
138$LDAPADD -h $LOCALHOST -p $PORT1 \
139	-D "cn=Manager,$BASEDN" -w secret \
140	>> $TESTOUT 2>&1 << EOF
141dn: $BASEDN
142objectClass: organization
143objectClass: dcObject
144o: Example, Inc.
145dc: example
146
147dn: ou=People,$BASEDN
148objectClass: organizationalUnit
149ou: People
150
151dn: ou=Groups,$BASEDN
152objectClass: organizationalUnit
153ou: Groups
154
155dn: cn=Roger Rabbit,ou=People,$BASEDN
156objectClass: inetOrgPerson
157cn: Roger Rabbit
158sn: Rabbit
159
160dn: cn=Baby Herman,ou=People,$BASEDN
161objectClass: inetOrgPerson
162cn: Baby Herman
163sn: Herman
164
165dn: cn=Cartoonia,ou=Groups,$BASEDN
166objectClass: groupOfNames
167cn: Cartoonia
168member: cn=Roger Rabbit,ou=People,$BASEDN
169member: cn=Baby Herman,ou=People,$BASEDN
170EOF
171RC=$?
172if test $RC != 0 ; then
173	echo "ldapadd failed ($RC)!"
174	test $KILLSERVERS != no && kill -HUP $KILLPIDS
175	exit $RC
176fi
177
178echo "Search the entire database..."
179echo "# Search the entire database..." >> $SEARCHOUT
180$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
181	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
182RC=$?
183if test $RC != 0 ; then
184	echo "ldapsearch failed ($RC)!"
185	test $KILLSERVERS != no && kill -HUP $KILLPIDS
186	exit $RC
187fi
188
189echo "Running ldapmodify to rename subtree..."
190$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
191	-D "cn=Manager,$BASEDN" -w secret \
192	>> $TESTOUT 2>&1 << EOF
193dn: ou=People,$BASEDN
194changetype: modrdn
195newrdn: ou=Toons
196deleteoldrdn:1
197newsuperior: $BASEDN
198EOF
199
200# refint runs in a background thread, so it most likely won't complete
201# before the modify returns. Give it some time to execute.
202sleep 1
203
204echo "Re-search the entire database..."
205echo "# Re-search the entire database..." >> $SEARCHOUT
206$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
207	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
208RC=$?
209if test $RC != 0 ; then
210	echo "ldapsearch failed ($RC)!"
211	test $KILLSERVERS != no && kill -HUP $KILLPIDS
212	exit $RC
213fi
214
215echo "Running ldapmodify to rename subtree..."
216$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
217	-D "cn=Manager,$BASEDN" -w secret \
218	>> $TESTOUT 2>&1 << EOF
219dn: ou=Groups,$BASEDN
220changetype: modrdn
221newrdn: ou=Studios
222deleteoldrdn:1
223newsuperior: $BASEDN
224EOF
225
226sleep 1
227
228echo "Re-search the entire database..."
229echo "# Re-search the entire database..." >> $SEARCHOUT
230$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
231	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
232RC=$?
233if test $RC != 0 ; then
234	echo "ldapsearch failed ($RC)!"
235	test $KILLSERVERS != no && kill -HUP $KILLPIDS
236	exit $RC
237fi
238
239echo "Running ldapdelete to remove a member..."
240$LDAPMODIFY -h $LOCALHOST -p $PORT1 \
241	-D "cn=Manager,$BASEDN" -w secret \
242	>> $TESTOUT 2>&1 << EOF
243dn: cn=Baby Herman,ou=Toons,$BASEDN
244changetype: delete
245EOF
246
247sleep 1
248
249echo "Re-search the entire database..."
250echo "# Re-search the entire database..." >> $SEARCHOUT
251$LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
252	'(objectClass=*)' '*' memberOf >> $SEARCHOUT 2>&1
253RC=$?
254if test $RC != 0 ; then
255	echo "ldapsearch failed ($RC)!"
256	test $KILLSERVERS != no && kill -HUP $KILLPIDS
257	exit $RC
258fi
259
260test $KILLSERVERS != no && kill -HUP $KILLPIDS
261
262LDIF=$MEMBEROFREFINTOUT
263
264echo "Filtering ldapsearch results..."
265$LDIFFILTER < $SEARCHOUT > $SEARCHFLT
266echo "Filtering original ldif used to create database..."
267$LDIFFILTER < $LDIF > $LDIFFLT
268echo "Comparing filter output..."
269$CMP $SEARCHFLT $LDIFFLT > $CMPOUT
270
271if test $? != 0 ; then
272	echo "Comparison failed"
273	exit 1
274fi
275
276echo ">>>>> Test succeeded"
277
278test $KILLSERVERS != no && wait
279
280exit 0
281