Home | History | Annotate | Line # | Download | only in scripts
      1 #! /bin/sh
      2 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
      3 ##
      4 ## Copyright 1998-2024 The OpenLDAP Foundation.
      5 ## All rights reserved.
      6 ##
      7 ## Redistribution and use in source and binary forms, with or without
      8 ## modification, are permitted only as authorized by the OpenLDAP
      9 ## Public License.
     10 ##
     11 ## A copy of this license is available in the file LICENSE in the
     12 ## top-level directory of the distribution or, alternatively, at
     13 ## <http://www.OpenLDAP.org/license.html>.
     14 
     15 echo "running defines.sh"
     16 . $SRCDIR/scripts/defines.sh
     17 
     18 if test $DYNLIST = "dynlistno" ; then 
     19 	echo "dynlist overlay not available, test skipped"
     20 	exit 0
     21 fi 
     22 
     23 if test $BACKEND = ldif ; then
     24 	# dynlist+ldif fails because back-ldif lacks bi_op_compare()
     25 	echo "$BACKEND backend unsuitable for dynlist overlay, test skipped"
     26 	exit 0
     27 fi
     28 
     29 mkdir -p $TESTDIR $DBDIR1
     30 
     31 $SLAPPASSWD -g -n >$CONFIGPWF
     32 echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf
     33 
     34 DBIX=2
     35 
     36 echo "Running slapadd to build slapd database..."
     37 . $CONFFILTER $BACKEND < $DYNLISTCONF > $CONF1
     38 $SLAPADD -f $CONF1 -l $LDIFORDERED
     39 RC=$?
     40 if test $RC != 0 ; then
     41 	echo "slapadd failed ($RC)!"
     42 	exit $RC
     43 fi
     44 
     45 
     46 echo "Starting slapd on TCP/IP port $PORT1..."
     47 $SLAPD -f $CONF1 -h $URI1 -d $LVL > $LOG1 2>&1 &
     48 PID=$!
     49 if test $WAIT != 0 ; then
     50     echo PID $PID
     51     read foo
     52 fi
     53 KILLPIDS="$PID"
     54 
     55 sleep 1
     56 
     57 echo "Testing slapd searching..."
     58 for i in 0 1 2 3 4 5; do
     59 	$LDAPSEARCH -s base -b "$MONITOR" -H $URI1 \
     60 		'(objectclass=*)' > /dev/null 2>&1
     61 	RC=$?
     62 	if test $RC = 0 ; then
     63 		break
     64 	fi
     65 	echo "Waiting 5 seconds for slapd to start..."
     66 	sleep 5
     67 done
     68 
     69 if test $RC != 0 ; then
     70 	echo "ldapsearch failed ($RC)!"
     71 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     72 	exit $RC
     73 fi
     74 
     75 cat /dev/null > $SEARCHOUT
     76 
     77 LISTDN="ou=Dynamic Lists,$BASEDN"
     78 echo "Adding a dynamic list..."
     79 $LDAPADD -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
     80 	> $TESTOUT 2>&1 << EOMODS
     81 dn: $LISTDN
     82 objectClass: organizationalUnit
     83 ou: Dynamic Lists
     84 
     85 dn: cn=Dynamic List,$LISTDN
     86 objectClass: groupOfURLs
     87 cn: Dynamic List
     88 memberURL: ldap:///ou=People,${BASEDN}?cn,mail?sub?(objectClass=person)
     89 EOMODS
     90 
     91 echo "Testing list search of all attrs..."
     92 echo "# Testing list search of all attrs..." >> $SEARCHOUT
     93 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
     94 	'(cn=Dynamic List)' '*' \
     95 	>> $SEARCHOUT 2>&1
     96 RC=$?
     97 if test $RC != 0 ; then
     98 	echo "ldapsearch failed ($RC)!"
     99 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    100 	exit $RC
    101 fi
    102 
    103 echo "Testing list search of a listed attr..."
    104 echo "# Testing list search of a listed attr..." >> $SEARCHOUT
    105 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    106 	'(cn=Dynamic List)' mail \
    107 	>> $SEARCHOUT 2>&1
    108 RC=$?
    109 if test $RC != 0 ; then
    110 	echo "ldapsearch failed ($RC)!"
    111 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    112 	exit $RC
    113 fi
    114 
    115 echo "Testing list search of a non-listed attr..."
    116 echo "# Testing list search of a non-listed attr..." >> $SEARCHOUT
    117 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    118 	'(cn=Dynamic List)' objectClass \
    119 	>> $SEARCHOUT 2>&1
    120 RC=$?
    121 if test $RC != 0 ; then
    122 	echo "ldapsearch failed ($RC)!"
    123 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    124 	exit $RC
    125 fi
    126 
    127 echo "Testing list search with (critical) manageDSAit..."
    128 echo "# Testing list search with (critical) manageDSAit..." >> $SEARCHOUT
    129 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 -MM \
    130 	'(cn=Dynamic List)' '*' \
    131 	>> $SEARCHOUT 2>&1
    132 RC=$?
    133 if test $RC != 0 ; then
    134 	echo "ldapsearch failed ($RC)!"
    135 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    136 	exit $RC
    137 fi
    138 
    139 echo "Testing filtered search with all attrs..."
    140 echo "# Testing filtered search with all attrs..." >> $SEARCHOUT
    141 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    142 	'(mail=jdoe (at] woof.net)' '*' \
    143 	>> $SEARCHOUT 2>&1
    144 RC=$?
    145 if test $RC != 0 ; then
    146 	echo "ldapsearch failed ($RC)!"
    147 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    148 	exit $RC
    149 fi
    150 
    151 echo "Testing filtered search of a listed attr..."
    152 echo "# Testing filtered search of a listed attr..." >> $SEARCHOUT
    153 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    154 	'(mail=jdoe (at] woof.net)' mail \
    155 	>> $SEARCHOUT 2>&1
    156 RC=$?
    157 if test $RC != 0 ; then
    158 	echo "ldapsearch failed ($RC)!"
    159 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    160 	exit $RC
    161 fi
    162 
    163 echo "Testing filtered search of a non-listed attr..."
    164 echo "# Testing filtered search of a non-listed attr..." >> $SEARCHOUT
    165 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    166 	'(mail=jdoe (at] woof.net)' objectClass \
    167 	>> $SEARCHOUT 2>&1
    168 RC=$?
    169 if test $RC != 0 ; then
    170 	echo "ldapsearch failed ($RC)!"
    171 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    172 	exit $RC
    173 fi
    174 
    175 echo "Testing filtered search of a non-present attr..."
    176 echo "# Testing filtered search of a non-present attr..." >> $SEARCHOUT
    177 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    178 	'(mail=nobody@nowhere)' objectClass \
    179 	>> $SEARCHOUT 2>&1
    180 RC=$?
    181 if test $RC != 0 ; then
    182 	echo "ldapsearch failed ($RC)!"
    183 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    184 	exit $RC
    185 fi
    186 
    187 echo "Testing list compare..."
    188 echo "# Testing list compare..." >> $SEARCHOUT
    189 $LDAPCOMPARE -H $URI1 \
    190 	"cn=Dynamic List,$LISTDN" "cn:Bjorn Jensen" \
    191 	>> $SEARCHOUT 2>&1
    192 RC=$?
    193 case $RC in
    194 5)
    195 	echo "ldapcompare returned FALSE ($RC)!"
    196 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    197 	exit $RC
    198 	;;
    199 6)
    200 	echo "ldapcompare returned TRUE ($RC)"
    201 	;;
    202 0)
    203 	echo "ldapcompare returned success ($RC)!"
    204 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    205 	exit 1
    206 	;;
    207 *)
    208 	echo "ldapcompare failed ($RC)!"
    209 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    210 	exit $RC
    211 	;;
    212 esac
    213 echo "" >> $SEARCHOUT
    214 
    215 echo "Testing list compare (should return FALSE)..."
    216 echo "# Testing list compare (should return FALSE)..." >> $SEARCHOUT
    217 $LDAPCOMPARE -H $URI1 \
    218 	"cn=Dynamic List,$LISTDN" "cn:FALSE" \
    219 	>> $SEARCHOUT 2>&1
    220 RC=$?
    221 case $RC in
    222 5)
    223 	echo "ldapcompare returned FALSE ($RC)"
    224 	;;
    225 6)
    226 	echo "ldapcompare returned TRUE ($RC)!"
    227 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    228 	exit $RC
    229 	;;
    230 0)
    231 	echo "ldapcompare returned success ($RC)!"
    232 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    233 	exit 1
    234 	;;
    235 *)
    236 	echo "ldapcompare failed ($RC)!"
    237 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    238 	exit $RC
    239 	;;
    240 esac
    241 echo "" >> $SEARCHOUT
    242 
    243 echo "Testing list compare (should return UNDEFINED)..."
    244 echo "# Testing list compare (should return UNDEFINED)..." >> $SEARCHOUT
    245 $LDAPCOMPARE -H $URI1 \
    246 	"cn=Dynamic List,$LISTDN" "dc:UNDEFINED" \
    247 	>> $SEARCHOUT 2>&1
    248 RC=$?
    249 case $RC in
    250 5)
    251 	echo "ldapcompare returned FALSE ($RC)!"
    252 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    253 	exit $RC
    254 	;;
    255 6)
    256 	echo "ldapcompare returned TRUE ($RC)!"
    257 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    258 	exit $RC
    259 	;;
    260 16|32)
    261 	echo "ldapcompare returned UNDEFINED ($RC)"
    262 	;;
    263 0)
    264 	echo "ldapcompare returned success ($RC)!"
    265 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    266 	exit 1
    267 	;;
    268 *)
    269 	echo "ldapcompare failed ($RC)"
    270 	;;
    271 esac
    272 echo "" >> $SEARCHOUT
    273 
    274 echo "Testing list compare with manageDSAit..."
    275 echo "# Testing list compare with manageDSAit..." >> $SEARCHOUT
    276 $LDAPCOMPARE -H $URI1 -MM \
    277 	"cn=Dynamic List,$LISTDN" "cn:Bjorn Jensen" \
    278 	>> $SEARCHOUT 2>&1
    279 RC=$?
    280 case $RC in
    281 5)
    282 	echo "ldapcompare returned FALSE ($RC)"
    283 	;;
    284 6)
    285 	echo "ldapcompare returned TRUE ($RC)!"
    286 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    287 	exit $RC
    288 	;;
    289 0)
    290 	echo "ldapcompare returned success ($RC)!"
    291 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    292 	exit 1
    293 	;;
    294 *)
    295 	echo "ldapcompare failed ($RC)!"
    296 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    297 	exit $RC
    298 	;;
    299 esac
    300 echo "" >> $SEARCHOUT
    301 
    302 echo "Reconfiguring slapd..."
    303 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    304 	$TESTOUT 2>&1 << EOMODS
    305 version: 1
    306 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    307 changetype: modify
    308 delete: olcDynListAttrSet
    309 olcDynListAttrSet: {0}
    310 -
    311 add: olcDynListAttrSet
    312 olcDynListAttrSet: groupOfURLs memberURL sn:cn mail
    313 -
    314 EOMODS
    315 
    316 RC=$?
    317 if test $RC != 0 ; then
    318 	echo "ldapmodify failed ($RC)!"
    319 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    320 	exit $RC
    321 fi
    322 
    323 echo "==========================================================" >> $LOG1
    324 
    325 echo "Testing attribute mapping"
    326 
    327 echo "Testing list search of all (mapped) attrs..."
    328 echo "# Testing list search of all (mapped) attrs..." >> $SEARCHOUT
    329 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    330 	'(cn=Dynamic List)' '*' \
    331 	>> $SEARCHOUT 2>&1
    332 RC=$?
    333 if test $RC != 0 ; then
    334 	echo "ldapsearch failed ($RC)!"
    335 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    336 	exit $RC
    337 fi
    338 
    339 echo "Testing list search of a (mapped) listed attr..."
    340 echo "# Testing list search of a (mapped) listed attr..." >> $SEARCHOUT
    341 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    342 	'(cn=Dynamic List)' sn \
    343 	>> $SEARCHOUT 2>&1
    344 RC=$?
    345 if test $RC != 0 ; then
    346 	echo "ldapsearch failed ($RC)!"
    347 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    348 	exit $RC
    349 fi
    350 
    351 echo "Testing list search of a (n unmapped) listed attr..."
    352 echo "# Testing list search of a (n unmapped) listed attr..." >> $SEARCHOUT
    353 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    354 	'(cn=Dynamic List)' mail \
    355 	>> $SEARCHOUT 2>&1
    356 RC=$?
    357 if test $RC != 0 ; then
    358 	echo "ldapsearch failed ($RC)!"
    359 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    360 	exit $RC
    361 fi
    362 
    363 echo "Testing list compare (mapped attrs) ..."
    364 echo "# Testing list compare (mapped attrs) ..." >> $SEARCHOUT
    365 $LDAPCOMPARE -H $URI1 \
    366 	"cn=Dynamic List,$LISTDN" "sn:Bjorn Jensen" \
    367 	>> $SEARCHOUT 2>&1
    368 RC=$?
    369 case $RC in
    370 5)
    371 	echo "ldapcompare returned FALSE ($RC)!"
    372 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    373 	exit $RC
    374 	;;
    375 6)
    376 	echo "ldapcompare returned TRUE ($RC)"
    377 	;;
    378 0)
    379 	echo "ldapcompare returned success ($RC)!"
    380 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    381 	exit 1
    382 	;;
    383 *)
    384 	echo "ldapcompare failed ($RC)!"
    385 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    386 	exit $RC
    387 	;;
    388 esac
    389 echo "" >> $SEARCHOUT
    390 
    391 echo "Testing list compare (mapped attrs; should return FALSE)..."
    392 echo "# Testing list compare (mapped attrs; should return FALSE)..." >> $SEARCHOUT
    393 $LDAPCOMPARE -H $URI1 \
    394 	"cn=Dynamic List,$LISTDN" "sn:FALSE" \
    395 	>> $SEARCHOUT 2>&1
    396 RC=$?
    397 case $RC in
    398 5)
    399 	echo "ldapcompare returned FALSE ($RC)"
    400 	;;
    401 6)
    402 	echo "ldapcompare returned TRUE ($RC)!"
    403 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    404 	exit $RC
    405 	;;
    406 0)
    407 	echo "ldapcompare returned success ($RC)!"
    408 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    409 	exit 1
    410 	;;
    411 *)
    412 	echo "ldapcompare failed ($RC)!"
    413 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    414 	exit $RC
    415 	;;
    416 esac
    417 echo "" >> $SEARCHOUT
    418 
    419 echo "Reconfiguring slapd..."
    420 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    421 	$TESTOUT 2>&1 << EOMODS
    422 version: 1
    423 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    424 changetype: modify
    425 delete: olcDynListAttrSet
    426 olcDynListAttrSet: {0}
    427 -
    428 add: olcDynListAttrSet
    429 olcDynListAttrSet: groupOfURLs memberURL member
    430 -
    431 EOMODS
    432 
    433 RC=$?
    434 if test $RC != 0 ; then
    435 	echo "ldapmodify failed ($RC)!"
    436 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    437 	exit $RC
    438 fi
    439 
    440 echo "==========================================================" >> $LOG1
    441 
    442 echo "Adding a dynamic list..."
    443 $LDAPADD -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    444 	> $TESTOUT 2>&1 << EOMODS
    445 dn: cn=Dynamic List of Members,$LISTDN
    446 objectClass: groupOfURLs
    447 cn: Dynamic List of Members
    448 memberURL: ldap:///ou=People,${BASEDN}??sub?(objectClass=person)
    449 EOMODS
    450 
    451 echo "Testing list search of all attrs..."
    452 echo "# Testing list search of all attrs..." >> $SEARCHOUT
    453 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    454 	'(cn=Dynamic List of Members)' '*' \
    455 	>> $SEARCHOUT 2>&1
    456 RC=$?
    457 if test $RC != 0 ; then
    458 	echo "ldapsearch failed ($RC)!"
    459 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    460 	exit $RC
    461 fi
    462 
    463 echo "Testing list search of a listed attr..."
    464 echo "# Testing list search of a listed attr..." >> $SEARCHOUT
    465 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    466 	'(cn=Dynamic List of Members)' member \
    467 	>> $SEARCHOUT 2>&1
    468 RC=$?
    469 if test $RC != 0 ; then
    470 	echo "ldapsearch failed ($RC)!"
    471 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    472 	exit $RC
    473 fi
    474 
    475 echo "Testing list search of a non-listed attr..."
    476 echo "# Testing list search of a non-listed attr..." >> $SEARCHOUT
    477 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    478 	'(cn=Dynamic List of Members)' objectClass \
    479 	>> $SEARCHOUT 2>&1
    480 RC=$?
    481 if test $RC != 0 ; then
    482 	echo "ldapsearch failed ($RC)!"
    483 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    484 	exit $RC
    485 fi
    486 
    487 echo "Testing list search with (critical) manageDSAit..."
    488 echo "# Testing list search with (critical) manageDSAit..." >> $SEARCHOUT
    489 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 -MM \
    490 	'(&(cn=Dynamic List of Members)(objectClass=groupOfURLs))' '*' \
    491 	>> $SEARCHOUT 2>&1
    492 RC=$?
    493 if test $RC != 0 ; then
    494 	echo "ldapsearch failed ($RC)!"
    495 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    496 	exit $RC
    497 fi
    498 
    499 CMPDN="$BJORNSDN"
    500 echo "Testing list compare..."
    501 echo "# Testing list compare..." >> $SEARCHOUT
    502 $LDAPCOMPARE -H $URI1 \
    503 	"cn=Dynamic List of Members,$LISTDN" "member:$CMPDN" \
    504 	>> $SEARCHOUT 2>&1
    505 RC=$?
    506 case $RC in
    507 5)
    508 	echo "ldapcompare returned FALSE ($RC)!"
    509 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    510 	exit $RC
    511 	;;
    512 6)
    513 	echo "ldapcompare returned TRUE ($RC)"
    514 	;;
    515 0)
    516 	echo "ldapcompare returned success ($RC)!"
    517 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    518 	exit 1
    519 	;;
    520 *)
    521 	echo "ldapcompare failed ($RC)!"
    522 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    523 	exit $RC
    524 	;;
    525 esac
    526 echo "" >> $SEARCHOUT
    527 
    528 CMPDN="$BADBJORNSDN"
    529 echo "Testing list compare (should return FALSE)..."
    530 echo "# Testing list compare... (should return FALSE)" >> $SEARCHOUT
    531 $LDAPCOMPARE -H $URI1 \
    532 	"cn=Dynamic List of Members,$LISTDN" "member:$CMPDN" \
    533 	>> $SEARCHOUT 2>&1
    534 RC=$?
    535 case $RC in
    536 5)
    537 	echo "ldapcompare returned FALSE ($RC)"
    538 	;;
    539 6)
    540 	echo "ldapcompare returned TRUE ($RC)!"
    541 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    542 	exit $RC
    543 	;;
    544 0)
    545 	echo "ldapcompare returned success ($RC)!"
    546 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    547 	exit 1
    548 	;;
    549 *)
    550 	echo "ldapcompare failed ($RC)!"
    551 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    552 	exit $RC
    553 	;;
    554 esac
    555 echo "" >> $SEARCHOUT
    556 
    557 CMPDN="$BJORNSDN"
    558 echo "Testing list compare (should return FALSE)..."
    559 echo "# Testing list compare (should return FALSE)..." >> $SEARCHOUT
    560 $LDAPCOMPARE -H $URI1 \
    561 	"cn=Dynamic List of Members,$LISTDN" "member:cn=Foo Bar" \
    562 	>> $SEARCHOUT 2>&1
    563 RC=$?
    564 case $RC in
    565 5)
    566 	echo "ldapcompare returned FALSE ($RC)"
    567 	;;
    568 6)
    569 	echo "ldapcompare returned TRUE ($RC)!"
    570 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    571 	exit $RC
    572 	;;
    573 0)
    574 	echo "ldapcompare returned success ($RC)!"
    575 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    576 	exit 1
    577 	;;
    578 *)
    579 	echo "ldapcompare failed ($RC)!"
    580 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    581 	exit $RC
    582 	;;
    583 esac
    584 echo "" >> $SEARCHOUT
    585 
    586 echo "Testing list compare with manageDSAit (should return UNDEFINED)..."
    587 echo "# Testing list compare with manageDSAit (should return UNDEFINED)..." >> $SEARCHOUT
    588 $LDAPCOMPARE -H $URI1 -MM \
    589 	"cn=Dynamic List,$LISTDN" "member:$CMPDN" \
    590 	>> $SEARCHOUT 2>&1
    591 RC=$?
    592 case $RC in
    593 5)
    594 	echo "ldapcompare returned FALSE ($RC)"
    595 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    596 	exit $RC
    597 	;;
    598 6)
    599 	echo "ldapcompare returned TRUE ($RC)!"
    600 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    601 	exit $RC
    602 	;;
    603 16|32)
    604 	echo "ldapcompare returned UNDEFINED ($RC)"
    605 	;;
    606 0)
    607 	echo "ldapcompare returned success ($RC)!"
    608 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    609 	exit 1
    610 	;;
    611 *)
    612 	echo "ldapcompare failed ($RC)!"
    613 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    614 	exit $RC
    615 	;;
    616 esac
    617 echo "" >> $SEARCHOUT
    618 
    619 echo "==========================================================" >> $LOG1
    620 
    621 echo "Testing dgIdentity..."
    622 
    623 # Set ACL, require authentication to get list contents
    624 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    625 	$TESTOUT 2>&1 << EOMODS
    626 version: 1
    627 dn: olcDatabase={$DBIX}$BACKEND,cn=config
    628 changetype: modify
    629 add: olcAccess
    630 olcAccess: to dn.base="cn=Dynamic List of Members,$LISTDN" by * read
    631 olcAccess: to * by users read by * search
    632 EOMODS
    633 
    634 RC=$?
    635 if test $RC != 0 ; then
    636 	echo "ldapmodify failed ($RC)!"
    637 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    638 	exit $RC
    639 fi
    640 
    641 echo "Testing list search without dgIdentity..."
    642 echo "# Testing list search without dgIdentity..." >> $SEARCHOUT
    643 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    644 	'(cn=Dynamic List of Members)' '*' \
    645 	>> $SEARCHOUT 2>&1
    646 RC=$?
    647 if test $RC != 0 ; then
    648 	echo "ldapsearch failed ($RC)!"
    649 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    650 	exit $RC
    651 fi
    652 
    653 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    654 	> $TESTOUT 2>&1 << EOMODS
    655 dn: cn=Dynamic List of Members,$LISTDN
    656 changetype: modify
    657 add: objectClass
    658 objectClass: dgIdentityAux
    659 -
    660 add: dgIdentity
    661 dgIdentity: $CMPDN
    662 EOMODS
    663 
    664 RC=$?
    665 if test $RC != 0 ; then
    666 	echo "ldapmodify failed ($RC)!"
    667 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    668 	exit $RC
    669 fi
    670 
    671 echo "Testing list search with dgIdentity..."
    672 echo "# Testing list search with dgIdentity..." >> $SEARCHOUT
    673 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    674 	'(cn=Dynamic List of Members)' '*' \
    675 	>> $SEARCHOUT 2>&1
    676 RC=$?
    677 if test $RC != 0 ; then
    678 	echo "ldapsearch failed ($RC)!"
    679 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    680 	exit $RC
    681 fi
    682 
    683 echo "Testing dgAuthz..."
    684 
    685 CMPDN="cn=Bjorn Jensen,ou=Information Technology Division,ou=People,$BASEDN"
    686 $LDAPMODIFY -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    687 	> $TESTOUT 2>&1 << EOMODS
    688 dn: cn=Dynamic List of Members,$LISTDN
    689 changetype: modify
    690 add: dgAuthz
    691 dgAuthz: dn:$BABSDN
    692 EOMODS
    693 
    694 RC=$?
    695 if test $RC != 0 ; then
    696 	echo "ldapmodify failed ($RC)!"
    697 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    698 	exit $RC
    699 fi
    700 
    701 echo "Testing list search with dgIdentity and dgAuthz anonymously..."
    702 echo "# Testing list search with dgIdentity and dgAuthz anonymously..." >> $SEARCHOUT
    703 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    704 	'(cn=Dynamic List of Members)' '*' \
    705 	>> $SEARCHOUT 2>&1
    706 RC=$?
    707 if test $RC != 0 ; then
    708 	echo "ldapsearch failed ($RC)!"
    709 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    710 	exit $RC
    711 fi
    712 
    713 echo "Testing list search with dgIdentity and dgAuthz as the authorized identity..."
    714 echo "# Testing list search with dgIdentity and dgAuthz as the authorized identity..." >> $SEARCHOUT
    715 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    716 	-D "$BABSDN" -w bjensen \
    717 	'(cn=Dynamic List of Members)' '*' \
    718 	>> $SEARCHOUT 2>&1
    719 RC=$?
    720 if test $RC != 0 ; then
    721 	echo "ldapsearch failed ($RC)!"
    722 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    723 	exit $RC
    724 fi
    725 
    726 echo "Reconfiguring slapd..."
    727 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    728 	$TESTOUT 2>&1 << EOMODS
    729 version: 1
    730 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    731 changetype: modify
    732 delete: olcDynListAttrSet
    733 olcDynListAttrSet: {0}
    734 -
    735 add: olcDynListAttrSet
    736 olcDynListAttrSet: groupOfURLs memberURL member+memberOf
    737 -
    738 EOMODS
    739 
    740 RC=$?
    741 if test $RC != 0 ; then
    742 	echo "ldapmodify failed ($RC)!"
    743 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    744 	exit $RC
    745 fi
    746 
    747 echo "==========================================================" >> $LOG1
    748 
    749 echo "Testing memberOf functionality..."
    750 echo "# Testing memberOf functionality..." >> $SEARCHOUT
    751 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
    752 	-D "$BABSDN" -w bjensen \
    753 	'(cn=Mark Elliot)' '*' 'memberOf' \
    754 	>> $SEARCHOUT 2>&1
    755 RC=$?
    756 if test $RC != 0 ; then
    757 	echo "ldapsearch failed ($RC)!"
    758 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    759 	exit $RC
    760 fi
    761 
    762 echo "Testing filtered memberOf functionality..."
    763 echo "# Testing filtered memberOf functionality..." >> $SEARCHOUT
    764 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
    765 	-D "$BABSDN" -w bjensen \
    766 	"(&(memberOf=cn=Dynamic List of Members,ou=Dynamic Lists,$BASEDN)(cn=Mark Elliot))" '*' 'memberOf' \
    767 	>> $SEARCHOUT 2>&1
    768 RC=$?
    769 if test $RC != 0 ; then
    770 	echo "ldapsearch failed ($RC)!"
    771 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    772 	exit $RC
    773 fi
    774 
    775 echo "Testing filtered member functionality..."
    776 echo "# Testing filtered member functionality..." >> $SEARCHOUT
    777 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
    778 	-D "$BABSDN" -w bjensen \
    779 	"(member=cn=Jane Doe,ou=Alumni Association,ou=People,$BASEDN)" \
    780 	>> $SEARCHOUT 2>&1
    781 RC=$?
    782 if test $RC != 0 ; then
    783 	echo "ldapsearch failed ($RC)!"
    784 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    785 	exit $RC
    786 fi
    787 
    788 echo "Reconfiguring slapd..."
    789 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    790 	$TESTOUT 2>&1 << EOMODS
    791 version: 1
    792 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    793 changetype: modify
    794 delete: olcDynListAttrSet
    795 olcDynListAttrSet: {0}
    796 -
    797 add: olcDynListAttrSet
    798 olcDynListAttrSet: groupOfURLs memberURL member+memberOf@groupOfNames
    799 -
    800 EOMODS
    801 
    802 RC=$?
    803 if test $RC != 0 ; then
    804 	echo "ldapmodify failed ($RC)!"
    805 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    806 	exit $RC
    807 fi
    808 
    809 echo "==========================================================" >> $LOG1
    810 
    811 echo "Testing static group memberOf functionality..."
    812 echo "# Testing static group memberOf functionality..." >> $SEARCHOUT
    813 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
    814 	-D "$BABSDN" -w bjensen \
    815 	'(cn=Mark Elliot)' '*' 'memberOf' \
    816 	>> $SEARCHOUT 2>&1
    817 RC=$?
    818 if test $RC != 0 ; then
    819 	echo "ldapsearch failed ($RC)!"
    820 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    821 	exit $RC
    822 fi
    823 
    824 echo "Testing static group member compare..."
    825 echo "# Testing static group member compare..." >> $SEARCHOUT
    826 $LDAPCOMPARE -H $URI1 \
    827 	"cn=all staff,ou=groups,$BASEDN" "member:cn=Mark Elliot,ou=Alumni Association,ou=People,$BASEDN" >> $SEARCHOUT
    828 RC=$?
    829 case $RC in
    830 5)
    831 	echo "ldapcompare returned FALSE ($RC)!"
    832 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    833 	exit $RC
    834 	;;
    835 6)
    836 	echo "ldapcompare returned TRUE ($RC)"
    837 	;;
    838 0)
    839 	echo "ldapcompare returned success ($RC)!"
    840 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    841 	exit 1
    842 	;;
    843 *)
    844 	echo "ldapcompare failed ($RC)!"
    845 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    846 	exit $RC
    847 	;;
    848 esac
    849 echo "" >> $SEARCHOUT
    850 
    851 echo "Testing static group non-member compare (should return FALSE)..."
    852 echo "# Testing static group non-member compare (should return FALSE)..." >> $SEARCHOUT
    853 $LDAPCOMPARE -H $URI1 \
    854 	"cn=all staff,ou=groups,$BASEDN" "member:cn=Not A User,ou=Alumni Association,ou=People,$BASEDN" >> $SEARCHOUT
    855 RC=$?
    856 case $RC in
    857 5)
    858 	echo "ldapcompare returned FALSE ($RC)"
    859 	;;
    860 6)
    861 	echo "ldapcompare returned TRUE ($RC)!"
    862 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    863 	exit $RC
    864 	;;
    865 0)
    866 	echo "ldapcompare returned success ($RC)!"
    867 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    868 	exit 1
    869 	;;
    870 *)
    871 	echo "ldapcompare failed ($RC)!"
    872 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    873 	exit $RC
    874 	;;
    875 esac
    876 echo "" >> $SEARCHOUT
    877 
    878 echo "Reconfiguring slapd..."
    879 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    880 	$TESTOUT 2>&1 << EOMODS
    881 version: 1
    882 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    883 changetype: modify
    884 delete: olcDynListAttrSet
    885 olcDynListAttrSet: {0}
    886 -
    887 add: olcDynListAttrSet
    888 olcDynListAttrSet: groupOfURLs memberURL member+memberOf*
    889 -
    890 EOMODS
    891 
    892 RC=$?
    893 if test $RC != 0 ; then
    894 	echo "ldapmodify failed ($RC)!"
    895 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    896 	exit $RC
    897 fi
    898 
    899 echo "==========================================================" >> $LOG1
    900 
    901 echo "Adding a couple dynamic groups..."
    902 $LDAPADD -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    903 	> $TESTOUT 2>&1 << EOMODS
    904 dn: cn=The Smiths,$LISTDN
    905 objectClass: groupOfURLs
    906 cn: The Smiths
    907 memberURL: ldap:///ou=People,${BASEDN}??sub?(sn=Smith)
    908 description: Smith family
    909 
    910 dn: cn=Meta Group,$LISTDN
    911 objectClass: groupOfURLs
    912 cn: Meta Group
    913 memberURL: ldap:///${LISTDN}??sub?(description=Smith%20family)
    914 EOMODS
    915 
    916 RC=$?
    917 if test $RC != 0 ; then
    918 	echo "ldapadd failed ($RC)!"
    919 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    920 	exit $RC
    921 fi
    922 
    923 echo "Testing nested dynamic group functionality..."
    924 echo "# Testing nested dynamic group functionality..." >> $SEARCHOUT
    925 $LDAPSEARCH -S "" -b "$LISTDN" -H $URI1 \
    926 	-D "$BABSDN" -w bjensen \
    927 	'(objectclass=*)' '*' 'memberOf' \
    928 	>> $SEARCHOUT 2>&1
    929 RC=$?
    930 if test $RC != 0 ; then
    931 	echo "ldapsearch failed ($RC)!"
    932 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    933 	exit $RC
    934 fi
    935 
    936 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
    937 	-D "$BABSDN" -w bjensen \
    938 	'(cn=Mark Elliot)' '*' 'memberOf' \
    939 	>> $SEARCHOUT 2>&1
    940 RC=$?
    941 if test $RC != 0 ; then
    942 	echo "ldapsearch failed ($RC)!"
    943 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    944 	exit $RC
    945 fi
    946 
    947 echo "Reconfiguring slapd..."
    948 $LDAPMODIFY -x -D cn=config -H $URI1 -y $CONFIGPWF > \
    949 	$TESTOUT 2>&1 << EOMODS
    950 version: 1
    951 dn: olcOverlay={0}dynlist,olcDatabase={$DBIX}$BACKEND,cn=config
    952 changetype: modify
    953 delete: olcDynListAttrSet
    954 olcDynListAttrSet: {0}
    955 -
    956 add: olcDynListAttrSet
    957 olcDynListAttrSet: groupOfURLs memberURL member+memberOf@groupOfNames*
    958 olcDynListAttrSet: labeledURIObject labeledURI uniqueMember+seeAlso@groupOfUniqueNames
    959 -
    960 EOMODS
    961 
    962 RC=$?
    963 if test $RC != 0 ; then
    964 	echo "ldapmodify failed ($RC)!"
    965 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    966 	exit $RC
    967 fi
    968 
    969 echo "==========================================================" >> $LOG1
    970 
    971 echo "Adding a couple static groups..."
    972 $LDAPADD -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
    973 	> $TESTOUT 2>&1 << EOMODS
    974 dn: cn=The Jensens,ou=Groups,$BASEDN
    975 objectClass: groupOfnames
    976 cn: The Jensens
    977 member: cn=Bjorn Jensen,ou=Information Technology DivisioN,ou=People,$BASEDN
    978 member: cn=Barbara Jensen,ou=Information Technology DivisioN,ou=People,$BASEDN
    979 
    980 dn: cn=JJs,ou=Groups,$BASEDN
    981 objectClass: groupOfnames
    982 cn: JJs
    983 member: cn=James A Jones 1,ou=Alumni Association,ou=People,$BASEDN
    984 member: cn=James A Jones 2,ou=Information Technology Division,ou=People,$BASEDN
    985 member: cn=The Jensens,ou=Groups,$BASEDN
    986 EOMODS
    987 
    988 RC=$?
    989 if test $RC != 0 ; then
    990 	echo "ldapadd failed ($RC)!"
    991 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    992 	exit $RC
    993 fi
    994 
    995 echo "Testing nested static group functionality..."
    996 echo "# Testing nested static group functionality..." >> $SEARCHOUT
    997 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
    998 	-D "$BABSDN" -w bjensen \
    999 	'(sn=Jensen)' '*' 'memberOf' \
   1000 	>> $SEARCHOUT 2>&1
   1001 RC=$?
   1002 if test $RC != 0 ; then
   1003 	echo "ldapsearch failed ($RC)!"
   1004 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1005 	exit $RC
   1006 fi
   1007 
   1008 echo "Adding another nested group..."
   1009 $LDAPADD -v -D "$MANAGERDN" -H $URI1 -w $PASSWD \
   1010 	> $TESTOUT 2>&1 << EOMODS
   1011 dn: cn=Bonus Group,ou=Groups,$BASEDN
   1012 objectClass: groupOfnames
   1013 cn: Bonus Group
   1014 member: cn=Ursula Hampster,ou=Alumni Association,ou=People,$BASEDN
   1015 member: cn=Meta Group,$LISTDN
   1016 EOMODS
   1017 
   1018 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
   1019 	-D "$BABSDN" -w bjensen \
   1020 	'(sn=Hampster)' '*' 'memberOf' \
   1021 	>> $SEARCHOUT 2>&1
   1022 RC=$?
   1023 if test $RC != 0 ; then
   1024 	echo "ldapsearch failed ($RC)!"
   1025 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1026 	exit $RC
   1027 fi
   1028 
   1029 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
   1030 	-D "$BABSDN" -w bjensen \
   1031 	'(sn=Doe)' '*' 'memberOf' \
   1032 	>> $SEARCHOUT 2>&1
   1033 RC=$?
   1034 if test $RC != 0 ; then
   1035 	echo "ldapsearch failed ($RC)!"
   1036 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1037 	exit $RC
   1038 fi
   1039 
   1040 $LDAPSEARCH -S "" -b "ou=People,$BASEDN" -H $URI1 \
   1041 	-D "$BABSDN" -w bjensen \
   1042 	'(sn=Smith)' '*' 'memberOf' \
   1043 	>> $SEARCHOUT 2>&1
   1044 RC=$?
   1045 if test $RC != 0 ; then
   1046 	echo "ldapsearch failed ($RC)!"
   1047 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1048 	exit $RC
   1049 fi
   1050 
   1051 echo "Testing filtered nested memberOf functionality..."
   1052 echo "# Testing filtered nested memberOf functionality..." >> $SEARCHOUT
   1053 
   1054 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
   1055 	-D "$BABSDN" -w bjensen \
   1056 	"(memberOf=cn=bonus group,ou=groups,$BASEDN)" '*' 'memberOf' \
   1057 	>> $SEARCHOUT 2>&1
   1058 RC=$?
   1059 if test $RC != 0 ; then
   1060 	echo "ldapsearch failed ($RC)!"
   1061 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1062 	exit $RC
   1063 fi
   1064 
   1065 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
   1066 	-D "$BABSDN" -w bjensen \
   1067 	"(&(uid=jjones)(memberOf=cn=jjs,ou=groups,$BASEDN))" 'uid' \
   1068 	>> $SEARCHOUT 2>&1
   1069 RC=$?
   1070 if test $RC != 0 ; then
   1071 	echo "ldapsearch failed ($RC)!"
   1072 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1073 	exit $RC
   1074 fi
   1075 
   1076 echo "Testing negated filtered memberOf functionality..."
   1077 echo "# Testing negated filtered memberOf functionality..." >> $SEARCHOUT
   1078 
   1079 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
   1080 	-D "$BABSDN" -w bjensen \
   1081 	"(&(objectClass=OpenLDAPperson)(!(memberOf=cn=Alumni Assoc Staff,ou=groups,$BASEDN)))" '*' 'memberOf' \
   1082 	>> $SEARCHOUT 2>&1
   1083 RC=$?
   1084 if test $RC != 0 ; then
   1085 	echo "ldapsearch failed ($RC)!"
   1086 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1087 	exit $RC
   1088 fi
   1089 
   1090 echo "Testing filtered nested member functionality..."
   1091 echo "# Testing filtered nested member functionality..." >> $SEARCHOUT
   1092 
   1093 $LDAPSEARCH -S "" -b "$BASEDN" -H $URI1 \
   1094 	-D "$BABSDN" -w bjensen \
   1095 	"(member=cn=Jennifer Smith,ou=Alumni Association,ou=People,$BASEDN)" '*' 'memberOf' \
   1096 	>> $SEARCHOUT 2>&1
   1097 RC=$?
   1098 if test $RC != 0 ; then
   1099 	echo "ldapsearch failed ($RC)!"
   1100 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1101 	exit $RC
   1102 fi
   1103 
   1104 test $KILLSERVERS != no && kill -HUP $KILLPIDS
   1105 
   1106 LDIF=$DYNLISTOUT
   1107 
   1108 echo "Filtering ldapsearch results..."
   1109 $LDIFFILTER < $SEARCHOUT > $SEARCHFLT
   1110 echo "Filtering original ldif used to create database..."
   1111 $LDIFFILTER < $LDIF > $LDIFFLT
   1112 echo "Comparing filter output..."
   1113 $CMP $SEARCHFLT $LDIFFLT > $CMPOUT
   1114 
   1115 if test $? != 0 ; then
   1116 	echo "Comparison failed"
   1117 	exit 1
   1118 fi
   1119 
   1120 echo ">>>>> Test succeeded"
   1121 
   1122 test $KILLSERVERS != no && wait
   1123 
   1124 exit 0
   1125