1#! /bin/sh 2# OpenLDAP: pkg/ldap/tests/scripts/test049-sync-config,v 1.4.2.13 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## 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 producer 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 producer 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 producer 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 producer..." 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: ../../../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 producer..." 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: ../../../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 268case $BACKEND in 269bdb | hdb) 270 $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 271dn: olcDatabase={1}$BACKEND,cn=config 272changetype: modify 273add: olcDbIndex 274olcDbIndex: objectClass,entryUUID,entryCSN eq 275olcDbIndex: cn,uid pres,eq,sub 276EOF 277 RC=$? 278 if test $RC != 0 ; then 279 echo "ldapadd modify for database config ($RC)!" 280 test $KILLSERVERS != no && kill -HUP $KILLPIDS 281 exit $RC 282 fi 283 ;; 284esac 285 286echo "Using ldapadd to populate producer..." 287$LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \ 288 >> $TESTOUT 2>&1 289RC=$? 290if test $RC != 0 ; then 291 echo "ldapadd failed for database config ($RC)!" 292 test $KILLSERVERS != no && kill -HUP $KILLPIDS 293 exit $RC 294fi 295 296echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 297sleep $SLEEP1 298 299echo "Using ldapsearch to check that syncrepl received database changes..." 300RC=32 301for i in 0 1 2 3 4 5; do 302 RESULT=`$LDAPSEARCH -H $URI2 \ 303 -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \ 304 '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 305 if test "x$RESULT$nullOK" = "xOK" ; then 306 RC=0 307 break 308 fi 309 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 310 sleep $SLEEP1 311done 312 313if test $RC != 0 ; then 314 echo "ldapsearch failed ($RC)!" 315 test $KILLSERVERS != no && kill -HUP $KILLPIDS 316 exit $RC 317fi 318 319echo "Replacing olcSyncrepl on producer..." 320$LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 321dn: olcDatabase={0}config,cn=config 322changetype: modify 323replace: olcSyncRepl 324olcSyncRepl: rid=002 provider=$URI1 binddn="cn=config" bindmethod=simple 325 credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 326 retry="3 5 300 5" timeout=3 327EOF 328echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 329sleep $SLEEP1 330 331echo "Using ldapsearch to read config from the producer..." 332$LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF \ 333 'objectclass=*' > $MASTEROUT 2>&1 334RC=$? 335 336if test $RC != 0 ; then 337 echo "ldapsearch failed at producer ($RC)!" 338 test $KILLSERVERS != no && kill -HUP $KILLPIDS 339 exit $RC 340fi 341 342echo "Using ldapsearch to read config from the consumer..." 343$LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \ 344 'objectclass=*' > $SLAVEOUT 2>&1 345RC=$? 346 347if test $RC != 0 ; then 348 echo "ldapsearch failed at consumer ($RC)!" 349 test $KILLSERVERS != no && kill -HUP $KILLPIDS 350 exit $RC 351fi 352 353echo "Filtering producer results..." 354$LDIFFILTER < $MASTEROUT > $MASTERFLT 355echo "Filtering consumer results..." 356$LDIFFILTER < $SLAVEOUT > $SLAVEFLT 357 358echo "Comparing retrieved configs from producer and consumer..." 359$CMP $MASTERFLT $SLAVEFLT > $CMPOUT 360 361if test $? != 0 ; then 362 echo "test failed - producer and consumer configs differ" 363 test $KILLSERVERS != no && kill -HUP $KILLPIDS 364 exit 1 365fi 366 367echo "Using ldapsearch to read all the entries from the producer..." 368$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ 369 'objectclass=*' > $MASTEROUT 2>&1 370RC=$? 371 372if test $RC != 0 ; then 373 echo "ldapsearch failed at producer ($RC)!" 374 test $KILLSERVERS != no && kill -HUP $KILLPIDS 375 exit $RC 376fi 377 378echo "Using ldapsearch to read all the entries from the consumer..." 379$LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \ 380 'objectclass=*' > $SLAVEOUT 2>&1 381RC=$? 382 383if test $RC != 0 ; then 384 echo "ldapsearch failed at consumer ($RC)!" 385 test $KILLSERVERS != no && kill -HUP $KILLPIDS 386 exit $RC 387fi 388 389test $KILLSERVERS != no && kill -HUP $KILLPIDS 390 391echo "Filtering producer results..." 392$LDIFFILTER < $MASTEROUT > $MASTERFLT 393echo "Filtering consumer results..." 394$LDIFFILTER < $SLAVEOUT > $SLAVEFLT 395 396echo "Comparing retrieved entries from producer and consumer..." 397$CMP $MASTERFLT $SLAVEFLT > $CMPOUT 398 399if test $? != 0 ; then 400 echo "test failed - producer and consumer databases differ" 401 exit 1 402fi 403 404echo ">>>>> Test succeeded" 405 406test $KILLSERVERS != no && wait 407 408exit 0 409