xref: /titanic_53/usr/src/cmd/stmsboot/stmsboot.sh (revision 7fc66be0e007780898c439e8aa5cffb3fdaa08ea)
1a0261a43SJames C. McPherson#!/sbin/sh -p
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#
23*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate#
25815dd917Sjmcp#
267c478bd9Sstevel@tonic-gatePATH=/usr/bin:/usr/sbin:$PATH; export PATH
277c478bd9Sstevel@tonic-gateSTMSBOOTUTIL=/lib/mpxio/stmsboot_util
287c478bd9Sstevel@tonic-gateSTMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade
2960fffc19Sjw149990KDRVCONF=
3060fffc19Sjw149990DRVCONF=
3160fffc19Sjw149990TMPDRVCONF=
3260fffc19Sjw149990TMPDRVCONF_MPXIO_ENTRY=
33cfc4930cSYong-Feng DuTMPDRVCONF_SATA_ENTRY=
3460fffc19Sjw149990DRVLIST=
3560fffc19Sjw149990GUID=
367c478bd9Sstevel@tonic-gateVFSTAB=/etc/vfstab
377c478bd9Sstevel@tonic-gateSAVEDIR=/etc/mpxio
38789c9c8fSJames C. McPhersonBOOTDEVICES=$SAVEDIR/boot-devices
397c478bd9Sstevel@tonic-gateRECOVERFILE=$SAVEDIR/recover_instructions
407c478bd9Sstevel@tonic-gateSVCCFG_RECOVERY=$SAVEDIR/svccfg_recover
414c06356bSdh142964SUPPORTED_DRIVERS="fp|mpt|mpt_sas|pmcs"
4260fffc19Sjw149990USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"`
43aca6e9ccSramatTEXTDOMAIN=SUNW_OST_OSCMD
44aca6e9ccSramatexport TEXTDOMAIN
45a0261a43SJames C. McPhersonSTMSINSTANCE=svc:system/device/mpxio-upgrade:default
4660fffc19Sjw149990STMSBOOT=/usr/sbin/stmsboot
4760fffc19Sjw149990BOOTADM=/sbin/bootadm
4860fffc19Sjw149990MOUNT=/usr/sbin/mount
49a0261a43SJames C. McPhersonEEPROM=/usr/sbin/eeprom
5060fffc19Sjw149990EGREP=/usr/bin/egrep
5160fffc19Sjw149990GREP=/usr/bin/grep
5260fffc19Sjw149990AWK=/usr/bin/awk
53a0261a43SJames C. McPhersonCP=/usr/bin/cp
54789c9c8fSJames C. McPhersonDF=/usr/bin/df
55a0261a43SJames C. McPhersonLS=/usr/bin/ls
56a0261a43SJames C. McPhersonMV=/usr/bin/mv
57a0261a43SJames C. McPhersonRM=/usr/bin/rm
5860fffc19Sjw149990SORT=/usr/bin/sort
5960fffc19Sjw149990UNIQ=/usr/bin/uniq
6060fffc19Sjw149990EXPR=/usr/bin/expr
61a0261a43SJames C. McPhersonMKDIR=/usr/bin/mkdir
62a0261a43SJames C. McPhersonREBOOT=/usr/sbin/reboot
63815dd917SjmcpSED=/usr/bin/sed
64815dd917SjmcpSVCPROP=/usr/bin/svcprop
65815dd917SjmcpSVCCFG=/usr/sbin/svccfg
66815dd917SjmcpSVCS=/usr/bin/svcs
67815dd917SjmcpSVCADM=/usr/sbin/svcadm
687c478bd9Sstevel@tonic-gate
69a0261a43SJames C. McPhersonNOW=`/usr/bin/date +%G%m%d_%H%M`
705a4c37c9Sqh201292MACH=`/usr/bin/uname -p`
71a0261a43SJames C. McPhersonBOOTENV_FILE=bootenv.rc
7260fffc19Sjw149990reboot_needed=0
73a0261a43SJames C. McPhersonnew_bootpath=""
74a0261a43SJames C. McPhersonCLIENT_TYPE_PHCI=""
75a0261a43SJames C. McPhersonCLIENT_TYPE_VHCI="/scsi_vhci"
7660fffc19Sjw149990
777c478bd9Sstevel@tonic-gate#
7860fffc19Sjw149990# Copy all entries (including comments) from source driver.conf
7960fffc19Sjw149990# to destination driver.conf except those entries which contain
8060fffc19Sjw149990# the mpxio-disable property.
817c478bd9Sstevel@tonic-gate# Take into consideration entries that spawn more than one line.
827c478bd9Sstevel@tonic-gate#
837c478bd9Sstevel@tonic-gate# $1	source driver.conf file
847c478bd9Sstevel@tonic-gate# $2	destination driver.conf file
857c478bd9Sstevel@tonic-gate#
867c478bd9Sstevel@tonic-gate# Returns 0 on success, non zero on failure.
877c478bd9Sstevel@tonic-gate#
887c478bd9Sstevel@tonic-gatedelete_mpxio_disable_entries()
897c478bd9Sstevel@tonic-gate{
90a0261a43SJames C. McPherson	# be careful here, we've got embedded \t characters
91a0261a43SJames C. McPherson	# in sed's pattern space.
92a0261a43SJames C. McPherson	$SED '
937c478bd9Sstevel@tonic-gate		/^[ 	]*#/{ p
947c478bd9Sstevel@tonic-gate			      d
957c478bd9Sstevel@tonic-gate			    }
967c478bd9Sstevel@tonic-gate		s/[ 	]*$//
977c478bd9Sstevel@tonic-gate		/^$/{ p
987c478bd9Sstevel@tonic-gate		      d
997c478bd9Sstevel@tonic-gate		    }
1005a4c37c9Sqh201292		/mpxio-disable[ 	]*=.*;$/{ w '$3'
1015a4c37c9Sqh201292						  d
1025a4c37c9Sqh201292						}
103cfc4930cSYong-Feng Du		/disable-sata-mpxio[ 	]*=.*;$/{ w '$4'
104cfc4930cSYong-Feng Du						  d
105cfc4930cSYong-Feng Du						}
1067c478bd9Sstevel@tonic-gate		/;$/{ p
1077c478bd9Sstevel@tonic-gate		      d
1087c478bd9Sstevel@tonic-gate		    }
1097c478bd9Sstevel@tonic-gate		:rdnext
1107c478bd9Sstevel@tonic-gate		N
1117c478bd9Sstevel@tonic-gate		s/[ 	]*$//
1127c478bd9Sstevel@tonic-gate		/[^;]$/b rdnext
1135a4c37c9Sqh201292		/mpxio-disable[ 	]*=/{ s/\n/ /g
1145a4c37c9Sqh201292					      w '$3'
1155a4c37c9Sqh201292					      d
1165a4c37c9Sqh201292					    }
1175a4c37c9Sqh201292		' $1 > $2
1187c478bd9Sstevel@tonic-gate
1197c478bd9Sstevel@tonic-gate	return $?
1207c478bd9Sstevel@tonic-gate}
1217c478bd9Sstevel@tonic-gate
1227c478bd9Sstevel@tonic-gate#
1237c478bd9Sstevel@tonic-gate# backup the last saved copy of the specified files.
1247c478bd9Sstevel@tonic-gate# $*	files to backup
1257c478bd9Sstevel@tonic-gate#
1267c478bd9Sstevel@tonic-gatebackup_lastsaved()
1277c478bd9Sstevel@tonic-gate{
1287c478bd9Sstevel@tonic-gate	for file in $*
1297c478bd9Sstevel@tonic-gate	do
130a0261a43SJames C. McPherson		newfile=`basename $file`
131a0261a43SJames C. McPherson		$CP $file $SAVEDIR/$newfile.$cmd.$NOW
1327c478bd9Sstevel@tonic-gate	done
1337c478bd9Sstevel@tonic-gate}
1347c478bd9Sstevel@tonic-gate
1357c478bd9Sstevel@tonic-gate#
1367c478bd9Sstevel@tonic-gate# build recover instructions
1377c478bd9Sstevel@tonic-gate#
1387c478bd9Sstevel@tonic-gate# $1	1 to include boot script in the instructions
1397c478bd9Sstevel@tonic-gate#	0 otherwise
1407c478bd9Sstevel@tonic-gate#
1417c478bd9Sstevel@tonic-gatebuild_recover()
1427c478bd9Sstevel@tonic-gate{
1437c478bd9Sstevel@tonic-gate	gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE
1447c478bd9Sstevel@tonic-gate	echo "\tboot net \c"  >> $RECOVERFILE
1457c478bd9Sstevel@tonic-gate	gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE
1467c478bd9Sstevel@tonic-gate	echo "\tfsck <your-root-device>" >> $RECOVERFILE
1477c478bd9Sstevel@tonic-gate	echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE
1487c478bd9Sstevel@tonic-gate
149fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$cmd" = "update" ]; then
1507c478bd9Sstevel@tonic-gate		gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE
15160fffc19Sjw149990		echo "/mnt$KDRVCONF." >> $RECOVERFILE
1527c478bd9Sstevel@tonic-gate	else
153a0261a43SJames C. McPherson		echo "\tcp /mnt${SAVEDIR}/$DRVCONF.$cmd.$NOW /mnt$KDRVCONF" >> $RECOVERFILE
1547c478bd9Sstevel@tonic-gate	fi
1557c478bd9Sstevel@tonic-gate
156815dd917Sjmcp	if [ $1 -eq 1 ]; then
157a0261a43SJames C. McPherson		echo "\tcp /mnt${SAVEDIR}/vfstab.$cmd.$NOW /mnt$VFSTAB" >> $RECOVERFILE
1587c478bd9Sstevel@tonic-gate
1597c478bd9Sstevel@tonic-gate		echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY
1607c478bd9Sstevel@tonic-gate		echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY
1617c478bd9Sstevel@tonic-gate		echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY
1627c478bd9Sstevel@tonic-gate		echo "exit" >> $SVCCFG_RECOVERY
1637c478bd9Sstevel@tonic-gate
164815dd917Sjmcp		echo "\t$SVCCFG -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE
1655a4c37c9Sqh201292
166fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then
167a0261a43SJames C. McPherson			echo "\tcp /mnt${SAVEDIR}/bootenv.rc.$cmd.$NOW /mnt/boot/solaris/$BOOTENV_FILE" >> $RECOVERFILE
1685a4c37c9Sqh201292		fi
1697c478bd9Sstevel@tonic-gate	fi
1707c478bd9Sstevel@tonic-gate
17160fffc19Sjw149990	rootdisk=`$MOUNT | $GREP "/ on " | cut -f 3 -d " "`
1727c478bd9Sstevel@tonic-gate	echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE
1737c478bd9Sstevel@tonic-gate	gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE
1747c478bd9Sstevel@tonic-gate}
1757c478bd9Sstevel@tonic-gate
176a0261a43SJames C. McPherson
1777c478bd9Sstevel@tonic-gate#
1787c478bd9Sstevel@tonic-gate# Arrange for /etc/vfstab and dump configuration to be updated
1797c478bd9Sstevel@tonic-gate# during the next reboot. If the cmd is "enable" or "disable", copy
18060fffc19Sjw149990# $TMPDRVCONF to $KDRVCONF.
1817c478bd9Sstevel@tonic-gate#
1827c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure.
1837c478bd9Sstevel@tonic-gate#
1847c478bd9Sstevel@tonic-gateupdate_sysfiles()
1857c478bd9Sstevel@tonic-gate{
18660fffc19Sjw149990
187a0261a43SJames C. McPherson	gettext "WARNING: This operation will require a reboot.\n"
188a0261a43SJames C. McPherson	gettext "Do you want to continue ? [y/n] (default: y) "
1897c478bd9Sstevel@tonic-gate	read response
1907c478bd9Sstevel@tonic-gate
191fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ -n "$response" -a "$response" != "y" -a \
192fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	    "$response" != "Y" ]; then
19360fffc19Sjw149990		for d in $DRVLIST; do
19460fffc19Sjw149990			TMPDRVCONF=/var/run/tmp.$d.conf.$$
195a0261a43SJames C. McPherson			$RM -f $TMPDRVCONF > /dev/null 2>&1
19660fffc19Sjw149990		done;
19760fffc19Sjw149990		return 0;
1987c478bd9Sstevel@tonic-gate	fi
1997c478bd9Sstevel@tonic-gate
200815dd917Sjmcp	# set need_bootscript to the number of drivers that
201815dd917Sjmcp	# we support.
202815dd917Sjmcp	need_bootscript=`echo $SUPPORTED_DRIVERS|$AWK -F"|" '{print NF}'`
20360fffc19Sjw149990
204fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then
20560fffc19Sjw149990
20660fffc19Sjw149990		for d in $DRVLIST; do
20760fffc19Sjw149990			DRVCONF=$d.conf
20860fffc19Sjw149990			KDRVCONF=/kernel/drv/$d.conf
20960fffc19Sjw149990			TMPDRVCONF=/var/run/tmp.$d.conf.$$
21060fffc19Sjw149990
211a0261a43SJames C. McPherson			$CP $KDRVCONF $SAVEDIR/`basename $KDRVCONF`.$cmd.$NOW
212815dd917Sjmcp			if [ -f $TMPDRVCONF ]; then
213a0261a43SJames C. McPherson				$CP $TMPDRVCONF $KDRVCONF
214a0261a43SJames C. McPherson				$RM -f $TMPDRVCONF
215815dd917Sjmcp			else
216815dd917Sjmcp				# if $TMPDRVCONF doesn't exist, then we
217815dd917Sjmcp				# haven't made any changes to it
218815dd917Sjmcp				continue;
219815dd917Sjmcp			fi
2207c478bd9Sstevel@tonic-gate
2217c478bd9Sstevel@tonic-gate			#
2227c478bd9Sstevel@tonic-gate			# there is no need to update the system files in the following
2237c478bd9Sstevel@tonic-gate			# cases:
2247c478bd9Sstevel@tonic-gate			# - we are enabling mpxio and the system has no configured
2257c478bd9Sstevel@tonic-gate			#   disks accessible by phci paths.
2267c478bd9Sstevel@tonic-gate			# - we are disabling mpxio and the system has no configured
2277c478bd9Sstevel@tonic-gate			#   disks accessible by vhci paths.
2287c478bd9Sstevel@tonic-gate			#
22960fffc19Sjw149990
230815dd917Sjmcp			# Function to setup the CLIENT_TYPE_PHCI string based on
231815dd917Sjmcp			# the list of drivers that we're operating on. The variable
232815dd917Sjmcp			# depends upon the pathname of the parent node in the
233815dd917Sjmcp			# device tree, which can be different on x86/x64 and sparc.
234815dd917Sjmcp
235a0261a43SJames C. McPherson			CLIENT_TYPE_PHCI=`$STMSBOOTUTIL -D $d -N`;
236815dd917Sjmcp
237fa30e7bdSjianfei wang - Sun Microsystems - Beijing China			if [ -z "$CLIENT_TYPE_PHCI" ]; then
23860fffc19Sjw149990				continue;
23960fffc19Sjw149990			fi
24060fffc19Sjw149990
241fa30e7bdSjianfei wang - Sun Microsystems - Beijing China			if [ "$cmd" = "enable" ]; then
242a0261a43SJames C. McPherson				$LS -l /dev/dsk/*s2 2> /dev/null | \
24360fffc19Sjw149990				    $EGREP -s "$CLIENT_TYPE_PHCI"
2447c478bd9Sstevel@tonic-gate			else
245a0261a43SJames C. McPherson				$LS -l /dev/dsk/*s2 2> /dev/null | \
24660fffc19Sjw149990				    $EGREP -s "$CLIENT_TYPE_VHCI"
2477c478bd9Sstevel@tonic-gate			fi
2487c478bd9Sstevel@tonic-gate
2497c478bd9Sstevel@tonic-gate			if [ $? -ne 0 ]; then
250815dd917Sjmcp				need_bootscript=`$EXPR $need_bootscript - 1`
25160fffc19Sjw149990			fi
25260fffc19Sjw149990		done
25360fffc19Sjw149990	fi
25460fffc19Sjw149990
255815dd917Sjmcp	if [ $need_bootscript -gt 0 ]; then
256815dd917Sjmcp		need_bootscript=1
257fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		if [  -n "$new_bootpath" -a "$MACH" = "i386" ]; then
2585a4c37c9Sqh201292			#only update bootpath for x86.
259a0261a43SJames C. McPherson			$CP /boot/solaris/$BOOTENV_FILE $SAVEDIR/$BOOTENV_FILE.$cmd.$NOW
260a0261a43SJames C. McPherson			$EEPROM bootpath="$new_bootpath"
2615a4c37c9Sqh201292		fi
262a0261a43SJames C. McPherson		# Enable the mpxio-upgrade service for the reboot
263815dd917Sjmcp		$SVCADM disable -t $STMSINSTANCE
264a0261a43SJames C. McPherson		$SVCCFG -s $STMSINSTANCE "setprop general/enabled=true"
265815dd917Sjmcp	else
266815dd917Sjmcp		need_bootscript=0
2677c478bd9Sstevel@tonic-gate	fi
2687c478bd9Sstevel@tonic-gate
2697c478bd9Sstevel@tonic-gate	build_recover $need_bootscript
2707c478bd9Sstevel@tonic-gate
271fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$MACH" = "i386" ]; then
27260fffc19Sjw149990		$BOOTADM update-archive
27360fffc19Sjw149990	fi
27460fffc19Sjw149990
2757c478bd9Sstevel@tonic-gate	gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) "
2767c478bd9Sstevel@tonic-gate	read response
2777c478bd9Sstevel@tonic-gate
278fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ -z "$response" -o "$response" = "y" -o \
279fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	    "$response" = "Y" ]; then
280a0261a43SJames C. McPherson		$REBOOT
2817c478bd9Sstevel@tonic-gate	fi
2827c478bd9Sstevel@tonic-gate
2837c478bd9Sstevel@tonic-gate	return 0
2847c478bd9Sstevel@tonic-gate}
2857c478bd9Sstevel@tonic-gate
286a0261a43SJames C. McPherson
2877c478bd9Sstevel@tonic-gate#
2887c478bd9Sstevel@tonic-gate# Enable or disable mpxio as specified by the cmd.
2897c478bd9Sstevel@tonic-gate# Returns 0 on success, 1 on failure.
2907c478bd9Sstevel@tonic-gate#
29160fffc19Sjw149990# Args: $cmd = {enable | disable}
2924c06356bSdh142964#	$d = {fp | mpt | mpt_sas | pmcs}
29360fffc19Sjw149990#
29460fffc19Sjw149990# the global variable $DRVLIST is used
29560fffc19Sjw149990#
2967c478bd9Sstevel@tonic-gateconfigure_mpxio()
2977c478bd9Sstevel@tonic-gate{
298a0261a43SJames C. McPherson	# be careful here, we've got embedded \t characters
299a0261a43SJames C. McPherson	# in sed's pattern space.
3005a4c37c9Sqh201292	mpxiodisableno='mpxio-disable[ 	]*=[ 	]*"no"[ 	]*;'
3015a4c37c9Sqh201292	mpxiodisableyes='mpxio-disable[ 	]*=[ 	]*"yes"[ 	]*;'
302cfc4930cSYong-Feng Du	satadisableno='disable-sata-mpxio[ 	]*=[ 	]*"no"[ 	]*;'
303cfc4930cSYong-Feng Du	satadisableyes='disable-sata-mpxio[ 	]*=[ 	]*"yes"[ 	]*;'
3045a4c37c9Sqh201292
305fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$cmd" = "enable" ]; then
3065a4c37c9Sqh201292		mpxiodisable_cur_entry=$mpxiodisableyes
307cfc4930cSYong-Feng Du		satadisable_cur_entry=$satadisableyes
3087c478bd9Sstevel@tonic-gate		propval=no
30960fffc19Sjw149990		msg=`gettext "STMS already enabled"`
3107c478bd9Sstevel@tonic-gate	else
3115a4c37c9Sqh201292		mpxiodisable_cur_entry=$mpxiodisableno
312cfc4930cSYong-Feng Du		satadisable_cur_entry=$satadisableno
3137c478bd9Sstevel@tonic-gate		propval=yes
31460fffc19Sjw149990		msg=`gettext "STMS already disabled"`
3157c478bd9Sstevel@tonic-gate	fi
3167c478bd9Sstevel@tonic-gate
31760fffc19Sjw149990	DRVCONF=$d.conf
31860fffc19Sjw149990	KDRVCONF=/kernel/drv/$d.conf
31960fffc19Sjw149990	TMPDRVCONF=/var/run/tmp.$d.conf.$$
32060fffc19Sjw149990	TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
321cfc4930cSYong-Feng Du	TMPDRVCONF_SATA_ENTRY=/var/run/tmp.$d.conf.sataentry.$$;
32260fffc19Sjw149990
323cfc4930cSYong-Feng Du	if delete_mpxio_disable_entries $KDRVCONF $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY; then
32460fffc19Sjw149990
32560fffc19Sjw149990		if [ -s $TMPDRVCONF_MPXIO_ENTRY ]; then
32660fffc19Sjw149990			# $DRVCONF does have mpxiodisable entries
32760fffc19Sjw149990			$EGREP -s "$mpxiodisable_cur_entry" $TMPDRVCONF_MPXIO_ENTRY
328cfc4930cSYong-Feng Du			if [ $? -eq 0 ]; then
329cfc4930cSYong-Feng Du				reboot_needed=`$EXPR $reboot_needed + 1`
330cfc4930cSYong-Feng Du			else
3315a4c37c9Sqh201292				# if all mpxiodisable entries are no/yes for
3325a4c37c9Sqh201292				# enable/disable mpxio, notify the user
333cfc4930cSYong-Feng Du				$EGREP -s "$satadisable_cur_entry" $TMPDRVCONF_SATA_ENTRY
334fa30e7bdSjianfei wang - Sun Microsystems - Beijing China				if [ $? -eq 0 -a "$d" = "mpt" ]; then
33560fffc19Sjw149990					reboot_needed=`$EXPR $reboot_needed + 1`
336cfc4930cSYong-Feng Du				else
337cfc4930cSYong-Feng Du					$RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
338ccb7005eSYong-Feng Du					return 0;
339cfc4930cSYong-Feng Du				fi
3407c478bd9Sstevel@tonic-gate			fi
34160fffc19Sjw149990
34260fffc19Sjw149990			# If mpxiodisable entries do not exist, always continue update
3435a4c37c9Sqh201292		fi
3447c478bd9Sstevel@tonic-gate	else
345cfc4930cSYong-Feng Du		$RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
3467c478bd9Sstevel@tonic-gate		gettext "failed to update " 1>&2
34760fffc19Sjw149990		echo "$KDRVCONF." 1>&2
3487c478bd9Sstevel@tonic-gate		gettext "No changes were made to your STMS configuration.\n" 1>&2
3497c478bd9Sstevel@tonic-gate		return 1
3507c478bd9Sstevel@tonic-gate	fi
3515a4c37c9Sqh201292
35235c62094Sjianfei wang - Sun Microsystems - Beijing China	rm $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1
35360fffc19Sjw149990	echo "mpxio-disable=\"${propval}\";" >> $TMPDRVCONF
354fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$d" = "mpt" ]; then
355cfc4930cSYong-Feng Du		echo "disable-sata-mpxio=\"${propval}\";" >> $TMPDRVCONF
35635c62094Sjianfei wang - Sun Microsystems - Beijing China	fi
3575a4c37c9Sqh201292
3587c478bd9Sstevel@tonic-gate}
3597c478bd9Sstevel@tonic-gate
3607c478bd9Sstevel@tonic-gatesetcmd()
3617c478bd9Sstevel@tonic-gate{
362fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$cmd" = "none" ]; then
3637c478bd9Sstevel@tonic-gate		cmd=$1
3647c478bd9Sstevel@tonic-gate	else
3657c478bd9Sstevel@tonic-gate		echo "$USAGE" 1>&2
3667c478bd9Sstevel@tonic-gate		exit 2
3677c478bd9Sstevel@tonic-gate	fi
3687c478bd9Sstevel@tonic-gate}
3697c478bd9Sstevel@tonic-gate
37060fffc19Sjw149990#
3715a4c37c9Sqh201292# Need to update bootpath on x86 if boot system from FC disk
3725a4c37c9Sqh201292# Only update bootpath here when mpxio is enabled
373a0261a43SJames C. McPherson# If mpxio is currently disabled, then we'll update bootpath in the
374a0261a43SJames C. McPherson# mpxio-upgrade service method on reboot.
37560fffc19Sjw149990#
37660fffc19Sjw149990
3775a4c37c9Sqh201292get_newbootpath_for_stmsdev() {
378fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$cmd" = "enable" ]; then
3795a4c37c9Sqh201292		return 0
3805a4c37c9Sqh201292	fi
3815a4c37c9Sqh201292
382a0261a43SJames C. McPherson	cur_bootpath=`$STMSBOOTUTIL -b`
383a0261a43SJames C. McPherson	if [ $? != 0 ]; then
3845a4c37c9Sqh201292		return 1
3855a4c37c9Sqh201292	fi
3865a4c37c9Sqh201292
387a0261a43SJames C. McPherson	# Since on x64 platforms the eeprom command doesn't update the
388a0261a43SJames C. McPherson	# kernel, the file /boot/solaris/bootenv.rc and the kernel's
389a0261a43SJames C. McPherson	# bootpath variable have a good chance of differing. We do some
390a0261a43SJames C. McPherson	# extra handwaving to get the correct bootpath variable setting.
391a0261a43SJames C. McPherson
392a0261a43SJames C. McPherson	ONDISKVER=`$AWK '/bootpath/ {print $3}' /boot/solaris/bootenv.rc|\
393a0261a43SJames C. McPherson		$SED -e"s,',,g"`
394fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$ONDISKVER" != "$cur_bootpath" ]; then
395a0261a43SJames C. McPherson		cur_bootpath="$ONDISKVER"
396a0261a43SJames C. McPherson	fi
397a0261a43SJames C. McPherson
398a0261a43SJames C. McPherson	NEWBOOTPATH=""
399a0261a43SJames C. McPherson	for path in $cur_bootpath; do
400a0261a43SJames C. McPherson		mapped=`$STMSBOOTUTIL -p $path`
401a0261a43SJames C. McPherson		if [ "$mapped" != "NOT_MAPPED" ]; then
402a0261a43SJames C. McPherson			if [ "$mapped" != "$path" ]; then
403a0261a43SJames C. McPherson				NEWBOOTPATH=`echo "$path " | \
404a0261a43SJames C. McPherson				   $SED -e"s|$path|$mapped|"`" $NEWBOOTPATH"
405a0261a43SJames C. McPherson			else
406a0261a43SJames C. McPherson				NEWBOOTPATH="$NEWBOOTPATH $path"
407a0261a43SJames C. McPherson			fi
408a0261a43SJames C. McPherson		fi
409a0261a43SJames C. McPherson	done
410a0261a43SJames C. McPherson	# now strip off leading and trailing space chars
411a0261a43SJames C. McPherson	new_bootpath=`echo $NEWBOOTPATH`
4125a4c37c9Sqh201292	return 0
41360fffc19Sjw149990}
41460fffc19Sjw149990
41560fffc19Sjw149990#
41660fffc19Sjw149990# Emit a warning message to the user that by default we
41760fffc19Sjw149990# operate on all multipath-capable controllers that are
41860fffc19Sjw149990# attached to the system, and that if they want to operate
4194c06356bSdh142964# on only a specific controller type (fp|mpt|mpt_sas|pmcs|....) then
42060fffc19Sjw149990# they need to re-invoke stmsboot with "-D $driver" in
42160fffc19Sjw149990# their argument list
42260fffc19Sjw149990#
42360fffc19Sjw149990
42460fffc19Sjw149990emit_driver_warning_msg() {
42560fffc19Sjw149990
42660fffc19Sjw149990	# for each driver that we support, grab the list
42760fffc19Sjw149990	# of controllers attached to the system.
42860fffc19Sjw149990
429815dd917Sjmcp	echo ""
43053ed03b5Sjmcp	gettext "WARNING: stmsboot operates on each supported multipath-capable controller\n"
43153ed03b5Sjmcp	gettext "         detected in a host. In your system, these controllers are\n\n"
43260fffc19Sjw149990
433815dd917Sjmcp	for WARNDRV in `echo $SUPPORTED_DRIVERS| $SED -e"s,|, ,g"`; do
434a0261a43SJames C. McPherson		$STMSBOOTUTIL -D $WARNDRV -n
43560fffc19Sjw149990	done;
43660fffc19Sjw149990
43760fffc19Sjw149990	echo ""
43853ed03b5Sjmcp	gettext "If you do NOT wish to operate on these controllers, please quit stmsboot\n"
4394c06356bSdh142964	gettext "and re-invoke with -D { fp | mpt | mpt_sas | pmcs} to specify which controllers you wish\n"
44053ed03b5Sjmcp	gettext "to modify your multipathing configuration for.\n"
44160fffc19Sjw149990
442815dd917Sjmcp	echo ""
44353ed03b5Sjmcp	gettext "Do you wish to continue? [y/n] (default: y) "
44460fffc19Sjw149990	read response
44560fffc19Sjw149990
446fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ -n "$response" -a "$response" != "Y" -a \
447fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	    "$response" != "y" ]; then
44860fffc19Sjw149990		exit
44960fffc19Sjw149990	fi
45060fffc19Sjw149990}
45160fffc19Sjw149990
4527c478bd9Sstevel@tonic-gate
453a0261a43SJames C. McPherson#
454a0261a43SJames C. McPherson#
455a0261a43SJames C. McPherson# main starts here
456a0261a43SJames C. McPherson#
457a0261a43SJames C. McPherson
458a0261a43SJames C. McPhersoncmd=none
4597c478bd9Sstevel@tonic-gate# process options
46060fffc19Sjw149990while getopts D:geduLl: c
4617c478bd9Sstevel@tonic-gatedo
4627c478bd9Sstevel@tonic-gate	case $c in
4637c478bd9Sstevel@tonic-gate	e)	setcmd enable;;
4647c478bd9Sstevel@tonic-gate	d)	setcmd disable;;
4657c478bd9Sstevel@tonic-gate	u)	setcmd update;;
4667c478bd9Sstevel@tonic-gate	L)	setcmd listall;;
4677c478bd9Sstevel@tonic-gate	l)	setcmd list
4687c478bd9Sstevel@tonic-gate		controller=$OPTARG;;
46960fffc19Sjw149990	D)	DRV=$OPTARG;;
47060fffc19Sjw149990	g)	GUID="-g";;
4717c478bd9Sstevel@tonic-gate	\?)	echo "$USAGE" 1>&2
4727c478bd9Sstevel@tonic-gate		exit 2;;
4737c478bd9Sstevel@tonic-gate	esac
4747c478bd9Sstevel@tonic-gatedone
4757c478bd9Sstevel@tonic-gate
476fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "none" ]; then
4777c478bd9Sstevel@tonic-gate	echo "$USAGE" 1>&2
4787c478bd9Sstevel@tonic-gate	exit 2
4797c478bd9Sstevel@tonic-gatefi
4807c478bd9Sstevel@tonic-gate
481fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ -z "$DRV" ]; then
4824c06356bSdh142964	DRVLIST="fp mpt mpt_sas pmcs"
48360fffc19Sjw149990else
48460fffc19Sjw149990	DRVLIST=$DRV
48560fffc19Sjw149990fi
48660fffc19Sjw149990
48734c94816SjmcpUSERID=`id | $EGREP "uid=0"`
48834c94816Sjmcpif [ -z "$USERID" ]; then
4897c478bd9Sstevel@tonic-gate	gettext "You must be super-user to run this script.\n" 1>&2
4907c478bd9Sstevel@tonic-gate	exit 1
4917c478bd9Sstevel@tonic-gatefi
4927c478bd9Sstevel@tonic-gate
4937c478bd9Sstevel@tonic-gate# just a sanity check
4947c478bd9Sstevel@tonic-gateif [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then
4957c478bd9Sstevel@tonic-gate	fmt=`gettext "Can't find %s and/or %s"`
4967c478bd9Sstevel@tonic-gate	printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2
4977c478bd9Sstevel@tonic-gate	exit 1
4987c478bd9Sstevel@tonic-gatefi
4997c478bd9Sstevel@tonic-gate
50060fffc19Sjw149990# If the old sun4u-specific SMF method is found, remove it
501815dd917Sjmcp$SVCCFG -s "platform/sun4u/mpxio-upgrade:default" < /dev/null > /dev/null 2>&1
502815dd917Sjmcpif [ $? -eq 0 ]; then
503815dd917Sjmcp	$SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1
50460fffc19Sjw149990fi
50560fffc19Sjw149990
50660fffc19Sjw149990# now import the new service, if necessary
507815dd917Sjmcp$SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1
50860fffc19Sjw149990if [ $? -ne 0 ]; then
5099444c26fSTom Whitten	if [ -f /lib/svc/manifest/system/device/mpxio-upgrade.xml ]; then
5109444c26fSTom Whitten		$SVCCFG import /lib/svc/manifest/system/device/mpxio-upgrade.xml
51160fffc19Sjw149990		if [ $? -ne 0 ]; then
512fa30e7bdSjianfei wang - Sun Microsystems - Beijing China
51353ed03b5Sjmcp			fmt=`gettext "Unable to import the %s service"`
5147c478bd9Sstevel@tonic-gate			printf "$fmt\n" "$STMSINSTANCE" 1>&2
5157c478bd9Sstevel@tonic-gate			exit 1
51660fffc19Sjw149990		else
51760fffc19Sjw149990			fmt=`gettext "Service %s imported successfully, continuing"`
51860fffc19Sjw149990			printf "$fmt\n" "$STMSINSTANCE" 1>&2
51960fffc19Sjw149990		fi
52060fffc19Sjw149990	else
52160fffc19Sjw149990		fmt=`gettext "Service %s does not exist on this host"`
52260fffc19Sjw149990 		printf "$fmt\n" "$STMSINSTANCE" 1>&2
52360fffc19Sjw149990		exit 1
52460fffc19Sjw149990	fi
5257c478bd9Sstevel@tonic-gatefi
5267c478bd9Sstevel@tonic-gate
527a0261a43SJames C. McPherson
528a0261a43SJames C. McPherson# make sure we can stash our data somewhere private
529a0261a43SJames C. McPhersonif [ ! -d $SAVEDIR ]; then
530a0261a43SJames C. McPherson	$MKDIR -p $SAVEDIR
531a0261a43SJames C. McPhersonfi
532a0261a43SJames C. McPherson# prime the cache
533a0261a43SJames C. McPherson$STMSBOOTUTIL -i
534a0261a43SJames C. McPherson
535a0261a43SJames C. McPherson
536fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "enable" -o "$cmd" = "disable" -o "$cmd" = "update" ]; then
5377c478bd9Sstevel@tonic-gate	#
5387c478bd9Sstevel@tonic-gate	# The bootup script doesn't work on cache-only-clients as the script
5396deb031bSsjelinek	# is executed before the plumbing for cachefs mounting of root is done.
5407c478bd9Sstevel@tonic-gate	#
54160fffc19Sjw149990	if $MOUNT -v | $EGREP -s " on / type (nfs|cachefs) "; then
542a0261a43SJames C. McPherson		gettext "This command option is not supported on systems with an nfs or cachefs mounted root filesystem.\n" 1>&2
5437c478bd9Sstevel@tonic-gate		exit 1
5447c478bd9Sstevel@tonic-gate	fi
5457c478bd9Sstevel@tonic-gate
546815dd917Sjmcp	# if the user has left the system with the mpxio-upgrade service
547815dd917Sjmcp	# in a temporarily disabled state (ie, service is armed for the next
548815dd917Sjmcp	# reboot), then let them know. We need to ensure that the system is
549815dd917Sjmcp	# is in a sane state before allowing any further invocations, so
550815dd917Sjmcp	# try to get the system admin to do so
551815dd917Sjmcp
552a0261a43SJames C. McPherson	ISARMED=`$SVCS -l $STMSINSTANCE|$GREP "enabled.*false.*temporary"`
553a0261a43SJames C. McPherson	if [ ! $? ]; then
554815dd917Sjmcp		echo ""
55553ed03b5Sjmcp		gettext "You need to reboot the system in order to complete\n"
55653ed03b5Sjmcp		gettext "the previous invocation of stmsboot.\n"
557815dd917Sjmcp		echo ""
55853ed03b5Sjmcp		gettext "Do you wish to reboot the system now? (y/n, default y) "
559815dd917Sjmcp		read response
560815dd917Sjmcp
561fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		if [ -z "$response" -o "x$response" = "Y" -o \
562fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		    "$response" = "y" ]; then
563a0261a43SJames C. McPherson			$REBOOT
564815dd917Sjmcp		else
56553ed03b5Sjmcp			echo ""
56653ed03b5Sjmcp			gettext "Please reboot this system before continuing\n"
56753ed03b5Sjmcp			echo ""
568815dd917Sjmcp			exit 1
569815dd917Sjmcp		fi
570815dd917Sjmcp	fi
571815dd917Sjmcp
5727c478bd9Sstevel@tonic-gate	#
5737c478bd9Sstevel@tonic-gate	# keep a copy of the last saved files, useful for manual
5747c478bd9Sstevel@tonic-gate	# recovery in case of a problem.
5757c478bd9Sstevel@tonic-gate	#
57660fffc19Sjw149990	for d in $DRVLIST; do
57760fffc19Sjw149990		DRVCONF=$d.conf
57860fffc19Sjw149990		KDRVCONF=/kernel/drv/$d.conf
57960fffc19Sjw149990		TMPDRVCONF=/var/run/tmp.$d.conf.$$
58060fffc19Sjw149990		TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$;
581fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		if [ "$MACH" = "sparc" ]; then
58260fffc19Sjw149990			backup_lastsaved $KDRVCONF $VFSTAB
5837c478bd9Sstevel@tonic-gate		else
584a0261a43SJames C. McPherson			backup_lastsaved $KDRVCONF $VFSTAB /boot/solaris/$BOOTENV_FILE
5855a4c37c9Sqh201292		fi
58660fffc19Sjw149990	done
5877c478bd9Sstevel@tonic-gatefi
5887c478bd9Sstevel@tonic-gate
589fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaif [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then
59060fffc19Sjw149990
591*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China	msgneeded=`echo "$DRVLIST" |$GREP " "`
59260fffc19Sjw149990	if [ -n "$msgneeded" ]; then
59360fffc19Sjw149990		emit_driver_warning_msg
59460fffc19Sjw149990	fi
59560fffc19Sjw149990	for d in $DRVLIST; do
59660fffc19Sjw149990		configure_mpxio $cmd $d
59760fffc19Sjw149990	done
59860fffc19Sjw149990
59960fffc19Sjw149990	if [ $reboot_needed -ne 0 ]; then
60060fffc19Sjw149990		# Need to update bootpath on x86 if our boot device is
60160fffc19Sjw149990		# now accessed through mpxio.
60260fffc19Sjw149990		# Only update bootpath before reboot when mpxio is enabled
60360fffc19Sjw149990		# If mpxio is currently disabled, we will update bootpath
60460fffc19Sjw149990		# on reboot in the mpxio-upgrade service
60560fffc19Sjw149990
606fa30e7bdSjianfei wang - Sun Microsystems - Beijing China		if [ "$cmd" = "disable" ]; then
607fa30e7bdSjianfei wang - Sun Microsystems - Beijing China			if [ "$MACH" = "i386" ]; then
60860fffc19Sjw149990				get_newbootpath_for_stmsdev
60960fffc19Sjw149990				if [ $? -ne 0 ]; then
610a0261a43SJames C. McPherson					$RM -f $TMPDRVCONF > /dev/null 2>&1
61160fffc19Sjw149990					gettext "failed to update bootpath.\n" 1>&2
61260fffc19Sjw149990					gettext "No changes were made to your STMS configuration.\n" 1>&2
61360fffc19Sjw149990					return 1
61460fffc19Sjw149990				fi
61560fffc19Sjw149990			fi
616789c9c8fSJames C. McPherson			# If we're not using ZFS root then we need
617789c9c8fSJames C. McPherson			# to keep track of what / maps to in case
618789c9c8fSJames C. McPherson			# it's an active-active device and we boot from
619789c9c8fSJames C. McPherson			# the other path
620*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China			HASZFSROOT=`$DF -g / |$GREP zfs`
621*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China			if [ -z "$HASZFSROOT" ]; then
622789c9c8fSJames C. McPherson				ROOTSCSIVHCI=`$DF /|$AWK -F":" '{print $1}' | \
623*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China					$AWK -F"(" '{print $2}'| $SED -e"s,),,"`
624*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China				TMPROOTDEV=`$LS -l $ROOTSCSIVHCI |$AWK -F">" '{print $2}' | \
625*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China					$SED -e"s, ../../devices,,"`
626*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China				$STMSBOOTUTIL -q $TMPROOTDEV > $BOOTDEVICES
627*7fc66be0Sjianfei wang - Sun Microsystems - Beijing China			fi
628789c9c8fSJames C. McPherson		fi
62960fffc19Sjw149990		update_sysfiles
63060fffc19Sjw149990	else
63160fffc19Sjw149990		echo "STMS is already ${cmd}d. No changes or reboots needed"
63260fffc19Sjw149990	fi
63360fffc19Sjw149990
63460fffc19Sjw149990
635fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaelif [ "$cmd" = "update" ]; then
636fa30e7bdSjianfei wang - Sun Microsystems - Beijing China	if [ "$MACH" = "i386" ]; then
6375a4c37c9Sqh201292	# In this case we always change the bootpath to phci-based
6385a4c37c9Sqh201292	# path first. bootpath will later be modified in mpxio-upgrade
6395a4c37c9Sqh201292	# to the vhci-based path if mpxio is enabled on root.
6405a4c37c9Sqh201292		get_newbootpath_for_stmsdev
6415a4c37c9Sqh201292		if [ $? -ne 0 ]; then
6425a4c37c9Sqh201292			gettext "failed to update bootpath.\n" 1>&2
6435a4c37c9Sqh201292			return 1
6445a4c37c9Sqh201292		fi
6455a4c37c9Sqh201292	fi
6467c478bd9Sstevel@tonic-gate	update_sysfiles
64760fffc19Sjw149990
648fa30e7bdSjianfei wang - Sun Microsystems - Beijing Chinaelif [ "$cmd" = "list" ]; then
64960fffc19Sjw149990		$STMSBOOTUTIL $GUID -l $controller
6507c478bd9Sstevel@tonic-gateelse
65160fffc19Sjw149990		$STMSBOOTUTIL $GUID -L
6527c478bd9Sstevel@tonic-gatefi
6537c478bd9Sstevel@tonic-gate
6547c478bd9Sstevel@tonic-gateexit $?
655