1 1.1 lukem #! /bin/sh 2 1.1.1.4 tron # $OpenLDAP$ 3 1.1 lukem ## This work is part of OpenLDAP Software <http://www.openldap.org/>. 4 1.1 lukem ## 5 1.1.1.10 christos ## Copyright 1998-2024 The OpenLDAP Foundation. 6 1.1 lukem ## All rights reserved. 7 1.1 lukem ## 8 1.1 lukem ## Redistribution and use in source and binary forms, with or without 9 1.1 lukem ## modification, are permitted only as authorized by the OpenLDAP 10 1.1 lukem ## Public License. 11 1.1 lukem ## 12 1.1 lukem ## A copy of this license is available in the file LICENSE in the 13 1.1 lukem ## top-level directory of the distribution or, alternatively, at 14 1.1 lukem ## <http://www.OpenLDAP.org/license.html>. 15 1.1 lukem 16 1.1 lukem echo "running defines.sh" 17 1.1 lukem . $SRCDIR/scripts/defines.sh 18 1.1 lukem 19 1.1 lukem if test $SYNCPROV = syncprovno; then 20 1.1 lukem echo "Syncrepl provider overlay not available, test skipped" 21 1.1 lukem exit 0 22 1.1 lukem fi 23 1.1 lukem 24 1.1 lukem PRODIR=$TESTDIR/pro 25 1.1.1.2 lukem CONDIR=$TESTDIR/con1 26 1.1 lukem DBPRO=$PRODIR/db 27 1.1 lukem DBCON=$CONDIR/db 28 1.1 lukem CFPRO=$PRODIR/slapd.d 29 1.1 lukem CFCON=$CONDIR/slapd.d 30 1.1 lukem 31 1.1 lukem mkdir -p $TESTDIR $PRODIR $CONDIR $DBPRO $DBCON $CFPRO $CFCON 32 1.1 lukem 33 1.1 lukem $SLAPPASSWD -g -n >$CONFIGPWF 34 1.1 lukem 35 1.1.1.2 lukem if test x"$SYNCMODE" = x ; then 36 1.1.1.2 lukem SYNCMODE=rp 37 1.1.1.2 lukem fi 38 1.1.1.2 lukem case "$SYNCMODE" in 39 1.1.1.2 lukem ro) 40 1.1.1.2 lukem SYNCTYPE="type=refreshOnly interval=00:00:00:03" 41 1.1.1.2 lukem ;; 42 1.1.1.2 lukem rp) 43 1.1.1.2 lukem SYNCTYPE="type=refreshAndPersist" 44 1.1.1.2 lukem ;; 45 1.1.1.2 lukem *) 46 1.1.1.2 lukem echo "unknown sync mode $SYNCMODE" 47 1.1.1.2 lukem exit 1; 48 1.1.1.2 lukem ;; 49 1.1.1.2 lukem esac 50 1.1.1.2 lukem 51 1.1 lukem # 52 1.1 lukem # Test replication of dynamic config: 53 1.1.1.4 tron # - start provider 54 1.1 lukem # - start consumer 55 1.1 lukem # - configure over ldap 56 1.1 lukem # - populate over ldap 57 1.1 lukem # - configure syncrepl over ldap 58 1.1 lukem # - retrieve database over ldap and compare against expected results 59 1.1 lukem # 60 1.1 lukem 61 1.1.1.4 tron echo "Starting provider slapd on TCP/IP port $PORT1..." 62 1.1.1.9 christos . $CONFFILTER $BACKEND < $DYNAMICCONF > $CONFLDIF 63 1.1 lukem $SLAPADD -F $CFPRO -n 0 -l $CONFLDIF 64 1.1.1.10 christos RC=$? 65 1.1.1.10 christos if test $RC != 0 ; then 66 1.1.1.10 christos echo "slapadd failed ($RC)!" 67 1.1.1.10 christos exit $RC 68 1.1.1.10 christos fi 69 1.1.1.10 christos 70 1.1 lukem cd $PRODIR 71 1.1.1.9 christos $SLAPD -F ./slapd.d -h $URI1 -d $LVL > $LOG1 2>&1 & 72 1.1 lukem PID=$! 73 1.1 lukem if test $WAIT != 0 ; then 74 1.1 lukem echo PID $PID 75 1.1 lukem read foo 76 1.1 lukem fi 77 1.1 lukem KILLPIDS="$PID" 78 1.1 lukem cd $TESTWD 79 1.1 lukem 80 1.1 lukem sleep 1 81 1.1 lukem 82 1.1.1.4 tron echo "Using ldapsearch to check that provider slapd is running..." 83 1.1 lukem for i in 0 1 2 3 4 5; do 84 1.1 lukem $LDAPSEARCH -s base -b "" -H $URI1 \ 85 1.1 lukem 'objectclass=*' > /dev/null 2>&1 86 1.1 lukem RC=$? 87 1.1 lukem if test $RC = 0 ; then 88 1.1 lukem break 89 1.1 lukem fi 90 1.1 lukem echo "Waiting 5 seconds for slapd to start..." 91 1.1 lukem sleep 5 92 1.1 lukem done 93 1.1 lukem 94 1.1 lukem if test $RC != 0 ; then 95 1.1 lukem echo "ldapsearch failed ($RC)!" 96 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 97 1.1 lukem exit $RC 98 1.1 lukem fi 99 1.1 lukem 100 1.1.1.4 tron echo "Inserting syncprov overlay on provider..." 101 1.1 lukem if [ "$SYNCPROV" = syncprovmod ]; then 102 1.1 lukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1 103 1.1 lukem dn: cn=module,cn=config 104 1.1 lukem objectClass: olcModuleList 105 1.1 lukem cn: module 106 1.1.1.4 tron olcModulePath: $TESTWD/../servers/slapd/overlays 107 1.1 lukem olcModuleLoad: syncprov.la 108 1.1 lukem EOF 109 1.1 lukem RC=$? 110 1.1 lukem if test $RC != 0 ; then 111 1.1 lukem echo "ldapadd failed for moduleLoad ($RC)!" 112 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 113 1.1 lukem exit $RC 114 1.1 lukem fi 115 1.1 lukem fi 116 1.1 lukem read CONFIGPW < $CONFIGPWF 117 1.1 lukem $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 118 1.1 lukem dn: olcDatabase={0}config,cn=config 119 1.1 lukem changetype: modify 120 1.1 lukem add: olcSyncRepl 121 1.1 lukem olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 122 1.1.1.2 lukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 123 1.1.1.2 lukem retry="3 5 300 5" timeout=3 124 1.1 lukem - 125 1.1 lukem add: olcUpdateRef 126 1.1 lukem olcUpdateRef: $URI1 127 1.1 lukem 128 1.1 lukem dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config 129 1.1 lukem changetype: add 130 1.1 lukem objectClass: olcOverlayConfig 131 1.1 lukem objectClass: olcSyncProvConfig 132 1.1 lukem olcOverlay: syncprov 133 1.1 lukem EOF 134 1.1 lukem RC=$? 135 1.1 lukem if test $RC != 0 ; then 136 1.1 lukem echo "ldapmodify failed for syncrepl config ($RC)!" 137 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 138 1.1 lukem exit $RC 139 1.1 lukem fi 140 1.1 lukem 141 1.1 lukem echo "Starting consumer slapd on TCP/IP port $PORT2..." 142 1.1 lukem $SLAPADD -F $CFCON -n 0 -l $CONFLDIF 143 1.1.1.10 christos RC=$? 144 1.1.1.10 christos if test $RC != 0 ; then 145 1.1.1.10 christos echo "slapadd failed ($RC)!" 146 1.1.1.10 christos test $KILLSERVERS != no && kill -HUP $KILLPIDS 147 1.1.1.10 christos exit $RC 148 1.1.1.10 christos fi 149 1.1.1.10 christos 150 1.1 lukem cd $CONDIR 151 1.1.1.9 christos $SLAPD -F ./slapd.d -h $URI2 -d $LVL > $LOG2 2>&1 & 152 1.1.1.9 christos CONSUMERPID=$! 153 1.1 lukem if test $WAIT != 0 ; then 154 1.1.1.9 christos echo CONSUMERPID $CONSUMERPID 155 1.1 lukem read foo 156 1.1 lukem fi 157 1.1.1.9 christos KILLPIDS="$KILLPIDS $CONSUMERPID" 158 1.1 lukem cd $TESTWD 159 1.1 lukem 160 1.1 lukem sleep 1 161 1.1 lukem 162 1.1 lukem echo "Using ldapsearch to check that consumer slapd is running..." 163 1.1 lukem for i in 0 1 2 3 4 5; do 164 1.1 lukem $LDAPSEARCH -s base -b "" -H $URI2 \ 165 1.1 lukem 'objectclass=*' > /dev/null 2>&1 166 1.1 lukem RC=$? 167 1.1 lukem if test $RC = 0 ; then 168 1.1 lukem break 169 1.1 lukem fi 170 1.1 lukem echo "Waiting 5 seconds for slapd to start..." 171 1.1 lukem sleep 5 172 1.1 lukem done 173 1.1 lukem 174 1.1 lukem if test $RC != 0 ; then 175 1.1 lukem echo "ldapsearch failed ($RC)!" 176 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 177 1.1 lukem exit $RC 178 1.1 lukem fi 179 1.1 lukem 180 1.1 lukem echo "Configuring syncrepl on consumer..." 181 1.1 lukem $LDAPMODIFY -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 182 1.1 lukem dn: olcDatabase={0}config,cn=config 183 1.1 lukem changetype: modify 184 1.1 lukem add: olcSyncRepl 185 1.1 lukem olcSyncRepl: rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple 186 1.1.1.2 lukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 187 1.1.1.2 lukem retry="3 5 300 5" timeout=3 188 1.1 lukem - 189 1.1 lukem add: olcUpdateRef 190 1.1 lukem olcUpdateRef: $URI1 191 1.1 lukem EOF 192 1.1 lukem 193 1.1.1.2 lukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 194 1.1.1.2 lukem sleep $SLEEP1 195 1.1 lukem 196 1.1 lukem echo "Using ldapsearch to check that syncrepl received config changes..." 197 1.1 lukem RC=32 198 1.1 lukem for i in 0 1 2 3 4 5; do 199 1.1 lukem RESULT=`$LDAPSEARCH -H $URI2 -D cn=config -y $CONFIGPWF \ 200 1.1 lukem -s base -b "olcDatabase={0}config,cn=config" \ 201 1.1 lukem '(olcUpdateRef=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 202 1.1 lukem if test "x$RESULT" = "xOK" ; then 203 1.1 lukem RC=0 204 1.1 lukem break 205 1.1 lukem fi 206 1.1.1.2 lukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 207 1.1.1.2 lukem sleep $SLEEP1 208 1.1 lukem done 209 1.1 lukem 210 1.1 lukem if test $RC != 0 ; then 211 1.1 lukem echo "ldapsearch failed ($RC)!" 212 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 213 1.1 lukem exit $RC 214 1.1 lukem fi 215 1.1 lukem 216 1.1.1.4 tron echo "Adding schema and databases on provider..." 217 1.1 lukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 218 1.1 lukem include: file://$ABS_SCHEMADIR/core.ldif 219 1.1 lukem 220 1.1 lukem include: file://$ABS_SCHEMADIR/cosine.ldif 221 1.1 lukem 222 1.1 lukem include: file://$ABS_SCHEMADIR/inetorgperson.ldif 223 1.1 lukem 224 1.1 lukem include: file://$ABS_SCHEMADIR/openldap.ldif 225 1.1 lukem 226 1.1 lukem include: file://$ABS_SCHEMADIR/nis.ldif 227 1.1 lukem EOF 228 1.1 lukem RC=$? 229 1.1 lukem if test $RC != 0 ; then 230 1.1 lukem echo "ldapadd failed for schema config ($RC)!" 231 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 232 1.1 lukem exit $RC 233 1.1 lukem fi 234 1.1 lukem 235 1.1.1.3 adam nullExclude="" nullOK="" 236 1.1.1.3 adam test $BACKEND = null && nullExclude="# " nullOK="OK" 237 1.1.1.3 adam 238 1.1 lukem if [ "$BACKENDTYPE" = mod ]; then 239 1.1 lukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 240 1.1 lukem dn: cn=module,cn=config 241 1.1 lukem objectClass: olcModuleList 242 1.1 lukem cn: module 243 1.1.1.4 tron olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND 244 1.1 lukem olcModuleLoad: back_$BACKEND.la 245 1.1 lukem EOF 246 1.1 lukem RC=$? 247 1.1 lukem if test $RC != 0 ; then 248 1.1 lukem echo "ldapadd failed for backend config ($RC)!" 249 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 250 1.1 lukem exit $RC 251 1.1 lukem fi 252 1.1 lukem fi 253 1.1 lukem 254 1.1 lukem $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 255 1.1 lukem dn: olcDatabase={1}$BACKEND,cn=config 256 1.1 lukem objectClass: olcDatabaseConfig 257 1.1.1.3 adam ${nullExclude}objectClass: olc${BACKEND}Config 258 1.1 lukem olcDatabase: {1}$BACKEND 259 1.1 lukem olcSuffix: $BASEDN 260 1.1.1.3 adam ${nullExclude}olcDbDirectory: ./db 261 1.1 lukem olcRootDN: $MANAGERDN 262 1.1 lukem olcRootPW: $PASSWD 263 1.1 lukem olcSyncRepl: rid=002 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple 264 1.1.1.2 lukem credentials=$PASSWD searchbase="$BASEDN" $SYNCTYPE 265 1.1.1.2 lukem retry="3 5 300 5" timeout=3 266 1.1 lukem olcUpdateRef: $URI1 267 1.1 lukem 268 1.1 lukem dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config 269 1.1 lukem changetype: add 270 1.1 lukem objectClass: olcOverlayConfig 271 1.1 lukem objectClass: olcSyncProvConfig 272 1.1 lukem olcOverlay: syncprov 273 1.1 lukem EOF 274 1.1 lukem RC=$? 275 1.1 lukem if test $RC != 0 ; then 276 1.1 lukem echo "ldapadd failed for database config ($RC)!" 277 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 278 1.1 lukem exit $RC 279 1.1 lukem fi 280 1.1 lukem 281 1.1.1.4 tron if test $INDEXDB = indexdb ; then 282 1.1.1.2 lukem $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1 283 1.1.1.2 lukem dn: olcDatabase={1}$BACKEND,cn=config 284 1.1.1.2 lukem changetype: modify 285 1.1.1.2 lukem add: olcDbIndex 286 1.1.1.2 lukem olcDbIndex: objectClass,entryUUID,entryCSN eq 287 1.1.1.2 lukem olcDbIndex: cn,uid pres,eq,sub 288 1.1.1.2 lukem EOF 289 1.1.1.2 lukem RC=$? 290 1.1.1.2 lukem if test $RC != 0 ; then 291 1.1.1.2 lukem echo "ldapadd modify for database config ($RC)!" 292 1.1.1.2 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 293 1.1.1.2 lukem exit $RC 294 1.1.1.2 lukem fi 295 1.1.1.4 tron fi 296 1.1.1.2 lukem 297 1.1.1.4 tron echo "Using ldapadd to populate provider..." 298 1.1 lukem $LDAPADD -D "$MANAGERDN" -H $URI1 -w $PASSWD -f $LDIFORDERED \ 299 1.1 lukem >> $TESTOUT 2>&1 300 1.1 lukem RC=$? 301 1.1 lukem if test $RC != 0 ; then 302 1.1 lukem echo "ldapadd failed for database config ($RC)!" 303 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 304 1.1 lukem exit $RC 305 1.1 lukem fi 306 1.1 lukem 307 1.1.1.2 lukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 308 1.1.1.2 lukem sleep $SLEEP1 309 1.1 lukem 310 1.1 lukem echo "Using ldapsearch to check that syncrepl received database changes..." 311 1.1 lukem RC=32 312 1.1 lukem for i in 0 1 2 3 4 5; do 313 1.1 lukem RESULT=`$LDAPSEARCH -H $URI2 \ 314 1.1 lukem -s base -b "cn=Ursula Hampster,ou=Alumni Association,ou=People,dc=example,dc=com" \ 315 1.1 lukem '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'` 316 1.1.1.3 adam if test "x$RESULT$nullOK" = "xOK" ; then 317 1.1 lukem RC=0 318 1.1 lukem break 319 1.1 lukem fi 320 1.1.1.2 lukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 321 1.1.1.2 lukem sleep $SLEEP1 322 1.1 lukem done 323 1.1 lukem 324 1.1 lukem if test $RC != 0 ; then 325 1.1 lukem echo "ldapsearch failed ($RC)!" 326 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 327 1.1 lukem exit $RC 328 1.1 lukem fi 329 1.1 lukem 330 1.1.1.4 tron echo "Replacing olcSyncrepl on provider..." 331 1.1.1.2 lukem $LDAPMODIFY -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1 332 1.1.1.2 lukem dn: olcDatabase={0}config,cn=config 333 1.1.1.2 lukem changetype: modify 334 1.1.1.2 lukem replace: olcSyncRepl 335 1.1.1.9 christos olcSyncRepl: rid=003 provider=$URI1 binddn="cn=config" bindmethod=simple 336 1.1.1.2 lukem credentials=$CONFIGPW searchbase="cn=config" type=refreshAndPersist 337 1.1.1.2 lukem retry="3 5 300 5" timeout=3 338 1.1.1.2 lukem EOF 339 1.1.1.2 lukem echo "Waiting $SLEEP1 seconds for syncrepl to receive changes..." 340 1.1.1.2 lukem sleep $SLEEP1 341 1.1.1.2 lukem 342 1.1.1.4 tron echo "Using ldapsearch to read config from the provider..." 343 1.1 lukem $LDAPSEARCH -b cn=config -D cn=config -H $URI1 -y $CONFIGPWF \ 344 1.1.1.9 christos 'objectclass=*' > $PROVIDEROUT 2>&1 345 1.1 lukem RC=$? 346 1.1 lukem 347 1.1 lukem if test $RC != 0 ; then 348 1.1.1.4 tron echo "ldapsearch failed at provider ($RC)!" 349 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 350 1.1 lukem exit $RC 351 1.1 lukem fi 352 1.1 lukem 353 1.1 lukem echo "Using ldapsearch to read config from the consumer..." 354 1.1 lukem $LDAPSEARCH -b cn=config -D cn=config -H $URI2 -y $CONFIGPWF \ 355 1.1.1.9 christos 'objectclass=*' > $CONSUMEROUT 2>&1 356 1.1 lukem RC=$? 357 1.1 lukem 358 1.1 lukem if test $RC != 0 ; then 359 1.1 lukem echo "ldapsearch failed at consumer ($RC)!" 360 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 361 1.1 lukem exit $RC 362 1.1 lukem fi 363 1.1 lukem 364 1.1.1.4 tron echo "Filtering provider results..." 365 1.1.1.9 christos $LDIFFILTER < $PROVIDEROUT > $PROVIDERFLT 366 1.1 lukem echo "Filtering consumer results..." 367 1.1.1.9 christos $LDIFFILTER < $CONSUMEROUT > $CONSUMERFLT 368 1.1 lukem 369 1.1.1.4 tron echo "Comparing retrieved configs from provider and consumer..." 370 1.1.1.9 christos $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT 371 1.1 lukem 372 1.1 lukem if test $? != 0 ; then 373 1.1.1.4 tron echo "test failed - provider and consumer configs differ" 374 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 375 1.1 lukem exit 1 376 1.1 lukem fi 377 1.1 lukem 378 1.1.1.4 tron echo "Using ldapsearch to read all the entries from the provider..." 379 1.1 lukem $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI1 -w $PASSWD \ 380 1.1.1.9 christos 'objectclass=*' > $PROVIDEROUT 2>&1 381 1.1 lukem RC=$? 382 1.1 lukem 383 1.1 lukem if test $RC != 0 ; then 384 1.1.1.4 tron echo "ldapsearch failed at provider ($RC)!" 385 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 386 1.1 lukem exit $RC 387 1.1 lukem fi 388 1.1 lukem 389 1.1 lukem echo "Using ldapsearch to read all the entries from the consumer..." 390 1.1 lukem $LDAPSEARCH -S "" -b "$BASEDN" -D "$MANAGERDN" -H $URI2 -w $PASSWD \ 391 1.1.1.9 christos 'objectclass=*' > $CONSUMEROUT 2>&1 392 1.1 lukem RC=$? 393 1.1 lukem 394 1.1 lukem if test $RC != 0 ; then 395 1.1 lukem echo "ldapsearch failed at consumer ($RC)!" 396 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 397 1.1 lukem exit $RC 398 1.1 lukem fi 399 1.1 lukem 400 1.1 lukem test $KILLSERVERS != no && kill -HUP $KILLPIDS 401 1.1 lukem 402 1.1.1.4 tron echo "Filtering provider results..." 403 1.1.1.9 christos $LDIFFILTER < $PROVIDEROUT > $PROVIDERFLT 404 1.1 lukem echo "Filtering consumer results..." 405 1.1.1.9 christos $LDIFFILTER < $CONSUMEROUT > $CONSUMERFLT 406 1.1 lukem 407 1.1.1.4 tron echo "Comparing retrieved entries from provider and consumer..." 408 1.1.1.9 christos $CMP $PROVIDERFLT $CONSUMERFLT > $CMPOUT 409 1.1 lukem 410 1.1 lukem if test $? != 0 ; then 411 1.1.1.4 tron echo "test failed - provider and consumer databases differ" 412 1.1 lukem exit 1 413 1.1 lukem fi 414 1.1 lukem 415 1.1 lukem echo ">>>>> Test succeeded" 416 1.1 lukem 417 1.1 lukem test $KILLSERVERS != no && wait 418 1.1 lukem 419 1.1 lukem exit 0 420