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