rc.frisbee 16.3 KB
Newer Older
1
#!/bin/sh
Leigh B. Stoller's avatar
Leigh B. Stoller committed
2
#
3
# Copyright (c) 2000-2013 University of Utah and the Flux Group.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
Leigh B. Stoller's avatar
Leigh B. Stoller committed
23
#
24
25
26
27
28
29
# Optional flag argument says "do not reboot"
#
reboot=1
if [ $# -eq 1 -a "$1" = "-noreboot" ]; then
    reboot=0
fi
Leigh B. Stoller's avatar
Leigh B. Stoller committed
30

31
32
echo "`date`: rc.frisbee starting"

33
34
35
36
37
38
#
# Amount of memory in MB to leave for everyone else in the system.  If you
# get out-of-memory or vm_pager error while running frisbee, increase this.
#
RESIDMEM=32

39
40
41
42
43
44
#
# Maximum socket buffer size in KB.
# Big enough to buffer a whole chunk.
#
MAXSOCKBUF=1024

45
46
47
48
if [ -r /etc/emulab/paths.sh ]; then
	. /etc/emulab/paths.sh
else
	BINDIR=/etc/testbed
49
	BOOTDIR=/etc/testbed
50
51
52
53
54
55
56
	ETCDIR=/etc/testbed
fi

# Behave a little different on widearea nodes.
isrem=0
if [ -e $ETCDIR/isrem ]; then
    isrem=1
57
fi
58

59
60
61
62
63
64
65
66
67
68
69
70
71
#
# Update the MBR of the given disk to the indicated "version."
#
# XXX this is somewhat of a hack right now.  We recognize two
# versions of the MBR:
#	v1 (partition 1 size 6281352)
#	v2 (partition 1 size 12305790)
# Currently we only install a new MBR if the existing one is the
# wrong size, just in case the user has customized the boot program.
#
tweakmbr() {
    _DSK=$1
    _NEW=$2
72
    _ALWAYS=$3
73
74
75
76
77
78
79
80
81
82
83
84

    dd if=/dev/$_DSK of=/dev/null bs=512 count=1 2>/dev/null || {
	echo "WARNING: could not read from $_DSK, MBR not changed"
	return
    }

    _size=`fdisk -s $_DSK 2>/dev/null | sed -n -e 's/^ *1: *[0-9][0-9]* *\([0-9][0-9]*\).*$/\1/p'`
    case ${_size}s in
    6281352s)
	_CUR=1
	;;
    12305790s)
85
	_CUR=2
86
87
88
	;;
    s)
        # special case: no part1 so probably no MBR at all, make sure we install
89
	echo "Found no MBR on $_DSK, installing version $_NEW"
90
91
92
	_CUR=1000000
	;;
    *)
93
94
95
96
97
98
99
        if [ $_ALWAYS -eq 1 ]; then
	    echo "WARNING: overwriting unknown MBR on $_DSK with version $_NEW"
	    _CUR=1000000
	else
	    echo "WARNING: custom MBR on $_DSK, not changed"
	    return
	fi
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    	;;
    esac

    if [ $_CUR = $_NEW ]; then
	return
    fi

    # now set it if we can
    if [ ! -r "/etc/emulab/mbr${_NEW}.dd" ]; then
	echo "WARNING: cannot find MBR version $_NEW, not installed"
	return
    fi

    echo "Installing MBR version $_NEW ..."
    dd if=/etc/emulab/mbr${_NEW}.dd of=/dev/$_DSK bs=512 count=1
}

117
find_disks() {
Mike Hibler's avatar
Mike Hibler committed
118
119
120
    _DISKS=""
    for d in `sed -n 's/^\([a-z]*[0-9][0-9]*\): [0-9][0-9]*MB/\1/p' /var/run/dmesg.boot`; do
	case $d in
121
	    ad*|da*|ar*|aacd*|amrd*|mfid*|mfisyspd*) _DISKS="$_DISKS $d"
Mike Hibler's avatar
Mike Hibler committed
122
123
	esac
    done
124

Mike Hibler's avatar
Mike Hibler committed
125
    echo $_DISKS
126
127
}

128
129
130
131
132
133
134
135
136
137
138
#
# Function to zero all potential superblocks in the DOS partitions that
# could interfere with the OSes on the image being loaded.
#
# FreeBSD 4 or 5 goes out of its way to make this hard.  In FBSD4, we
# cannot overwrite the beginning of partitions that have a legit superblock.
# In FBSD5, DOS partitions that have a zero type cannot even be accessed.
# So we have to use the whole-disk special file using offsets extracted
# via fdisk.
#
zapsuperblocks() {
Mike Hibler's avatar
Mike Hibler committed
139
    _DSK=$1
140
141
142
143
144

    #
    # Note we are not overly concerned about the consequences of misparsing
    # the fdisk output.  If we whack random blocks, it doesn't hurt anything.
    #
Mike Hibler's avatar
Mike Hibler committed
145
    offs=`fdisk -s $_DSK 2>/dev/null | sed -n -e 's/^[ 0-9]*: *\([0-9]*\).*$/\1/p'`
146
147
148
149
150

    if [ x"$offs" = x ]; then
        return
    fi

Mike Hibler's avatar
Mike Hibler committed
151
    echo -n "Invalidating old potential superblocks on $_DSK: "
152
153
    for off in $offs; do
        echo -n "$off "
Mike Hibler's avatar
Mike Hibler committed
154
	dd if=/dev/zero of=/dev/${_DSK} oseek=$off count=16 >/dev/null 2>&1 || {
155
156
157
158
159
160
161
162
	    echo "WARNING: failed to invalidate $off"
	}
    done
    echo ""

    return
}

163
164
165
166
#
# Function to load a single image on a disk
#
loadone() {
Mike Hibler's avatar
Mike Hibler committed
167
168
169
170
171
172
    _LOADINFO=$1
    _NUM=$2

    echo "Loading image #$_NUM"

    # Parse dem args
Mike Hibler's avatar
Mike Hibler committed
173
174
175
176
177
    ADDR=""
    SERVER=""
    PART=""
    PARTOS=""
    DISK=""
178
    BIOSDISK=""
Mike Hibler's avatar
Mike Hibler committed
179
180
181
    ZFILL=""
    ACPI=""
    ASF=""
182
    NOCLFLUSH=""
Mike Hibler's avatar
Mike Hibler committed
183
184
    MBRVERS=""
    PREPARE=""
185
    VGAONLY=""
186
    IMAGEID=""
187
    KEEPALIVE=""
188
    CONSOLE=""
189
    DOM0MEM=""
190

Mike Hibler's avatar
Mike Hibler committed
191
192
193
194
195
    for parm in $_LOADINFO; do
        case $parm in
	ADDR=*|\
	PART=*|\
	PARTOS=*|\
196
	SERVER=*|\
Mike Hibler's avatar
Mike Hibler committed
197
	DISK=*|\
198
	BIOSDISK=*|\
Mike Hibler's avatar
Mike Hibler committed
199
200
	ZFILL=*|\
	ACPI=*|\
201
	NOCLFLUSH=*|\
Mike Hibler's avatar
Mike Hibler committed
202
	MBRVERS=*|\
203
204
	ASF=*|\
	PREPARE=*|\
205
	VGAONLY=*|\
206
        IMAGEID=*|\
207
        KEEPALIVE=*|\
208
209
        DOM0MEM=*|\
        OSVERSION=*|\
210
	CONSOLE=*)
Mike Hibler's avatar
Mike Hibler committed
211
212
213
214
215
216
217
218
	    # XXX need to parse better, eval is dangerous!
	    eval $parm
	    ;;
        *)
	    echo "WARNING: bad loadinfo parameter \"$parm\" ignored"
	    ;;
	esac
    done
219

Mike Hibler's avatar
Mike Hibler committed
220
221
222
    #
    # Assign defaults where needed.
    #
223
    SERVER=${SERVER:-$BOSSIP}
Mike Hibler's avatar
Mike Hibler committed
224
225
    PART=${PART:-'0'}
    PARTOS=${PARTOS:-'unknown'}
226
227
228
229
    DISK=${DISK:-'ad0'}
    ZFILL=${ZFILL:-'0'}
    ACPI=${ACPI:-'unknown'}
    ASF=${ASF:-'unknown'}
230
    NOCLFLUSH=${NOCLFLUSH:-'unknown'}
231
    VGAONLY=${VGAONLY:-'unknown'}
Mike Hibler's avatar
Mike Hibler committed
232
    MBRVERS=${MBRVERS:-'1'}
233
    PREPARE=${PREPARE:-'0'}
234
    CONSOLE=${CONSOLE:-'unknown'}
235

236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
    #
    # XXX If KEEPALIVE is not explicitly set, attempt to intuit a value.
    #
    # It appears that FreeBSD 8.x's IGMP v3 implementation doesn't
    # properly sent V2 reports when it is connected to a V2-only querier
    # (switch). It insists on sending V3 reports event when the default
    # version is set to 2. So if detect that we have the newer IGMP
    # implementation, we will use the V2 keep alive mechanism in the
    # frisbee client.
    #
    if [ -z "$KEEPALIVE" ]; then
	igmpversion=`sysctl -n net.inet.igmp.default_version 2>/dev/null`
	if [ "$igmpversion"x != "x" ]; then
	    echo "WARNING: possible IGMP issues; using frisbee keep alive timer"
	    KEEPALIVE=30
	else
	    KEEPALIVE=0
	fi
    fi

256
257
258
    #
    # One of ADDR or IMAGEID must be set.
    #
259
260
261
262
263
264
265
266
267
268
269
    if [ x"$IMAGEID" != x ]; then
        ADDR=""
    	# IMAGEID=pid,gid,imagename
	pid=`echo $IMAGEID | awk -F, '{ printf $1 }'`
	name=`echo $IMAGEID | awk -F, '{ printf $3 }'`
	IMAGEID="$pid/$name"
    elif [ x"$ADDR" = x ]; then
	echo "Unable to get imageid or address for loading image"
	return 1
    fi

Mike Hibler's avatar
Mike Hibler committed
270
271
    if [ "$PART" != "0" ]; then
	SLICE="-s $PART"
272
273
274
275
276
277
278
279
280
	case $PARTOS in
	FreeBSD)
		SLICE="$SLICE -D 165"
		PTYPE=165
		;;
	OpenBSD)
		SLICE="$SLICE -D 166"
		PTYPE=166
		;;
281
	Fedora|Linux)
282
283
284
285
286
287
		SLICE="$SLICE -D 131"
		PTYPE=131
		;;
	*)
		;;
	esac
288
    fi
289

290
291
292
293
294
    #
    # set memory limits:
    #	allow $RESIDMEM MB for non-frisbee stuff
    #	split remaining memory (min of 2MB) between network/disk buffering
    #
295
    MEMARGS=""
296
297
298
    HOSTMEM=`sysctl -n hw.usermem`
    HOSTMEM=`expr $HOSTMEM / 1048576`
    if [ $HOSTMEM -ge `expr $RESIDMEM + 2` ]; then
299
	HOSTMEM=`expr $HOSTMEM - $RESIDMEM`
300
	KBYTES=`expr $HOSTMEM \* 1024`
301
	DATASEGSZ=`ulimit -d`
302
303
304
	if [ $KBYTES -gt $DATASEGSZ ]; then
	    KBYTES=$DATASEGSZ
	    HOSTMEM=`expr $KBYTES / 1024`
305
306
	    echo "WARNING: kernel limits buffering to $HOSTMEM MB"
	fi
307
	ulimit -v $KBYTES
308

309
	# Let the client split up the memory
310
	MEMARGS="-M $HOSTMEM"
311
    fi
312

313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328

    #
    # Allow for large-ish socketbuf for frisbee
    # NOTE: add 12.5% slop to get socketbuf of the appropriate size
    # NOTE: if the sysctl fails, it doesn't matter as frisbee will downsize
    #
    osbs=`sysctl -n kern.ipc.maxsockbuf`
    sbs=`expr $MAXSOCKBUF \* 1024`
    sbs=`expr $sbs \+ \( $sbs / 8 \)`
    if [ $sbs -gt $osbs ]; then
	sysctl kern.ipc.maxsockbuf=$sbs
    fi

    # NOTE: make sure you install the latest frisbee client for -k!
    MEMARGS="$MEMARGS -k $MAXSOCKBUF"

329
    #
330
331
332
    # Make sure the necessary device files exist (only necessary on
    # FreeBSD 4.x).  Note that we create partition files for all slices,
    # not just slice 1, for the benefit of the slicefix script.
333
334
    #
    if [ -x /dev/MAKEDEV -a ! -e /dev/$DISK ]; then
335
	(cd /dev; ./MAKEDEV $DISK ${DISK}s2a ${DISK}s3a ${DISK}s4a)
336
    fi
337

Mike Hibler's avatar
Mike Hibler committed
338
339
340
    if [ x"$ADDR" != x ]; then
	isurl=`echo $ADDR | grep http -`
	ispath=`echo $ADDR | grep '^/' -`
341
342

	if [ x"$isurl" != x ]; then
Mike Hibler's avatar
Mike Hibler committed
343
	    echo "Need to download $ADDR"
344
345
346
347

	    isurl=1
	    if [ ! -d /images ]; then
		echo "Need to create or mount /images directory!"
348
		return 1
349
	    fi
350

351
352
353
	    #
	    # This needs a lot more work ...
	    #
Mike Hibler's avatar
Mike Hibler committed
354
	    imagefile=`echo $ADDR | sed -e 's,^http[s]*://[^/]*/,,'`
355
356
357
	    imagefile="/images/$imagefile"
	elif [ x"$ispath" != x ]; then
	    ispath=1
358

Mike Hibler's avatar
Mike Hibler committed
359
360
	    if [ ! -e $ADDR ]; then
		echo "$ADDR does not exist!"
361
		return 1
362
	    fi
Mike Hibler's avatar
Mike Hibler committed
363
	    imagefile="$ADDR"
364
	else
Mike Hibler's avatar
Mike Hibler committed
365
366
	    PORT=`echo $ADDR | awk -F: '{ printf $2 }'`
	    MCAST=`echo $ADDR | awk -F: '{ printf $1 }'`
367
368
369
	    if [ -e $BOOTDIR/myip ]; then
		MCASTIF="-i `cat $BOOTDIR/myip`"
	    else
370
		MCASTIF=""
371
372
	    fi
	    MCASTADDR="-m $MCAST -p $PORT"
373
	    IMAGEID="$MCASTIF $MCASTADDR"
374
375
	    isurl=0
	    ispath=0
376
	fi
377
    else
378
379
380
381
	#
	# Note: if you want to use broadcast rather that multicast as
	# the distribution method, add "-X bcast" to the IMAGEID= below.
	#
382
383
384
385
        IMAGEID="-B 30 -F $IMAGEID"
	isurl=0
	ispath=0
    fi
386

387
388
389
390
391
392
393
394
395
    #
    # ZFILL==1: use frisbee
    # ZFILL==2: separate disk-wipe pass (not yet implemented)
    #
    if [ "$ZFILL" != "0" ]; then
	ZFILL="-z"
    else
	ZFILL=""
    fi
396

397
398
399
400
401
402
    if [ "$KEEPALIVE" != "0" ]; then
	KA="-K $KEEPALIVE"
    else
	KA=""
    fi

403
404
405
406
407
408
409
410
411
412
413
    #
    # Make sure the write-cache is enabled on SCSI disks.  It makes a
    # huge difference.  We don't worry about data corruption in the
    # case of a crash, because we will just reload the disk again anyway
    # in that situation.
    #
    turncacheoff=0
    case $DISK in
    da*)
	if [ -x $BINDIR/camwce ] && $BINDIR/camwce on $DISK; then
	    turncacheoff=1;
414
	fi
415
416
	;;
    esac
417

418
419
420
421
422
423
    #
    # For slice images, ensure that the MBR is the correct version
    # and replace if not.
    #
    if [ $_NUM -eq 0 ]; then
	if [ "$PART" != "0" ]; then
424
	    tweakmbr $DISK $MBRVERS $PREPARE
425
	fi
426
427
428
429
        FIRSTMBR=$MBRVERS
    else
	if [ "$FIRSTMBR" != "$MBRVERS" ]; then
	    echo "MBR Mismatch: First MBR is \"$FIRSTMBR\" while image #$_NUM is \"$MBRVERS\""
430
	fi
431
    fi
432

433
434
435
436
437
438
439
    #
    # If a remote node and we have a URL, make sure that we have a place
    # to put it. Done after the MBR tweak of course. Then download the URL.
    #
    if [ $isrem -eq 1 -a $isurl -eq 1 ]; then
	echo "Downloading image \'$ADDR\' to /images directory ..."
	$BINDIR/mkextrafs.pl -c -s 4 -r $DISK /images || {
440
441
	    # XXX run growdisk to ensure we have a partition in the MBR
	    $BINDIR/growdisk -vW /dev/$DISK >/dev/null 2>&1
442
443
444
445
446
447
448
449
	    $BINDIR/mkextrafs.pl -n -f -s 4 -r $DISK /images || {
		echo "Could not create /images partition"
		return 1
	    }
	}
	wget -nv -N -P /images "$ADDR"
	wstat=$?
	case $wstat in
450
	0)
451
	    echo "wget succeeded getting the image"
452
	    ;;
453
	*)
454
455
	    echo "wget failed, status $wstat"
	    return 1
456
	    ;;
457
	esac
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
    fi

    #
    # If not zeroing the disk and we are loading a full disk image
    # we need to ensure that we at least invalidate any old superblocks
    # that might leak through (most likely in partition 4 which isn't
    # touched by our current image).  We do this before running frisbee
    # so that any legit filesystems loaded from the image work.
    #
    # Since we do it before frisbee, we are counting on the current
    # MBR being the same as the MBR being layed down.  While not
    # a reasonable assumption in general, it mostly works in our
    # environment and at least won't hurt anything if not true.
    #
    if [ $PREPARE -eq 1 -o \
         \( $isrem -eq 0 -a x"$ZFILL" = x -a "$PART" = "0" \) ]; then
	zapsuperblocks $DISK
    fi

    if [ x"$imagefile" != x ]; then
478
	echo "`date`: Running /usr/local/bin/imageunzip -o -O -W 32 $ZFILL $imagefile /dev/${DISK}s${PART}"
479
	/usr/local/bin/imageunzip -o -O -W 32 $ZFILL $imagefile /dev/${DISK}s${PART}
480
    else
481
	echo "`date`: Running $BINDIR/frisbee -S $SERVER $MEMARGS $KA $ZFILL $SLICE $IMAGEID /dev/$DISK"
482
	$BINDIR/frisbee -S $SERVER $MEMARGS $KA $ZFILL $SLICE $IMAGEID /dev/$DISK
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
    fi
    fstat=$?

    #
    # If we mounted a partition from the disk to store the image,
    # we must unmount it now so that slicefix and others don't fail
    # due to an in-use partition.
    #
    if [ $isrem -eq 1 -a $isurl -eq 1 ]; then
	umount /images || {
	    echo "WARNING: could not unmount /images"
	}
    fi

    #
    # Turn the cache back off if we turned it on.
    # Is this sufficient to ensure the cache gets flushed?
    #
    if [ $turncacheoff -eq 1 ]; then
	$BINDIR/camwce off $DISK
503
    fi
504
505
506

    case $fstat in
    0)
507
	echo "`date`: Adjusting slice-related files"
508
509
	export SLICEFIX_ACPI=$ACPI
	export SLICEFIX_ASF=$ASF
510
	export SLICEFIX_NOCLFLUSH=$NOCLFLUSH
511
	export SLICEFIX_VGAONLY=$VGAONLY
512
513
	export SLICEFIX_CONSOLE=$CONSOLE
	export SLICEFIX_BIOSDISK=$BIOSDISK
514
	export SLICEFIX_DOM0MEM=$DOM0MEM
515
	$BINDIR/slicefix $PART $DISK
516
	echo "`date`: Image #$_NUM load complete"
517
518
519
520
521
522
	return 0
	;;
    *)
	echo "Frisbee run failed, status $fstat"
	;;
    esac
523
524
525
526
527
528
529
530
531
532
    return 1
}

$BINDIR/tmcc state RELOADSETUP

BOSSINFO=`$BINDIR/tmcc bossinfo`
STATUS=`$BINDIR/tmcc status`

BOSSIP=`echo $BOSSINFO | awk '{ print $2 }'`

533
534
535
536
NTPIP=`grep -w ntp1 /etc/hosts 2>/dev/null | awk '{ print $1 }'`
if [ -z "$NTPIP" ]; then
    NTPIP=$BOSSIP
fi
537
if [ -x /usr/sbin/ntpdate ]; then
538
	/usr/sbin/ntpdate -b $NTPIP >/dev/null 2>&1
539
540
541
542
543
fi

# Enable IPoD
if [ -r $BINDIR/rc.ipod ]; then
    . $BINDIR/rc.ipod
544
fi
545
546

#
Mike Hibler's avatar
Mike Hibler committed
547
548
# Assign each line (one image) to one of the positional parameters.
# This is done by setting IFS to a newline and using set.
549
550
# XXX there must be a better way to do this!
#
Mike Hibler's avatar
Mike Hibler committed
551
OIFS="$IFS"
552
553
554
IFS='
'
set -- `$BINDIR/tmcc loadinfo`
Mike Hibler's avatar
Mike Hibler committed
555
IFS="$OIFS"
556
557
558
559
560
561
562
if [ "$1"x = x ]; then
    echo "No load information for node"
    exit 1
fi

$BINDIR/tmcc state RELOADING

563
564
565
566
567
568
569
570
571
572
# HACK ALERT: If we're reloading we need to zap the superblocks and
# MBRs of any other disks in the system.  This is to prevent Linux from
# finding an old filesystem with the same label or UUID and mounting
# that instead of the right one.  We skip the disks that are mounted
# and the disk we're going to write to.
# DOUBLE HACK ALERT: Changed this to zap all disks to avoid having
# to figure out what the other disks are when loading multiple images.
# Since a new MBR will be laid down anyway there is no harm in doing
# this as long as we are sure we are in the reloading experiment.
case $STATUS in
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
*ALLOCATED=emulab-ops/reloading*)
    disks=`find_disks`
    for d in $disks; do
	#[ $d = $DISK ] && continue
	mount | grep "^/dev/$d" > /dev/null && continue
	zapsuperblocks $d
	echo "Invalidating MBR on $d"
	dd if=/dev/zero of=/dev/$d bs=512 count=16
    done

    #
    # If we have nodecheck, run it. This allows us to both collect HW info
    # (if nodecheck "collect" is enabled in the DB) and to run a destructive
    # disk write speed test (as part of a nodecheck "check" operation).
    #
    if [ -x $BINDIR/rc.nodecheck ]; then
	$BINDIR/rc.nodecheck boot
    fi
    ;;
592
593
esac

594
595
596
597
598
599
600
601
602
#
# Load each image in turn.
# If a load fails, we exit non-zero so that the rc script will drop into
# single-user mode.  If all loads succeed we either reboot or continue with
# the rc script as desired by the caller.
#
NUM=0
while [ "$1"x != x ]; do
    loadone "$1" $NUM || {
603
	echo "`date`: Failed to load disk, dropping to login prompt"
604
605
606
607
608
        exit 1
    }
    shift
    NUM=`expr $NUM + 1`
done
609
echo "`date`: Frisbee run(s) finished"
610

611
echo "`date`: Resizing final disk partition"
612
$BINDIR/growdisk -vW /dev/$DISK
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630

#
# If requested to reboot, do so.
#
# Note: there is a race condition with stated here.
# If we reboot immediately after sending RELOADDONE,
# it is possible that, under heavy server load, we will
# finish the reboot and reach the bootinfo stage before
# stated gets and processes our RELOADDONE.  So now we
# wait around after sending the RELOADDONE.  stated should
# force us to reboot when the transition takes place.
# For backward compatibility we use a new state: RELOADDONEV2.
# For paranoia we just wait around for awhile and then
# reboot anyway, just in case stated's reboot fails for
# some reason.
#
if [ $reboot -eq 1 ]; then
    $BINDIR/tmcc state RELOADDONEV2
631
    echo "`date`: Waiting for server to reboot us ..."
632
633
634
    if [ $isrem -eq 1 ]; then
	sleep 30
    else
635
	sleep 300
636
    fi
637
    echo "`date`: No response from server, rebooting myself ..."
638
639
640
641
642
643
    /sbin/reboot
    sleep 100
else
    $BINDIR/tmcc state RELOADDONE
fi

644
echo "`date`: rc.frisbee finished"
645
646

exit 0