1#! /bin/sh 2# $OpenLDAP$ 3## This work is part of OpenLDAP Software <http://www.openldap.org/>. 4## 5## Copyright 1998-2011 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 16echo "running defines.sh" 17. $SRCDIR/scripts/defines.sh 18 19if test $SYNCPROV = syncprovno; then 20 echo "Syncrepl provider overlay not available, test skipped" 21 exit 0 22fi 23 24PRODIR=$TESTDIR/pro 25CONDIR=$TESTDIR/con1 26DBPRO=$PRODIR/db 27DBCON=$CONDIR/db 28CFPRO=$PRODIR/slapd.d 29CFCON=$CONDIR/slapd.d 30 31mkdir -p $TESTDIR $PRODIR $CONDIR $DBPRO $DBCON $CFPRO $CFCON 32 33$SLAPPASSWD -g -n >$CONFIGPWF 34 35if test x"$SYNCMODE" = x ; then 36 SYNCMODE=rp 37fi 38case "$SYNCMODE" in 39 ro) 40 SYNCTYPE="type=refreshOnly interval=00:00:00:03" 41 ;; 42 rp) 43 SYNCTYPE="type=refreshAndPersist" 44 ;; 45 *) 46 echo "unknown sync mode $SYNCMODE" 47 exit 1; 48 ;; 49esac 50 51# 52# Test replication of dynamic config: 53# - start provider 54# - start consumer 55# - configure over ldap 56# - populate over ldap 57# - configure syncrepl over ldap 58# - retrieve database over ldap and compare against expected results 59# 60 61echo "Starting provider slapd on TCP/IP port $PORT1..." 62. $CONFFILTER $BACKEND $MONITORDB < $DYNAMICCONF > $CONFLDIF 63$SLAPADD -F $CFPRO -n 0 -l $CONFLDIF 64cd $PRODIR 65$SLAPD -F ./slapd.d -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 & 66PID=$! 67if test $WAIT != 0 ; then 68 echo PID $PID 69 read foo 70fi 71KILLPIDS="$PID" 72cd $TESTWD 73 74sleep 1 75 76echo "Using ldapsearch to check that provider slapd is running..." 77for i in 0 1 2 3 4 5; do 78 $LDAPSEARCH -s base -b "" -H $URI1 \ 79 'objectclass=*' > /dev/null 2>&1 80 RC=$? 81 if test $RC = 0 ; then 82 break 83 fi 84 echo "Waiting 5 seconds for slapd to start..." 85 sleep 5 86done 87 88if test $RC != 0 ; then 89 echo "ldapsearch failed ($RC)!" 90 test $KILLSERVERS != no && kill -HUP $KILLPIDS 91 exit $RC 92fi 93 94echo "Inserting syncprov overlay on provider..." 95if [ "$SYNCPROV" = syncprovmod ]; then 96 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 97dn: cn=module,cn=config 98objectClass: olcModuleList 99cn: module 100olcModulePath: $TESTWD/../servers/slapd/overlays 101olcModuleLoad: syncprov.la 102EOF 103 RC=$? 104 if test $RC != 0 ; then 105 echo "ldapadd failed for moduleLoad ($RC)!" 106 test $KILLSERVERS != no && kill -HUP $KILLPIDS 107 exit $RC 108 fi 109fi 110read CONFIGPW < $CONFIGPWF 111$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 112dn: olcDatabase={0}config,cn=config 113changetype: modify 114add: olcSyncRepl 115olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 116 credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 117 retry="3 5 300 5" timeout=3 118- 119add: olcUpdateRef 120olcUpdateRef: $URI1 121 122dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config 123changetype: add 124objectClass: olcOverlayConfig 125objectClass: olcSyncProvConfig 126olcOverlay: syncprov 127EOF 128RC=$? 129if test $RC != 0 ; then 130 echo "ldapmodify failed for syncrepl config ($RC)!" 131 test $KILLSERVERS != no && kill -HUP $KILLPIDS 132 exit $RC 133fi 134 135echo "Starting consumer slapd on TCP/IP port $PORT2..." 136$SLAPADD -F $CFCON -n 0 -l $CONFLDIF 137cd $CONDIR 138$SLAPD -F ./slapd.d -h $URI2 -d $LVL $TIMING > $LOG2 2>&1 & 139SLAVEPID=$! 140if test $WAIT != 0 ; then 141 echo SLAVEPID $SLAVEPID 142 read foo 143fi 144KILLPIDS="$KILLPIDS $SLAVEPID" 145cd $TESTWD 146 147sleep 1 148 149echo "Using ldapsearch to check that consumer slapd is running..." 150for i in 0 1 2 3 4 5; do 151 $LDAPSEARCH -s base -b "" -H $URI2 \ 152 'objectclass=*' > /dev/null 2>&1 153 RC=$? 154 if test $RC = 0 ; then 155 break 156 fi 157 echo "Waiting 5 seconds for slapd to start..." 158 sleep 5 159done 160 161if test $RC != 0 ; then 162 echo "ldapsearch failed ($RC)!" 163 test $KILLSERVERS != no && kill -HUP $KILLPIDS 164 exit $RC 165fi 166 167echo "Configuring syncrepl on consumer..." 168$LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 169dn: olcDatabase={0}config,cn=config 170changetype: modify 171add: olcSyncRepl 172olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 173 credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 174 retry="3 5 300 5" timeout=3 175- 176add: olcUpdateRef 177olcUpdateRef: $URI1 178EOF 179 180echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 181sleep $SLEEP1 182 183echo "Using ldapsearch to check that syncrepl received config changes..." 184RC=32 185for i in 0 1 2 3 4 5; do 186 RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \ 187 -s base -b "olcDatabase={0}config,cn=config" \ 188 '(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 189 if test "x$RESULT" = "xOK" ; then 190 RC=0 191 break 192 fi 193 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 194 sleep $SLEEP1 195done 196 197if test $RC != 0 ; then 198 echo "ldapsearch failed ($RC)!" 199 test $KILLSERVERS != no && kill -HUP $KILLPIDS 200 exit $RC 201fi 202 203echo "Adding schema and databases on provider..." 204$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 205include: file://$ABS_SCHEMADIR/core.ldif 206 207include: file://$ABS_SCHEMADIR/cosine.ldif 208 209include: file://$ABS_SCHEMADIR/inetorgperson.ldif 210 211include: file://$ABS_SCHEMADIR/openldap.ldif 212 213include: file://$ABS_SCHEMADIR/nis.ldif 214EOF 215RC=$? 216if test $RC != 0 ; then 217 echo "ldapadd failed for schema config ($RC)!" 218 test $KILLSERVERS != no && kill -HUP $KILLPIDS 219 exit $RC 220fi 221 222nullExclude="" nullOK="" 223test $BACKEND = null && nullExclude="# " nullOK="OK" 224 225if [ "$BACKENDTYPE" = mod ]; then 226 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 227dn: cn=module,cn=config 228objectClass: olcModuleList 229cn: module 230olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND 231olcModuleLoad: back_$BACKEND.la 232EOF 233 RC=$? 234 if test $RC != 0 ; then 235 echo "ldapadd failed for backend config ($RC)!" 236 test $KILLSERVERS != no && kill -HUP $KILLPIDS 237 exit $RC 238 fi 239fi 240 241$LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 242dn: olcDatabase={1}$BACKEND,cn=config 243objectClass: olcDatabaseConfig 244${nullExclude}objectClass: olc${BACKEND}Config 245olcDatabase: {1}$BACKEND 246olcSuffix: $BASEDN 247${nullExclude}olcDbDirectory: ./db 248olcRootDN: $MANAGERDN 249olcRootPW: $PASSWD 250olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple 251 credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE 252 retry="3 5 300 5" timeout=3 253olcUpdateRef: $URI1 254 255dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config 256changetype: add 257objectClass: olcOverlayConfig 258objectClass: olcSyncProvConfig 259olcOverlay: syncprov 260EOF 261RC=$? 262if test $RC != 0 ; then 263 echo "ldapadd failed for database config ($RC)!" 264 test $KILLSERVERS != no && kill -HUP $KILLPIDS 265 exit $RC 266fi 267 268if test $INDEXDB = indexdb ; then 269 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 270dn: olcDatabase={1}$BACKEND,cn=config 271changetype: modify 272add: olcDbIndex 273olcDbIndex: objectClass,entryUUID,entryCSN eq 274olcDbIndex: cn,uid pres,eq,sub 275EOF 276 RC=$? 277 if test $RC != 0 ; then 278 echo "ldapadd modify for database config ($RC)!" 279 test $KILLSERVERS != no && kill -HUP $KILLPIDS 280 exit $RC 281 fi 282fi 283 284echo "Using ldapadd to populate provider..." 285$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \ 286 >> $TESTOUT 2>&1 287RC=$? 288if test $RC != 0 ; then 289 echo "ldapadd failed for database config ($RC)!" 290 test $KILLSERVERS != no && kill -HUP $KILLPIDS 291 exit $RC 292fi 293 294echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 295sleep $SLEEP1 296 297echo "Using ldapsearch to check that syncrepl received database changes..." 298RC=32 299for i in 0 1 2 3 4 5; do 300 RESULT=`$LDAPSEARCH -H $URI2 \ 301 -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \ 302 '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 303 if test "x$RESULT$nullOK" = "xOK" ; then 304 RC=0 305 break 306 fi 307 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 308 sleep $SLEEP1 309done 310 311if test $RC != 0 ; then 312 echo "ldapsearch failed ($RC)!" 313 test $KILLSERVERS != no && kill -HUP $KILLPIDS 314 exit $RC 315fi 316 317echo "Replacing olcSyncrepl on provider..." 318$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 319dn: olcDatabase={0}config,cn=config 320changetype: modify 321replace: olcSyncRepl 322olcSyncRepl: rid=002 provider=$URI1 binddn="cn=config" bindmethod=simple 323 credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 324 retry="3 5 300 5" timeout=3 325EOF 326echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 327sleep $SLEEP1 328 329echo "Using ldapsearch to read config from the provider..." 330$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF \ 331 'objectclass=*' > $MASTEROUT 2>&1 332RC=$? 333 334if test $RC != 0 ; then 335 echo "ldapsearch failed at provider ($RC)!" 336 test $KILLSERVERS != no && kill -HUP $KILLPIDS 337 exit $RC 338fi 339 340echo "Using ldapsearch to read config from the consumer..." 341$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \ 342 'objectclass=*' > $SLAVEOUT 2>&1 343RC=$? 344 345if test $RC != 0 ; then 346 echo "ldapsearch failed at consumer ($RC)!" 347 test $KILLSERVERS != no && kill -HUP $KILLPIDS 348 exit $RC 349fi 350 351echo "Filtering provider results..." 352$LDIFFILTER < $MASTEROUT > $MASTERFLT 353echo "Filtering consumer results..." 354$LDIFFILTER < $SLAVEOUT > $SLAVEFLT 355 356echo "Comparing retrieved configs from provider and consumer..." 357$CMP $MASTERFLT $SLAVEFLT > $CMPOUT 358 359if test $? != 0 ; then 360 echo "test failed - provider and consumer configs differ" 361 test $KILLSERVERS != no && kill -HUP $KILLPIDS 362 exit 1 363fi 364 365echo "Using ldapsearch to read all the entries from the provider..." 366$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ 367 'objectclass=*' > $MASTEROUT 2>&1 368RC=$? 369 370if test $RC != 0 ; then 371 echo "ldapsearch failed at provider ($RC)!" 372 test $KILLSERVERS != no && kill -HUP $KILLPIDS 373 exit $RC 374fi 375 376echo "Using ldapsearch to read all the entries from the consumer..." 377$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \ 378 'objectclass=*' > $SLAVEOUT 2>&1 379RC=$? 380 381if test $RC != 0 ; then 382 echo "ldapsearch failed at consumer ($RC)!" 383 test $KILLSERVERS != no && kill -HUP $KILLPIDS 384 exit $RC 385fi 386 387test $KILLSERVERS != no && kill -HUP $KILLPIDS 388 389echo "Filtering provider results..." 390$LDIFFILTER < $MASTEROUT > $MASTERFLT 391echo "Filtering consumer results..." 392$LDIFFILTER < $SLAVEOUT > $SLAVEFLT 393 394echo "Comparing retrieved entries from provider and consumer..." 395$CMP $MASTERFLT $SLAVEFLT > $CMPOUT 396 397if test $? != 0 ; then 398 echo "test failed - provider and consumer databases differ" 399 exit 1 400fi 401 402echo ">>>>> Test succeeded" 403 404test $KILLSERVERS != no && wait 405 406exit 0 407