From 4e5d6ac097bf68fe14722bd74edd49e136b96ae1 Mon Sep 17 00:00:00 2001 From: nott Date: Mon, 3 May 2010 17:56:24 +0000 Subject: [PATCH] Add xcatchroot command. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5941 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-client/bin/xcatchroot | 273 +++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100755 xCAT-client/bin/xcatchroot diff --git a/xCAT-client/bin/xcatchroot b/xCAT-client/bin/xcatchroot new file mode 100755 index 000000000..06a9e9bd3 --- /dev/null +++ b/xCAT-client/bin/xcatchroot @@ -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 /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 ')" + +# all done +exit 0