git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@12195 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			298 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/ksh
 | |
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| #(C)IBM Corp
 | |
| ################################################################
 | |
| # Usage:
 | |
| #		xcatchroot -h 
 | |
| #		xcatchroot [-v] -i osimage  cmd_string
 | |
| #
 | |
| #
 | |
| # WARNING:
 | |
| #			Be very careful when using this script!!!  Make sure you are 
 | |
| #			very clear about exactly what you are changing and what effect
 | |
| #			it will have.
 | |
| #
 | |
| #			As a precaution it is advisable to make a copy of the original 
 | |
| #			spot in case your changes wind up corrupting the image.
 | |
| #
 | |
| # Note:
 | |
| #        	There is a fix for the AIX bosboot command that is needed for
 | |
| #			this script to work properly if your command involves modifying
 | |
| #			the ODM.  The AIX APAR information is not available at this time.
 | |
| #
 | |
| #			However, it is very easy to check for and/or make the required
 | |
| #			modification.
 | |
| #
 | |
| #			In the bosboot code, there is a check for the creation of a boot
 | |
| #			image; if the image creation is anything other than disk, the 
 | |
| #			odm values are not picked up. You will have to confirm that
 | |
| #			the bosboot command in your spot has the check removed.
 | |
| #
 | |
| #           Edit the bosboot command contained in the spot (save a backup). 
 | |
| #			(ex. "vi <path_to_spotName>/usr/sbin/bosboot"). Search for
 | |
| #			"zap it as". The next line checks to see if the
 | |
| #			device prefix is "hdisk".  Comment out the line and the
 | |
| #			corresponding "fi" which ends the "if" statement.  Now this
 | |
| #			code will always execute. Save changes.
 | |
| #
 | |
| # Note:  	Always run the NIM check operation after you are done updating 
 | |
| #			your spot.
 | |
| #
 | |
| #        		nim -Fo check spotName
 | |
| #
 | |
| ######################################################################
 | |
| 
 | |
| # make sure we only run on AIX for now
 | |
| OSNAME=$(uname -s)
 | |
| if [[ $OSNAME != "AIX" ]] ; then
 | |
| 	echo "This command is currently only supported on AIX."
 | |
| 	exit 0
 | |
| fi
 | |
| 
 | |
| # set this variable so the nim methods will work when use a
 | |
| #   gpfs file system
 | |
| NIM_ATTR_FORCE="yes"
 | |
| export NIM_ATTR_FORCE
 | |
| 
 | |
| # include common NIM shell defines/functions
 | |
| NIM="/usr/sbin/nim"
 | |
| NIMPATH=/usr/lpp/bos.sysmgt/nim
 | |
| NIM_METHODS="${NIMPATH}/methods"
 | |
| . ${NIM_METHODS}/c_sh_lib
 | |
| M_CHATTR="${NIM_METHODS}/m_chattr"
 | |
| 
 | |
| #---------------------------- local defines     --------------------------------
 | |
| server=""
 | |
| spot=""
 | |
| lpp_source=""
 | |
| spotObj=""
 | |
| lppObj=""
 | |
| 
 | |
| #---------------------------- module globals    --------------------------------
 | |
| REQUIRED_ATTRS=""
 | |
| OPTIONAL_ATTRS=""
 | |
| location=""
 | |
| osimage=""
 | |
| cmd_string=""
 | |
| verbose=0
 | |
| error=0
 | |
| 
 | |
| usage="Usage:\n\txcatchroot -h\n\txcatchroot [-V] -i osimage  cmd_string"
 | |
| 
 | |
| # signal processing
 | |
| trap cleanup 0
 | |
| trap err_signal 1 2 11 15
 | |
| 
 | |
| # NIM initialization
 | |
| nim_init
 | |
| 
 | |
| # initialize local variables
 | |
| typeset z=""
 | |
| 
 | |
| # set parameters from command line
 | |
| while getopts :i:vVh z
 | |
| do
 | |
| 	case ${z} in
 | |
| 
 | |
| 		h)			echo $usage
 | |
| 					exit 0 
 | |
| 					;;
 | |
| 
 | |
| 		i)			# xCAT osimage name
 | |
| 					osimage=${OPTARG}
 | |
| 					;;
 | |
| 
 | |
| 		v)          # NIM verbose mode (undocumented option for debugging)
 | |
|                     set -x
 | |
|                     for i in $(typeset +f)
 | |
|                     do
 | |
|                         typeset -ft $i
 | |
|                     done
 | |
|                     ;;
 | |
| 
 | |
| 		V)			# xCAT verbose
 | |
| 					verbose=1
 | |
| 					;;
 | |
| 
 | |
| 		\?)			# unknown option
 | |
| 					echo "Unknown options."
 | |
| 					echo $usage
 | |
| 					exit 1
 | |
| 					;;
 | |
| 	esac
 | |
| done
 | |
| 
 | |
| shift `expr $OPTIND - 1`
 | |
| cmd_string=$1
 | |
| 
 | |
| # check for cmd string
 | |
| if [[ $cmd_string = "" ]] ; then
 | |
| 	echo "ERROR: A command strng is required."
 | |
| 	echo "xcatchroot: ERROR: A command strng is required." | logger -t xcat
 | |
| 	echo $usage
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # chk for osimage ??
 | |
| if [[ $osimage = "" ]] ; then
 | |
| 	echo "ERROR: An xCAT osimage name is required."
 | |
| 	echo "xcatchroot: ERROR: An xCAT osimage name is required." | logger -t xcat
 | |
| 	echo $usage
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # get the spot and lpp_source name from the osimage def
 | |
| if [ $verbose -eq 1 ]
 | |
| then
 | |
| 	echo "Running command: '/opt/xcat/bin/lsdef -t osimage -o $osimage -i spot | grep spot | cut -f2 -d ='\n"
 | |
| fi
 | |
| 
 | |
| spot=`/opt/xcat/bin/lsdef -t osimage -o $osimage -i spot | grep spot | cut -f2 -d = `
 | |
| 
 | |
| if [[ $spot = "" ]] ; then
 | |
| 	echo "ERROR: Could not get spot name from xCAT osimage definition."
 | |
| 	echo "xcatchroot: ERROR: Could not get spot name from xCAT osimage definition." | logger -t xcat
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| if [ $verbose -eq 1 ]
 | |
| then
 | |
|     echo "Running command: '/opt/xcat/bin/lsdef -t osimage -o $osimage -i lpp_source | grep lpp_source | cut -f2 -d ='\n"
 | |
| fi
 | |
| lpp_source=`/opt/xcat/bin/lsdef -t osimage -o $osimage -i lpp_source | grep lpp_source | cut -f2 -d = `
 | |
| 
 | |
| # confirm & set spot path for chroot global vars
 | |
| if ${LSNIM} $spot >/dev/null ; then
 | |
| 
 | |
| 	if [[ $verbose -eq 1 ]]; then
 | |
|     	echo "Running command: ${LSNIM} -a server $spot | ${AWK} '/server/ {print $3}'\n"
 | |
| 	fi
 | |
| 	server=`${LSNIM} -a server $spot | ${AWK} '/server/ {print $3}'`
 | |
| 
 | |
| 	if [[ $server = "master" ]] ; then
 | |
| 
 | |
| 		spotObj="$spot"
 | |
| 		# chroot uses location var
 | |
| 		if [ $verbose -eq 1 ]
 | |
| 		then
 | |
| 			echo "Running command: ${LSNIM} -a location $spotObj | ${AWK} '/location/ {print $3}'\n"
 | |
| 		fi
 | |
| 		location=`${LSNIM} -a location $spotObj | ${AWK} '/location/ {print $3}'` 
 | |
| 
 | |
| 	else
 | |
| 		echo "ERROR: Cannot use chroot with remote resources $spot." 
 | |
| 		echo "xcatchroot: ERROR: Cannot use chroot with remote resources $spot." | logger -t xcat
 | |
| 		exit 1
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| # confirm & set lpp_source path for chroot global vars
 | |
| if ${LSNIM} $lpp_source >/dev/null ; then
 | |
| 
 | |
| 	if [ $verbose -eq 1 ]
 | |
| 	then
 | |
| 		echo "Running command: ${LSNIM} -a server $lpp_source | ${AWK} '/server/ {print $3}'\n"
 | |
| 	fi
 | |
| 	server=`${LSNIM} -a server $lpp_source | ${AWK} '/server/ {print $3}'`
 | |
| 
 | |
| 	if [[ $server = "master" ]] ; then
 | |
| 
 | |
| 		lppObj="$lpp_source"
 | |
| 		# chroot uses lpp_source var
 | |
| 		if [ $verbose -eq 1 ]
 | |
| 		then
 | |
| 			echo "Running command: ${LSNIM} -a location $lppObj | ${AWK} '/location/ {print $3}'\n"
 | |
| 		fi
 | |
| 
 | |
| 		lpp_source=`${LSNIM} -a location $lppObj | ${AWK} '/location/ {print $3}'`
 | |
| 	else
 | |
| 		echo "ERROR: Cannot use chroot with remote resource $lpp_source."
 | |
|         echo "xcatchroot: ERROR: Cannot use chroot with remote resource $lpp_source." | logger -t xcat
 | |
|         exit 1
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| # last sanity check before chroot session is attempted
 | |
| if [[ ! -d $location ]] ; then
 | |
| 	echo "ERROR: Unable to proceed. Check resource name(s) also verify path location(s)."
 | |
| 	echo "xcatchroot: ERROR: Unable to proceed. Check resource name(s) also verify path location(s)." | logger -t xcat
 | |
| 	exit 1
 | |
| else
 | |
| 
 | |
| 	# create a temporary script containing the $cmd_string
 | |
|     # put it in the spot location
 | |
| 	if [ $verbose -eq 1 ]
 | |
| 	then
 | |
| 		echo "Running command: echo '#!/bin/ksh\n$cmd_string' > $location/xcatchrootscript\n"
 | |
| 	fi
 | |
| 
 | |
|     `echo "#!/bin/ksh\n$cmd_string" > $location/xcatchrootscript`
 | |
| 	`chmod 777 $location/xcatchrootscript`
 | |
| 
 | |
| 	# setup chroot environment
 | |
| 	setup_chroot_env
 | |
| 	${SET_CHROOT_LIBPATH}
 | |
| 	
 | |
| 	# mount the lpp_source
 | |
| 	if [[ -d $lpp_source ]] ; then
 | |
| 		if [ $verbose -eq 1 ]
 | |
| 		then
 | |
| 			echo "Running command: 'mount ${lpp_source} ${new_root}/lpp_source'\n"
 | |
| 		fi
 | |
| 		nim_mount ${lpp_source} ${new_root}/lpp_source
 | |
| 	fi
 | |
| 
 | |
| 	# add session id to spot comment field
 | |
| 	# on a graceful exit, we'll update this to show completion timestamp
 | |
| 	if tty -s
 | |
| 	then
 | |
| 		$NIM -o change -a comments="chroot session $$ is enabled on `tty`" $spotObj
 | |
| 	fi
 | |
| 	
 | |
| 	# sensitive process : place "unavailable" state on spot & lpp_source
 | |
| 	${M_CHATTR} -a Rstate=unavailable $spotObj
 | |
| 	if [[ -d $lpp_source ]] ; then
 | |
| 		${M_CHATTR} -a Rstate=unavailable $lppObj
 | |
| 	fi
 | |
| 
 | |
| 	# run the temp script using chroot
 | |
| 	if [ $verbose -eq 1 ]
 | |
|     then
 | |
| 		echo "Running command: ${chroot} /usr/xcatchrootscript\n"
 | |
| 	fi
 | |
| 	msg=`${chroot} /usr/xcatchrootscript`
 | |
| 
 | |
| 	rc=$?
 | |
| 
 | |
| 	echo "\n\n$msg\n\n"
 | |
| 
 | |
| 	#if [ ${rc} -ne 0 ]
 | |
| 	#then 
 | |
| 	#	error=1
 | |
| 	#	echo "\nError: The chroot command failed for '$cmd_string'."
 | |
| 	#	echo "Error: The return code from chroot was '${rc}'\n"
 | |
| 	#fi
 | |
| 
 | |
| 
 | |
| 	# sensitive process has completed
 | |
| 	${M_CHATTR} -a Rstate=available $spotObj
 | |
| 	if [[ -d $lpp_source ]] ; then
 | |
| 		${M_CHATTR} -a Rstate=available $lppObj
 | |
| 	fi
 | |
| 
 | |
| 	# update spot comment field
 | |
| 	$NIM -o change -a comments="chroot session $$ has ended" $spotObj
 | |
| 
 | |
| fi
 | |
| 
 | |
| # remove the tmp script
 | |
| /usr/bin/rm $location/xcatchrootscript
 | |
| 
 | |
| # all done
 | |
| #if [ $error -eq 1 ]
 | |
| #then
 | |
| #    exit 1
 | |
| #fi
 | |
| #exit 0
 | |
| exit ${rc}
 |