528 lines
12 KiB
Bash
528 lines
12 KiB
Bash
#! /bin/sh
|
|
#
|
|
# setup_client : script written to add/remove a client
|
|
#
|
|
# @(#)setup_client 1.1 88/06/08 4.0NFSSRC; from 1.27 88/03/11 D/NFS
|
|
# @(#) from setup_client 1.15 88/02/08
|
|
#
|
|
# Copyright (c) 1987 by Sun Microsystems, Inc.
|
|
#
|
|
|
|
HOME=/; export HOME
|
|
PATH=/bin:/usr/bin:/etc:/usr/etc:/usr/bsd:/usr/etc/netdisk
|
|
|
|
CMDNAME=$0
|
|
MYPATH="/usr/etc/netdisk"
|
|
INSTALLPATH="/tmp"
|
|
TFTPBOOTPATH="/usr/etc/boot"
|
|
YPMASTERPATH="/var/yp"
|
|
|
|
USAGE="usage:
|
|
${CMDNAME} op name yp size rootpath swappath dumppath
|
|
homepath execpath sharepath arch
|
|
where:
|
|
op = \"add\" or \"remove\"
|
|
name = name of the client machine
|
|
yp = \"master\" or \"slave\" or \"client\" or \"none\"
|
|
size = size for swap
|
|
(e.g. 16M or 16m ==> 16 * 1048576 bytes
|
|
16K or 16k ==> 16 * 1000 bytes
|
|
16B or 16b ==> 16 * 512 bytes
|
|
16 ==> 16 bytes )
|
|
rootpath = pathname of root (e.g. /export/root )
|
|
swappath = pathname of swap (e.g. /export/swap )
|
|
dumppath = pathname of dump (e.g. /export/dump ) or \"none\"
|
|
homepath = pathname of home (e.g. /home or homeserver:/home)
|
|
or \"none\"
|
|
execpath = full pathname of exec directory (e.g. /export/exec/sun3 )
|
|
sharepath = full pathname of shared files (e.g. /export/exec/share )
|
|
or \"none\"
|
|
arch = \"sun2\" or \"sun3\" or \"sun4\" etc
|
|
"
|
|
|
|
#
|
|
# Verify number of arguments and initialize
|
|
#
|
|
case $# in
|
|
11)
|
|
;;
|
|
*)
|
|
echo "${CMDNAME}: incorrect number of arguments."
|
|
echo "${USAGE}"
|
|
exit 1 ;;
|
|
esac
|
|
OP=${1}; shift # 1
|
|
NAME=${1}; shift # 2
|
|
YP=${1}; shift # 3
|
|
SWAPSIZE=${1}; shift # 4
|
|
ROOTPATH=${1}; shift # 5
|
|
SWAPPATH=${1}; shift # 6
|
|
DUMPPATH=${1}; shift # 7
|
|
HOMEFULLPATH=${1}; shift # 8
|
|
EXECPATH=${1}; shift # 9
|
|
SHAREPATH=${1}; shift # 10
|
|
ARCH=${1} # 11
|
|
#
|
|
# Get name info
|
|
#
|
|
SERVER=`hostname`
|
|
DOMAIN=`domainname`
|
|
#
|
|
# Verify operation
|
|
#
|
|
case "$OP" in
|
|
"add" | "remove" )
|
|
YPUPDATE=yes
|
|
break ;;
|
|
"add/noYP" )
|
|
# used by INSTALL
|
|
OP=add
|
|
YPUPDATE=no
|
|
break ;;
|
|
*)
|
|
echo "${CMDNAME}: invalid operation type \"${OP}\"."
|
|
exit 1 ;;
|
|
esac
|
|
#
|
|
# Verify YP mode
|
|
#
|
|
case "$YP" in
|
|
"master" | "slave" | "client" | "none" )
|
|
break ;;
|
|
*)
|
|
echo "${CMDNAME}: invalid YP mode \"${YP}\"."
|
|
exit 1 ;;
|
|
esac
|
|
#
|
|
# Pathnames
|
|
#
|
|
case "$OP" in
|
|
"add" )
|
|
case "$ROOTPATH" in
|
|
"none" )
|
|
echo "${CMDNAME}: rootpath must not be \"none\" for client add"
|
|
exit 1 ;;
|
|
esac
|
|
|
|
case "$SWAPPATH" in
|
|
"none" )
|
|
echo "${CMDNAME}: swappath must not be \"none\" for client add"
|
|
exit 1 ;;
|
|
esac
|
|
;;
|
|
esac
|
|
if [ "$ROOTPATH" != "none" -a ! -d $ROOTPATH ]; then
|
|
mkdir -p -m 755 $ROOTPATH
|
|
if [ ! -d $ROOTPATH ]; then
|
|
echo "${CMDNAME}: can't make directory $ROOTPATH"
|
|
exit 1
|
|
fi
|
|
chmod 700 $ROOTPATH
|
|
fi
|
|
if [ "$SWAPPATH" != "none" -a ! -d $SWAPPATH ]; then
|
|
mkdir -p -m 755 $SWAPPATH
|
|
if [ ! -d $SWAPPATH ]; then
|
|
echo "${CMDNAME}: can't make directory $SWAPPATH"
|
|
exit 1
|
|
fi
|
|
chmod 700 $SWAPPATH
|
|
fi
|
|
if [ "$DUMPPATH" != "none" -a ! -d $DUMPPATH ]; then
|
|
mkdir -p -m 755 $DUMPPATH
|
|
if [ ! -d $DUMPPATH ]; then
|
|
echo "${CMDNAME}: can't make directory $DUMPPATH"
|
|
exit 1
|
|
fi
|
|
fi
|
|
case "$HOMEFULLPATH" in
|
|
"none" | *:*)
|
|
# if server:path, then HOMEFULLPATH is all we need
|
|
HOMEPATH=none
|
|
;;
|
|
* )
|
|
HOMEPATH=$HOMEFULLPATH
|
|
if [ ! -d $HOMEPATH/$SERVER ]; then
|
|
mkdir -p -m 755 $HOMEPATH/$SERVER
|
|
if [ ! -d $HOMEPATH/$SERVER ]; then
|
|
echo "${CMDNAME}: ATTENTION: can't make directory $HOMEPATH/$SERVER"
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
#
|
|
# Verify architecture name, exec pathname and root pathname
|
|
#
|
|
if [ ! -d $EXECPATH/boot -a "$OP" = "add" ]; then
|
|
echo "${CMDNAME}: can't set up client \"${NAME}\"."
|
|
echo "${CMDNAME}: $EXECPATH/boot doesn't exist."
|
|
echo "ATTENTION: You must load the \"${ARCH}\" architecture."
|
|
exit 1
|
|
fi
|
|
if [ -d $ROOTPATH/$NAME -a "$OP" = "add" ]; then
|
|
echo "${CMDNAME}: $ARCH client \"${NAME}\" already exists."
|
|
exit 1
|
|
elif [ ! -d $ROOTPATH/$NAME -a "$OP" = "remove" ]; then
|
|
echo "${CMDNAME}: $ARCH client \"${NAME}\" does not exist."
|
|
exit 1
|
|
fi
|
|
#
|
|
# Make sure proto tree exists.
|
|
#
|
|
if [ ! -d $MYPATH/proto/etc -a "$OP" = "add" ]; then
|
|
echo
|
|
echo "${CMDNAME}: can't set up client \"${NAME}\"."
|
|
echo "${CMDNAME}: prototype root not found in $MYPATH/proto."
|
|
echo "ATTENTION: You must load the \"${ARCH}\" architecture."
|
|
exit 1
|
|
fi
|
|
#
|
|
# Verify ip address
|
|
#
|
|
rm -rf /tmp/ipaddr
|
|
if [ "$DOMAIN" = "noname" -o "$DOMAIN" = "" ]; then
|
|
grep "[ ]$NAME[ ]" /etc/hosts | grep -v "^#"
|
|
else
|
|
ypmatch $NAME hosts
|
|
fi | awk '{ print $1 }' >> /tmp/ipaddr
|
|
IPADDR=`cat /tmp/ipaddr`
|
|
rm -rf /tmp/ipaddr
|
|
case "$IPADDR" in
|
|
"")
|
|
echo "${CMDNAME}: can't find ip address in /etc/hosts for \"${NAME}\" !"
|
|
exit 1
|
|
;;
|
|
esac
|
|
#
|
|
# Convert ipaddr to hex
|
|
# Note that convert_to_hex adds a newline to end of string, so $HEXADDR
|
|
# will have a space at the end of it. This is important if $HEXADDR is
|
|
# used to construct other strings.
|
|
#
|
|
HEXADDR=`convert_to_hex $IPADDR`
|
|
#
|
|
# Create the symlink name to the boot file. Sun3 symlink names are
|
|
# merely the 8 character uppercase IP address, while all others
|
|
# have ".arch" appended, where "arch" is the uppercase architecture
|
|
# name of the client.
|
|
#
|
|
case "$ARCH" in
|
|
sun3)
|
|
BOOTSYMLINK=$HEXADDR
|
|
;;
|
|
sun386)
|
|
BOOTSYMLINK=`echo "$HEXADDR." | tr -d " "`S386
|
|
;;
|
|
*)
|
|
# Get rid of spaces in $HEXADDR and make $ARCH uppercase
|
|
BOOTSYMLINK=`echo "$HEXADDR." | tr -d " "``echo "$ARCH" \
|
|
| tr '[a-z]' '[A-Z]'`
|
|
;;
|
|
esac
|
|
#
|
|
# Verify ethernet address
|
|
#
|
|
rm -rf /tmp/etheraddr
|
|
if [ "$DOMAIN" = "noname" -o "$DOMAIN" = "" ]; then
|
|
grep "[ ]$NAME[ ]" /etc/ethers | grep -v "^#"
|
|
else
|
|
ypmatch $NAME ethers
|
|
fi | awk '{ print $1 }' >> /tmp/etheraddr
|
|
ETHERADDR=`cat /tmp/etheraddr`
|
|
rm -rf /tmp/etheraddr
|
|
case "$ETHERADDR" in
|
|
"")
|
|
echo "${CMDNAME}: can't find address in /etc/ethers for \"${NAME}\" !"
|
|
exit 1
|
|
;;
|
|
esac
|
|
echo
|
|
#
|
|
# Start add/remove a nfs client
|
|
#
|
|
case "$OP" in
|
|
add)
|
|
echo "Start creating $ARCH client \"${NAME}\" :"
|
|
echo
|
|
#
|
|
# Update bootparams
|
|
#
|
|
echo "Updating bootparams ..."
|
|
if [ -f /etc/bootparams ]; then
|
|
grep "[ ]$NAME[ ]" /etc/bootparams >/dev/null 2>&1
|
|
case $? in
|
|
0)
|
|
fix_bootparams remove $NAME
|
|
;;
|
|
esac
|
|
fi
|
|
fix_bootparams $OP $NAME $ROOTPATH $SWAPPATH $DUMPPATH
|
|
case "$YPUPDATE" in
|
|
yes)
|
|
if [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a -f ${YPMASTERPATH}/bootparams.time ]; then
|
|
cd ${YPMASTERPATH}
|
|
make bootparams
|
|
elif [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a ! -f ${YPMASTERPATH}/bootparams.time ]; then
|
|
if [ ! -f ${YPMASTERPATH}/bootparams.time- ]; then
|
|
echo "ATTENTION: /etc/bootparams on the yp master needs to be updated."
|
|
fi
|
|
fi ;;
|
|
esac
|
|
#
|
|
# Setup root
|
|
#
|
|
echo
|
|
echo "Creating root for client \"${NAME}\"."
|
|
create_root $NAME $YP $ROOTPATH $HOMEFULLPATH $EXECPATH \
|
|
$SHAREPATH $SERVER "$DOMAIN"
|
|
cd $EXECPATH/boot
|
|
tar cf - init sh mount ifconfig hostname \
|
|
| (cd ${ROOTPATH}/${NAME}/sbin; tar xpf -)
|
|
cp $EXECPATH/boot/vmunix ${ROOTPATH}/${NAME}
|
|
if [ -f $EXECPATH/boot/kadb ]; then
|
|
cp $EXECPATH/boot/kadb ${ROOTPATH}/${NAME}
|
|
fi
|
|
#
|
|
# Setup swap
|
|
#
|
|
echo
|
|
echo "Creating $SWAPSIZE bytes of swap for client \"${NAME}\"."
|
|
cd $SWAPPATH
|
|
if [ -f /usr/etc/mkfile ]; then
|
|
/usr/etc/mkfile $SWAPSIZE $NAME
|
|
elif [ -f /etc/mkfile ]; then
|
|
/etc/mkfile $SWAPSIZE $NAME
|
|
else
|
|
echo "ATTENTION: /usr/etc/mkfile does not exist."
|
|
echo "ATTENTION: $SWAPSIZE bytes of swap for \"${NAME}\" not created."
|
|
fi
|
|
#
|
|
# Setup dump
|
|
#
|
|
case "$DUMPPATH" in
|
|
"none" )
|
|
;;
|
|
* )
|
|
echo
|
|
echo "Creating dump for client \"${NAME}\"."
|
|
cd $DUMPPATH
|
|
touch $NAME
|
|
chmod 666 $NAME
|
|
;;
|
|
esac
|
|
#
|
|
# Setup ${TFTPBOOTPATH} directory
|
|
#
|
|
echo
|
|
echo "Setting up ${TFTPBOOTPATH} directory."
|
|
if [ ! -d ${TFTPBOOTPATH} ]; then
|
|
mkdir -p -m 755 ${TFTPBOOTPATH}
|
|
fi
|
|
cd ${TFTPBOOTPATH}
|
|
#
|
|
# Create the symlink to the boot file.
|
|
#
|
|
case $ARCH in
|
|
sun386 )
|
|
BOOTARCH=S386
|
|
;;
|
|
* )
|
|
BOOTARCH=$ARCH
|
|
;;
|
|
esac
|
|
rm -rf $BOOTSYMLINK
|
|
if [ -f boot.${BOOTARCH} ]; then
|
|
ln -s boot.${BOOTARCH} $BOOTSYMLINK
|
|
elif [ -f $EXECPATH/stand/boot.${BOOTARCH} ]; then
|
|
cp $EXECPATH/stand/boot.${BOOTARCH} .
|
|
ln -s boot.${BOOTARCH} $BOOTSYMLINK
|
|
else
|
|
echo "ATTENTION: ${TFTPBOOTPATH}/boot.${BOOTARCH} doesn't exist."
|
|
echo "ATTENTION: $BOOTSYMLINK -> boot.${BOOTARCH} not created."
|
|
fi
|
|
case "$ARCH" in
|
|
sun2)
|
|
if [ ! -f sun2.bb ]; then
|
|
if [ -f $EXECPATH/stand/sun2.bb ]; then
|
|
cp $EXECPATH/stand/sun2.bb .
|
|
else
|
|
echo "
|
|
ATTENTION: $EXECPATH/stand/sun2.bb doesn't exist.
|
|
ATTENTION: Can't create sun2 bootblock ${TFTPBOOTPATH}/sun2.bb"
|
|
fi
|
|
fi ;;
|
|
esac
|
|
#
|
|
# Fix /etc/exports on server
|
|
#
|
|
if [ ! -f /etc/exports ]; then
|
|
> /etc/exports
|
|
chmod 644 /etc/exports
|
|
fi
|
|
RUN_EXPORTFS=no
|
|
case $HOMEPATH in
|
|
none )
|
|
;;
|
|
* )
|
|
egrep "${HOMEPATH}[ ]|${HOMEPATH}$" /etc/exports >/dev/null
|
|
case $? in
|
|
1)
|
|
echo
|
|
echo "Updating /etc/exports to export \"$HOMEPATH\"."
|
|
echo "#" >> /etc/exports
|
|
echo "$HOMEPATH" >> /etc/exports
|
|
RUN_EXPORTFS=yes
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
egrep "/${NAME}[ ]|/${NAME}$" /etc/exports >/dev/null
|
|
case $? in
|
|
1)
|
|
echo
|
|
echo "Updating /etc/exports to export \"$NAME\" info."
|
|
echo "#" >> /etc/exports
|
|
echo "$ROOTPATH/$NAME -root=$NAME,access=$NAME" >> /etc/exports
|
|
echo "$SWAPPATH/$NAME -root=$NAME,access=$NAME" >> /etc/exports
|
|
case "$DUMPPATH" in
|
|
"none" )
|
|
;;
|
|
* )
|
|
echo "$DUMPPATH/$NAME -root=$NAME" >> /etc/exports
|
|
;;
|
|
esac
|
|
RUN_EXPORTFS=yes
|
|
;;
|
|
esac
|
|
case "$RUN_EXPORTFS" in
|
|
yes)
|
|
if [ -f /usr/etc/exportfs ]; then
|
|
/usr/etc/exportfs -a
|
|
case $? in
|
|
0)
|
|
;;
|
|
*)
|
|
echo "ATTENTION: /etc/exports needs attention !"
|
|
echo "ATTENTION: fix /etc/exports and rerun exportfs !"
|
|
;;
|
|
esac
|
|
else
|
|
echo "ATTENTION: /usr/etc/exportfs does not exist !"
|
|
fi ;;
|
|
esac
|
|
|
|
echo
|
|
echo "Completed creating $ARCH client \"$NAME\"."
|
|
case "$ARCH" in
|
|
sun2)
|
|
echo "
|
|
ATTENTION: /usr/etc/ndbootd must be running on server before
|
|
bringing up \"$NAME\"."
|
|
;;
|
|
esac
|
|
;;
|
|
remove)
|
|
echo "Start removing $ARCH client \"$NAME\" :"
|
|
echo
|
|
#
|
|
# Update bootparams
|
|
#
|
|
if [ -f /etc/bootparams ]; then
|
|
grep "[ ]$NAME[ ]" /etc/bootparams >/dev/null 2>&1
|
|
case $? in
|
|
0)
|
|
echo "Updating bootparams ..."
|
|
fix_bootparams remove $NAME
|
|
;;
|
|
esac
|
|
fi
|
|
case "$YPUPDATE" in
|
|
yes)
|
|
if [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a -f ${YPMASTERPATH}/bootparams.time ]; then
|
|
cd ${YPMASTERPATH}
|
|
make bootparams
|
|
elif [ "$DOMAIN" != "noname" -a "$DOMAIN" != "" -a ! -f ${YPMASTERPATH}/bootparams.time ]; then
|
|
if [ ! -f ${YPMASTERPATH}/bootparams.time- ]; then
|
|
echo "ATTENTION: /etc/bootparams on the yp master needs to be updated."
|
|
fi
|
|
fi ;;
|
|
esac
|
|
#
|
|
# Clean nfsroot
|
|
#
|
|
case "$ROOTPATH" in
|
|
none)
|
|
;;
|
|
*)
|
|
echo
|
|
echo "Removing root for client \"${NAME}\"."
|
|
cd $ROOTPATH
|
|
rm -rf $NAME
|
|
;;
|
|
esac
|
|
#
|
|
# Clean nfsswap
|
|
#
|
|
case "$SWAPPATH" in
|
|
none)
|
|
;;
|
|
*)
|
|
echo
|
|
echo "Removing swap for client \"${NAME}\"."
|
|
cd $SWAPPATH
|
|
rm -rf $NAME
|
|
;;
|
|
esac
|
|
#
|
|
# Clean nfsdump
|
|
#
|
|
case "$DUMPPATH" in
|
|
none)
|
|
;;
|
|
*)
|
|
echo
|
|
echo "Removing dump for client \"${NAME}\"."
|
|
cd $DUMPPATH
|
|
rm -rf $NAME
|
|
;;
|
|
esac
|
|
#
|
|
# Remove link in ${TFTPBOOTPATH}
|
|
#
|
|
if [ -d ${TFTPBOOTPATH} ]; then
|
|
cd ${TFTPBOOTPATH}
|
|
rm -rf $BOOTSYMLINK
|
|
fi
|
|
#
|
|
# Fix /etc/exports on server
|
|
#
|
|
grep ${NAME} /etc/exports >/dev/null 2>&1
|
|
case $? in
|
|
0)
|
|
ed - /etc/exports <<END
|
|
g,/${NAME}[ ],d
|
|
g,/${NAME}\$,d
|
|
w
|
|
q
|
|
END
|
|
if [ -f /usr/etc/exportfs ]; then
|
|
exportfs -a
|
|
case $? in
|
|
0)
|
|
;;
|
|
*)
|
|
echo "ATTENTION: /etc/exports needs attention !"
|
|
echo "ATTENTION: fix exports and rerun exportfs !"
|
|
;;
|
|
esac
|
|
else
|
|
echo "ATTENTION: /usr/etc/exportfs does not exist !"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
echo
|
|
echo "Completed removing $ARCH client \"$NAME\"."
|
|
;;
|
|
esac
|
|
exit 0
|