5a8c284b38
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5600 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
356 lines
9.1 KiB
Bash
Executable File
356 lines
9.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
#-------------------------------------------------------------------------------
|
|
#=head1 otherpkgs
|
|
#=head2 It gets the extra rpms and install/update them.
|
|
# The environment variable OTHERPKGS contains the rpms to be installed/updated.
|
|
# On MN, You need to:
|
|
# 1. put rpms under /install/post/otherpkgs/os/arch directory where 'os' and 'arch'
|
|
# can be found in the nodetype table.
|
|
# 2. put the name of the packages to /opt/xcat/share/xcat/netboot(install)/platform
|
|
# directory. The file name is one of the following:
|
|
# profile.os.arch.otherpkgs.pkglist
|
|
# profile.os.otherpkgs.pkglist
|
|
# profile.arch.otherpkgs.pkglist
|
|
# profile.otherpkgs.pkglist
|
|
# The install/deployment process will pick up the rpms and install them on the nodes.
|
|
# However, if the nodes have already installed and up and running, you can run the following
|
|
# command to have the extra rpms installed:
|
|
# updatenode noderange otherpkgs
|
|
#
|
|
#=cut
|
|
#-------------------------------------------------------------------------------
|
|
|
|
# do nothing for diskless deployment case because it is done in the image already
|
|
if [[ $UPDATENODE -ne 1 ]]; then
|
|
if [ "$NODESETSTATE" = "netboot" -o \
|
|
"$NODESETSTATE" = "diskless" -o \
|
|
"$NODESETSTATE" = "dataless" ]
|
|
then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
#echo "OTHERPKGS=$OTHERPKGS"
|
|
if [[ -z "$OTHERPKGS" ]]; then
|
|
echo "$0: no extra rpms to install"
|
|
exit 0
|
|
fi
|
|
|
|
if [[ -z "$NFSSERVER" ]]; then
|
|
NFSSERVER=$MASTER
|
|
fi
|
|
|
|
if [[ -z "$INSTALLDIR" ]]; then
|
|
INSTALLDIR="/install"
|
|
fi
|
|
|
|
#check if /install is mounted on the server, we may need to add code to conver NFSSERVER to ip
|
|
mounted=0;
|
|
result=`mount |grep /install |grep $NFSSERVER`
|
|
if [ $? -eq 0 ]; then
|
|
NFSSERVER=$INSTALLDIR
|
|
mounted=1
|
|
fi
|
|
|
|
if [[ -z "$OTHERPKGDIR" ]]; then
|
|
OTHERPKGDIR="$NFSSERVER/post/otherpkgs/$OSVER/$ARCH"
|
|
fi
|
|
|
|
if [ $mounted -eq 0 ]; then
|
|
OTHERPKGDIR=${OTHERPKGDIR/#$INSTALLDIR/$NFSSERVER/}
|
|
fi
|
|
|
|
echo NFSSERVER=$NFSSERVER
|
|
echo OTHERPKGDIR=$OTHERPKGDIR
|
|
|
|
#check if the node has yum or zypper installed, it will try yum first, then zypper and last rpm
|
|
hasyum=0
|
|
haszypper=0;
|
|
result=`rpm -q yum`
|
|
if [ $? -eq 0 ]; then
|
|
hasyum=1
|
|
mkdir -p /etc/yum.repos.d
|
|
result=`rm /etc/yum.repos.d/xCAT-otherpkgs*.repo 2>&1`
|
|
result=`yum clean all`
|
|
repo_base="/etc/yum.repos.d"
|
|
else
|
|
result=`rpm -q zypper`
|
|
if [ "$?" = "0" ]; then
|
|
haszypper=1
|
|
#remove old repo
|
|
old_repo=`zypper sl |grep xcat-otherpkgs | cut -f2 -d '|'`
|
|
for x in $old_repo
|
|
do
|
|
result=`zypper sd $x`
|
|
done
|
|
zypper --non-interactive refresh
|
|
repo_base="/tmp"
|
|
fi
|
|
fi
|
|
|
|
dhcpcd -n eth0
|
|
|
|
|
|
repo_path=()
|
|
repo_pkgs=""
|
|
repo_pkgs_preremove=""
|
|
repo_pkgs_postremove=""
|
|
plain_pkgs=""
|
|
plain_pkgs_preremove=""
|
|
plain_pkgs_postremove=""
|
|
handled_path=()
|
|
for x in `echo "$OTHERPKGS" | tr "," "\n"`
|
|
do
|
|
#check if the file name starts with -- or -.
|
|
#If it is start with -, then the rpm must be removed before installing other packages
|
|
#If it is start with --, then the rpm will be removed after installing other packages
|
|
string_type=0; #nornmal rpm
|
|
pos=`expr index $x -`
|
|
if [ $pos -eq 1 ]; then
|
|
x=`echo ${x#-}`
|
|
pos=`expr index $x -`
|
|
if [ $pos -eq 1 ]; then
|
|
x=`echo ${x#-}`
|
|
string_type=1 #start with --
|
|
else
|
|
string_type=-1 #start with -
|
|
fi
|
|
fi
|
|
|
|
if [ $hasyum -eq 0 ] && [ $haszypper -eq 0 ]; then
|
|
if [ $string_type -eq -1 ]; then
|
|
plain_pkgs_preremove="$plain_pkgs_preremove $x"
|
|
elif [ $string_type -eq 1 ]; then
|
|
plain_pkgs_postremove="$plain_pkgs_postremove $x"
|
|
else
|
|
plain_pkgs="$plain_pkgs $x-*"
|
|
fi
|
|
continue
|
|
fi
|
|
|
|
if [ $string_type -eq -1 ]; then
|
|
repo_pkgs_preremove="$repo_pkgs_preremove $x"
|
|
elif [ $string_type -eq 1 ]; then
|
|
repo_pkgs_postremove="$repo_pkgs_postremove $x"
|
|
else
|
|
fn=`basename $x`
|
|
path=`dirname $x`
|
|
whole_path=$OTHERPKGDIR/$path
|
|
|
|
#find out if this path has already handled
|
|
try_repo=1
|
|
rc=1
|
|
i=0
|
|
while [ $i -lt ${#handled_path[*]} ]; do
|
|
if [ ${handled_path[$i]} = $path ]; then
|
|
try_repo=0
|
|
j=0
|
|
while [ $j -lt ${#repo_path[*]} ]; do
|
|
if [ ${repo_path[$j]} = $path ]; then
|
|
rc=0
|
|
break
|
|
fi
|
|
let j++
|
|
done
|
|
break
|
|
fi
|
|
let i++
|
|
done
|
|
|
|
|
|
#try to add the path to the repo
|
|
if [ $try_repo -eq 1 ]; then
|
|
index=${#repo_path[*]}
|
|
REPOFILE="$repo_base/xCAT-otherpkgs$index.repo"
|
|
echo "[xcat-otherpkgs$index]" > $REPOFILE
|
|
echo "name=xcat-otherpkgs$index" >> $REPOFILE
|
|
if [ $mounted -eq 0 ]; then
|
|
echo "baseurl=ftp://$whole_path" >> $REPOFILE
|
|
else
|
|
echo "baseurl=file://$whole_path" >> $REPOFILE
|
|
fi
|
|
echo "enabled=1" >> $REPOFILE
|
|
echo "gpgcheck=0" >> $REPOFILE
|
|
|
|
if [ $hasyum -eq 1 ]; then
|
|
#use yum
|
|
result=`yum list $fn 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
rc=0
|
|
repo_path[${#repo_path[*]}]=$path
|
|
else
|
|
rm $REPOFILE
|
|
fi
|
|
elif [ $haszypper -eq 1 ]; then
|
|
#use zypper
|
|
if [[ "$OSVER" = sles11* ]]; then
|
|
result=`zypper ar -c $REPOFILE`
|
|
else
|
|
result=`zypper sa -c $REPOFILE`
|
|
fi
|
|
|
|
result=`zypper --non-interactive refresh xcat-otherpkgs$index 2>&1`
|
|
if [ $? -eq 0 ]; then
|
|
rc=0
|
|
repo_path[${#repo_path[*]}]=$path
|
|
else
|
|
result=`zypper sd xcat-otherpkgs$index`
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ $rc -eq 0 ]; then
|
|
repo_pkgs="$repo_pkgs $fn"
|
|
else
|
|
#now no hope we have to use rpm command
|
|
plain_pkgs="$plain_pkgs $x-*"
|
|
fi
|
|
handled_path[${#handled_path[*]}]=$path
|
|
fi
|
|
done
|
|
|
|
#echo "repo_pkgs=$repo_pkgs,\nrepo_pkgs_preremove=$repo_pkgs_preremove,\nrepo_pkgs_postremove=$repo_pkgs_postremove"
|
|
#echo "plain_pkgs=$plain_pkgs,\nplain_pkgs_preremove=$plain_pkgs_preremove,\nplain_pkgs_postremove=$plain_pkgs_postremove"
|
|
|
|
|
|
#Now we have parse the input, let's remove rpms if is specified with -
|
|
if [ "$repo_pkgs_preremove" != "" ]; then
|
|
if [ $hasyum -eq 1 ]; then
|
|
echo "yum -y remove $repo_pkgs_preremove"
|
|
result=`yum -y remove $repo_pkgs_preremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
elif [ $haszypper -eq 1 ]; then
|
|
echo "zypper remove -y $repo_pkgs_preremove"
|
|
result=`zypper remove -y $repo_pkgs_preremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
fi
|
|
fi
|
|
|
|
if [ "$plain_pkgs_preremove" != "" ]; then
|
|
echo "rpm -ev $plain_pkgs_preremove"
|
|
result=`rpm -ev $plain_pkgs_preremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs $result"
|
|
fi
|
|
echo "$result"
|
|
fi
|
|
|
|
|
|
#installation using yum or zypper
|
|
if [ "$repo_pkgs" != "" ]; then
|
|
if [ $hasyum -eq 1 ]; then
|
|
echo "yum -y install $repo_pkgs"
|
|
result=`yum -y install $repo_pkgs 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
elif [ $haszypper -eq 1 ]; then
|
|
echo "zypper install -y $repo_pkgs"
|
|
result=`zypper install -y $repo_pkgs 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
#remove the repos
|
|
#old_repo=`zypper lr -u |grep xcat-otherpkgs | cut -f2 -d '|'`
|
|
#for x in $old_repo
|
|
#do
|
|
# result=`zypper sd $x`
|
|
#done
|
|
fi
|
|
fi
|
|
|
|
#Handle the rest with rpm
|
|
if [ "$plain_pkgs" != "" ]; then
|
|
if [ $mounted -eq 0 ]; then
|
|
dir_no_ftproot=${OTHERPKGDIR#$INSTALLDIR/}
|
|
mkdir -p /xcatpost/$dir_no_ftproot
|
|
rm -f -R /xcatpost/$dir_no_ftproot/*
|
|
mkdir -p /tmp/postage/
|
|
rm -f -R /tmp/postage/*
|
|
cd /tmp/postage
|
|
|
|
for x in `echo "$plain_pkgs" | tr " " "\n"`
|
|
do
|
|
wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -t 0 -T 60 ftp://$OTHERPKGDIR/$x 2> /tmp/wget.log
|
|
done
|
|
|
|
mv $dir_no_ftproot/* /xcatpost/$dir_no_ftproot;
|
|
rm -rf $NFSSERVER
|
|
cd /xcatpost/$dir_no_ftproot
|
|
else
|
|
cd $OTHERPKGDIR
|
|
fi
|
|
|
|
echo "rpm -Uvh --replacepkgs $plain_pkgs"
|
|
result=`rpm -Uvh --replacepkgs $plain_pkgs 2>&1`
|
|
#result=`rpm -Fvh $plain_pkgs 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs $result"
|
|
fi
|
|
echo "$result"
|
|
|
|
if [ $mounted -eq 0 ]; then
|
|
cd /xcatpost
|
|
dir_no_ftproot=${OTHERPKGDIR#$INSTALLDIR/}
|
|
rm -f -R $dir_no_ftproot
|
|
fi
|
|
fi
|
|
|
|
#remove more rpms if specified with --
|
|
if [ "$repo_pkgs_postremove" != "" ]; then
|
|
if [ $hasyum -eq 1 ]; then
|
|
echo "yum -y removel $repo_pkgs_postremove"
|
|
result=`yum -y remove $repo_pkgs_postremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
elif [ $haszypper -eq 1 ]; then
|
|
echo "zypper remove -y $repo_pkgs_postremove"
|
|
result=`zypper remove -y $repo_pkgs_postremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs: $result"
|
|
fi
|
|
echo "$result"
|
|
fi
|
|
fi
|
|
|
|
if [ "$plain_pkgs_postremove" != "" ]; then
|
|
echo "rpm -ev $plain_pkgs_postremove"
|
|
result=`rpm -ev $plain_pkgs_postremove 2>&1`
|
|
if [ $? -ne 0 ]; then
|
|
logger "otherpkgs $result"
|
|
fi
|
|
echo "$result"
|
|
fi
|
|
|
|
exit 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|