Home | History | Annotate | Line # | Download | only in scripts
      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 if test $SYNCPROV = syncprovno; then
     20 	echo "Syncrepl provider overlay not available, test skipped"
     21 	exit 0
     22 fi
     23 if test $ACCESSLOG = accesslogno; then
     24 	echo "Accesslog overlay not available, test skipped"
     25 	exit 0
     26 fi
     27 
     28 MPR=${MPR-4}
     29 
     30 XDIR=$TESTDIR/srv
     31 TMP=$TESTDIR/tmp
     32 
     33 mkdir -p $TESTDIR
     34 
     35 $SLAPPASSWD -g -n >$CONFIGPWF
     36 
     37 if test x"$SYNCMODE" = x ; then
     38 	SYNCMODE=rp
     39 fi
     40 case "$SYNCMODE" in
     41 	ro)
     42 		SYNCTYPE="type=refreshOnly interval=00:00:00:03"
     43 		;;
     44 	rp)
     45 		SYNCTYPE="type=refreshAndPersist interval=00:00:00:03"
     46 		;;
     47 	*)
     48 		echo "unknown sync mode $SYNCMODE"
     49 		exit 1;
     50 		;;
     51 esac
     52 
     53 #
     54 # Test delta-sync mpr
     55 # - start servers
     56 # - configure over ldap
     57 # - populate over ldap
     58 # - configure syncrepl over ldap
     59 # - break replication
     60 # - modify each server separately
     61 # - restore replication
     62 # - compare results
     63 #
     64 
     65 nullExclude=""
     66 test $BACKEND = null && nullExclude="# "
     67 
     68 KILLPIDS=
     69 
     70 echo "Initializing server configurations..."
     71 n=1
     72 while [ $n -le $MPR ]; do
     73 
     74 DBDIR=${XDIR}$n/db
     75 CFDIR=${XDIR}$n/slapd.d
     76 
     77 mkdir -p ${XDIR}$n $DBDIR.1 $DBDIR.2 $CFDIR
     78 
     79 cat > $TMP <<EOF
     80 dn: cn=config
     81 objectClass: olcGlobal
     82 cn: config
     83 EOF
     84 
     85 o=1
     86 while [ $o -le $MPR ]; do
     87 PORT=`expr $BASEPORT + $o`
     88 URI="ldap://${LOCALHOST}:$PORT/"
     89 echo "olcServerID: $o $URI" >> $TMP
     90 o=`expr $o + 1`
     91 done
     92 echo "" >> $TMP
     93 
     94 if [ "$SYNCPROV" = syncprovmod -o "$ACCESSLOG" = accesslogmod ]; then
     95   cat <<EOF >> $TMP
     96 dn: cn=module,cn=config
     97 objectClass: olcModuleList
     98 cn: module
     99 olcModulePath: $TESTWD/../servers/slapd/overlays
    100 EOF
    101   if [ "$SYNCPROV" = syncprovmod ]; then
    102   echo "olcModuleLoad: syncprov.la" >> $TMP
    103   fi
    104   if [ "$ACCESSLOG" = accesslogmod ]; then
    105   echo "olcModuleLoad: accesslog.la" >> $TMP
    106   fi
    107   echo "" >> $TMP
    108 fi
    109 
    110 if [ "$BACKENDTYPE" = mod ]; then
    111 cat <<EOF >> $TMP
    112 dn: cn=module,cn=config
    113 objectClass: olcModuleList
    114 cn: module
    115 olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
    116 olcModuleLoad: back_$BACKEND.la
    117 
    118 EOF
    119 fi
    120 
    121 MYURI=`eval echo '$URI'$n`
    122 PROVIDERURI=`eval echo '$URI'$o`
    123 if test $INDEXDB = indexdb ; then
    124 INDEX1="olcDbIndex: objectClass,entryCSN,reqStart,reqDN,reqResult eq"
    125 INDEX2="olcDbIndex: objectClass,entryCSN,entryUUID eq"
    126 else
    127 INDEX1=
    128 INDEX2=
    129 fi
    130 cat >> $TMP <<EOF
    131 dn: cn=schema,cn=config
    132 objectclass: olcSchemaconfig
    133 cn: schema
    134 
    135 include: file://$ABS_SCHEMADIR/core.ldif
    136 
    137 include: file://$ABS_SCHEMADIR/cosine.ldif
    138 
    139 include: file://$ABS_SCHEMADIR/inetorgperson.ldif
    140 
    141 include: file://$ABS_SCHEMADIR/openldap.ldif
    142 
    143 include: file://$ABS_SCHEMADIR/nis.ldif
    144 
    145 dn: olcDatabase={0}config,cn=config
    146 objectClass: olcDatabaseConfig
    147 olcDatabase: {0}config
    148 olcRootPW:< file://$CONFIGPWF
    149 
    150 dn: olcDatabase={1}$BACKEND,cn=config
    151 objectClass: olcDatabaseConfig
    152 ${nullExclude}objectClass: olc${BACKEND}Config
    153 olcDatabase: {1}$BACKEND
    154 olcSuffix: cn=log
    155 ${nullExclude}olcDbDirectory: ${DBDIR}.1
    156 olcRootDN: $MANAGERDN
    157 $INDEX1
    158 
    159 dn: olcOverlay=syncprov,olcDatabase={1}$BACKEND,cn=config
    160 objectClass: olcOverlayConfig
    161 objectClass: olcSyncProvConfig
    162 olcOverlay: syncprov
    163 olcSpNoPresent: TRUE
    164 olcSpReloadHint: TRUE
    165 
    166 dn: olcDatabase={2}$BACKEND,cn=config
    167 objectClass: olcDatabaseConfig
    168 ${nullExclude}objectClass: olc${BACKEND}Config
    169 olcDatabase: {2}$BACKEND
    170 olcSuffix: $BASEDN
    171 ${nullExclude}olcDbDirectory: ${DBDIR}.2
    172 olcRootDN: $MANAGERDN
    173 olcRootPW: $PASSWD
    174 EOF
    175 
    176 o=1
    177 while [ $o -le $MPR ]; do
    178 PORT=`expr $BASEPORT + $o`
    179 URI="ldap://${LOCALHOST}:$PORT/"
    180 cat >>$TMP <<EOF
    181 olcSyncRepl: rid=00$o provider=$URI binddn="$MANAGERDN" bindmethod=simple
    182   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
    183   retry="3 +" timeout=3 logbase="cn=log"
    184   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
    185   syncdata=accesslog
    186 EOF
    187 o=`expr $o + 1`
    188 done
    189 
    190 cat >> $TMP <<EOF
    191 olcMultiProvider: TRUE
    192 $INDEX2
    193 
    194 dn: olcOverlay=syncprov,olcDatabase={2}$BACKEND,cn=config
    195 objectClass: olcOverlayConfig
    196 objectClass: olcSyncProvConfig
    197 olcOverlay: syncprov
    198 
    199 dn: olcOverlay=accesslog,olcDatabase={2}$BACKEND,cn=config
    200 objectClass: olcOverlayConfig
    201 objectClass: olcAccessLogConfig
    202 olcOverlay: accesslog
    203 olcAccessLogDB: cn=log
    204 olcAccessLogOps: writes
    205 olcAccessLogSuccess: TRUE
    206 
    207 EOF
    208 cat <<EOF >> $TMP
    209 dn: olcDatabase={3}monitor,cn=config
    210 objectClass: olcDatabaseConfig
    211 objectClass: olcmonitorConfig
    212 olcDatabase: {3}monitor
    213 
    214 EOF
    215 
    216 $SLAPADD -F $CFDIR -n 0  -d-1< $TMP > $TESTOUT 2>&1
    217 RC=$?
    218 if test $RC != 0 ; then
    219 	echo "slapadd failed ($RC)!"
    220 	exit $RC
    221 fi
    222 
    223 PORT=`eval echo '$PORT'$n`
    224 echo "Starting server $n on TCP/IP port $PORT..."
    225 cd ${XDIR}${n}
    226 LOG=`eval echo '$LOG'$n`
    227 $SLAPD -F slapd.d -h $MYURI -d $LVL > $LOG 2>&1 &
    228 PID=$!
    229 if test $WAIT != 0 ; then
    230     echo PID $PID
    231     read foo
    232 fi
    233 KILLPIDS="$PID $KILLPIDS"
    234 cd $TESTWD
    235 
    236 echo "Using ldapsearch to check that server $n is running..."
    237 sleep 1
    238 for i in 0 1 2 3 4 5; do
    239 	$LDAPSEARCH -s base -b "" -H $MYURI \
    240 		'objectclass=*' > /dev/null 2>&1
    241 	RC=$?
    242 	if test $RC = 0 ; then
    243 		break
    244 	fi
    245 	echo "Waiting 5 seconds for slapd to start..."
    246 	sleep 5
    247 done
    248 
    249 if test $RC != 0 ; then
    250 	echo "ldapsearch failed ($RC)!"
    251 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    252 	exit $RC
    253 fi
    254 
    255 if [ $n = 1 ]; then
    256 echo "Using ldapadd for context on server 1..."
    257 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDCP \
    258 	>> $TESTOUT 2>&1
    259 RC=$?
    260 if test $RC != 0 ; then
    261 	echo "ldapadd failed for server $n database ($RC)!"
    262 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    263 	exit $RC
    264 fi
    265 fi
    266 
    267 n=`expr $n + 1`
    268 done
    269 
    270 echo "Using ldapadd to populate server 1..."
    271 $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDEREDNOCP \
    272 	>> $TESTOUT 2>&1
    273 RC=$?
    274 if test $RC != 0 ; then
    275 	echo "ldapadd failed for server $n database ($RC)!"
    276 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    277 	exit $RC
    278 fi
    279 
    280 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    281 sleep $SLEEP1
    282 
    283 n=1
    284 while [ $n -le $MPR ]; do
    285 PORT=`expr $BASEPORT + $n`
    286 URI="ldap://${LOCALHOST}:$PORT/"
    287 
    288 echo "Using ldapsearch to read all the entries from server $n..."
    289 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
    290 	'objectclass=*' > $TESTDIR/server$n.out 2>&1
    291 RC=$?
    292 
    293 if test $RC != 0 ; then
    294 	echo "ldapsearch failed at server $n ($RC)!"
    295 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    296 	exit $RC
    297 fi
    298 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
    299 n=`expr $n + 1`
    300 done
    301 
    302 n=2
    303 while [ $n -le $MPR ]; do
    304 echo "Comparing retrieved entries from server 1 and server $n..."
    305 $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT
    306 
    307 if test $? != 0 ; then
    308 	echo "test failed - server 1 and server $n databases differ"
    309 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    310 	exit 1
    311 fi
    312 n=`expr $n + 1`
    313 done
    314 
    315 echo "Using ldapadd to populate server 2..."
    316 cp $LDIFADD1 $TESTDIR/add.ldif
    317 echo "displayName: The other" >>$TESTDIR/add.ldif
    318 $LDAPADD -D "$MANAGERDN" -H $URI2 -w $PASSWD -f $TESTDIR/add.ldif \
    319 	>> $TESTOUT 2>&1
    320 RC=$?
    321 if test $RC != 0 ; then
    322 	echo "ldapadd failed for server 2 database ($RC)!"
    323 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    324 	exit $RC
    325 fi
    326 
    327 THEDN="cn=James A Jones 2,ou=Alumni Association,ou=People,dc=example,dc=com"
    328 sleep 1
    329 for i in 1 2 3; do
    330 	$LDAPSEARCH -S "" -b "$THEDN" -H $URI1 \
    331 		-s base '(objectClass=*)' entryCSN > "${PROVIDEROUT}.$i" 2>&1
    332 	RC=$?
    333 
    334 	if test $RC = 0 ; then
    335 		break
    336 	fi
    337 
    338 	if test $RC != 32 ; then
    339 		echo "ldapsearch failed at consumer ($RC)!"
    340 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    341 		exit $RC
    342 	fi
    343 
    344 	echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    345 	sleep $SLEEP1
    346 done
    347 
    348 n=1
    349 while [ $n -le $MPR ]; do
    350 PORT=`expr $BASEPORT + $n`
    351 URI="ldap://${LOCALHOST}:$PORT/"
    352 
    353 echo "Using ldapsearch to read all the entries from server $n..."
    354 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
    355 	'objectclass=*' > $TESTDIR/server$n.out 2>&1
    356 RC=$?
    357 
    358 if test $RC != 0 ; then
    359 	echo "ldapsearch failed at server $n ($RC)!"
    360 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    361 	exit $RC
    362 fi
    363 $LDIFFILTER < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
    364 n=`expr $n + 1`
    365 done
    366 
    367 n=2
    368 while [ $n -le $MPR ]; do
    369 echo "Comparing retrieved entries from server 1 and server $n..."
    370 $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT
    371 
    372 if test $? != 0 ; then
    373 	echo "test failed - server 1 and server $n databases differ"
    374 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    375 	exit 1
    376 fi
    377 n=`expr $n + 1`
    378 done
    379 
    380 echo "Breaking replication between server 1 and 2..."
    381 n=1
    382 while [ $n -le 2 ]; do
    383 MYURI=`eval echo '$URI'$n`
    384 o=`expr $n - 1`
    385 $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <<EOF
    386 dn: olcDatabase={2}$BACKEND,cn=config
    387 changetype: modify
    388 delete: olcSyncRepl
    389 -
    390 
    391 EOF
    392 RC=$?
    393 if test $RC != 0 ; then
    394 	echo "ldapmodify failed for server $n config ($RC)!"
    395 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    396 	exit $RC
    397 fi
    398 n=`expr $n + 1`
    399 done
    400 
    401 echo "Using ldapmodify to force conflicts between server 1 and 2..."
    402 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    403 	>> $TESTOUT 2>&1 << EOF
    404 dn: $THEDN
    405 changetype: modify
    406 add: description
    407 description: Amazing
    408 -
    409 add: displayName
    410 displayName: James the Second
    411 -
    412 delete: displayName
    413 displayName: The other
    414 -
    415 replace: mail
    416 mail: jaj2@mail.alumni.example.com
    417 
    418 EOF
    419 RC=$?
    420 if test $RC != 0 ; then
    421 	echo "ldapmodify failed for server 1 database ($RC)!"
    422 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    423 	exit $RC
    424 fi
    425 
    426 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
    427 	>> $TESTOUT 2>&1 << EOF
    428 dn: $THEDN
    429 changetype: modify
    430 replace: employeetype
    431 -
    432 add: description
    433 description: Stupendous
    434 -
    435 add: displayName
    436 displayName: James II
    437 -
    438 delete: displayName
    439 displayName: The other
    440 -
    441 add: mail
    442 mail: jaj2@moo.net
    443 
    444 EOF
    445 RC=$?
    446 if test $RC != 0 ; then
    447 	echo "ldapmodify failed for server 2 database ($RC)!"
    448 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    449 	exit $RC
    450 fi
    451 
    452 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    453 	>> $TESTOUT 2>&1 << EOF
    454 dn: $THEDN
    455 changetype: modify
    456 delete: description
    457 description: Outstanding
    458 -
    459 add: description
    460 description: Mindboggling
    461 
    462 EOF
    463 RC=$?
    464 if test $RC != 0 ; then
    465 	echo "ldapmodify failed for server 1 database ($RC)!"
    466 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    467 	exit $RC
    468 fi
    469 
    470 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
    471 	>> $TESTOUT 2>&1 << EOF
    472 dn: $THEDN
    473 changetype: modify
    474 delete: description
    475 description: OutStanding
    476 -
    477 add: description
    478 description: Bizarre
    479 
    480 EOF
    481 RC=$?
    482 if test $RC != 0 ; then
    483 	echo "ldapmodify failed for server 2 database ($RC)!"
    484 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    485 	exit $RC
    486 fi
    487 
    488 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    489 	>> $TESTOUT 2>&1 << EOF
    490 dn: $THEDN
    491 changetype: modify
    492 add: carLicense
    493 carLicense: 123-XYZ
    494 -
    495 add: employeeNumber
    496 employeeNumber: 32
    497 
    498 EOF
    499 RC=$?
    500 if test $RC != 0 ; then
    501 	echo "ldapmodify failed for server 1 database ($RC)!"
    502 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    503 	exit $RC
    504 fi
    505 
    506 $LDAPMODIFY -D "$MANAGERDN" -H $URI2 -w $PASSWD \
    507 	>> $TESTOUT 2>&1 << EOF
    508 dn: $THEDN
    509 changetype: modify
    510 add: employeeType
    511 employeeType: deadwood
    512 -
    513 add: employeeNumber
    514 employeeNumber: 64
    515 
    516 EOF
    517 RC=$?
    518 if test $RC != 0 ; then
    519 	echo "ldapmodify failed for server 2 database ($RC)!"
    520 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    521 	exit $RC
    522 fi
    523 
    524 $LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    525 	>> $TESTOUT 2>&1 << EOF
    526 dn: $THEDN
    527 changetype: modify
    528 replace: sn
    529 sn: Replaced later
    530 -
    531 replace: sn
    532 sn: Surname
    533 EOF
    534 RC=$?
    535 if test $RC != 0 ; then
    536 	echo "ldapmodify failed for server 1 database ($RC)!"
    537 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    538 	exit $RC
    539 fi
    540 
    541 echo "Restoring replication between server 1 and 2..."
    542 cat > $TMP <<EOF
    543 dn: olcDatabase={2}$BACKEND,cn=config
    544 changetype: modify
    545 add: olcSyncRepl
    546 EOF
    547 n=1
    548 while [ $n -le $MPR ]; do
    549 MYURI=`eval echo '$URI'$n`
    550 PROVIDERURI=`eval echo '$URI'$n`
    551 cat >> $TMP <<EOF
    552 olcSyncRepl: rid=00$n provider=$PROVIDERURI binddn="$MANAGERDN" bindmethod=simple
    553   credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE
    554   retry="3 +" timeout=3 logbase="cn=log"
    555   logfilter="(&(objectclass=auditWriteObject)(reqresult=0))"
    556   syncdata=accesslog
    557 EOF
    558 n=`expr $n + 1`
    559 done
    560 cat >> $TMP <<EOF
    561 -
    562 replace: olcMultiProvider
    563 olcMultiProvider: TRUE
    564 EOF
    565 n=1
    566 while [ $n -le 2 ]; do
    567 MYURI=`eval echo '$URI'$n`
    568 $LDAPMODIFY -D cn=config -H $MYURI -y $CONFIGPWF > $TESTOUT 2>&1 <$TMP
    569 RC=$?
    570 if test $RC != 0 ; then
    571 	echo "ldapmodify failed for server $n config ($RC)!"
    572 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    573 	exit $RC
    574 fi
    575 n=`expr $n + 1`
    576 done
    577 
    578 echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..."
    579 sleep $SLEEP1
    580 
    581 n=1
    582 while [ $n -le $MPR ]; do
    583 PORT=`expr $BASEPORT + $n`
    584 URI="ldap://${LOCALHOST}:$PORT/"
    585 
    586 echo "Using ldapsearch to read all the entries from server $n..."
    587 $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI -w $PASSWD  \
    588 	'objectclass=*' > $TESTDIR/server$n.out 2>&1
    589 RC=$?
    590 
    591 if test $RC != 0 ; then
    592 	echo "ldapsearch failed at server $n ($RC)!"
    593 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    594 	exit $RC
    595 fi
    596 $LDIFFILTER -s a < $TESTDIR/server$n.out > $TESTDIR/server$n.flt
    597 n=`expr $n + 1`
    598 done
    599 
    600 n=2
    601 while [ $n -le $MPR ]; do
    602 echo "Comparing retrieved entries from server 1 and server $n..."
    603 $CMP $PROVIDERFLT $TESTDIR/server$n.flt > $CMPOUT
    604 
    605 if test $? != 0 ; then
    606 	echo "test failed - server 1 and server $n databases differ"
    607 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    608 	exit 1
    609 fi
    610 n=`expr $n + 1`
    611 done
    612 
    613 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    614 
    615 echo ">>>>> Test succeeded"
    616 
    617 test $KILLSERVERS != no && wait
    618 
    619 exit 0
    620