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