17a3484c3SDavid du Colombier#!/bin/rc 24e3613abSDavid du Colombier# fshalt [-r] [new-kernel] - sync (flush) and, if possible, halt all 34e3613abSDavid du Colombier# file servers and optionally reboot 481bcec06SDavid du Colombierrfork nes 54e3613abSDavid du Colombierkern=() 6e332dd3eSDavid du Colombierkerncopy=() 7*9220b9f3SDavid du Colombierloadkern=yes 86b0d5c8bSDavid du Colombierreboot=no 94e3613abSDavid du Colombierfn usage { 10*9220b9f3SDavid du Colombier echo usage: $1 '[-r] [-R] [new-kernel]' >[1=2] 114e3613abSDavid du Colombier exit usage 124e3613abSDavid du Colombier} 134e3613abSDavid du Colombierif (! ~ $#* 0) 144e3613abSDavid du Colombier switch ($1) { 154e3613abSDavid du Colombier case -r 164e3613abSDavid du Colombier reboot=yes 174e3613abSDavid du Colombier shift 18*9220b9f3SDavid du Colombier case -R 19*9220b9f3SDavid du Colombier loadkern=no 20*9220b9f3SDavid du Colombier reboot=yes 21*9220b9f3SDavid du Colombier shift 224e3613abSDavid du Colombier case -* 234e3613abSDavid du Colombier usage $0 244e3613abSDavid du Colombier } 256b0d5c8bSDavid du Colombierswitch ($#*) { 266b0d5c8bSDavid du Colombiercase 0 276b0d5c8bSDavid du Colombiercase 1 284e3613abSDavid du Colombier kern = $1 296b0d5c8bSDavid du Colombiercase * 304e3613abSDavid du Colombier usage $0 316b0d5c8bSDavid du Colombier} 326b0d5c8bSDavid du Colombier 337a3484c3SDavid du Colombierpath=(/bin) 347a3484c3SDavid du Colombierbuiltin cd / 35e332dd3eSDavid du Colombier9fs boot # in case of odd namespace 36e332dd3eSDavid du Colombierramfs # stash files here that we'll need after the fs halts 377a3484c3SDavid du Colombier 38c4b21101SDavid du Colombiersetrtc 39c4b21101SDavid du Colombier 40e332dd3eSDavid du Colombier# turn off graphics, if any 41e332dd3eSDavid du Colombierif (test -e '#v/vgactl' && test -e '#P/realmode') { 42a2ede175SDavid du Colombier vgatype=`{read '#v/vgactl'} 43a2ede175SDavid du Colombier if (! ~ $vgatype(2) cga) { 4484ba54caSDavid du Colombier prompt='' 45e332dd3eSDavid du Colombier kill rio | rc -i & 46e332dd3eSDavid du Colombier sleep 2 47e332dd3eSDavid du Colombier aux/vga -l text 48e332dd3eSDavid du Colombier } 49a2ede175SDavid du Colombier} 50e332dd3eSDavid du Colombier 51e332dd3eSDavid du Colombierfn isbootable { 5215bfe97dSDavid du Colombier test -e $1 && ~ `{file $1} *' plan 9 boot image' \ 5315bfe97dSDavid du Colombier *' plan 9 executable'* *ELF*' executable' 54e332dd3eSDavid du Colombier} 55e332dd3eSDavid du Colombierfn usekernel { 5681bcec06SDavid du Colombier kerncopy=kern 5781bcec06SDavid du Colombier cp $1 /tmp/$kerncopy && echo -n using kernel $1... 58e332dd3eSDavid du Colombier} 59e332dd3eSDavid du Colombier 60e332dd3eSDavid du Colombier# make a copy of the right kernel 61*9220b9f3SDavid du Colombierif (~ $reboot yes) 62*9220b9f3SDavid du Colombierif (~ $loadkern yes) { 634e3613abSDavid du Colombier if (~ $#kern 0) 64e332dd3eSDavid du Colombier kern=`{echo $terminal | 65ad68c38aSDavid du Colombier sed 's;^([^ ]+) .*/([^/ ]+).*$;/n/boot/'$cputype'/9\2;'} 66e332dd3eSDavid du Colombier if (isbootable $kern) 67e332dd3eSDavid du Colombier usekernel $kern 68e332dd3eSDavid du Colombier if not { 69e332dd3eSDavid du Colombier # $kern is probably a raw binary, try s^name as boot image 70e332dd3eSDavid du Colombier kern=`{ echo $kern | sed 's;.*/;&s;' } 71e332dd3eSDavid du Colombier if (isbootable $kern) 72e332dd3eSDavid du Colombier usekernel $kern 73e332dd3eSDavid du Colombier if not 74e332dd3eSDavid du Colombier echo -n using default kernel... 75e332dd3eSDavid du Colombier } 76e332dd3eSDavid du Colombier} 77e332dd3eSDavid du Colombier 78ebbc20e5SDavid du Colombier# start venti flushing 79ebbc20e5SDavid du Colombierventi/sync -h localhost >[2]/dev/null & 80ebbc20e5SDavid du Colombierventi/sync >[2]/dev/null & 81ebbc20e5SDavid du Colombier 826b0d5c8bSDavid du Colombierunmount /mnt/consoles >[2]/dev/null 83c717cbbdSDavid du Colombierkill consolefs | rc # don't compete with /mnt/consoles 84f54a2a50SDavid du Colombierkill cron | rc # unlock /cron/lock 8570b6ec21SDavid du Colombierkill watchdog | rc 86c717cbbdSDavid du Colombiersleep 1 87c717cbbdSDavid du Colombier 887a3484c3SDavid du Colombierf=`{ls /srv/fscons*>[2]/dev/null} 897a3484c3SDavid du Colombierk=`{ls /srv/kfs*cmd >[2]/dev/null|sort -r} 907a3484c3SDavid du Colombier 917a3484c3SDavid du Colombierecho -n syncing... 924e7b9544SDavid du Colombierfor(i in $f) @ { 937a3484c3SDavid du Colombier echo -n $i... 947a3484c3SDavid du Colombier { 95ce31847cSDavid du Colombier echo 96ebbc20e5SDavid du Colombier dial/drain & 97ebbc20e5SDavid du Colombier sleep 2 987a3484c3SDavid du Colombier echo fsys all sync 99c89dfd4eSDavid du Colombier if(! dial/expect -t 120 ': ') 1007a3484c3SDavid du Colombier echo -n 'not synced...' > /dev/cons 101220e960cSDavid du Colombier } < $i >> $i 1027a3484c3SDavid du Colombier} 1037a3484c3SDavid du Colombier 104ebbc20e5SDavid du Colombier# flush the last bit of possible fossil traffic 105a3fbd160SDavid du Colombierif (ls /srv | grep -s fossil) { 1067a3484c3SDavid du Colombier echo -n venti... 107ebbc20e5SDavid du Colombier venti/sync -h localhost >[2]/dev/null & 108059f8267SDavid du Colombier venti/sync >[2]/dev/null & 109f05caca4SDavid du Colombier sleep 5 110a3fbd160SDavid du Colombier} 1117a3484c3SDavid du Colombier 1127a3484c3SDavid du Colombierfor (i in $k){ 113ef53e415SDavid du Colombier echo -n $i... 114ef53e415SDavid du Colombier switch($i){ 115ef53e415SDavid du Colombier case /srv/kfs.cmd 116ef53e415SDavid du Colombier disk/kfscmd sync 117ef53e415SDavid du Colombier case * 118ef53e415SDavid du Colombier disk/kfscmd -n `{echo $i | sed -n 's%/srv/kfs.(.*).cmd%\1%p'} sync 119ef53e415SDavid du Colombier } 1207a3484c3SDavid du Colombier sleep 2 1217a3484c3SDavid du Colombier} 1227a3484c3SDavid du Colombier 1237a3484c3SDavid du Colombier# halting (binaries we run can't be on the fs we're halting) 124e332dd3eSDavid du Colombierbuiltin cd /bin 125e332dd3eSDavid du Colombiercp dial/expect echo disk/kfscmd rc sed /tmp 1267a3484c3SDavid du Colombierbuiltin cd /tmp 127c89dfd4eSDavid du Colombiermkdir /tmp/lib 128c89dfd4eSDavid du Colombiercp /rc/lib/rcmain /tmp/lib 129c89dfd4eSDavid du Colombierbind /tmp /rc 1307a3484c3SDavid du Colombierbind /tmp /bin 1317a3484c3SDavid du Colombier 132c89dfd4eSDavid du Colombier# put this in a shell function so this rc script doesn't get read 133c89dfd4eSDavid du Colombier# when it's no longer accessible 134c89dfd4eSDavid du Colombierfn x { 135a3fbd160SDavid du Colombier rfork s 1367a3484c3SDavid du Colombier echo 1377a3484c3SDavid du Colombier echo -n halting... 1384e7b9544SDavid du Colombier for(i in $f) @ { 1397a3484c3SDavid du Colombier echo -n $i... 1407a3484c3SDavid du Colombier { 1417a3484c3SDavid du Colombier echo fsys all halt 142c89dfd4eSDavid du Colombier if(! expect -t 60 ': ') 1437a3484c3SDavid du Colombier echo -n 'not halted...' > /dev/cons 144220e960cSDavid du Colombier } < $i >> $i 1457a3484c3SDavid du Colombier } 1467a3484c3SDavid du Colombier 1477a3484c3SDavid du Colombier for (i in $k){ 1487a3484c3SDavid du Colombier echo -n $i... 149ef53e415SDavid du Colombier switch($i){ 150ef53e415SDavid du Colombier case /srv/kfs.cmd 151ef53e415SDavid du Colombier kfscmd halt 152ef53e415SDavid du Colombier case * 153ef53e415SDavid du Colombier kfscmd -n `{echo $i | sed -n 's%/srv/kfs.(.*).cmd%\1%p'} halt 154ef53e415SDavid du Colombier } 1557a3484c3SDavid du Colombier } 1567a3484c3SDavid du Colombier echo 1576b0d5c8bSDavid du Colombier echo done halting 1586b0d5c8bSDavid du Colombier 159e332dd3eSDavid du Colombier if (~ $reboot yes) 16081bcec06SDavid du Colombier echo reboot $kerncopy >'#c/reboot' 161c89dfd4eSDavid du Colombier} 162c89dfd4eSDavid du Colombier 163c89dfd4eSDavid du Colombierx 164