xref: /titanic_53/usr/src/cmd/stmsboot/stmsboot.sh (revision 34c948160fe246359b1ab74a1dc391c155a54990)
17c478bd9Sstevel@tonic-gate#!/sbin/sh
27c478bd9Sstevel@tonic-gate#
37c478bd9Sstevel@tonic-gate# CDDL HEADER START
47c478bd9Sstevel@tonic-gate#
57c478bd9Sstevel@tonic-gate# The contents of this file are subject to the terms of the
66deb031bSsjelinek# Common Development and Distribution License (the "License").
76deb031bSsjelinek# You may not use this file except in compliance with the License.
87c478bd9Sstevel@tonic-gate#
97c478bd9Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate# See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate# and limitations under the License.
137c478bd9Sstevel@tonic-gate#
147c478bd9Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate#
207c478bd9Sstevel@tonic-gate# CDDL HEADER END
217c478bd9Sstevel@tonic-gate#
227c478bd9Sstevel@tonic-gate#
235a4c37c9Sqh201292# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate# Use is subject to license terms.
257c478bd9Sstevel@tonic-gate#
267c478bd9Sstevel@tonic-gate#ident	"%Z%%M%	%I%	%E% SMI"
27815dd917Sjmcp#
287c478bd9Sstevel@tonic-gate
297c478bd9Sstevel@tonic-gatePATH=/usr/bin:/usr/sbin:$PATH; export PATH
307c478bd9Sstevel@tonic-gateSTMSBOOTUTIL=/lib/mpxio/stmsboot_util
317c478bd9Sstevel@tonic-gateSTMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade
3260fffc19Sjw149990KDRVCONF=
3360fffc19Sjw149990DRVCONF=
3460fffc19Sjw149990TMPDRVCONF=
3560fffc19Sjw149990TMPDRVCONF_MPXIO_ENTRY=
3660fffc19Sjw149990DRVLIST=
3760fffc19Sjw149990GUID=
387c478bd9Sstevel@tonic-gateVFSTAB=/etc/vfstab
397c478bd9Sstevel@tonic-gateSAVEDIR=/etc/mpxio
407c478bd9Sstevel@tonic-gateRECOVERFILE=$SAVEDIR/recover_instructions
417c478bd9Sstevel@tonic-gateSVCCFG_RECOVERY=$SAVEDIR/svccfg_recover
4260fffc19Sjw149990SUPPORTED_DRIVERS="fp|mpt"
4360fffc19Sjw149990USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"`
44aca6e9ccSramatTEXTDOMAIN=SUNW_OST_OSCMD
45aca6e9ccSramatexport TEXTDOMAIN
465a4c37c9Sqh201292STMSINSTANCE=system/device/mpxio-upgrade:default
4760fffc19Sjw149990STMSBOOT=/usr/sbin/stmsboot
4860fffc19Sjw149990BOOTADM=/sbin/bootadm
4960fffc19Sjw149990MOUNT=/usr/sbin/mount
5060fffc19Sjw149990EGREP=/usr/bin/egrep
5160fffc19Sjw149990GREP=/usr/bin/grep
5260fffc19Sjw149990AWK=/usr/bin/awk
5360fffc19Sjw149990SORT=/usr/bin/sort
5460fffc19Sjw149990UNIQ=/usr/bin/uniq
5560fffc19Sjw149990EXPR=/usr/bin/expr
56815dd917SjmcpSED=/usr/bin/sed
57815dd917SjmcpSVCPROP=/usr/bin/svcprop
58815dd917SjmcpSVCCFG=/usr/sbin/svccfg
59815dd917SjmcpSVCS=/usr/bin/svcs
60815dd917SjmcpSVCADM=/usr/sbin/svcadm
617c478bd9Sstevel@tonic-gate
625a4c37c9Sqh201292MACH=`/usr/bin/uname -p`
635a4c37c9Sqh201292BOOTENV_FILE=/boot/solaris/bootenv.rc
6460fffc19Sjw149990
6560fffc19Sjw149990CLIENT_TYPE_VHCI="/scsi_vhci.*/ssd@|/scsi_vhci.*/disk@"
6660fffc19Sjw149990# The phci client type egrep string will change based on the
6760fffc19Sjw149990# drivers which we are operating on, and the cpu architecture
6860fffc19Sjw149990# and we call stmsboot_util -n -D $drv to get that string
6960fffc19Sjw149990CLIENT_TYPE_PHCI=
7060fffc19Sjw149990reboot_needed=0
7160fffc19Sjw149990
727c478bd9Sstevel@tonic-gate#
7360fffc19Sjw149990# Copy all entries (including comments) from source driver.conf
7460fffc19Sjw149990# to destination driver.conf except those entries which contain
7560fffc19Sjw149990# the mpxio-disable property.
767c478bd9Sstevel@tonic-gate# Take into consideration entries that spawn more than one line.
777c478bd9Sstevel@tonic-gate#
787c478bd9Sstevel@tonic-gate# $1	source driver.conf file
797c478bd9Sstevel@tonic-gate# $2	destination driver.conf file
807c478bd9Sstevel@tonic-gate#
817c478bd9Sstevel@tonic-gate# Returns 0 on success, non zero on failure.
827c478bd9Sstevel@tonic-gate#
837c478bd9Sstevel@tonic-gatedelete_mpxio_disable_entries()
847c478bd9Sstevel@tonic-gate{
857c478bd9Sstevel@tonic-gate	sed '
867c478bd9Sstevel@tonic-gate		/^[ 	]*#/{ p
877c478bd9Sstevel@tonic-gate			      d
887c478bd9Sstevel@tonic-gate			    }
897c478bd9Sstevel@tonic-gate		s/[ 	]*$//
907c478bd9Sstevel@tonic-gate		/^$/{ p
917c478bd9Sstevel@tonic-gate		      d
927c478bd9Sstevel@tonic-gate		    }
935a4c37c9Sqh201292		/mpxio-disable[ 	]*=.*;$/{ w '$3'
945a4c37c9Sqh201292						  d
955a4c37c9Sqh201292						}
967c478bd9Sstevel@tonic-gate		/;$/{ p
977c478bd9Sstevel@tonic-gate		      d
987c478bd9Sstevel@tonic-gate		    }
997c478bd9Sstevel@tonic-gate		:rdnext
1007c478bd9Sstevel@tonic-gate		N
1017c478bd9Sstevel@tonic-gate		s/[ 	]*$//
1027c478bd9Sstevel@tonic-gate		/[^;]$/b rdnext
1035a4c37c9Sqh201292		/mpxio-disable[ 	]*=/{ s/\n/ /g
1045a4c37c9Sqh201292					      w '$3'
1055a4c37c9Sqh201292					      d
1065a4c37c9Sqh201292					    }
1075a4c37c9Sqh201292		' $1 > $2
1087c478bd9Sstevel@tonic-gate
1097c478bd9Sstevel@tonic-gate	return $?
1107c478bd9Sstevel@tonic-gate}
1117c478bd9Sstevel@tonic-gate
1127c478bd9Sstevel@tonic-gate#
1137c478bd9Sstevel@tonic-gate# backup the last saved copy of the specified files.
1147c478bd9Sstevel@tonic-gate# $*	files to backup
1157c478bd9Sstevel@tonic-gate#
1167c478bd9Sstevel@tonic-gatebackup_lastsaved()
1177c478bd9Sstevel@tonic-gate{
1187c478bd9Sstevel@tonic-gate	for file in $*
1197c478bd9Sstevel@tonic-gate	do
1207c478bd9Sstevel@tonic-gate		file=`basename $file`
1217c478bd9Sstevel@tonic-gate		if [ -f $SAVEDIR/$file ]; then
1227c478bd9Sstevel@tonic-gate			mv $SAVEDIR/$file $SAVEDIR/${file}.old
1237c478bd9Sstevel@tonic-gate		fi
1247c478bd9Sstevel@tonic-gate	done
1257c478bd9Sstevel@tonic-gate}
1267c478bd9Sstevel@tonic-gate
1277c478bd9Sstevel@tonic-gate#
1287c478bd9Sstevel@tonic-gate# build recover instructions
1297c478bd9Sstevel@tonic-gate#
1307c478bd9Sstevel@tonic-gate# $1	1 to include boot script in the instructions
1317c478bd9Sstevel@tonic-gate#	0 otherwise
1327c478bd9Sstevel@tonic-gate#
1337c478bd9Sstevel@tonic-gatebuild_recover()
1347c478bd9Sstevel@tonic-gate{
1357c478bd9Sstevel@tonic-gate	gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE
1367c478bd9Sstevel@tonic-gate	echo "\tboot net \c"  >> $RECOVERFILE
1377c478bd9Sstevel@tonic-gate	gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE
1387c478bd9Sstevel@tonic-gate	echo "\tfsck <your-root-device>" >> $RECOVERFILE
1397c478bd9Sstevel@tonic-gate	echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE
1407c478bd9Sstevel@tonic-gate
1417c478bd9Sstevel@tonic-gate	if [ "x$cmd" = xupdate ]; then
1427c478bd9Sstevel@tonic-gate		gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE
14360fffc19Sjw149990		echo "/mnt$KDRVCONF." >> $RECOVERFILE
1447c478bd9Sstevel@tonic-gate	else
14560fffc19Sjw149990		echo "\tcp /mnt${SAVEDIR}/$DRVCONF /mnt$KDRVCONF" >> $RECOVERFILE
1467c478bd9Sstevel@tonic-gate	fi
1477c478bd9Sstevel@tonic-gate
148815dd917Sjmcp	if [ $1 -eq 1 ]; then
1497c478bd9Sstevel@tonic-gate		echo "\tcp /mnt${SAVEDIR}/vfstab /mnt$VFSTAB" >> $RECOVERFILE
1507c478bd9Sstevel@tonic-gate
1517c478bd9Sstevel@tonic-gate		echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY
1527c478bd9Sstevel@tonic-gate		echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY
1537c478bd9Sstevel@tonic-gate		echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY
1547c478bd9Sstevel@tonic-gate		echo "exit" >> $SVCCFG_RECOVERY
1557c478bd9Sstevel@tonic-gate
156815dd917Sjmcp		echo "\t$SVCCFG -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE
1575a4c37c9Sqh201292
1585a4c37c9Sqh201292		if [ "x$MACH" = "xi386" -a "x$new_bootpath" != "x" ]; then
1595a4c37c9Sqh201292			echo "\tcp /mnt${SAVEDIR}/bootenv.rc /mnt$BOOTENV_FILE" >> $RECOVERFILE
1605a4c37c9Sqh201292		fi
1617c478bd9Sstevel@tonic-gate	fi
1627c478bd9Sstevel@tonic-gate
16360fffc19Sjw149990	rootdisk=`$MOUNT | $GREP "/ on " | cut -f 3 -d " "`
1647c478bd9Sstevel@tonic-gate	echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE
1657c478bd9Sstevel@tonic-gate	gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE
1667c478bd9Sstevel@tonic-gate}
1677c478bd9Sstevel@tonic-gate
1687c478bd9Sstevel@tonic-gate#
1697c478bd9Sstevel@tonic-gate# Arrange for /etc/vfstab and dump configuration to be updated
1707c478bd9Sstevel@tonic-gate# during the next reboot. If the cmd is "enable" or "disable", copy
17160fffc19Sjw149990# $TMPDRVCONF to $KDRVCONF.
1727c478bd9Sstevel@tonic-gate#
1737c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure.
1747c478bd9Sstevel@tonic-gate#
1757c478bd9Sstevel@tonic-gateupdate_sysfiles()
1767c478bd9Sstevel@tonic-gate{
17760fffc19Sjw149990
1787c478bd9Sstevel@tonic-gate	gettext "WARNING: This operation will require a reboot.\nDo you want to continue ? [y/n] (default: y) "
1797c478bd9Sstevel@tonic-gate	read response
1807c478bd9Sstevel@tonic-gate
1817c478bd9Sstevel@tonic-gate	if [ "x$response" != x -a "x$response" != xy -a \
1827c478bd9Sstevel@tonic-gate	    "x$response" != xY ]; then
18360fffc19Sjw149990		for d in $DRVLIST; do
18460fffc19Sjw149990			TMPDRVCONF=/var/run/tmp.$d.conf.$$
18560fffc19Sjw149990			rm -f $TMPDRVCONF > /dev/null 2>&1
18660fffc19Sjw149990		done;
18760fffc19Sjw149990		return 0;
1887c478bd9Sstevel@tonic-gate	fi
1897c478bd9Sstevel@tonic-gate
190815dd917Sjmcp	# set need_bootscript to the number of drivers that
191815dd917Sjmcp	# we support.
192815dd917Sjmcp	need_bootscript=`echo $SUPPORTED_DRIVERS|$AWK -F"|" '{print NF}'`
19360fffc19Sjw149990
1947c478bd9Sstevel@tonic-gate	if [ "x$cmd" = xenable -o "x$cmd" = xdisable ]; then
19560fffc19Sjw149990
19660fffc19Sjw149990		for d in $DRVLIST; do
19760fffc19Sjw149990			DRVCONF=$d.conf
19860fffc19Sjw149990			KDRVCONF=/kernel/drv/$d.conf
19960fffc19Sjw149990			TMPDRVCONF=/var/run/tmp.$d.conf.$$
20060fffc19Sjw149990
20160fffc19Sjw149990			cp $KDRVCONF $SAVEDIR
202815dd917Sjmcp			if [ -f $TMPDRVCONF ]; then
20360fffc19Sjw149990				cp $TMPDRVCONF $KDRVCONF
204815dd917Sjmcp				rm -f $TMPDRVCONF
205815dd917Sjmcp			else
206815dd917Sjmcp				# if $TMPDRVCONF doesn't exist, then we
207815dd917Sjmcp				# haven't made any changes to it
208815dd917Sjmcp				continue;
209815dd917Sjmcp			fi
2107c478bd9Sstevel@tonic-gate
2117c478bd9Sstevel@tonic-gate			#
2127c478bd9Sstevel@tonic-gate			# there is no need to update the system files in the following
2137c478bd9Sstevel@tonic-gate			# cases:
2147c478bd9Sstevel@tonic-gate			# - we are enabling mpxio and the system has no configured
2157c478bd9Sstevel@tonic-gate			#   disks accessible by phci paths.
2167c478bd9Sstevel@tonic-gate			# - we are disabling mpxio and the system has no configured
2177c478bd9Sstevel@tonic-gate			#   disks accessible by vhci paths.
2187c478bd9Sstevel@tonic-gate			#
21960fffc19Sjw149990
220815dd917Sjmcp			# Function to setup the CLIENT_TYPE_PHCI string based on
221815dd917Sjmcp			# the list of drivers that we're operating on. The variable
222815dd917Sjmcp			# depends upon the pathname of the parent node in the
223815dd917Sjmcp			# device tree, which can be different on x86/x64 and sparc.
224815dd917Sjmcp
225815dd917Sjmcp			CLIENT_TYPE_PHCI=`$STMSBOOTUTIL -D $d -n`;
226815dd917Sjmcp
22760fffc19Sjw149990			if [ "x$CLIENT_TYPE_PHCI" = "x" ]; then
22860fffc19Sjw149990				continue;
22960fffc19Sjw149990			fi
23060fffc19Sjw149990
23160fffc19Sjw149990			if [ "x$cmd" = "xenable" ]; then
2327c478bd9Sstevel@tonic-gate				ls -l /dev/dsk/*s2 2> /dev/null | \
23360fffc19Sjw149990				    $EGREP -s "$CLIENT_TYPE_PHCI"
2347c478bd9Sstevel@tonic-gate			else
2357c478bd9Sstevel@tonic-gate				ls -l /dev/dsk/*s2 2> /dev/null | \
23660fffc19Sjw149990				    $EGREP -s "$CLIENT_TYPE_VHCI"
2377c478bd9Sstevel@tonic-gate			fi
2387c478bd9Sstevel@tonic-gate
2397c478bd9Sstevel@tonic-gate			if [ $? -ne 0 ]; then
240815dd917Sjmcp				need_bootscript=`$EXPR $need_bootscript - 1`
24160fffc19Sjw149990			fi
24260fffc19Sjw149990		done
24360fffc19Sjw149990	fi
24460fffc19Sjw149990
245815dd917Sjmcp	if [ $need_bootscript -gt 0 ]; then
246815dd917Sjmcp		need_bootscript=1
2475a4c37c9Sqh201292		if [ "x$MACH" = "xi386" -a "x$new_bootpath" != "x" ]; then
2485a4c37c9Sqh201292			#only update bootpath for x86.
2495a4c37c9Sqh201292			cp $BOOTENV_FILE $SAVEDIR
25060fffc19Sjw149990			/usr/sbin/eeprom bootpath=$new_bootpath
2515a4c37c9Sqh201292		fi
2527c478bd9Sstevel@tonic-gate		#
2537c478bd9Sstevel@tonic-gate		# Enable the mpxio-upgrade service, but don't run it now.
2547c478bd9Sstevel@tonic-gate		# The service will run during the next reboot and will do
2557c478bd9Sstevel@tonic-gate		# the actual job of modifying the system files.
2567c478bd9Sstevel@tonic-gate		#
257815dd917Sjmcp		$SVCADM disable -t $STMSINSTANCE
258815dd917Sjmcp		$SVCCFG -f - << EOF
2597c478bd9Sstevel@tonic-gateselect $STMSINSTANCE
2607c478bd9Sstevel@tonic-gatesetprop general/enabled = true
2617c478bd9Sstevel@tonic-gateEOF
262815dd917Sjmcp	else
263815dd917Sjmcp		need_bootscript=0
2647c478bd9Sstevel@tonic-gate	fi
2657c478bd9Sstevel@tonic-gate
2667c478bd9Sstevel@tonic-gate	build_recover $need_bootscript
2677c478bd9Sstevel@tonic-gate
26860fffc19Sjw149990	if [ "x$MACH" = "xi386" ]; then
26960fffc19Sjw149990		$BOOTADM update-archive
27060fffc19Sjw149990	fi
27160fffc19Sjw149990
2727c478bd9Sstevel@tonic-gate	gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) "
2737c478bd9Sstevel@tonic-gate	read response
2747c478bd9Sstevel@tonic-gate
2757c478bd9Sstevel@tonic-gate	if [ "x$response" = x -o "x$response" = xy -o \
2767c478bd9Sstevel@tonic-gate	    "x$response" = xY ]; then
27760fffc19Sjw149990		/usr/sbin/reboot
2787c478bd9Sstevel@tonic-gate	fi
2797c478bd9Sstevel@tonic-gate
2807c478bd9Sstevel@tonic-gate	return 0
2817c478bd9Sstevel@tonic-gate}
2827c478bd9Sstevel@tonic-gate
2837c478bd9Sstevel@tonic-gate#
2847c478bd9Sstevel@tonic-gate# Enable or disable mpxio as specified by the cmd.
2857c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure.
2867c478bd9Sstevel@tonic-gate#
28760fffc19Sjw149990# Args: $cmd = {enable | disable}
28860fffc19Sjw149990#	$d = {fp | mpt}
28960fffc19Sjw149990#
29060fffc19Sjw149990# the global variable $DRVLIST is used
29160fffc19Sjw149990#
2927c478bd9Sstevel@tonic-gateconfigure_mpxio()
2937c478bd9Sstevel@tonic-gate{
2945a4c37c9Sqh201292	mpxiodisableno='mpxio-disable[ 	]*=[ 	]*"no"[ 	]*;'
2955a4c37c9Sqh201292	mpxiodisableyes='mpxio-disable[ 	]*=[ 	]*"yes"[ 	]*;'
2965a4c37c9Sqh201292
2977c478bd9Sstevel@tonic-gate	if [ "x$cmd" = xenable ]; then
2985a4c37c9Sqh201292		mpxiodisable_cur_entry=$mpxiodisableyes
2997c478bd9Sstevel@tonic-gate		propval=no
30060fffc19Sjw149990		msg=`gettext "STMS already enabled"`
3017c478bd9Sstevel@tonic-gate	else
3025a4c37c9Sqh201292		mpxiodisable_cur_entry=$mpxiodisableno
3037c478bd9Sstevel@tonic-gate		propval=yes
30460fffc19Sjw149990		msg=`gettext "STMS already disabled"`
3057c478bd9Sstevel@tonic-gate	fi
3067c478bd9Sstevel@tonic-gate
30760fffc19Sjw149990	DRVCONF=$d.conf
30860fffc19Sjw149990	KDRVCONF=/kernel/drv/$d.conf
30960fffc19Sjw149990	TMPDRVCONF=/var/run/tmp.$d.conf.$$
31060fffc19Sjw149990	TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
31160fffc19Sjw149990
31260fffc19Sjw149990	echo "Checking mpxio status for driver $d"
31360fffc19Sjw149990	if delete_mpxio_disable_entries $KDRVCONF $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY; then
31460fffc19Sjw149990
31560fffc19Sjw149990		if [ -s $TMPDRVCONF_MPXIO_ENTRY ]; then
31660fffc19Sjw149990			# $DRVCONF does have mpxiodisable entries
31760fffc19Sjw149990			$EGREP -s "$mpxiodisable_cur_entry" $TMPDRVCONF_MPXIO_ENTRY
3185a4c37c9Sqh201292			if [ $? -ne 0 ]; then
3195a4c37c9Sqh201292				# if all mpxiodisable entries are no/yes for
3205a4c37c9Sqh201292				# enable/disable mpxio, notify the user
32160fffc19Sjw149990				rm -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY > /dev/null 2>&1
32260fffc19Sjw149990				continue;
32360fffc19Sjw149990			else
32460fffc19Sjw149990				reboot_needed=`$EXPR $reboot_needed + 1`
3257c478bd9Sstevel@tonic-gate			fi
32660fffc19Sjw149990
32760fffc19Sjw149990			# If mpxiodisable entries do not exist, always continue update
3285a4c37c9Sqh201292		fi
3297c478bd9Sstevel@tonic-gate	else
33060fffc19Sjw149990		rm -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY > /dev/null 2>&1
3317c478bd9Sstevel@tonic-gate		gettext "failed to update " 1>&2
33260fffc19Sjw149990		echo "$KDRVCONF." 1>&2
3337c478bd9Sstevel@tonic-gate		gettext "No changes were made to your STMS configuration.\n" 1>&2
3347c478bd9Sstevel@tonic-gate		return 1
3357c478bd9Sstevel@tonic-gate	fi
3365a4c37c9Sqh201292
33760fffc19Sjw149990	rm $TMPDRVCONF_MPXIO_ENTRY > /dev/null 2>&1
33860fffc19Sjw149990	echo "mpxio-disable=\"${propval}\";" >> $TMPDRVCONF
3395a4c37c9Sqh201292
3407c478bd9Sstevel@tonic-gate}
3417c478bd9Sstevel@tonic-gate
3427c478bd9Sstevel@tonic-gatesetcmd()
3437c478bd9Sstevel@tonic-gate{
3447c478bd9Sstevel@tonic-gate	if [ "x$cmd" = xnone ]; then
3457c478bd9Sstevel@tonic-gate		cmd=$1
3467c478bd9Sstevel@tonic-gate	else
3477c478bd9Sstevel@tonic-gate		echo "$USAGE" 1>&2
3487c478bd9Sstevel@tonic-gate		exit 2
3497c478bd9Sstevel@tonic-gate	fi
3507c478bd9Sstevel@tonic-gate}
3517c478bd9Sstevel@tonic-gate
35260fffc19Sjw149990#
3535a4c37c9Sqh201292#Need to update bootpath on x86 if boot system from FC disk
3545a4c37c9Sqh201292#Only update bootpath here when mpxio is enabled
3555a4c37c9Sqh201292#If mpxio is disabled currently, will update bootpath in mpxio-upgrade
35660fffc19Sjw149990#
35760fffc19Sjw149990
3585a4c37c9Sqh201292get_newbootpath_for_stmsdev() {
3595a4c37c9Sqh201292	if [ "x$cmd" = "xenable" ]; then
3605a4c37c9Sqh201292		return 0
3615a4c37c9Sqh201292	fi
3625a4c37c9Sqh201292
36360fffc19Sjw149990	cur_bootpath=`eeprom bootpath | \
36460fffc19Sjw149990	    sed 's/bootpath=[ 	]*//g' | sed 's/[ 	]*$//'`
3655a4c37c9Sqh201292	if [ "x$cur_bootpath" = "x" ]; then
3665a4c37c9Sqh201292		gettext "failed to get bootpath by eeprom\n" 1>&2
3675a4c37c9Sqh201292		return 1
3685a4c37c9Sqh201292	fi
3695a4c37c9Sqh201292
3705a4c37c9Sqh201292	#only update bootpath for STMS path
37160fffc19Sjw149990	echo $cur_bootpath|$EGREP $CLIENT_TYPE_VHCI > /dev/null 2>&1
3725a4c37c9Sqh201292	if [ $? -eq 1 ]; then
3735a4c37c9Sqh201292		return 0
3745a4c37c9Sqh201292	fi
3755a4c37c9Sqh201292
3765a4c37c9Sqh201292	new_bootpath=`$STMSBOOTUTIL -p /devices$cur_bootpath`
3775a4c37c9Sqh201292	if [ $? -ne 0 ]; then
3785a4c37c9Sqh201292		new_bootpath=""
3795a4c37c9Sqh201292		return 1
3805a4c37c9Sqh201292	fi
38160fffc19Sjw149990
38260fffc19Sjw149990	# we replace "sd" with "disk" if we need to work on the eeprom
38360fffc19Sjw149990	# bootpath setting, since fibre-channel devices will report as
38460fffc19Sjw149990	# being attached via "disk" and not "sd". One day we'll have a
38560fffc19Sjw149990	# truly unified and architecture-independent view of the device
38660fffc19Sjw149990	# tree, and this block will be redundant
38760fffc19Sjw149990	fp_bootpath=`echo $new_bootpath|grep fp.*sd`
38860fffc19Sjw149990	if [ "x$fp_bootpath" != "x" ]; then
38960fffc19Sjw149990		new_bootpath=`echo $fp_bootpath |sed -e"s,sd,disk,g"`
39060fffc19Sjw149990	fi
39160fffc19Sjw149990}
39260fffc19Sjw149990
39360fffc19Sjw149990#
39460fffc19Sjw149990# Emit a warning message to the user that by default we
39560fffc19Sjw149990# operate on all multipath-capable controllers that are
39660fffc19Sjw149990# attached to the system, and that if they want to operate
39760fffc19Sjw149990# on only a specific controller type (fp|mpt|....) then
39860fffc19Sjw149990# they need to re-invoke stmsboot with "-D $driver" in
39960fffc19Sjw149990# their argument list
40060fffc19Sjw149990#
40160fffc19Sjw149990
40260fffc19Sjw149990emit_driver_warning_msg() {
40360fffc19Sjw149990
40460fffc19Sjw149990	# for each driver that we support, grab the list
40560fffc19Sjw149990	# of controllers attached to the system.
40660fffc19Sjw149990
407815dd917Sjmcp	echo ""
40860fffc19Sjw149990	echo "WARNING: stmsboot operates on each supported multipath-capable controller"
40960fffc19Sjw149990	echo "         detected in a host. In your system, these controllers are"
41060fffc19Sjw149990
411815dd917Sjmcp	for WARNDRV in `echo $SUPPORTED_DRIVERS| $SED -e"s,|, ,g"`; do
412815dd917Sjmcp		for i in `$STMSBOOTUTIL -D $WARNDRV -n | $SED -e"s,|, ,g"`; do
413815dd917Sjmcp			$GREP "$i.*$WARNDRV.$" /etc/path_to_inst | $AWK -F"\"" '{print "/devices"$2}'
414815dd917Sjmcp		done;
41560fffc19Sjw149990	done;
41660fffc19Sjw149990
41760fffc19Sjw149990	echo ""
41860fffc19Sjw149990	echo "If you do NOT wish to operate on these controllers, please quit stmsboot"
41960fffc19Sjw149990	echo "and re-invoke with -D { fp | mpt } to specify which controllers you wish"
42060fffc19Sjw149990	echo "to modify your multipathing configuration for."
42160fffc19Sjw149990
422815dd917Sjmcp	echo ""
42360fffc19Sjw149990	gettext "Do you wish to continue? [y/n] (default: y) " 1>&2
42460fffc19Sjw149990	read response
42560fffc19Sjw149990
4268cecff49Sgp87344	if [ "x$response" != "x" -a "x$response" != "xY" -a \
4278cecff49Sgp87344	    "x$response" != "xy" ]; then
42860fffc19Sjw149990		exit
42960fffc19Sjw149990	fi
43060fffc19Sjw149990
43160fffc19Sjw149990}
43260fffc19Sjw149990
4337c478bd9Sstevel@tonic-gatecmd=none
4347c478bd9Sstevel@tonic-gate
4357c478bd9Sstevel@tonic-gate# process options
43660fffc19Sjw149990while getopts D:geduLl: c
4377c478bd9Sstevel@tonic-gatedo
4387c478bd9Sstevel@tonic-gate	case $c in
4397c478bd9Sstevel@tonic-gate	e)	setcmd enable;;
4407c478bd9Sstevel@tonic-gate	d)	setcmd disable;;
4417c478bd9Sstevel@tonic-gate	u)	setcmd update;;
4427c478bd9Sstevel@tonic-gate	L)	setcmd listall;;
4437c478bd9Sstevel@tonic-gate	l)	setcmd list
4447c478bd9Sstevel@tonic-gate		controller=$OPTARG;;
44560fffc19Sjw149990	D)	DRV=$OPTARG;;
44660fffc19Sjw149990	g)	GUID="-g";;
4477c478bd9Sstevel@tonic-gate	\?)	echo "$USAGE" 1>&2
4487c478bd9Sstevel@tonic-gate		exit 2;;
4497c478bd9Sstevel@tonic-gate	esac
4507c478bd9Sstevel@tonic-gatedone
4517c478bd9Sstevel@tonic-gate
4527c478bd9Sstevel@tonic-gateif [ "x$cmd" = xnone ]; then
4537c478bd9Sstevel@tonic-gate	echo "$USAGE" 1>&2
4547c478bd9Sstevel@tonic-gate	exit 2
4557c478bd9Sstevel@tonic-gatefi
4567c478bd9Sstevel@tonic-gate
45760fffc19Sjw149990if [ "x$DRV" = "x" ]; then
45860fffc19Sjw149990	DRVLIST="fp mpt"
45960fffc19Sjw149990else
46060fffc19Sjw149990	DRVLIST=$DRV
46160fffc19Sjw149990fi
46260fffc19Sjw149990
463*34c94816SjmcpUSERID=`id | $EGREP "uid=0"`
464*34c94816Sjmcpif [ -z "$USERID" ]; then
4657c478bd9Sstevel@tonic-gate	gettext "You must be super-user to run this script.\n" 1>&2
4667c478bd9Sstevel@tonic-gate	exit 1
4677c478bd9Sstevel@tonic-gatefi
4687c478bd9Sstevel@tonic-gate
4697c478bd9Sstevel@tonic-gate# just a sanity check
4707c478bd9Sstevel@tonic-gateif [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then
4717c478bd9Sstevel@tonic-gate	fmt=`gettext "Can't find %s and/or %s"`
4727c478bd9Sstevel@tonic-gate	printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2
4737c478bd9Sstevel@tonic-gate	exit 1
4747c478bd9Sstevel@tonic-gatefi
4757c478bd9Sstevel@tonic-gate
47660fffc19Sjw149990# If the old sun4u-specific SMF method is found, remove it
477815dd917Sjmcp$SVCCFG -s "platform/sun4u/mpxio-upgrade:default" < /dev/null > /dev/null 2>&1
478815dd917Sjmcpif [ $? -eq 0 ]; then
479815dd917Sjmcp	$SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1
48060fffc19Sjw149990fi
48160fffc19Sjw149990
48260fffc19Sjw149990# now import the new service, if necessary
483815dd917Sjmcp$SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1
48460fffc19Sjw149990if [ $? -ne 0 ]; then
48560fffc19Sjw149990	if [ -f /var/svc/manifest/system/device/mpxio-upgrade.xml ]; then
486815dd917Sjmcp		$SVCCFG import /var/svc/manifest/system/device/mpxio-upgrade.xml
48760fffc19Sjw149990		if [ $? -ne 0 ]; then
48860fffc19Sjw149990			fmt=`gettext "Unable to import %s service"`
4897c478bd9Sstevel@tonic-gate			printf "$fmt\n" "$STMSINSTANCE" 1>&2
4907c478bd9Sstevel@tonic-gate			exit 1
49160fffc19Sjw149990		else
49260fffc19Sjw149990			fmt=`gettext "Service %s imported successfully, continuing"`
49360fffc19Sjw149990			printf "$fmt\n" "$STMSINSTANCE" 1>&2
49460fffc19Sjw149990		fi
49560fffc19Sjw149990	else
49660fffc19Sjw149990		fmt=`gettext "Service %s does not exist on this host"`
49760fffc19Sjw149990 		printf "$fmt\n" "$STMSINSTANCE" 1>&2
49860fffc19Sjw149990		exit 1
49960fffc19Sjw149990	fi
5007c478bd9Sstevel@tonic-gatefi
5017c478bd9Sstevel@tonic-gate
5027c478bd9Sstevel@tonic-gateif [ "x$cmd" = xenable -o "x$cmd" = xdisable -o "x$cmd" = xupdate ]; then
5037c478bd9Sstevel@tonic-gate	#
5047c478bd9Sstevel@tonic-gate	# The bootup script doesn't work on cache-only-clients as the script
5056deb031bSsjelinek	# is executed before the plumbing for cachefs mounting of root is done.
5067c478bd9Sstevel@tonic-gate	#
50760fffc19Sjw149990	if $MOUNT -v | $EGREP -s " on / type (nfs|cachefs) "; then
5087c478bd9Sstevel@tonic-gate		gettext "This command option is not supported on systems with nfs or cachefs mounted root filesystem.\n" 1>&2
5097c478bd9Sstevel@tonic-gate		exit 1
5107c478bd9Sstevel@tonic-gate	fi
5117c478bd9Sstevel@tonic-gate
512815dd917Sjmcp	# if the user has left the system with the mpxio-upgrade service
513815dd917Sjmcp	# in a temporarily disabled state (ie, service is armed for the next
514815dd917Sjmcp	# reboot), then let them know. We need to ensure that the system is
515815dd917Sjmcp	# is in a sane state before allowing any further invocations, so
516815dd917Sjmcp	# try to get the system admin to do so
517815dd917Sjmcp
518815dd917Sjmcp	ISARMED=`$SVCS -l $STMSINSTANCE |$GREP "enabled.*temporary"`
519815dd917Sjmcp	if [ $? -eq 0 ]; then
520815dd917Sjmcp		echo ""
521815dd917Sjmcp		echo "You need the reboot the system in order to complete"
522815dd917Sjmcp		echo "the previous invocation of stmsboot."
523815dd917Sjmcp		echo ""
524815dd917Sjmcp		echo "Do you wish to reboot the system now? (y/n, default y) \c"
525815dd917Sjmcp		read response
526815dd917Sjmcp
5278cecff49Sgp87344		if [ "x$response" = "x" -o "x$response" = "xY" -o \
5288cecff49Sgp87344		    "x$response" = "xy" ]; then
529815dd917Sjmcp			/usr/sbin/reboot
530815dd917Sjmcp		else
531815dd917Sjmcp			/bin/echo ""
532815dd917Sjmcp			/bin/echo "Please reboot this system before continuing"
533815dd917Sjmcp			/bin/echo ""
534815dd917Sjmcp			exit 1
535815dd917Sjmcp		fi
536815dd917Sjmcp	fi
537815dd917Sjmcp
5387c478bd9Sstevel@tonic-gate	if [ -d $SAVEDIR ]; then
5397c478bd9Sstevel@tonic-gate		#
5407c478bd9Sstevel@tonic-gate		# keep a copy of the last saved files, useful for manual
5417c478bd9Sstevel@tonic-gate		# recovery in case of a problem.
5427c478bd9Sstevel@tonic-gate		#
54360fffc19Sjw149990		for d in $DRVLIST; do
54460fffc19Sjw149990			DRVCONF=$d.conf
54560fffc19Sjw149990			KDRVCONF=/kernel/drv/$d.conf
54660fffc19Sjw149990			TMPDRVCONF=/var/run/tmp.$d.conf.$$
54760fffc19Sjw149990			TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
54860fffc19Sjw149990
5495a4c37c9Sqh201292			if [ "x$MACH" = "xsparc" ]; then
55060fffc19Sjw149990				backup_lastsaved $KDRVCONF $VFSTAB
5517c478bd9Sstevel@tonic-gate			else
55260fffc19Sjw149990				backup_lastsaved $KDRVCONF $VFSTAB $BOOTENV_FILE
5535a4c37c9Sqh201292			fi
55460fffc19Sjw149990		done
5555a4c37c9Sqh201292	else
5567c478bd9Sstevel@tonic-gate		mkdir $SAVEDIR
5577c478bd9Sstevel@tonic-gate	fi
5587c478bd9Sstevel@tonic-gate
5597c478bd9Sstevel@tonic-gatefi
5607c478bd9Sstevel@tonic-gate
5617c478bd9Sstevel@tonic-gateif [ "x$cmd" = xenable -o "x$cmd" = xdisable ]; then
56260fffc19Sjw149990
56360fffc19Sjw149990	msgneeded=`echo "$DRVLIST" |grep " "`
56460fffc19Sjw149990	if [ -n "$msgneeded" ]; then
56560fffc19Sjw149990		emit_driver_warning_msg
56660fffc19Sjw149990	fi
56760fffc19Sjw149990	for d in $DRVLIST; do
56860fffc19Sjw149990		configure_mpxio $cmd $d
56960fffc19Sjw149990	done
57060fffc19Sjw149990
57160fffc19Sjw149990	if [ $reboot_needed -ne 0 ]; then
57260fffc19Sjw149990
57360fffc19Sjw149990		# Need to update bootpath on x86 if our boot device is
57460fffc19Sjw149990		# now accessed through mpxio.
57560fffc19Sjw149990		# Only update bootpath before reboot when mpxio is enabled
57660fffc19Sjw149990		# If mpxio is currently disabled, we will update bootpath
57760fffc19Sjw149990		# on reboot in the mpxio-upgrade service
57860fffc19Sjw149990
57960fffc19Sjw149990		if [ "x$MACH" = "xi386" -a "x$cmd" = "xdisable" ]; then
58060fffc19Sjw149990			get_newbootpath_for_stmsdev
58160fffc19Sjw149990			if [ $? -ne 0 ]; then
58260fffc19Sjw149990				rm -f $TMPDRVCONF > /dev/null 2>&1
58360fffc19Sjw149990				gettext "failed to update bootpath.\n" 1>&2
58460fffc19Sjw149990				gettext "No changes were made to your STMS configuration.\n" 1>&2
58560fffc19Sjw149990				return 1
58660fffc19Sjw149990			fi
58760fffc19Sjw149990		fi
58860fffc19Sjw149990		update_sysfiles
58960fffc19Sjw149990	else
59060fffc19Sjw149990		echo "STMS is already ${cmd}d. No changes or reboots needed"
59160fffc19Sjw149990	fi
59260fffc19Sjw149990
59360fffc19Sjw149990
5947c478bd9Sstevel@tonic-gateelif [ "x$cmd" = xupdate ]; then
5955a4c37c9Sqh201292	if [ "x$MACH" = "xi386" ]; then
5965a4c37c9Sqh201292	# In this case we always change the bootpath to phci-based
5975a4c37c9Sqh201292	# path first. bootpath will later be modified in mpxio-upgrade
5985a4c37c9Sqh201292	# to the vhci-based path if mpxio is enabled on root.
5995a4c37c9Sqh201292		get_newbootpath_for_stmsdev
6005a4c37c9Sqh201292		if [ $? -ne 0 ]; then
6015a4c37c9Sqh201292			gettext "failed to update bootpath.\n" 1>&2
6025a4c37c9Sqh201292			return 1
6035a4c37c9Sqh201292		fi
6045a4c37c9Sqh201292	fi
6057c478bd9Sstevel@tonic-gate	update_sysfiles
60660fffc19Sjw149990
6077c478bd9Sstevel@tonic-gateelif [ "x$cmd" = xlist ]; then
60860fffc19Sjw149990		$STMSBOOTUTIL $GUID -l $controller
6097c478bd9Sstevel@tonic-gateelse
61060fffc19Sjw149990		$STMSBOOTUTIL $GUID -L
6117c478bd9Sstevel@tonic-gatefi
6127c478bd9Sstevel@tonic-gate
6137c478bd9Sstevel@tonic-gateexit $?
614