2014-11-19 14:42:19 +00:00
#!/bin/bash
2008-09-08 18:54:30 +00:00
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------------------------------
2012-03-22 13:51:08 +00:00
#=head1 otherpkgs - only runs on Linux
2008-09-08 18:54:30 +00:00
#=head2 It gets the extra rpms and install/update them.
2008-09-09 21:08:48 +00:00
# The environment variable OTHERPKGS contains the rpms to be installed/updated.
2008-09-08 18:54:30 +00:00
# On MN, You need to:
2008-09-09 21:08:48 +00:00
# 1. put rpms under /install/post/otherpkgs/os/arch directory where 'os' and 'arch'
2008-09-08 18:54:30 +00:00
# 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:
2008-09-09 21:08:48 +00:00
# profile.os.arch.otherpkgs.pkglist
# profile.os.otherpkgs.pkglist
# profile.arch.otherpkgs.pkglist
# profile.otherpkgs.pkglist
2008-09-08 18:54:30 +00:00
# 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:
2008-09-09 21:08:48 +00:00
# updatenode noderange otherpkgs
2008-09-08 18:54:30 +00:00
#
#=cut
#-------------------------------------------------------------------------------
2015-02-05 03:08:58 +00:00
#enable debug
2015-04-13 20:32:27 +00:00
#set -x
2015-02-05 03:08:58 +00:00
2011-08-20 03:38:17 +00:00
# pmatch determines if 1st argument string is matched by 2nd argument pattern
pmatch ()
{
case $1 in
$2) return 0;; # zero return code means string matched by pattern
esac
return 1 # non-zero return code means string not matched by pattern
}
##
## The following routines implement the notion of an array.
## The POSIX shell does not support arrays.
## With these routines, an array conceptually called "my_array" is implmented using the following series
## of variables:
##
## my_array__ARRAY_HIGH_INDEX - holds the highest index used in the array
## my_array__0 - value for element 0 of my_array: my_array[0] in standard array notation
## my_array__1 - value for element 1 of my_array: my_array[1] in standard array notation
## . .
## . .
## . .
##
#
# array_empty - make the array whose name is given by $1 empty (with no elements).
#
# sample call: array_empty my_array
#
array_empty ()
{
local array_name="$1"
local high_ndx_varname="${array_name}__ARRAY_HIGH_INDEX"
local elem_varname
local high_ndx
local ndx
# Determine current element count
eval "high_ndx=\$${high_ndx_varname}"
if [ -z "$high_ndx" ]; then
return
fi
# Unset all previously defined element variables and the high index variable
ndx=0
while [ $ndx -le $high_ndx ]; do
elem_varname="${array_name}__${ndx}"
eval "unset ${elem_varname}"
ndx=$(expr $ndx + 1)
done
eval "unset ${high_ndx_varname}"
}
#
# array_get_size - return the size of the array whose name is given by $1.
# The size, which is the highest index plus one is written to standard output
#
# sample call: size=$(array_get_size my_array)
#
array_get_size ()
{
local array_name="$1"
local high_ndx_varname="${array_name}__ARRAY_HIGH_INDEX"
local high_ndx
eval "high_ndx=\$${high_ndx_varname}"
if [ -z "$high_ndx" ]; then
high_ndx=-1
fi
echo $(expr $high_ndx + 1)
}
#
# array_set_element - set an element to a value. $1 is the array name, $2 is the element index,
# $3 is the element value.
#
# sample call: array_set_element my_array index "the new element value"
#
array_set_element ()
{
local array_name="$1"
local ndx="$2"
local elem_value="$3"
local high_ndx_varname="${array_name}__ARRAY_HIGH_INDEX"
local elem_varname
local high_ndx
# Set specified element to specified value
elem_varname="${array_name}__${ndx}"
eval "${elem_varname}=\"${elem_value}\""
# Adjust high index
eval "high_ndx=\$${high_ndx_varname}"
if [ -z "$high_ndx" ]; then
high_ndx=-1
fi
if [ $ndx -gt $high_ndx ]; then
eval "${high_ndx_varname}=${ndx}"
fi
}
#
# array_get_element - get an element's value. $1 is the array name, $2 is the element index.
#
# sample call: value=$(array_get_element my_array index)
#
array_get_element ()
{
local array_name="$1"
local ndx="$2"
eval "echo \"\$${array_name}__${ndx}\""
}
##
## End of set routines.
##
2010-04-13 17:30:54 +00:00
2011-10-05 17:32:53 +00:00
##
## Begin the means to update apt's view of Ubuntu repo's if necessary.
##
# *** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT ***
# Call apt_get_update_if_repos_changed before ALL apt-* calls. Examples:
#
# apt_get_update_if_repos_changed $REPOFILE
# apt-get install $PACKAGES
#
# apt_get_update_if_repos_changed $REPOFILE
# apt-get -y remove $repo_pkgs_postremove
# *** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT *** IMPORTANT ***
prev_ubuntu_repo_lastmod=
# required argument: REPOFILE
apt_get_update_if_repos_changed()
{
# Obtain file last modification timestamp. Ignore stderr because file
# non-existence is not an error, but just another indication of modification.
# It's okay if REPOFILE isn't set because that is interpreted as acceptable
# file non-existence.
curr_ubuntu_repo_lastmod=`stat -c "%y" $1 2>/dev/null`
if [ "$prev_ubuntu_repo_lastmod" != "$curr_ubuntu_repo_lastmod" ];then
apt-get -y update 1>/dev/null 2>/dev/null
prev_ubuntu_repo_lastmod=$curr_ubuntu_repo_lastmod
fi
}
##
## End the means to update apt's view of Ubuntu repo's if necessary.
##
2012-03-22 13:51:08 +00:00
# Main - start of other pkgs
#do nothing for diskless deployment case because it is done in the image already
2011-10-05 17:32:53 +00:00
2012-11-25 02:49:41 +00:00
RETURNVAL=0
2012-03-22 13:51:08 +00:00
if [ "$(uname -s)" = "AIX" ]; then
logger -p local4.info -t xcat "otherpkgs not support on AIX, exiting "
exit 0
else
logger -p local4.info -t xcat "Running otherpkgs "
fi
2011-08-20 03:38:17 +00:00
if [ -z "$UPDATENODE" ] || [ $UPDATENODE -ne 1 ]; then
2009-10-06 16:43:05 +00:00
if [ "$NODESETSTATE" = "netboot" -o \
2010-04-23 10:46:04 +00:00
"$NODESETSTATE" = "statelite" -o \
2009-10-06 16:43:05 +00:00
"$NODESETSTATE" = "diskless" -o \
"$NODESETSTATE" = "dataless" ]
2009-07-29 21:25:59 +00:00
then
2013-11-26 07:04:09 +00:00
echo " Did not install any extra packages."
2009-07-29 21:25:59 +00:00
exit 0
fi
fi
2011-08-20 03:38:17 +00:00
if [ -z "$OTHERPKGS_INDEX" ]; then
2008-09-08 18:54:30 +00:00
echo "$0: no extra rpms to install"
exit 0
fi
2011-08-20 03:38:17 +00:00
if [ -z "$NFSSERVER" ]; then
2009-03-12 19:44:45 +00:00
NFSSERVER=$MASTER
2009-07-02 15:48:28 +00:00
fi
2008-09-11 04:43:33 +00:00
2011-08-20 03:38:17 +00:00
if [ -z "$INSTALLDIR" ]; then
2009-10-02 18:55:54 +00:00
INSTALLDIR="/install"
fi
2009-07-02 15:48:28 +00:00
2012-03-19 14:51:04 +00:00
#check if /install is mounted on the server
2009-07-02 15:48:28 +00:00
mounted=0;
2012-03-19 14:51:04 +00:00
result=`mount |grep " $INSTALLDIR " |grep $NFSSERVER`
2009-07-02 15:48:28 +00:00
if [ $? -eq 0 ]; then
mounted=1
fi
2008-09-11 04:43:33 +00:00
2013-04-03 09:12:22 +00:00
if [ -n "$OTHERPKGDIR" ]; then
OLDIFS=$IFS
IFS=$','
dir_array=($OTHERPKGDIR)
for dir in ${dir_array[@]}
do
dirtype=${dir:0:4}
if [ $dirtype = 'http' ]; then
OTHERPKGDIR_INTERNET="${OTHERPKGDIR_INTERNET}${dir} ,"
else
OTHERPKGDIR_LOCAL=$dir
fi
done
OTHERPKGDIR=$OTHERPKGDIR_LOCAL
IFS=$OLDIFS
fi
2012-03-19 14:51:04 +00:00
2012-03-06 21:32:13 +00:00
#OTHERPKGDIR is set only when the provmethod is the os image name
#when it is not set, we need to figure it out here
2011-08-20 03:38:17 +00:00
if [ -z "$OTHERPKGDIR" ]; then
2011-12-30 08:57:37 +00:00
if [ $mounted -eq 0 ]; then
OTHERPKGDIR="$NFSSERVER$INSTALLDIR/post/otherpkgs/$OSVER/$ARCH"
else
2012-03-06 21:32:13 +00:00
OTHERPKGDIR="$INSTALLDIR/post/otherpkgs/$OSVER/$ARCH"
2011-12-30 08:57:37 +00:00
fi
2013-04-03 09:12:22 +00:00
if ( pmatch "$OSVER" "ubuntu*" ); then
OTHERPKGDIR=""
fi
2012-03-06 21:32:13 +00:00
else
if [ $mounted -eq 0 ]; then
OTHERPKGDIR=${NFSSERVER}${OTHERPKGDIR}
2011-08-20 03:38:17 +00:00
fi
2009-10-02 18:55:54 +00:00
fi
2013-03-14 07:47:46 +00:00
#########################
##start collecting the repositories for os
if [ -z "$OSPKGDIR" ]; then
OSPKGDIR="$INSTALLDIR/$OSVER/$ARCH"
fi
if [ "$KERNELDIR" != "" ]; then
OSPKGDIR="$OSPKGDIR,$KERNELDIR"
fi
OIFS=$IFS
IFS=$','
if ( pmatch "$OSVER" "ubuntu*" ); then
IFS=$(printf ',')
fi
array_ospkgdirs=($OSPKGDIR)
IFS=$OIFS
array_empty os_path
index=0
for dir in ${array_ospkgdirs[@]}
do
default_pkgdir="$INSTALLDIR/$OSVER/$ARCH"
OSPKGDIR="$OSPKGDIR"
if [ $mounted -eq 0 ]; then
#OSPKGDIR="$OSPKGDIR"
ospkgdir="$NFSSERVER$dir"
else
ospkgdir="$dir"
fi
# for the os base pkg dir(default_pkgdir) , there are some special cases.
# (1)for rhels6, there is one repodata in the os base dir; so keep it here, and handle the other cases below
# (2)for sles, we should specified the baseurl should be ./install/sles11/ppc64/1
# (3)for SL5, we should append the /SL
# (4) for other os, we just keep it here.
# For other pkg paths, we just keep it here.
if [ $dir == $default_pkgdir ] || [ $dir == "$default_pkgdir/" ]; then
if ( pmatch "$OSVER" "sles*" ); then
OSPKGDIR="$OSPKGDIR/1"
ospkgdir="$ospkgdir/1"
elif ( pmatch "$OSVER" "SL5*" ); then
OSPKGDIR="$OSPKGDIR/SL"
ospkgdir="$ospkgdir/SL"
fi
fi
array_set_element os_path $index $ospkgdir
if ( pmatch "$OSVER" "rhel*" ); then
#default_pkgdir="$INSTALLDIR/$OSVER/$ARCH"
if [ $dir == $default_pkgdir ] || [ $dir == "$default_pkgdir/" ]; then
if ( pmatch "$OSVER" "rhels6*" ); then
if [ $ARCH == "ppc64" ]; then
ospkgdir_ok="$ospkgdir/Server"
index=$(expr $index + 1)
array_set_element os_path $index $ospkgdir_ok
fi
if [ $ARCH == "x86_64" ]; then
for arg in "Server" "ScalableFileSystem" "HighAvailability" "ResilientStorage" "LoadBalancer"
do
ospkgdir_ok="$ospkgdir/$arg"
index=$(expr $index + 1)
array_set_element os_path $index $ospkgdir_ok
done
fi
elif ( pmatch "$OSVER" "rhels5*" ); then
# for rhels5, the repodata is in ./Server, ./Cluster, ./CusterStorage, not in ./
ospkgdir_ok="$ospkgdir/Server"
array_set_element os_path $index $ospkgdir_ok
if [ $ARCH == "x86_64" ]; then
for arg in "Cluster" "ClusterStorage"
do
ospkgdir_ok="$ospkgdir/$arg"
index=$(expr $index + 1)
array_set_element os_path $index $ospkgdir_ok
done
fi # x86_64
fi # if...elif..fi
fi # eq default_pkgdir
fi # match rhel*
index=$(expr $index + 1)
done
#fi
2015-01-22 20:32:18 +00:00
#if [ "$SDKDIR" != "" ]; then
# if [ $mounted -eq 0 ]; then
# SDKDIR="$NFSSERVER/$SDKDIR"
# fi
#fi
2013-03-14 07:47:46 +00:00
##end collecting the repositories for os
#########################
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo NFSSERVER=$NFSSERVER
fi
2012-03-22 13:51:08 +00:00
logger -p local4.info -t xcat "NFSSERVER=$NFSSERVER"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo OTHERPKGDIR=$OTHERPKGDIR
fi
2012-03-22 13:51:08 +00:00
logger -p local4.info -t xcat "OTHERPKGDIR=$OTHERPKGDIR"
2009-07-02 15:48:28 +00:00
2011-02-07 18:33:11 +00:00
#if [ -x "/sbin/dhcpcd" ]; then
# dhcpcd -n $PRIMARYNIC
#fi
2010-04-13 17:30:54 +00:00
2011-09-26 13:41:56 +00:00
#check if the node has yum or zypper installed, it will try yum first, then zypper and last rpm
# for rpm based machines, or check if apt is installed, then it will use apt then dpkg
hasrpm=0
2009-07-02 15:48:28 +00:00
hasyum=0
2010-04-13 17:30:54 +00:00
haszypper=0
2011-09-26 13:41:56 +00:00
hasapt=0
hasdpkg=0
supdatecommand="rpm -Uvh --replacepkgs"
sremovecommand="rpm -ev"
2014-10-08 08:32:48 +00:00
#In ubuntu, rpm can be installed, if rpm is installed,ubuntu will use rpm
#So dpkg --version should be in front of rpm --version
result=`dpkg --version 2>/dev/null`
2011-09-26 13:41:56 +00:00
if [ $? -eq 0 ]; then
2014-10-08 08:32:48 +00:00
hasdpkg=1
supdatecommand="dpkg -i"
sremovecommand="dpkg -r"
result=`dpkg -l apt`
if [ $? -eq 0 ]; then
hasapt=1
fi
2009-07-02 15:48:28 +00:00
else
2014-10-08 08:32:48 +00:00
result=`rpm --version 2>/dev/null`
2011-09-26 13:41:56 +00:00
if [ $? -eq 0 ]; then
2014-10-08 08:32:48 +00:00
hasrpm=1
result=`rpm -q yum`
if [ $? -eq 0 ]; then
hasyum=1
else
result=`rpm -q zypper`
if [ "$?" = "0" ]; then
haszypper=1
fi
fi
2010-04-13 17:30:54 +00:00
fi
fi
2014-10-08 08:32:48 +00:00
2013-03-14 07:47:46 +00:00
###########
##start generating the os pkg repositories
2015-01-22 20:32:18 +00:00
if ( ! ( pmatch "$OSVER" "sles10*" ) && [ $haszypper -eq 1 ] ); then
2013-03-14 07:47:46 +00:00
old_repo=`zypper lr |grep -e "^[0-9]" | cut -f2 -d '|'`
for x in $old_repo
do
2013-04-22 06:30:18 +00:00
if ( ( pmatch "$x" "xCAT-$OSVER*" ) || ( pmatch "$x" "$OSVER-path*" ) || ( pmatch "$x" "xcat-otherpkgs*" ) ); then
2013-04-17 07:05:21 +00:00
result=`zypper rr "$x"`
fi
2013-03-14 07:47:46 +00:00
done
result=`zypper --non-interactive refresh 2>&1`
SUM=$(array_get_size os_path)
i=0
if [ $SUM -eq 0 ]; then
if [ $mounted -eq 0 ]; then
path="http://$OSPKGDIR"
else
path="file://$OSPKGDIR"
fi
result=`zypper ar $path xCAT-$OSVER 2>&1`
if [ $? -ne 0 ]; then
if ( ! pmatch "$result" "*exists*" ); then
logger -t xcat -p local4.info "ospkgs: zypper ar $path xCAT-$OSVER\n $result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "ospkgs: zypper ar $path xCAT-$OSVER"
echo " $result"
fi
2013-03-14 07:47:46 +00:00
fi
fi
else
while [ $i -lt $SUM ]; do
OSPKGDIR=$(array_get_element os_path $i)
if [ $mounted -eq 0 ]; then
path="http://$OSPKGDIR"
else
path="file://$OSPKGDIR"
fi
result=`zypper ar $path xCAT-$OSVER-"path$i" 2>&1`
if [ $? -ne 0 ]; then
if ( ! pmatch "$result" "*exists*" ); then
logger -t xcat -p local4.info "ospkgs: zypper ar $path xCAT-$OSVER-path$i\n $result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
2013-03-14 07:47:46 +00:00
echo "ospkgs: zypper ar $path xCAT-$OSVER-path$i"
echo " $result"
2013-11-05 07:49:20 +00:00
fi
2013-03-14 07:47:46 +00:00
fi
fi
i=$((i+1))
done
fi
2015-01-22 20:32:18 +00:00
#adds SDK repository. The SDKDIR is a comma separated list of
#directory names. For example:
#SDKDIR='/install/sles12/x86_64/sdk1,/install/sles12/x86_64/sdk2'
2013-03-14 07:47:46 +00:00
if [ "$SDKDIR" != "" ]; then
2015-01-22 20:32:18 +00:00
OIFS=$IFS
IFS=$','
for sdk_src in $SDKDIR; do
bname=`basename $sdk_src`
if [ $mounted -eq 0 ]; then
sdk_src="http://$NFSSERVER/$sdk_src"
else
sdk_src="file://$sdk_src"
fi
result=`zypper ar $sdk_src xCAT-$OSVER-$bname 2>&1`
if [ $? -ne 0 ]; then
if ( ! pmatch "$result" "*exists*" ); then
logger -t xcat -p local4.info "otherpkgs: zypper ar $sdk_src xCAT-$OSVER-bname\n $result"
if [ $VERBOSE ]; then
echo "otherpkgs: zypper ar $sdk_src xCAT-$OSVER-bname"
echo " $result"
fi
fi
fi
done
IFS=$OIFS
2013-03-14 07:47:46 +00:00
fi
2015-01-22 20:32:18 +00:00
2013-03-14 07:47:46 +00:00
result=`zypper --non-interactive --no-gpg-checks refresh 2>&1`
2013-10-22 07:37:07 +00:00
elif ( ((pmatch "$OSVER" "rhel*") || (pmatch "$OSVER" "centos*") || (pmatch "$OSVER" "SL*")) && [ $hasyum -eq 1 ] ); then
2013-03-14 07:47:46 +00:00
#remove old repo
mkdir -p /etc/yum.repos.d
if [ -r "/etc/yum.repos.d/local-repository.repo" ]; then
result=`rm /etc/yum.repos.d/local-repository.repo 2>&1`
fi
2013-04-17 07:05:21 +00:00
rm /etc/yum.repos.d/$OSVER-path*.repo >/dev/null 2>&1
result=`rm /etc/yum.repos.d/xCAT-$OSVER-path*.repo 2>&1`
2013-04-22 06:30:18 +00:00
result=`rm /etc/yum.repos.d/xCAT-otherpkgs*.repo 2>&1`
2013-03-14 07:47:46 +00:00
result=`yum clean all`
SUM=$(array_get_size os_path)
i=0
while [ $i -lt $SUM ]; do
REPOFILE="/etc/yum.repos.d/xCAT-$OSVER-path$i.repo"
OSPKGDIR=$(array_get_element os_path $i)
if [ ! -f $REPOFILE ]; then
echo "[xCAT-$OSVER-path$i]" > $REPOFILE
echo "name=xCAT-$OSVER-path$i" >> $REPOFILE
if [ $mounted -eq 0 ]; then
echo "baseurl=http://$OSPKGDIR" >> $REPOFILE
else
echo "baseurl=file://$OSPKGDIR" >> $REPOFILE
fi
echo "enabled=1" >> $REPOFILE
echo "gpgcheck=0" >> $REPOFILE
fi
i=$((i+1))
done
fi
##end generating the os pkg repositories
###########
###########
2010-04-13 17:30:54 +00:00
# To support the #NEW_INSTALL_LIST# entry in otherpkgs.pkglist files,
# multiple lists of packages are provided to this script in the form:
# OTHERPKGS1, OTHERPKGS2, ... OTHERPKSn where n=OTHERPKGS_INDEX
# Each sublist will be installed in a separate call (separate pass
# through this loop)
op_index=1
#echo "OTHERPKGS_INDEX = $OTHERPKGS_INDEX"
while [ $op_index -le $OTHERPKGS_INDEX ]; do
eval pkglist=\$OTHERPKGS$op_index
2011-10-10 07:46:18 +00:00
eval envlist=\$ENVLIST$op_index
2010-04-13 17:30:54 +00:00
#echo "pkglist = $pkglist"
if [ $hasyum -eq 1 ]; then
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"
elif [ $haszypper -eq 1 ]; then
2009-07-02 15:48:28 +00:00
#remove old repo
2009-07-02 19:53:03 +00:00
old_repo=`zypper sl |grep xcat-otherpkgs | cut -f2 -d '|'`
2009-07-02 15:48:28 +00:00
for x in $old_repo
do
result=`zypper sd $x`
done
2013-11-05 07:49:20 +00:00
result=`zypper --non-interactive refresh 2>&1`
if [ $VERBOSE ]; then
echo "otherpkgs: zypper --non-interactive refresh"
echo " $result"
fi
repo_base="/tmp"
2011-09-26 13:41:56 +00:00
elif [ $hasapt -eq 1 ] ; then
mkdir -p /etc/apt/sources.list.d
result=`rm /etc/apt/sources.list.d/xCAT-otherpkgs*.list 2>&1`
repo_base="/etc/apt/sources.list.d"
2009-02-12 10:14:58 +00:00
fi
2009-07-02 15:48:28 +00:00
2011-08-20 03:38:17 +00:00
array_empty repo_path
2010-04-13 17:30:54 +00:00
repo_pkgs=""
repo_pkgs_preremove=""
repo_pkgs_postremove=""
plain_pkgs=""
plain_pkgs_preremove=""
plain_pkgs_postremove=""
2011-08-20 03:38:17 +00:00
array_empty handled_path
2015-01-09 03:19:11 +00:00
oifs=$IFS
IFS=$','
pkgsarray=($pkglist)
IFS=$oifs
echo "pkgsarray: ${pkgsarray[@]}, ${#pkgsarray[@]}"
echo "yum: $hasyum, apt: $hasapt, zypper: $haszypper"
for x in ${pkgsarray[@]}
2010-04-13 17:30:54 +00:00
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
2009-10-07 19:27:19 +00:00
x=`echo ${x#-}`
2010-04-13 17:30:54 +00:00
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
2009-10-07 19:27:19 +00:00
2011-09-26 13:41:56 +00:00
if [ $hasyum -eq 0 ] && [ $haszypper -eq 0 ] && [ $hasapt -eq 0 ]; then
2010-04-13 17:30:54 +00:00
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
2010-11-04 19:35:10 +00:00
plain_pkgs="$plain_pkgs $x*"
2010-04-13 17:30:54 +00:00
fi
continue
fi
2009-10-07 19:27:19 +00:00
2010-04-13 17:30:54 +00:00
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`
2015-01-09 03:19:11 +00:00
whole_path=$OTHERPKGDIR
2015-01-20 08:34:10 +00:00
if [[ ! $OSVER =~ ^debian ]]; then
# echo "rhel package path"
2015-01-09 03:19:11 +00:00
whole_path=$OTHERPKGDIR/$path
2015-01-20 08:34:10 +00:00
whole_path=${whole_path%.}
2015-01-09 03:19:11 +00:00
fi
2009-10-07 19:27:19 +00:00
2010-04-13 17:30:54 +00:00
#find out if this path has already handled
try_repo=1
rc=1
i=0
2011-08-20 03:38:17 +00:00
while [ $i -lt $(array_get_size handled_path) ]; do
if [ $(array_get_element handled_path $i) = $path ]; then
2010-04-13 17:30:54 +00:00
try_repo=0
j=0
2011-08-20 03:38:17 +00:00
while [ $j -lt $(array_get_size repo_path) ]; do
if [ $(array_get_element repo_path $j) = $path ]; then
2010-04-13 17:30:54 +00:00
rc=0
break
fi
2011-08-20 03:38:17 +00:00
j=$((j+1))
2010-04-13 17:30:54 +00:00
done
break
fi
2011-08-20 03:38:17 +00:00
i=$((i+1))
2010-04-13 17:30:54 +00:00
done
2009-10-07 19:27:19 +00:00
2009-07-02 15:48:28 +00:00
2010-04-13 17:30:54 +00:00
#try to add the path to the repo
if [ $try_repo -eq 1 ]; then
2011-08-20 03:38:17 +00:00
index=$(array_get_size repo_path)
2011-09-26 13:41:56 +00:00
if [ $hasyum -eq 1 ] || [ $haszypper -eq 1 ] ; then
REPOFILE="$repo_base/xCAT-otherpkgs$index.repo"
echo "[xcat-otherpkgs$index]" > $REPOFILE
echo "name=xcat-otherpkgs$index" >> $REPOFILE
if [ $mounted -eq 0 ]; then
2011-11-10 14:26:08 +00:00
echo "baseurl=http://$whole_path" >> $REPOFILE
2011-09-26 13:41:56 +00:00
else
echo "baseurl=file://$whole_path" >> $REPOFILE
fi
echo "enabled=1" >> $REPOFILE
echo "gpgcheck=0" >> $REPOFILE
2012-10-03 12:56:10 +00:00
if [ $hasyum -eq 1 ]; then
yum clean all
fi
if [ $haszypper -eq 1 ]; then
2013-11-05 07:49:20 +00:00
result=`zypper --non-interactive refresh 2>&1`
if [ $VERBOSE ]; then
echo "otherpkgs: zypper --non-interactive refresh"
echo " $result"
fi
2012-10-03 12:56:10 +00:00
fi
2011-09-26 13:41:56 +00:00
elif [ $hasapt -eq 1 ] ; then
REPOFILE="$repo_base/xCAT-otherpkgs$index.list"
2013-04-03 09:12:22 +00:00
if [ -n "$OTHERPKGDIR" ];then
if [ $mounted -eq 0 ]; then
type=http
else
type=file
fi
echo "deb $type://$whole_path ./" > $REPOFILE
fi
2015-01-20 08:34:10 +00:00
if [ -n "$OTHERPKGDIR_INTERNET" ] && [ $index -eq 0 ] ;then
2013-04-03 09:12:22 +00:00
OLDIFS=$IFS
IFS=$','
urlarray=($OTHERPKGDIR_INTERNET)
for url in ${urlarray[@]}
do
echo "deb "$url >> $REPOFILE
done
IFS=$OLDIFS
fi
2011-09-26 13:41:56 +00:00
fi
2015-01-09 03:19:11 +00:00
fi
2010-04-13 17:30:54 +00:00
if [ $hasyum -eq 1 ]; then
#use yum
result=`yum list $fn 2>&1`
if [ $? -eq 0 ]; then
rc=0
2011-08-20 03:38:17 +00:00
array_set_element repo_path $index $path
2013-03-30 02:10:38 +00:00
#else
#rm $REPOFILE
2010-04-13 17:30:54 +00:00
fi
elif [ $haszypper -eq 1 ]; then
#use zypper
2015-01-22 20:32:18 +00:00
if ( pmatch "$OSVER" "sles10*" ); then
2013-11-05 07:40:46 +00:00
result=`zypper sa -r $REPOFILE << EOF
y
EOF`
2015-01-22 20:32:18 +00:00
else
result=`zypper ar -c $REPOFILE`
fi
2010-04-13 17:30:54 +00:00
result=`zypper --non-interactive refresh xcat-otherpkgs$index 2>&1`
if [ $? -eq 0 ]; then
rc=0
2011-08-20 03:38:17 +00:00
array_set_element repo_path $index $path
2010-04-13 17:30:54 +00:00
else
2013-11-05 07:49:20 +00:00
#on sles10, the $? always 1, even the refresh is success.
if ( pmatch "$OSVER" "sles10*" ); then
2013-10-10 10:11:53 +00:00
rc=0
array_set_element repo_path $index $path
2013-10-10 10:14:50 +00:00
else
2013-11-05 07:49:20 +00:00
result=`zypper sd xcat-otherpkgs$index`
2013-10-10 10:11:53 +00:00
fi
2010-04-13 17:30:54 +00:00
fi
2011-09-26 13:41:56 +00:00
elif [ $hasapt -eq 1 ]; then
#use apt
2015-01-09 03:19:11 +00:00
fn=`echo $fn| tr "." ":"`
2011-10-05 17:32:53 +00:00
apt_get_update_if_repos_changed $REPOFILE
result=`apt-cache show $fn 2>&1`
2011-09-26 13:41:56 +00:00
if [ $? -eq 0 ]; then
rc=0
2011-10-05 17:32:53 +00:00
array_set_element repo_path $index $path
2011-09-26 13:41:56 +00:00
else
rm $REPOFILE
fi
2010-04-13 17:30:54 +00:00
fi
if [ $rc -eq 0 ]; then
repo_pkgs="$repo_pkgs $fn"
else
#now no hope we have to use rpm command
2010-11-04 19:35:10 +00:00
plain_pkgs="$plain_pkgs $x*"
2010-04-13 17:30:54 +00:00
fi
2011-08-20 03:38:17 +00:00
array_set_element handled_path $(array_get_size handled_path) $path
2010-04-13 17:30:54 +00:00
fi
done
2010-10-27 18:22:21 +00:00
#now update all the existing rpms
if [ $hasyum -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist yum -y upgrade"
fi
2013-07-10 08:30:39 +00:00
result=`eval $envlist yum -y upgrade 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2013-01-08 09:14:19 +00:00
fi
2012-12-06 19:35:40 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-10-27 18:22:21 +00:00
elif [ $haszypper -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist zypper --non-interactive update --auto-agree-with-license"
fi
2013-07-10 08:30:39 +00:00
result=`eval $envlist zypper --non-interactive update --auto-agree-with-license 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2013-01-08 09:14:19 +00:00
fi
2012-03-22 13:51:08 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2013-04-03 09:12:22 +00:00
elif [ $hasapt -eq 1 ]; then
apt_get_update_if_repos_changed $REPOFILE
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
2015-01-07 07:35:14 +00:00
echo "$envlist DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated --force-yes -o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef' upgrade"
2013-11-05 07:49:20 +00:00
fi
2015-01-07 07:35:14 +00:00
result=`eval $envlist DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated --force-yes -o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef' upgrade 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2013-04-03 09:12:22 +00:00
fi
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-10-27 18:22:21 +00:00
fi
2010-04-13 17:30:54 +00:00
#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 parsed the input, let's remove rpms if is specified with -
if [ "$repo_pkgs_preremove" != "" ]; then
if [ $hasyum -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist yum -y remove $repo_pkgs_preremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist yum -y remove $repo_pkgs_preremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2010-04-13 17:30:54 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
elif [ $haszypper -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist zypper remove -y $repo_pkgs_preremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist zypper remove -y $repo_pkgs_preremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2012-11-25 02:49:41 +00:00
elif [ $hasapt -eq 1 ]; then
apt_get_update_if_repos_changed $REPOFILE
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
2013-11-18 09:46:07 +00:00
echo "DEBIAN_FRONTEND=noninteractive apt-get -y remove $repo_pkgs_preremove"
2013-11-05 07:49:20 +00:00
fi
2013-11-18 09:46:07 +00:00
result=`DEBIAN_FRONTEND=noninteractive apt-get -y remove $repo_pkgs_preremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2012-11-25 02:49:41 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
fi
fi
2009-10-07 19:27:19 +00:00
2010-04-13 17:30:54 +00:00
if [ "$plain_pkgs_preremove" != "" ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist $sremovecommand $plain_pkgs_preremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist $sremovecommand $plain_pkgs_preremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2009-10-07 19:27:19 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2009-10-07 19:27:19 +00:00
fi
2010-04-13 17:30:54 +00:00
#installation using yum or zypper
if [ "$repo_pkgs" != "" ]; then
if [ $hasyum -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist yum -y install $repo_pkgs"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist yum -y install $repo_pkgs 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2010-04-13 17:30:54 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
elif [ $haszypper -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist zypper install -y $repo_pkgs"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist zypper install -y $repo_pkgs 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2010-04-13 17:30:54 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
#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
2011-09-26 13:41:56 +00:00
elif [ $hasapt -eq 1 ]; then
2013-11-05 07:49:20 +00:00
apt_get_update_if_repos_changed $REPOFILE
if [ $VERBOSE ]; then
2015-01-21 07:29:21 +00:00
echo "$envlist DEBIAN_FRONTEND=noninteractive apt-get -q -y --force-yes -o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef' install $repo_pkgs"
2013-11-05 07:49:20 +00:00
fi
2015-01-21 07:29:21 +00:00
result=`eval $envlist DEBIAN_FRONTEND=noninteractive apt-get -q -y --force-yes -o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef' install $repo_pkgs 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
2011-09-26 13:41:56 +00:00
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
fi
fi
#Handle the rest with rpm
2013-04-03 09:12:22 +00:00
if [ "$plain_pkgs" != "" -a -n "$OTHERPKGDIR" ]; then
2015-01-09 03:19:11 +00:00
echo "Warning: the packages $plain_pkgs could not be found in the yum/apt repository, falling back to rpm/dpkg command. If you want your packages to be installed with yum/apt, verify yum/apt is installed and createrepo/dpkg-scanpackages has been run."
logger -p local4.info -t xcat "Warning: the packages $plain_pkgs could not be found in the yum/apt repository, falling back to rpm/dpkg command. If you want your packages to be installed with yum/apt, verify yum/apt is installed and createrepo/dpkg-scanpackages has been run."
2010-04-13 17:30:54 +00:00
if [ $mounted -eq 0 ]; then
2012-02-20 19:38:44 +00:00
dir_no_ftproot=${OTHERPKGDIR#*$INSTALLDIR/}
2010-04-13 17:30:54 +00:00
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
2012-04-26 13:00:41 +00:00
wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -e robots=off -t 0 -T 60 --reject "index.html*" --no-parent http://$OTHERPKGDIR/ 2> /tmp/wget.log
2010-04-13 17:30:54 +00:00
2012-03-08 00:13:00 +00:00
cd /tmp/postage/$NFSSERVER$INSTALLDIR
2010-04-13 17:30:54 +00:00
mv $dir_no_ftproot/* /xcatpost/$dir_no_ftproot;
2012-02-20 19:38:44 +00:00
rm -rf $dir_no_ftproot
2010-04-13 17:30:54 +00:00
cd /xcatpost/$dir_no_ftproot
else
cd $OTHERPKGDIR
fi
2009-10-07 19:27:19 +00:00
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist $supdatecommand $plain_pkgs"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist $supdatecommand $plain_pkgs 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2009-07-02 15:48:28 +00:00
2010-04-13 17:30:54 +00:00
if [ $mounted -eq 0 ]; then
cd /xcatpost
2012-03-08 00:13:00 +00:00
dir_no_ftproot=${OTHERPKGDIR#*$INSTALLDIR/}
2011-08-20 03:38:17 +00:00
dir_no_ftproot=${dir_no_ftproot%%/*}
2010-04-13 17:30:54 +00:00
rm -f -R $dir_no_ftproot
fi
2009-04-21 21:20:30 +00:00
fi
2010-04-13 17:30:54 +00:00
#remove more rpms if specified with --
if [ "$repo_pkgs_postremove" != "" ]; then
if [ $hasyum -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist yum -y remove $repo_pkgs_postremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist yum -y remove $repo_pkgs_postremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
elif [ $haszypper -eq 1 ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist zypper remove -y $repo_pkgs_postremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist zypper remove -y $repo_pkgs_postremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2011-09-26 13:41:56 +00:00
elif [ $hasapt -eq 1 ]; then
2012-11-25 02:49:41 +00:00
apt_get_update_if_repos_changed $REPOFILE
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist apt-get -y remove $repo_pkgs_postremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist apt-get -y remove $repo_pkgs_postremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2010-04-13 17:30:54 +00:00
fi
fi
2008-09-08 18:54:30 +00:00
2010-04-13 17:30:54 +00:00
if [ "$plain_pkgs_postremove" != "" ]; then
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$envlist $sremovecommand $plain_pkgs_postremove"
fi
2011-10-10 07:46:18 +00:00
result=`eval $envlist $sremovecommand $plain_pkgs_postremove 2>&1`
2013-06-25 14:56:43 +00:00
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
2012-12-12 05:01:06 +00:00
logger -p local4.info -t xcat "$result"
2013-11-05 07:49:20 +00:00
if [ $VERBOSE ]; then
echo "$result"
fi
2009-10-07 19:27:19 +00:00
fi
2011-08-20 03:38:17 +00:00
op_index=$((op_index+1))
2010-04-13 17:30:54 +00:00
done
2009-10-07 19:27:19 +00:00
2012-11-25 02:49:41 +00:00
exit $RETURNVAL
2008-09-08 18:54:30 +00:00