Home | History | Annotate | Line # | Download | only in scripts
test018-syncreplication-persist revision 1.1.1.2
      1 #! /bin/sh
      2 # OpenLDAP: pkg/ldap/tests/scripts/test018-syncreplication-persist,v 1.38.2.10 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 if test "$BACKEND" != "bdb" && test "$BACKEND" != "hdb" && test "$BACKEND" != "ldif"; then
     17 	echo "Test does not support $BACKEND"
     18 	exit 0
     19 fi
     20 
     21 echo "running defines.sh"
     22 . $SRCDIR/scripts/defines.sh
     23 
     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 $DBDIR1 $DBDIR4
     30 
     31 #
     32 # Test replication:
     33 # - start producer
     34 # - start consumer
     35 # - populate over ldap
     36 # - perform some modifies and deleted
     37 # - attempt to modify the consumer (referral or chain)
     38 # - retrieve database over ldap and compare against expected results
     39 #
     40 
     41 echo "Starting producer slapd on TCP/IP port $PORT1..."
     42 . $CONFFILTER $BACKEND $MONITORDB < $SRMASTERCONF > $CONF1
     43 $SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 &
     44 PID=$!
     45 if test $WAIT != 0 ; then
     46     echo PID $PID
     47     read foo
     48 fi
     49 KILLPIDS="$PID"
     50 
     51 sleep 1
     52 
     53 echo "Using ldapsearch to check that producer slapd is running..."
     54 for i in 0 1 2 3 4 5; do
     55 	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
     56 		'objectclass=*' > /dev/null 2>&1
     57 	RC=$?
     58 	if test $RC = 0 ; then
     59 		break
     60 	fi
     61 	echo "Waiting 5 seconds for slapd to start..."
     62 	sleep 5
     63 done
     64 
     65 if test $RC != 0 ; then
     66 	echo "ldapsearch failed ($RC)!"
     67 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     68 	exit $RC
     69 fi
     70 
     71 echo "Using ldapadd to create the context prefix entry in the producer..."
     72 $LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
     73 	$LDIFORDEREDCP > /dev/null 2>&1
     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 $PORT4..."
     82 . $CONFFILTER $BACKEND $MONITORDB < $P1SRSLAVECONF > $CONF4
     83 $SLAPD -f $CONF4 -h $URI4 -d $LVL $TIMING > $LOG4 2>&1 &
     84 SLAVEPID=$!
     85 if test $WAIT != 0 ; then
     86     echo SLAVEPID $SLAVEPID
     87     read foo
     88 fi
     89 KILLPIDS="$KILLPIDS $SLAVEPID"
     90 
     91 sleep 1
     92 
     93 echo "Using ldapsearch to check that consumer slapd is running..."
     94 for i in 0 1 2 3 4 5; do
     95 	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT4 \
     96 		'objectclass=*' > /dev/null 2>&1
     97 	RC=$?
     98 	if test $RC = 0 ; then
     99 		break
    100 	fi
    101 	echo "Waiting 5 seconds for slapd to start..."
    102 	sleep 5
    103 done
    104 
    105 if test $RC != 0 ; then
    106 	echo "ldapsearch failed ($RC)!"
    107 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    108 	exit $RC
    109 fi
    110 
    111 echo "Using ldapadd to populate the producer directory..."
    112 $LDAPADD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD < \
    113 	$LDIFORDEREDNOCP > /dev/null 2>&1
    114 RC=$?
    115 if test $RC != 0 ; then
    116 	echo "ldapadd failed ($RC)!"
    117 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    118 	exit $RC
    119 fi
    120 
    121 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    122 sleep $SLEEP1
    123 
    124 echo "Stopping the provider, sleeping 10 seconds and restarting it..."
    125 kill -HUP "$PID"
    126 wait $PID
    127 sleep 10
    128 echo "RESTART" >> $LOG1
    129 $SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING >> $LOG1 2>&1 &
    130 PID=$!
    131 if test $WAIT != 0 ; then
    132     echo PID $PID
    133     read foo
    134 fi
    135 KILLPIDS="$PID $SLAVEPID"
    136 
    137 sleep 1
    138 
    139 echo "Using ldapsearch to check that producer slapd is running..."
    140 for i in 0 1 2 3 4 5; do
    141 	$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \
    142 		'objectclass=*' > /dev/null 2>&1
    143 	RC=$?
    144 	if test $RC = 0 ; then
    145 		break
    146 	fi
    147 	echo "Waiting 5 seconds for slapd to start..."
    148 	sleep 5
    149 done
    150 
    151 echo "Waiting $SLEEP1 seconds for consumer to reconnect..."
    152 sleep $SLEEP1
    153 
    154 if test $RC != 0 ; then
    155 	echo "ldapsearch failed ($RC)!"
    156 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    157 	exit $RC
    158 fi
    159 
    160 echo "Using ldapmodify to modify producer directory..."
    161 
    162 #
    163 # Do some modifications
    164 #
    165 
    166 $LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \
    167 	$TESTOUT 2>&1 << EOMODS
    168 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
    169 changetype: modify
    170 add: drink
    171 drink: Orange Juice
    172 -
    173 delete: sn
    174 sn: Jones
    175 -
    176 add: sn
    177 sn: Jones
    178 
    179 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    180 changetype: modify
    181 replace: drink
    182 drink: Iced Tea
    183 
    184 dn: cn=ITD Staff,ou=Groups,dc=example,dc=com
    185 changetype: modify
    186 delete: uniquemember
    187 uniquemember: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
    188 uniquemember: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    189 -
    190 add: uniquemember
    191 uniquemember: cn=Dorothy Stevens, ou=Alumni Association, ou=People, dc=example,dc=com
    192 uniquemember: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example,dc=com
    193 
    194 dn: cn=All Staff,ou=Groups,dc=example,dc=com
    195 changetype: modify
    196 delete: description
    197 
    198 dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    199 changetype: add
    200 objectclass: OpenLDAPperson
    201 cn: Gern Jensen
    202 sn: Jensen
    203 uid: gjensen
    204 title: Chief Investigator, ITD
    205 postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103
    206 seealso: cn=All Staff, ou=Groups, dc=example,dc=com
    207 drink: Coffee
    208 homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104
    209 description: Very odd
    210 facsimiletelephonenumber: +1 313 555 7557
    211 telephonenumber: +1 313 555 8343
    212 mail: gjensen@mailgw.example.com
    213 homephone: +1 313 555 8844
    214 
    215 dn: ou=Retired, ou=People, dc=example,dc=com
    216 changetype: add
    217 objectclass: organizationalUnit
    218 ou: Retired
    219 
    220 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
    221 changetype: add
    222 objectclass: OpenLDAPperson
    223 cn: Rosco P. Coltrane
    224 sn: Coltrane
    225 uid: rosco
    226 description: Fat tycoon
    227 
    228 dn: cn=Rosco P. Coltrane, ou=Information Technology Division, ou=People, dc=example,dc=com
    229 changetype: modrdn
    230 newrdn: cn=Rosco P. Coltrane
    231 deleteoldrdn: 1
    232 newsuperior: ou=Retired, ou=People, dc=example,dc=com
    233 
    234 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, dc=example,dc=com
    235 changetype: delete
    236 
    237 dn: dc=testdomain1,dc=example,dc=com
    238 changetype: modrdn
    239 newrdn: dc=itsdomain1
    240 deleteoldrdn: 1
    241 
    242 dn: dc=itsdomain1,dc=example,dc=com
    243 changetype: modify
    244 replace: description
    245 description: Example, Inc. ITS test domain
    246 
    247 dn: dc=testdomain2,dc=example,dc=com
    248 changetype: modrdn
    249 newrdn: dc=itsdomain2
    250 deleteoldrdn: 1
    251 
    252 EOMODS
    253 
    254 RC=$?
    255 if test $RC != 0 ; then
    256 	echo "ldapmodify failed ($RC)!"
    257 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    258 	exit $RC
    259 fi
    260 
    261 echo "Using ldappasswd to change some passwords..."
    262 $LDAPPASSWD -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \
    263 	'cn=Bjorn Jensen,ou=Information Technology Division,ou=People,dc=example,dc=com' \
    264 	> $TESTOUT 2>&1
    265 RC=$?
    266 if test $RC != 0 ; then
    267 	echo "ldapmodify failed ($RC)!"
    268 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    269 	exit $RC
    270 fi
    271 
    272 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    273 sleep $SLEEP1
    274 
    275 echo "Stopping consumer to test recovery..."
    276 kill -HUP $SLAVEPID
    277 wait $SLAVEPID
    278 
    279 echo "Modifying more entries on the producer..."
    280 $LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD >> \
    281 	$TESTOUT 2>&1 << EOMODS
    282 dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
    283 changetype: delete
    284 
    285 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, dc=example,dc=com
    286 changetype: modify
    287 add: drink
    288 drink: Mad Dog 20/20
    289 
    290 dn: cn=Rosco P. Coltrane, ou=Retired, ou=People, dc=example,dc=com
    291 changetype: add
    292 objectclass: OpenLDAPperson
    293 sn: Coltrane
    294 uid: rosco
    295 cn: Rosco P. Coltrane
    296 
    297 dn: dc=itsdomain2,dc=example,dc=com
    298 changetype: modify
    299 replace: description
    300 description: Example, Inc. itsdomain2 test domain
    301 
    302 EOMODS
    303 
    304 RC=$?
    305 if test $RC != 0 ; then
    306 	echo "ldapmodify failed ($RC)!"
    307 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    308 	exit $RC
    309 fi
    310 
    311 echo "Restarting consumer..."
    312 echo "RESTART" >> $LOG4
    313 $SLAPD -f $CONF4 -h $URI4 -d $LVL $TIMING >> $LOG4 2>&1 &
    314 SLAVEPID=$!
    315 if test $WAIT != 0 ; then
    316     echo SLAVEPID $SLAVEPID
    317     read foo
    318 fi
    319 KILLPIDS="$PID $SLAVEPID"
    320 
    321 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    322 sleep $SLEEP1
    323 
    324 if test ! $BACKLDAP = "ldapno" ; then
    325 	echo "Try updating the consumer slapd..."
    326 	$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT4 -w $PASSWD > \
    327 		$TESTOUT 2>&1 << EOMODS
    328 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com
    329 changetype: modify
    330 add: description
    331 description: This write must fail because directed to a shadow context,
    332 description: unless the chain overlay is configured appropriately ;)
    333 
    334 EOMODS
    335 
    336 	RC=$?
    337 	if test $RC != 0 ; then
    338 		echo "ldapmodify failed ($RC)!"
    339 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    340 		exit $RC
    341 	fi
    342 
    343 	# ITS#4964
    344 	echo "Trying to change some passwords on the consumer..."
    345 	$LDAPPASSWD -D "$MANAGERDN" -h $LOCALHOST -p $PORT4 -w $PASSWD \
    346 		'cn=Barbara Jensen,ou=Information Technology Division,ou=People,dc=example,dc=com' \
    347 		> $TESTOUT 2>&1
    348 	RC=$?
    349 	if test $RC != 0 ; then
    350 		echo "ldapmodify failed ($RC)!"
    351 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    352 		exit $RC
    353 	fi
    354 
    355 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    356 	sleep $SLEEP1
    357 fi
    358 
    359 OPATTRS="entryUUID creatorsName createTimestamp modifiersName modifyTimestamp"
    360 
    361 echo "Using ldapsearch to read all the entries from the producer..."
    362 $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT1 \
    363 	'(objectclass=*)' '*' $OPATTRS > $MASTEROUT 2>&1
    364 RC=$?
    365 
    366 if test $RC != 0 ; then
    367 	echo "ldapsearch failed at producer ($RC)!"
    368 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    369 	exit $RC
    370 fi
    371 
    372 echo "Using ldapsearch to read all the entries from the consumer..."
    373 $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT4 \
    374 	'(objectclass=*)' '*' $OPATTRS > $SLAVEOUT 2>&1
    375 RC=$?
    376 
    377 if test $RC != 0 ; then
    378 	echo "ldapsearch failed at consumer ($RC)!"
    379 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    380 	exit $RC
    381 fi
    382 
    383 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    384 
    385 echo "Filtering producer results..."
    386 . $LDIFFILTER < $MASTEROUT > $MASTERFLT
    387 echo "Filtering consumer results..."
    388 . $LDIFFILTER < $SLAVEOUT > $SLAVEFLT
    389 
    390 echo "Comparing retrieved entries from producer and consumer..."
    391 $CMP $MASTERFLT $SLAVEFLT > $CMPOUT
    392 
    393 if test $? != 0 ; then
    394 	echo "test failed - producer and consumer databases differ"
    395 	exit 1
    396 fi
    397 
    398 echo ">>>>> Test succeeded"
    399 
    400 test $KILLSERVERS != no && wait
    401 
    402 exit 0
    403