Add xcatchroot command.
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5941 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		
							
								
								
									
										273
									
								
								xCAT-client/bin/xcatchroot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										273
									
								
								xCAT-client/bin/xcatchroot
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,273 @@ | ||||
| #!/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 | ||||
| # | ||||
| ###################################################################### | ||||
|  | ||||
| # 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 | ||||
|  | ||||
| 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 | ||||
| 	${chroot} /usr/xcatchrootscript | ||||
|  | ||||
| 	# 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 | ||||
| if [ $verbose -eq 1 ] | ||||
| then | ||||
| 	echo "Running command: 'rm $location/xcatchrootscript'\n" | ||||
| fi | ||||
| `rm $location/xcatchrootscript` | ||||
|  | ||||
| # echo "\nNote: Be sure to perform the NIM check operation after completing NIM spot\nupdates. (ex. 'nim -o check <spot_name>')" | ||||
|  | ||||
| # all done | ||||
| exit 0 | ||||
		Reference in New Issue
	
	Block a user