xcat-core/xCAT/postscripts/aixlitesetup
mxi1 b841208705 for defect 3087228
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
2010-10-15 08:34:00 +00:00

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