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