xcat-core/xCAT-client/bin/xcatchroot

298 lines
7.9 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 -p local4.err
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 -p local4.err
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 -p local4.err
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 -p local4.err
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 -p local4.err
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 -p local4.err
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}