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