b841208705
add two checkpoints in InstUtils.pm and aixlitesetup if the entry in litefile table is one file and the entry in spot is one directory, or the entry in litefile table is one directory and the entry in spot is one file, there will be one error message to indicate the user to update the spot or the litefile table One loop is added to do the check in InstUtils.pm; in aixlitesetup script, two checkpoints are added to make sure the entries in litetree is comatible with the litefile entry Also add one checkpoint in aixinstall.pm to see the return code of dolitesetup git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@7864 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
310 lines
7.8 KiB
Bash
310 lines
7.8 KiB
Bash
#!/bin/sh
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
################################################################################
|
|
#
|
|
# aixlitesetup
|
|
# - This script is used to configure the xCAT statelite support
|
|
# for AIX
|
|
#
|
|
###############################################################################
|
|
|
|
SL="/.statelite"
|
|
ROOTDIR="/"
|
|
MOUNTDIR="$SL/mnt" # where I mount all the trees.
|
|
PERSISTENT="$SL/persistent"
|
|
TMPDIR="$SL/tmpdir"
|
|
DEFAULT="/.default"
|
|
|
|
# statelite table files are in "/"
|
|
# /statelite.table, /litefile.table, /litetree.table
|
|
STATELITE="/statelite.table"
|
|
LITEFILE="/litefile.table"
|
|
LITETREE="/litetree.table"
|
|
LOG="${ROOTDIR}/${SL}/statelite.log"
|
|
|
|
# get this node name from the /etc/niminfo file
|
|
INFO=`cat /etc/niminfo | grep 'NIM_HOSTNAME'`
|
|
ME=`echo $INFO | awk -F= '{print $2}' | awk -F. '{print $1}'`
|
|
|
|
# check the statelite.table file to see if we have
|
|
# a persistent dir to mount.
|
|
ProcessStatelite () {
|
|
|
|
for i in `cat $STATELITE | grep -v '^#' | grep $ME`
|
|
do
|
|
|
|
SERVER=`echo $i | awk -F'|' '{print $2}'`
|
|
TOMNT=`echo $i | awk -F'|' '{print $3}'`
|
|
|
|
# /.statelite/tmpdir
|
|
if [ ! -d ${TMPDIR} ]; then
|
|
mkdir -m 755 -p ${TMPDIR}
|
|
fi
|
|
|
|
# /.statelite/persistent
|
|
if [ ! -d ${PERSISTENT} ]; then
|
|
mkdir -m 755 -p ${PERSISTENT}
|
|
fi
|
|
|
|
# mount 10.2.0.200:/nodedata /.statelite/persistent
|
|
mount $SERVER:$TOMNT ${PERSISTENT}
|
|
|
|
# make a node subdir
|
|
# /.statelite/persistent/<nodename>
|
|
if [ ! -d ${PERSISTENT}/${ME} ]; then
|
|
mkdir -m 755 -p ${PERSISTENT}/${ME}
|
|
fi
|
|
|
|
done
|
|
}
|
|
|
|
# process the litefile table
|
|
ProcessLitefile () {
|
|
for i in `cat $LITEFILE | grep $ME`
|
|
do
|
|
type=`echo $i | awk -F'|' '{print $2}'`
|
|
path=`echo $i | awk -F'|' '{print $3}'`
|
|
|
|
FindFile ${path} ${type}
|
|
done
|
|
|
|
}
|
|
|
|
MountTrees () {
|
|
# ex. /.statelite/mnt
|
|
if [ ! -d ${MOUNTDIR} ]; then
|
|
mkdir -m 755 -p $MOUNTDIR
|
|
fi
|
|
|
|
for i in `cat $LITETREE | grep -v '^#' | grep $ME`
|
|
do
|
|
|
|
NODE=`echo $i | awk -F'|' '{print $1}'`
|
|
SERV=`echo $i | awk -F'|' '{print $2}'`
|
|
DIR=`echo $i | awk -F'|' '{print $3}'`
|
|
|
|
if [ ! -d ${MOUNTDIR}/${SERV}${DIR} ]; then
|
|
# ex. /.statelite/mnt/10.2.0.200/etc/
|
|
mkdir -m 755 -p ${MOUNTDIR}/${SERV}${DIR}
|
|
fi
|
|
|
|
MAX=5
|
|
TRIES=1
|
|
|
|
# ex. 10.2.0.200:/etc/ /.statelite/mnt/10.2.0.200/etc/
|
|
while ! mount $SERV:$DIR ${MOUNTDIR}/${SERV}${DIR}
|
|
do
|
|
if [ "$TRIES" = "$MAX" ]
|
|
then
|
|
echo "Cannot mount $i." >/dev/console
|
|
break
|
|
fi
|
|
TRIES=`expr $TRIES + 1`
|
|
S=`expr $RANDOM % 20`
|
|
echo "Can't mount $SERV:$MNT... Sleeping $S seconds then trying agai
|
|
n" >/dev/console
|
|
sleep $S
|
|
done
|
|
done
|
|
}
|
|
|
|
|
|
ProcessType () {
|
|
#MOUNT=$1 # where this is (ex. /.statelite/mnt/10.2.0.200/etc/FScfg)
|
|
#PATH=$2 # file (ex. /etc/FScfg)
|
|
#TYPE=$3 # type of file (ex. rw)
|
|
#isChild=$4 # child = 1, parent = 0
|
|
|
|
PPATH=`dirname ${2}` # ex. /etc
|
|
|
|
case "${3}" in
|
|
rw)
|
|
# item is copied from litetree dir or .default location ($1)
|
|
# into local file
|
|
|
|
|
|
# the local name of the file or directory
|
|
LOCAL=`echo ${2} | sed -e 's/\/$//'`
|
|
|
|
# copy to local file or dir
|
|
if [ -d ${1} ]; then
|
|
# if it's a dir then copy all contents to local
|
|
if [ ! -e ${LOCAL} ]; then
|
|
mkdir -m 755 -p ${LOCAL}
|
|
fi
|
|
if [ "0" -ne `ls -A ${1} | wc -l` ]; then
|
|
cp -p -r ${1}* ${LOCAL}
|
|
echo "cp -p -r ${1}* ${LOCAL}" 2>&1 >>$LOG
|
|
fi
|
|
else
|
|
# if file just copy
|
|
if [ ! -e ${LOCAL} ]; then
|
|
FDIR=`dirname ${2}`
|
|
mkdir -m 755 -p ${FDIR}
|
|
touch ${LOCAL}
|
|
fi
|
|
cp -p -r ${1} ${LOCAL}
|
|
echo "cp -p -r ${1} ${LOCAL}" 2>&1 >>$LOG
|
|
fi
|
|
;;
|
|
|
|
persistent)
|
|
# the item is copied to the /.statelite/persistent subdir
|
|
# from wherever it is found ( $1 above )
|
|
# the /.statelite/persistent/blah is then mounted
|
|
# over the local /blah
|
|
# ex. /.statelite/persistent/compute02/etc
|
|
if [ ! -d ${PERSISTENT}/${ME}${PPATH} ]; then
|
|
mkdir -m 755 -p ${PERSISTENT}/${ME}${PPATH}
|
|
echo "mkdir -p ${PERSISTENT}/${ME}${PPATH}" >>$LOG
|
|
fi
|
|
|
|
# if the file doesn't exist, then copy it over to persistent
|
|
if [ ! -e ${PERSISTENT}/${ME}${2} ]; then
|
|
echo "cp -p -r ${1} ${PERSISTENT}/${ME}${2}" >>$LOG
|
|
cp -p -r ${1} ${PERSISTENT}/${ME}${2} 2>&1 >>$LOG
|
|
fi
|
|
|
|
LOCAL=`echo ${2} | sed -e 's/\/$//'`
|
|
SOURCE=`echo ${PERSISTENT}/${ME}${2}`
|
|
|
|
if [ ! -e ${LOCAL} ]; then
|
|
|
|
if [ -d ${SOURCE} ]; then
|
|
# need to create local dir
|
|
echo "mkdir -m 755 -p ${LOCAL}" >>$LOG
|
|
mkdir -m 755 -p ${LOCAL}
|
|
|
|
else
|
|
# need to create local file
|
|
FDIR=`dirname ${2}`
|
|
if [ ! -d ${FDIR} ]; then
|
|
mkdir -m 755 -p ${FDIR}
|
|
fi
|
|
touch ${LOCAL}
|
|
|
|
fi
|
|
fi
|
|
|
|
# ex. mount /.statelite/persistent/<nodename>/blah /blah
|
|
# note: the dir from the statelite table is mounted over
|
|
# /.statelite/persistent
|
|
|
|
# make sure we don't get duplicate mounts
|
|
umount ${LOCAL}>>$LOG 2>&1
|
|
|
|
echo "mount ${SOURCE} ${LOCAL}" >>$LOG
|
|
mount ${SOURCE} ${LOCAL}>>$LOG 2>&1
|
|
;;
|
|
|
|
ro)
|
|
# mounted file or dir is overmounted over local version
|
|
|
|
# $1 - mounted file or directory or default(?)
|
|
# $2 - file or dir name
|
|
|
|
# ex. /etc/lppcfg
|
|
LOCAL=`echo ${2} | sed -e 's/\/$//'`
|
|
|
|
# ex. /.statelite/mnt/<server>/etc/lppcfg
|
|
SOURCE=`echo ${1} | sed -e 's/\/$//'`
|
|
|
|
if [ ! -e ${LOCAL} ]; then
|
|
|
|
if [ -d ${SOURCE} ]; then
|
|
# need to create local dir
|
|
echo "mkdir -m 755 -p ${LOCAL}" >>$LOG
|
|
mkdir -m 755 -p ${LOCAL}
|
|
else
|
|
# need to create local file
|
|
GDIR=`dirname ${2}`
|
|
if [ ! -d ${GDIR} ]; then
|
|
mkdir -m 755 -p ${GDIR}
|
|
fi
|
|
touch ${LOCAL}
|
|
fi
|
|
fi
|
|
# make sure we don't get duplicate mounts
|
|
umount ${LOCAL}>>$LOG 2>&1
|
|
|
|
echo "mount -o ro ${SOURCE} ${LOCAL}" >>$LOG 2>&1
|
|
# ex. mount -o /.statelite/mnt/<server>/etc/lppcfg /etc/lppcfg
|
|
mount -o ro ${SOURCE} ${LOCAL}>>$LOG 2>&1
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
}
|
|
|
|
|
|
FindFile () {
|
|
# $1 = Pathname to locate
|
|
# $2 = Type of file
|
|
# $3 = 0 or 1: 0 means parent, 1 means child
|
|
path=$1
|
|
type=$2
|
|
isChild=$3
|
|
FOUND=0
|
|
|
|
# this assumes the dir are already in priority order
|
|
for i in `cat $LITETREE | grep -v '^#' | grep $ME`
|
|
do
|
|
|
|
SERVER=`echo $i | awk -F'|' '{print $2}'`
|
|
DIR=`echo $i | awk -F'|' '{print $3}'`
|
|
SRC=`echo ${MOUNTDIR}/${SERVER}${DIR}${path} | sed -e 's/\/\//\//'`
|
|
|
|
# ex. /.statelite/mnt/10.2.0.200/etc/FScfg
|
|
# ex. /.statelite/mnt/10.2.0.200/root/ssh/
|
|
if [ -e ${SRC} ]; then
|
|
PATHEND=`expr ${#path} - 1` # get the last char of the path
|
|
if [ ${path[${PATHEND}]} -ne '/' ] && [ -d ${SRC} ]; then
|
|
FOUND=0
|
|
continue
|
|
fi
|
|
|
|
if [ ${path[${PATHEND}]} -eq "/" ] && [ -f ${SRC} ]; then
|
|
FOUND=0
|
|
continue
|
|
fi
|
|
|
|
FOUND=1
|
|
ProcessType ${SRC} ${path} ${type} ${isChild}
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Default behavior is to get from the image
|
|
if [ "$FOUND" = "0" ]; then
|
|
|
|
if [ -e "${DEFAULT}${path}" ]; then
|
|
|
|
|
|
ProcessType ${DEFAULT}${path} ${path} ${type} ${isChild}
|
|
else
|
|
|
|
echo "Could not find ${path} in defaults or any other place" >/dev/console
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
###########################################################################
|
|
# Start / MAIN / main
|
|
###########################################################################
|
|
|
|
# mount the persistent dir - if provided
|
|
ProcessStatelite
|
|
|
|
# mount all the dirs from the litetree table.
|
|
MountTrees
|
|
|
|
# process the litefile table
|
|
ProcessLitefile
|
|
|
|
# Unmount dirs no longer needed - TBD
|
|
#UnmountTrees
|
|
|
|
exit 0
|