xref: /plan9-contrib/rc/bin/fshalt (revision 9220b9f310c23158b42332ba8a3150f09eaa8bc1)
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