Home | History | Annotate | Line # | Download | only in scripts
test071-dirsync revision 1.1.1.2
      1 #! /bin/sh
      2 # $OpenLDAP$
      3 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
      4 ##
      5 ## Copyright 1998-2024 The OpenLDAP Foundation.
      6 ## All rights reserved.
      7 ##
      8 ## Redistribution and use in source and binary forms, with or without
      9 ## modification, are permitted only as authorized by the OpenLDAP
     10 ## Public License.
     11 ##
     12 ## A copy of this license is available in the file LICENSE in the
     13 ## top-level directory of the distribution or, alternatively, at
     14 ## <http://www.OpenLDAP.org/license.html>.
     15 
     16 echo "running defines.sh"
     17 . $SRCDIR/scripts/defines.sh
     18 
     19 # requires MSAD_URI, MSAD_SUFFIX, MSAD_ADMINDN, MSAD_ADMINPW
     20 if test -z "$MSAD_URI"; then
     21 	echo "No MSAD envvars set, test skipped"
     22 	exit 0
     23 fi
     24 if test $SYNCPROV = syncprovno; then 
     25 	echo "Syncrepl provider overlay not available, test skipped"
     26 	exit 0
     27 fi 
     28 
     29 mkdir -p $TESTDIR $DBDIR2
     30 
     31 URI1=$MSAD_URI
     32 BASEDN="ou=OpenLDAPtest,$MSAD_SUFFIX"
     33 DC=`echo $MSAD_SUFFIX | sed -e 's/dc=//' -e 's/,.*//'`
     34 
     35 #
     36 # Test replication:
     37 # - populate MSAD over ldap
     38 # - start consumer
     39 # - perform some modifies and deletes
     40 # - attempt to modify the consumer (referral)
     41 # - retrieve database over ldap and compare against expected results
     42 #
     43 
     44 # Notes:
     45 # We use a separate OU under the MSAD suffix to contain our test objects,
     46 # since we can't just wipe out the entire directory when starting over.
     47 # The replication search filter is thus more convoluted than would normally
     48 # be needed. Typically it would only need (|(objectclass=user)(objectclass=group))
     49 #
     50 # MSAD does referential integrity by default, so to get 1-to-1 modifications
     51 # we must add users before creating groups that reference them, and we
     52 # should delete group memberships before deleting users. If we delete
     53 # users first, MSAD will automatically remove them from their groups,
     54 # but won't notify us of these changed groups.
     55 # We could use the refint overlay to duplicate this behavior, but that's
     56 # beyond the scope of this test.
     57 
     58 echo "Using ldapsearch to check that MSAD is running..."
     59 $LDAPSEARCH -D $MSAD_ADMINDN -w $MSAD_ADMINPW -s base -b "$MSAD_SUFFIX" -H $MSAD_URI 'objectclass=*' > /dev/null 2>&1
     60 RC=$?
     61 if test $RC != 0 ; then
     62 	echo "ldapsearch failed ($RC)!"
     63 	exit $RC
     64 fi
     65 
     66 echo "Using ldapdelete to delete old MSAD test tree, if any..."
     67 $LDAPDELETE -D "$MSAD_ADMINDN" -H $MSAD_URI -w $MSAD_ADMINPW -r "$BASEDN"
     68 RC=$?
     69 
     70 echo "Using ldapadd to create the test context entry in MSAD..."
     71 sed -e "s/dc=example,dc=com/$MSAD_SUFFIX/" < $LDIFDIRSYNCCP | \
     72 	$LDAPADD -D "$MSAD_ADMINDN" -H $MSAD_URI -w $MSAD_ADMINPW > /dev/null 2>&1
     73 
     74 RC=$?
     75 if test $RC != 0 ; then
     76 	echo "ldapadd failed ($RC)!"
     77 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     78 	exit $RC
     79 fi
     80 
     81 echo "Starting consumer slapd on TCP/IP port $PORT2..."
     82 . $CONFFILTER $BACKEND < $DIRSYNC1CONF | . $CONFDIRSYNC > $CONF2
     83 $SLAPADD -f $CONF2 <<EOMODS
     84 dn: $MSAD_SUFFIX
     85 dc: $DC
     86 objectclass: organization
     87 objectclass: dcObject
     88 o: OpenLDAP Testing
     89 
     90 EOMODS
     91 RC=$?
     92 if test $RC != 0 ; then
     93 	echo "slapadd failed ($RC)!"
     94 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     95 	exit $RC
     96 fi
     97 
     98 $SLAPD -f $CONF2 -h $URI2 -d $LVL > $LOG2 2>&1 &
     99 CONSUMERPID=$!
    100 if test $WAIT != 0 ; then
    101     echo CONSUMERPID $CONSUMERPID
    102     read foo
    103 fi
    104 KILLPIDS="$KILLPIDS $CONSUMERPID"
    105 
    106 sleep 1
    107 
    108 echo "Using ldapsearch to check that consumer slapd is running..."
    109 for i in 0 1 2 3 4 5; do
    110 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI2 \
    111 		'objectclass=*' > /dev/null 2>&1
    112 	RC=$?
    113 	if test $RC = 0 ; then
    114 		break
    115 	fi
    116 	echo "Waiting 5 seconds for slapd to start..."
    117 	sleep 5
    118 done
    119 
    120 if test $RC != 0 ; then
    121 	echo "ldapsearch failed ($RC)!"
    122 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    123 	exit $RC
    124 fi
    125 
    126 
    127 echo "Using ldapsearch to check that consumer received context entry..."
    128 for i in 0 1 2 3 4 5; do
    129 	$LDAPSEARCH -s base -b "$BASEDN" -H $URI2 \
    130 		'objectclass=*' > /dev/null 2>&1
    131 	RC=$?
    132 	if test $RC = 0 ; then
    133 		break
    134 	fi
    135 	echo "Waiting 5 seconds for syncrepl to catch up..."
    136 	sleep 5
    137 done
    138 
    139 if test $RC != 0 ; then
    140 	echo "ldapsearch failed ($RC)!"
    141 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    142 	exit $RC
    143 fi
    144 
    145 echo "Using ldapadd to populate MSAD..."
    146 sed -e "s/dc=example,dc=com/$BASEDN/" < $LDIFDIRSYNCNOCP | \
    147 	$LDAPADD -D "$MSAD_ADMINDN" -H $MSAD_URI -w $MSAD_ADMINPW > /dev/null 2>&1
    148 RC=$?
    149 if test $RC != 0 ; then
    150 	echo "ldapadd failed ($RC)!"
    151 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    152 	exit $RC
    153 fi
    154 
    155 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    156 sleep $SLEEP1
    157 
    158 echo "Using ldapmodify to modify provider directory..."
    159 
    160 #
    161 # Do some modifications
    162 #
    163 
    164 $LDAPMODIFY -v -H $MSAD_URI -D "$MSAD_ADMINDN" -w $MSAD_ADMINPW > \
    165 	$TESTOUT 2>&1 << EOMODS
    166 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, $BASEDN
    167 changetype: modify
    168 add: carLicense
    169 carLicense: Orange Juice
    170 -
    171 delete: sn
    172 sn: Jones
    173 -
    174 add: sn
    175 sn: Jones
    176 
    177 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, $BASEDN
    178 changetype: modify
    179 replace: carLicense
    180 carLicense: Iced Tea
    181 carLicense: Mad Dog 20/20
    182 
    183 dn: cn=ITD Staff,ou=Groups,$BASEDN
    184 changetype: modify
    185 delete: uniquemember
    186 uniquemember: cn=James A Jones 2, ou=Information Technology Division, ou=People, $BASEDN
    187 uniquemember: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, $BASEDN
    188 -
    189 add: uniquemember
    190 uniquemember: cn=Dorothy Stevens, ou=Alumni Association, ou=People, $BASEDN
    191 uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, $BASEDN
    192 
    193 dn: cn=All Staff,ou=Groups,$BASEDN
    194 changetype: modify
    195 replace: description
    196 description: The whole universe
    197 -
    198 delete: member
    199 member: cn=James A Jones 2,ou=Information Technology Division,ou=People,$BASEDN
    200 
    201 dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, $BASEDN
    202 changetype: add
    203 objectclass: inetorgperson
    204 objectclass: domainrelatedobject
    205 cn: Gern Jensen
    206 sn: Jensen
    207 uid: gjensen
    208 title: Chief Investigator, ITD
    209 postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103
    210 seealso: cn=All Staff, ou=Groups, $BASEDN
    211 carLicense: Coffee
    212 homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104
    213 description: Very odd
    214 facsimiletelephonenumber: +1 313 555 7557
    215 telephonenumber: +1 313 555 8343
    216 mail: gjensen@mailgw.example.com
    217 homephone: +1 313 555 8844
    218 associateddomain: test.openldap.org
    219 
    220 dn: ou=Retired, ou=People, $BASEDN
    221 changetype: add
    222 objectclass: organizationalUnit
    223 ou: Retired
    224 
    225 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, $BASEDN
    226 changetype: add
    227 objectclass: inetorgperson
    228 objectclass: domainrelatedobject
    229 cn: Rosco P. Coltrane
    230 sn: Coltrane
    231 uid: rosco
    232 associateddomain: test.openldap.org
    233 
    234 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, $BASEDN
    235 changetype: modrdn
    236 newrdn: cn=Rosco P. Coltrane
    237 deleteoldrdn: 1
    238 newsuperior: ou=Retired, ou=People, $BASEDN
    239 
    240 dn: ou=testdomain1,$BASEDN
    241 changetype: modrdn
    242 newrdn: ou=itsdomain1
    243 deleteoldrdn: 1
    244 
    245 dn: ou=itsdomain1,$BASEDN
    246 changetype: modify
    247 replace: description
    248 description: Example, Inc. ITS test domain
    249 
    250 EOMODS
    251 
    252 RC=$?
    253 if test $RC != 0 ; then
    254 	echo "ldapmodify failed ($RC)!"
    255 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    256 	exit $RC
    257 fi
    258 
    259 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    260 sleep $SLEEP1
    261 
    262 echo "Performing modrdn alone on the provider..."
    263 $LDAPMODIFY -v -H $MSAD_URI -D "$MSAD_ADMINDN" -w $MSAD_ADMINPW > \
    264 	$TESTOUT 2>&1 << EOMODS
    265 dn: ou=testdomain2,$BASEDN
    266 changetype: modrdn
    267 newrdn: ou=itsdomain2
    268 deleteoldrdn: 1
    269 
    270 EOMODS
    271 
    272 RC=$?
    273 if test $RC != 0 ; then
    274 	echo "ldapmodify failed ($RC)!"
    275 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    276 	exit $RC
    277 fi
    278 
    279 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    280 sleep $SLEEP1
    281 
    282 echo "Performing modify alone on the provider..."
    283 $LDAPMODIFY -v -H $MSAD_URI -D "$MSAD_ADMINDN" -w $MSAD_ADMINPW > \
    284 	$TESTOUT 2>&1 << EOMODS
    285 dn: ou=itsdomain2,$BASEDN
    286 changetype: modify
    287 replace: description
    288 description: Example, Inc. itsdomain2 test domain
    289 
    290 EOMODS
    291 
    292 RC=$?
    293 if test $RC != 0 ; then
    294 	echo "ldapmodify failed ($RC)!"
    295 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    296 	exit $RC
    297 fi
    298 
    299 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    300 sleep $SLEEP1
    301 
    302 echo "Performing larger modify on the provider..."
    303 $LDAPMODIFY -v -H $MSAD_URI -D "$MSAD_ADMINDN" -w $MSAD_ADMINPW > \
    304 	$TESTOUT 2>&1 << EOMODS
    305 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, $BASEDN
    306 changetype: delete
    307 
    308 dn: cn=Alumni Assoc Staff,ou=Groups,$BASEDN
    309 changetype: modify
    310 replace: description
    311 description: blablabla
    312 -
    313 replace: member
    314 member: cn=Manager,$BASEDN
    315 member: cn=Dorothy Stevens,ou=Alumni Association,ou=People,$BASEDN
    316 member: cn=James A Jones 1,ou=Alumni Association,ou=People,$BASEDN
    317 member: cn=Jane Doe,ou=Alumni Association,ou=People,$BASEDN
    318 member: cn=Jennifer Smith,ou=Alumni Association,ou=People,$BASEDN
    319 member: cn=Mark Elliot,ou=Alumni Association,ou=People,$BASEDN
    320 member: cn=Ursula Hampster,ou=Alumni Association,ou=People,$BASEDN
    321 
    322 EOMODS
    323 
    324 RC=$?
    325 if test $RC != 0 ; then
    326 	echo "ldapmodify failed ($RC)!"
    327 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    328 	exit $RC
    329 fi
    330 
    331 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    332 sleep $SLEEP1
    333 
    334 OPATTRS="entryUUID creatorsName createTimestamp modifiersName modifyTimestamp"
    335 
    336 echo "Using ldapsearch to read all the entries from the provider..."
    337 $LDAPSEARCH -D $MSAD_ADMINDN -w $MSAD_ADMINPW -S "" -H $MSAD_URI -b "$MSAD_SUFFIX" -E \!dirsync=0/0 -o ldif_wrap=120 \
    338 	'(associatedDomain=test.openldap.org)' > $PROVIDEROUT 2>&1
    339 RC=$?
    340 
    341 if test $RC != 0 ; then
    342 	echo "ldapsearch failed at provider ($RC)!"
    343 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    344 	exit $RC
    345 fi
    346 
    347 echo "Using ldapsearch to read all the entries from the consumer..."
    348 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI2 -o ldif_wrap=120 \
    349 	'(objectclass=*)' > $CONSUMEROUT 2>&1
    350 RC=$?
    351 
    352 if test $RC != 0 ; then
    353 	echo "ldapsearch failed at consumer ($RC)!"
    354 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    355 	exit $RC
    356 fi
    357 
    358 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    359 
    360 echo "Filtering provider results..."
    361 $LDIFFILTER -s a < $PROVIDEROUT | sed -e 's/CN=/cn=/g' -e 's/OU=/ou=/g' -e 's/DC=/dc=/g' > $PROVIDERFLT
    362 echo "Filtering consumer results..."
    363 $LDIFFILTER -s a < $CONSUMEROUT > $CONSUMERFLT
    364 
    365 echo "Comparing retrieved entries from provider and consumer..."
    366 $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT
    367 
    368 if test $? != 0 ; then
    369 	echo "test failed - provider and consumer databases differ"
    370 	exit 1
    371 fi
    372 
    373 echo ">>>>> Test succeeded"
    374 
    375 test $KILLSERVERS != no && wait
    376 
    377 exit 0
    378