2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-21 15:18:19 +00:00
Files
xcat-core/xCAT/postscripts/ospkgs
T
Vinícius Ferrão 16b6acf620 fix(openeuler): integrate current Genesis and installer changes
Merge current master into the openEuler support branch. Keep native
kernel, DHCP, locale and timezone requirements with the upstream payload
verifier and EL10 package paths. Preserve signed openEuler installation.

Update the native fixtures to check the merged payload contract.
2026-09-22 19:45:05 -03:00

1066 lines
30 KiB
Bash
Executable File

#!/bin/bash
# IBM(c) 2010 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------------------------------
#=head1 ospkgs
#=head2 Used on Linux only. It installs/updates the rpms thta are from OS distro.
# The environment variable OSPKGS contains the rpms to be installed/updated.
# On MN, You need to:
# 1. update the rpms under /install/os/arch/... directory where 'os' and 'arch'
# can be found in the nodetype table.
# 2. put new package names to /install/custom/netboot(install)/platform or
# /opt/xcat/share/xcat/netboot(install)/platform
# directory. The file name is one of the following:
# profile.os.arch.pkglist
# profile.os.pkglist
# profile.arch.pkglist
# profile.pkglist
# You can run the following commands to install/update the rpms from os distro.
# updatenode noderange ospkgs
# updatenode noderange -S (this one intslls/updates rpms from os distro as well as otherpkgs)
# updatenode noderange -P "ospkgs --keeprepo" (this one will preserve the original repositories when installing/updating the rpms. )
#
#
#=cut
#-------------------------------------------------------------------------------
#set -x
XCATPKGUTILS_LOADER="$(dirname "$0")/xcatpkgutils-loader.sh"
if [ ! -r "$XCATPKGUTILS_LOADER" ]; then
printf 'Error: package utility loader is not readable: %s\n' "$XCATPKGUTILS_LOADER" >&2
unset XCATPKGUTILS_LOADER
exit 1
fi
# shellcheck source-path=SCRIPTDIR
# shellcheck source=xcatpkgutils-loader.sh
# shellcheck disable=SC1091
if ! . "$XCATPKGUTILS_LOADER"; then
printf 'Error: package utilities could not be loaded through: %s\n' "$XCATPKGUTILS_LOADER" >&2
unset XCATPKGUTILS_LOADER
exit 1
fi
unset XCATPKGUTILS_LOADER
if [ -n "$LOGLABEL" ]; then
log_label=$LOGLABEL
else
log_label="xcat"
fi
# 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.
##
RETURNVAL=0
debug=0
if [ $VERBOSE ]; then
debug=1
fi
OS_TYPE=`uname -s`
if [ "$OS_TYPE" != "Linux" ]; then
#not supported on AIX
echo "ospkgs script only runs on Linux."
exit 0
fi
# This command only runs by updatenode command
#if [ -z "$UPDATENODE" ] || [ $UPDATENODE -ne 1 ]; then
# echo " Did not install any extra rpms."
# exit 0
#fi
if [ -z "$OSPKGS" ]; then
echo "$0: no extra rpms to install"
exit 0
fi
argnum=$#;
args=$@
keeprepo=0
if [ $argnum -gt 0 ]; then
if ( pmatch "$args" "*keeprepo*" ); then
keeprepo=1
fi
if ( pmatch "$args" "*debug*" ); then
debug=1
fi
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 " $INSTALLDIR " |grep $NFSSERVER`
if [ $? -eq 0 ]; then
NFSSERVER="/install"
mounted=1
fi
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)
#initialize the array "os_path" with all the valid repository paths
#under the directories specified in "OSPKGDIR"
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}:${HTTPPORT}$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 rhels8/9, centos8/9, ol8/9, alma8/9 and rocky8/9 we should append /BaseOS and /AppStream to base directory
# (5) 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" "sle*" ); then
OSPKGDIR="$OSPKGDIR/1"
ospkgdir="$ospkgdir/1"
elif ( pmatch "$OSVER" "SL5*" ); then
OSPKGDIR="$OSPKGDIR/SL"
ospkgdir="$ospkgdir/SL"
fi
fi
if ! xcat_is_el_modular_pkgdir "$OSVER" || \
{ [ "$dir" != "$default_pkgdir" ] && [ "$dir" != "$default_pkgdir/" ]; }; then
# For EL8+ modular distros, only the base OS pkgdir expands to subrepos.
array_set_element os_path $index $ospkgdir
fi
if [ $dir == $default_pkgdir ] || [ $dir == "$default_pkgdir/" ]; then
ospkgdir=$(echo $ospkgdir|sed 's/\/1$/\/2/')
if ( pmatch "$OSVER" "sle15*" ); then
if [ $ARCH == "x86_64" ]; then
for arg in "Product-SLES" "Module-Desktop-Applications" "Module-Live-Patching" \
"Module-Web-Scripting" "Module-Basesystem" "Module-Development-Tools" "Module-Public-Cloud" \
"Product-HA" "Product-SLES_SAP" "Module-CAP-Tools" "Module-HPC" "Module-SAP-Applications" \
"Product-HPC" "Product-WE" "Module-Containers" "Module-Legacy" "Module-Server-Applications" "Product-SLED"
do
ospkgdir_ok="$ospkgdir/$arg"
index=$(expr $index + 1)
array_set_element os_path $index $ospkgdir_ok
done
elif [ $ARCH == "ppc64le" ]; then
for arg in "Product-SLES" "Module-Desktop-Applications" "Module-Live-Patching" \
"Module-Web-Scripting" "Module-Basesystem" "Module-Development-Tools" "Module-Public-Cloud" \
"Product-HA" "Product-SLES_SAP" "Module-SAP-Applications" \
"Module-Containers" "Module-Legacy" "Module-Server-Applications"
do
ospkgdir_ok="$ospkgdir/$arg"
index=$(expr $index + 1)
array_set_element os_path $index $ospkgdir_ok
done
fi
fi
fi
if ( pmatch "$OSVER" "rhel*" ||
pmatch "$OSVER" "centos*" ||
pmatch "$OSVER" "rocky*" ||
pmatch "$OSVER" "alma*" ||
pmatch "$OSVER" "ol*"); 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
elif xcat_is_el_modular_pkgdir "$OSVER"; then
# for EL8+ modular distros the repodata is in ./BaseOS and ./AppStream, not in ./
for arg in "BaseOS" "AppStream"
do
ospkgdir_ok="$ospkgdir/$arg"
array_set_element os_path $index $ospkgdir_ok
index=$(expr $index + 1)
done
continue
fi # if...elif..fi
fi # eq default_pkgdir
fi # match rhel*
index=$(expr $index + 1)
done
IFS=$OIFS
#if [ "$SDKDIR" != "" ]; then
# if [ $mounted -eq 0 ]; then
# SDKDIR="$NFSSERVER/$SDKDIR"
# fi
#fi
#if [ $mounted -eq 0 ]; then
# OSPKGDIR_NO_PREFIX=${OSPKGDIR#$INSTALLDIR}
# if [ "$OSPKGDIR" != "$OSPKGDIR_NO_PREFIX" ]; then
# OSPKGDIR="$NFSSERVER/$OSPKGDIR_NO_PREFIX"
# fi
#fi
logger -t $log_label -p local4.info "NFSSERVER=$NFSSERVER"
logger -t $log_label -p local4.info "OSPKGDIR=$OSPKGDIR"
logger -t $log_label -p local4.info "OSPKGS=$OSPKGS"
if [ $debug -ne 0 ]; then
echo NFSSERVER=$NFSSERVER
echo OSPKGDIR=$OSPKGDIR
echo OSPKGS = $OSPKGS
fi
pkgs='' #packages
groups='' #groups
groups_d='' #groups to remove
pkgs_d='' #packages to remove
cudapkgs='' #cuda pkg set
OIFS=$IFS
IFS=$','
if ( pmatch "$OSVER" "ubuntu*" ); then
IFS=$(printf ',')
fi
pkgarray=($OSPKGS)
#parse the pkglist file, categorize the pkglist entries according to
#the type(package/group/patterns) and action(install/remove)
for x in ${pkgarray[@]};
do
#a flag indication the operation to current pkg/group
# 0:install;1:remove
remove=0
#remove leading and trailing spaces
x=`echo $x |sed 's/^ *//;s/ *$//'`
#echo "x=$x"
pos=`expr index "$x" -`
if [ $pos -eq 1 ]; then
remove=1
x=${x#-}
fi
pos=`expr index "$x" @`
if [ $pos -eq 1 ]; then
#remove leading @
tmp=${x#@}
#remove leading and trailing spaces
tmp=`echo $tmp |sed 's/^ *//;s/ *$//'`
#remove the leading ^
[ "^" = "${tmp:0:1}" ] && tmp="${tmp:1}"
#if there are spaces in the middle of the name, quote it
pos=`expr index "$tmp" "\ "`
if [ $pos -gt 0 ]; then
tmp="\"$tmp\""
fi
#categorize the groups according to the action(install/remove)
if [ $remove -eq 0 ]; then
groups="$groups @$tmp"
else
groups_d="$groups_d @$tmp"
fi
else
if ( pmatch "$x" "cuda*" ); then
cudapkgs="$cudapkgs $x"
else
#categorize the packages according to the action(install/remove)
if [ $remove -eq 0 ]; then
pkgs="$pkgs $x"
else
pkgs_d="$pkgs_d $x"
fi
fi
fi
done
IFS=$OIFS
if [ $debug -ne 0 ]; then
echo "pkgs=$pkgs"
if [ -n "$cudapkgs" ]; then
echo "cudapkgs=$cudapkgs"
fi
echo "groups=$groups"
echo "remove groups=$groups_d"
echo "remove pkgs=$pkgs_d"
fi
#perform the software maintenance with the available package management tools, the process:
#1.make sure the necessary package management tool is available
#2.enable all the available repositories and refresh the relevant metadata
#3.upgrade all the existing packages
#4.install specified package groups if any
#5.install specified packages if any
#6.remove specified package groups if any
#7.remove specified packages if any
if ( pmatch "$OSVER" "sles10*" ); then
#check if rug is installed
result=`rpm -q rug`
if [ $? -ne 0 ]; then
echo "Please install rug on $NODE."
exit 1
fi
if [ $keeprepo -ne 1 ]; then
#remove old repo
old_repo=`rug sl |grep -e "^[0-9]" | cut -f2 -d '|'`
for x in $old_repo
do
result=`rug sd $x`
done
result=`rug refresh 2>&1`
if [ $debug -ne 0 ]; then
echo "rug refresh"
echo $result
fi
fi
#add new repo
if [ $mounted -eq 0 ]; then
path="http://$OSPKGDIR"
else
path="dir://$OSPKGDIR"
fi
result=`rug sa $path $OSVER`
if [ $? -ne 0 ]; then
logger -t $log_label -p local4.info "ospkgs: rug sa $path $OSVER\n $result"
echo "ospkgs: rug sa $path $OSVER"
echo " $result"
fi
result=`rug sub $OSVER`
if [ $? -ne 0 ]; then
logger -t $log_label -p local4.info "ospkgs: rug sub $OSVER\n $result"
echo "ospkgs: rug sub $OSVER"
echo " $result"
fi
result=`rug refresh 2>&1`
if [ $debug -ne 0 ]; then
echo "rug refresh"
echo $result
fi
result=`rug update -y --agree-to-third-party-licences`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "rug update -y --agree-to-third-party-licences\n $result"
echo "ospkgs: rug update -y --agree-to-third-party-licences"
echo " $result"
else
if [ $debug -ne 0 ]; then
echo "rug update -y --agree-to-third-party-licences"
echo $result
fi
fi
#install the new patterns if any
if [ -n "$groups" ]; then
cmd="$ENVLIST rug install -y --agree-to-third-party-licences -t pattern $groups"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#install new rpms if any
if [ -n "$pkgs" ]; then
cmd="$ENVLIST rug install -y --agree-to-third-party-licences $pkgs"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#remove some packages if specified
if [ -n "$pkgs_d" ]; then
cmd="$ENVLIST rug remove -y $pkgs_d"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
elif ( pmatch "$OSVER" "sle*" ); then
#check if zypper is installed
result=`rpm -q zypper`
if [ $? -ne 0 ]; then
echo "Please install zypper on $NODE."
exit 1
fi
if [ $keeprepo -ne 1 ]; then
old_repo=`zypper lr |grep -e "^[0-9]" | cut -f2 -d '|'`
for x in $old_repo
do
if ( ( pmatch "$x" "xCAT-$OSVER-path*" ) || ( pmatch "$x" "$OSVER-path*" ) || ( pmatch "$x" "xcat-otherpkgs*" ) ); then
result=`zypper rr "$x"`
fi
done
result=`zypper --non-interactive refresh 2>&1`
if [ $debug -ne 0 ]; then
echo "zypper --non-interactive refresh"
echo $result
fi
fi
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 $log_label -p local4.info "ospkgs: zypper ar $path xCAT-$OSVER\n $result"
echo "ospkgs: zypper ar $path xCAT-OSVER"
echo " $result"
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 $log_label -p local4.info "ospkgs: zypper ar $path xCAT-$OSVER-path$i\n $result"
echo "ospkgs: zypper ar $path xCAT-$OSVER-path$i"
echo " $result"
fi
fi
i=$((i+1))
done
fi
#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'
if [ "$SDKDIR" != "" ]; then
OIFS=$IFS
IFS=$','
for sdk_src in $SDKDIR; do
bname=`basename $sdk_src`
if [ $mounted -eq 0 ]; then
sdk_src="http://$NFSSERVER:$HTTPPORT/$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 $log_label -p local4.info "ospkgs: zypper ar $sdk_src xCAT-$OSVER-bname\n $result"
echo "ospkgs: zypper ar $sdk_src xCAT-$OSVER-bname"
echo " $result"
fi
fi
done
IFS=$OIFS
fi
result=`zypper --non-interactive --no-gpg-checks refresh 2>&1`
if [ $debug -ne 0 ]; then
echo "zypper --non-interactive refresh"
echo $result
fi
#upgrade the all existing rpms
result=`zypper --non-interactive update --auto-agree-with-licenses`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: zypper --non-interactive update --auto-agree-with-licenses\n $result"
echo "ospkgs: zypper --non-interactive update --auto-agree-with-licenses"
echo " $result"
else
if [ $debug -ne 0 ]; then
echo "ospkgs: zypper --non-interactive update --auto-agree-with-licenses"
echo $result
fi
fi
#install the new patterns if any
if [ -n "$groups" ]; then
cmd="$ENVLIST zypper install -y --auto-agree-with-licenses -t pattern $groups"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#install new rpms if any
if [ -n "$pkgs" ]; then
cmd="$ENVLIST zypper install -y --auto-agree-with-licenses $pkgs"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#remove patterns if any
if [ -n "$groups_d" ]; then
cmd="$ENVLIST zypper remove -y -t pattern $groups_d"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#remove some packages if specified
if [ -n "$pkgs_d" ]; then
cmd="$ENVLIST zypper remove -y $pkgs_d"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
elif ( pmatch "$OSVER" "ubuntu*" ); then
# verify dpkg is installed
result=`dpkg --version`
if [ $? -ne 0 ]; then
echo "Please install dpkg on $NODE."
exit 1
fi
# verify apt is installed
result=`dpkg -l apt`
if [ $? -ne 0 ]; then
echo "Please install apt on $NODE."
exit 1
fi
# setup apt source for os distro updates
# check whether the os package path in primary apt source (/etc/apt/sources.list) or not
# if the os package path does not exist in /etc/apt/sources.list,
# create apt source file in /etc/apt/sources.list.d
# replace space with "===" to avoid the string split issue
OSPKGDIR=`echo $OSPKGDIR | sed 's/\ /===/g'`
prirepo=/etc/apt/sources.list
repoprefix=/etc/apt/sources.list.d/xCAT-${OSVER}-path
oldif=$IFS
IFS=","
pkgdirs=($OSPKGDIR)
IFS=$oldif
repocount=0
for dir in ${pkgdirs[@]}; do
dir=`echo $dir | sed 's/\=\=\=/\ /g'`
if grep "^deb\ .*$dir" $prirepo; then
continue
fi
#create apt source file in /etc/apt/sources.list.d
result=`echo $dir | grep -E "^http:.*"`
if [ $? -eq 0 ]; then
echo "deb $dir" > "${repoprefix}${repocount}.list"
#else
# echo "deb http://$NFSSERVER/$dir ./" > "${repoprefix}${repocount}.list"
fi
repocount=$(($repocount+1))
done
# upgrade existing packages
apt-get -y update
command="xcat_apt_get -o Dpkg::Options::='--force-confold' -o Dpkg::Options::='--force-confdef' upgrade"
echo "=== $command"
eval $command
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
# install groups (NOTE: It's not clear rpm-like "groups" are supported by dpkg/apt,
# but keeping this here doesn't really hurt. Anything that looks like a group will
# be installed as though it were a package.)
if [ -n "$groups" ]; then
command="$ENVLIST xcat_apt_get -q install --no-install-recommends $groups"
echo "=== $command"
eval $command
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
fi
#remove package group is not supported in ubuntu,
#cause there is no rpm-like "groups" supported by dpkg/apt
# install packages
if [ -n "$pkgs" ]; then
command="$ENVLIST xcat_apt_get -q install --no-install-recommends $pkgs"
echo "=== $command"
eval $command
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
fi
if [ -n "$cudapkgs" ]; then
command="$ENVLIST xcat_apt_get -q install --no-install-recommends $cudapkgs"
echo "=== $command"
# the nvidia-346 postinstall script will trigger the building of nvidia driver, it will use the ARCH environment parameter, unset the ARCH env variable will resolve this issue
original_arch=$ARCH
unset ARCH
eval $command
R=$?
# re declare the ARCH env after installing cuda command done
ARCH=$original_arch
export ARCH
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
fi
# remove packages
if [ -n "$pkgs_d" ]; then
command="$ENVLIST apt-get -y remove $pkgs_d"
echo "=== $command"
eval $command
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
fi
fi
else
#check if yum or dnf is installed
if ! yumcmd=$(xcat_find_rpm_package_manager); then
echo "Please install yum or dnf on $NODE."
exit 1;
fi
if pmatch "$OSVER" "openeuler*"; then
if [ "$yumcmd" != dnf ]; then
echo "ospkgs: openEuler package installation requires dnf" >&2
exit 1
fi
yumcmd=xcat_dnf_strict
fi
if [ $keeprepo -ne 1 ]; then
#remove old repo files
mkdir -p /etc/yum.repos.d
if [ `ls -1 /etc/yum.repos.d/local-repository*.repo 2>/dev/null | wc -l` -gt 0 ]; then
result=`rm /etc/yum.repos.d/local-repository*.repo 2>&1`
fi
rm /etc/yum.repos.d/$OSVER-path*.repo >/dev/null 2>&1
result=`rm /etc/yum.repos.d/xCAT-$OSVER-path*.repo 2>&1`
result=`rm /etc/yum.repos.d/xCAT-otherpkgs*.repo 2>&1`
fi
result=`$yumcmd 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
xcat_rpm_repository_policy "$OSVER" >> "$REPOFILE"
fi
i=$((i+1))
done
if pmatch "$OSVER" "openeuler*" && [ "$keeprepo" -ne 1 ]; then
xcat_dnf_repositories="xCAT-$OSVER-path*"
yumcmd=xcat_dnf_scoped
fi
#import the release key?
#my $key = "$installDIR/$os/$arch/RPM-GPG-KEY-redhat-release";
#my $tmp = "/tmp/RPM-GPG-KEY-redhat-release";
#my $tgt = "root@" . $node;
#$out = `scp $key $tgt:$tmp`;
#$out = `ssh $node "rpm --import $tmp"`;
#upgrade the existing rpms
result=`$yumcmd -y upgrade 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $yumcmd -y upgrade\n $result"
echo "ospkgs: $yumcmd -y upgrade"
echo " $result"
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $yumcmd -y upgrade"
echo $result
fi
fi
#install new groups if any
if [ -n "$groups" ]; then
cmd="$ENVLIST $yumcmd -y install $groups"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#install new rpms if any
if [ -n "$pkgs" ]; then
cmd="$ENVLIST $yumcmd -y install $pkgs"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#install cuda package if any
if [ -n "$cudapkgs" ]; then
cmd="$ENVLIST $yumcmd -y install $cudapkgs"
original_arch=$ARCH
unset ARCH
result=`eval $cmd 2>&1`
R=$?
# re declare the ARCH env after installing cuda command done
ARCH=$original_arch
export ARCH
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#remove some groups if specified
if [ -n "$groups_d" ]; then
cmd="$ENVLIST $yumcmd -y remove $groups_d"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
#remove some rpms if specified
if [ -n "$pkgs_d" ]; then
cmd="$ENVLIST $yumcmd -y remove $pkgs_d"
result=`eval $cmd 2>&1`
R=$?
if [ $R -ne 0 ]; then
RETURNVAL=$R
logger -t $log_label -p local4.info "ospkgs: $cmd\n $result"
echo "ospkgs: $cmd"
echo $result
else
if [ $debug -ne 0 ]; then
echo "ospkgs: $cmd"
echo $result
fi
fi
fi
fi
exit $RETURNVAL