xref: /illumos-gate/usr/src/cmd/stmsboot/stmsboot.sh (revision 03831d35)
1#!/sbin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License, Version 1.0 only
7# (the "License").  You may not use this file except in compliance
8# with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23#
24# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27#ident	"%Z%%M%	%I%	%E% SMI"
28
29PATH=/usr/bin:/usr/sbin:$PATH; export PATH
30STMSBOOTUTIL=/lib/mpxio/stmsboot_util
31STMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade
32STMSINSTANCE=platform/sun4u/mpxio-upgrade:default
33FPCONF=/kernel/drv/fp.conf
34TMPFPCONF=/var/run/tmp.fp.conf.$$
35VFSTAB=/etc/vfstab
36SAVEDIR=/etc/mpxio
37RECOVERFILE=$SAVEDIR/recover_instructions
38SVCCFG_RECOVERY=$SAVEDIR/svccfg_recover
39USAGE=`gettext "Usage: stmsboot -e | -d | -u | -L | -l controller_number"`
40
41#
42# Copy all entries (including comments) from source driver.conf to destination
43# driver.conf except those entries which contain mpxio-disable property.
44# Take into consideration entries that spawn more than one line.
45#
46# $1	source driver.conf file
47# $2	destination driver.conf file
48#
49# Returns 0 on success, non zero on failure.
50#
51delete_mpxio_disable_entries()
52{
53	sed '
54		/^[ 	]*#/{ p
55			      d
56			    }
57		s/[ 	]*$//
58		/^$/{ p
59		      d
60		    }
61		/mpxio-disable[ 	]*=.*;$/d
62		/;$/{ p
63		      d
64		    }
65		:rdnext
66		N
67		s/[ 	]*$//
68		/[^;]$/b rdnext
69		/mpxio-disable[ 	]*=/d' $1 > $2
70
71	return $?
72}
73
74#
75# backup the last saved copy of the specified files.
76# $*	files to backup
77#
78backup_lastsaved()
79{
80	for file in $*
81	do
82		file=`basename $file`
83		if [ -f $SAVEDIR/$file ]; then
84			mv $SAVEDIR/$file $SAVEDIR/${file}.old
85		fi
86	done
87}
88
89#
90# build recover instructions
91#
92# $1	1 to include boot script in the instructions
93#	0 otherwise
94#
95build_recover()
96{
97	gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE
98	echo "\tboot net \c"  >> $RECOVERFILE
99	gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE
100	echo "\tfsck <your-root-device>" >> $RECOVERFILE
101	echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE
102
103	if [ "x$cmd" = xupdate ]; then
104		gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE
105		echo "/mnt$FPCONF." >> $RECOVERFILE
106	else
107		echo "\tcp /mnt${SAVEDIR}/fp.conf /mnt$FPCONF" >> $RECOVERFILE
108	fi
109
110	if [ $1 -eq 1 ]; then
111		echo "\tcp /mnt${SAVEDIR}/vfstab /mnt$VFSTAB" >> $RECOVERFILE
112
113		echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY
114		echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY
115		echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY
116		echo "exit" >> $SVCCFG_RECOVERY
117
118		echo "\t/usr/sbin/svccfg -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE
119	fi
120
121	rootdisk=`mount | grep "/ on " | cut -f 3 -d " "`
122	echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE
123	gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE
124}
125
126#
127# Arrange for /etc/vfstab and dump configuration to be updated
128# during the next reboot. If the cmd is "enable" or "disable", copy
129# $TMPFPCONF to $FPCONF.
130#
131# Returns 0 on success, 1 on failure.
132#
133update_sysfiles()
134{
135	gettext "WARNING: This operation will require a reboot.\nDo you want to continue ? [y/n] (default: y) "
136	read response
137
138	if [ "x$response" != x -a "x$response" != xy -a \
139	    "x$response" != xY ]; then
140		rm -f $TMPFPCONF
141		return 0
142	fi
143
144	need_bootscript=1
145	if [ "x$cmd" = xenable -o "x$cmd" = xdisable ]; then
146		cp $FPCONF $SAVEDIR
147		cp $TMPFPCONF $FPCONF
148		rm -f $TMPFPCONF
149
150		#
151		# there is no need to update the system files in the following
152		# cases:
153		# - we are enabling mpxio and the system has no configured
154		#   disks accessible by phci paths.
155		# - we are disabling mpxio and the system has no configured
156		#   disks accessible by vhci paths.
157		#
158		if [ "x$cmd" = xenable ]; then
159			ls -l /dev/dsk/*s2 2> /dev/null | \
160			    egrep -s "/fp@.*/ssd@.*"
161		else
162			ls -l /dev/dsk/*s2 2> /dev/null | \
163			    egrep -s "/scsi_vhci.*/ssd@.*"
164		fi
165
166		if [ $? -ne 0 ]; then
167			need_bootscript=0
168		fi
169	fi
170
171	if [ $need_bootscript -eq 1 ]; then
172		#
173		# Enable the mpxio-upgrade service, but don't run it now.
174		# The service will run during the next reboot and will do
175		# the actual job of modifying the system files.
176		#
177		svcadm disable -t $STMSINSTANCE
178		svccfg -f - << EOF
179select $STMSINSTANCE
180setprop general/enabled = true
181EOF
182	fi
183
184	build_recover $need_bootscript
185
186	gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) "
187	read response
188
189	if [ "x$response" = x -o "x$response" = xy -o \
190	    "x$response" = xY ]; then
191		reboot
192	fi
193
194	return 0
195}
196
197#
198# Enable or disable mpxio as specified by the cmd.
199# Returns 0 on success, 1 on failure.
200#
201configure_mpxio()
202{
203	if [ "x$cmd" = xenable ]; then
204		propval=no
205		msg=`gettext "STMS already enabled."`
206	else
207		propval=yes
208		msg=`gettext "STMS already disabled."`
209	fi
210
211	if delete_mpxio_disable_entries $FPCONF $TMPFPCONF; then
212		echo "mpxio-disable=\"${propval}\";" >> $TMPFPCONF
213		if diff -b $FPCONF $TMPFPCONF > /dev/null; then
214			rm -f $TMPFPCONF
215			echo "$msg"
216			return 0
217		fi
218		update_sysfiles
219		return $?
220	else
221		rm -f $TMPFPCONF
222		gettext "failed to update " 1>&2
223		echo "$FPCONF." 1>&2
224		gettext "No changes were made to your STMS configuration.\n" 1>&2
225		return 1
226	fi
227}
228
229setcmd()
230{
231	if [ "x$cmd" = xnone ]; then
232		cmd=$1
233	else
234		echo "$USAGE" 1>&2
235		exit 2
236	fi
237}
238
239cmd=none
240
241# process options
242while getopts eduLl: c
243do
244	case $c in
245	e)	setcmd enable;;
246	d)	setcmd disable;;
247	u)	setcmd update;;
248	L)	setcmd listall;;
249	l)	setcmd list
250		controller=$OPTARG;;
251	\?)	echo "$USAGE" 1>&2
252		exit 2;;
253	esac
254done
255
256if [ "x$cmd" = xnone ]; then
257	echo "$USAGE" 1>&2
258	exit 2
259fi
260
261set `id`
262if [ "$1" != "uid=0(root)" ]; then
263	gettext "You must be super-user to run this script.\n" 1>&2
264	exit 1
265fi
266
267# just a sanity check
268if [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then
269	fmt=`gettext "Can't find %s and/or %s"`
270	printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2
271	exit 1
272fi
273
274svcprop -q $STMSINSTANCE
275if [ $? -ne 0 ]; then
276	fmt=`gettext "Can't find %s service"`
277	printf "$fmt\n" "$STMSINSTANCE" 1>&2
278	exit 1
279fi
280
281if [ "x$cmd" = xenable -o "x$cmd" = xdisable -o "x$cmd" = xupdate ]; then
282	#
283	# The bootup script doesn't work on cache-only-clients as the script
284	# is executed before the plumbing for cachfs mounting of root is done.
285	#
286	if mount -v | egrep -s " on / type (nfs|cachefs) "; then
287		gettext "This command option is not supported on systems with nfs or cachefs mounted root filesystem.\n" 1>&2
288		exit 1
289	fi
290
291	if [ -d $SAVEDIR ]; then
292		#
293		# keep a copy of the last saved files, useful for manual
294		# recovery in case of a problem.
295		#
296		backup_lastsaved $FPCONF $VFSTAB
297	else
298		mkdir $SAVEDIR
299	fi
300
301fi
302
303if [ "x$cmd" = xenable -o "x$cmd" = xdisable ]; then
304	configure_mpxio $cmd
305elif [ "x$cmd" = xupdate ]; then
306	update_sysfiles
307elif [ "x$cmd" = xlist ]; then
308	$STMSBOOTUTIL -l $controller
309else
310	$STMSBOOTUTIL -L
311fi
312
313exit $?
314