2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-08-21 02:30:21 +00:00
Files
xcat-core/xCAT-server/share/xcat/tools/go-xcat
2016-06-16 23:41:01 +08:00

1120 lines
25 KiB
Bash
Executable File

#!/bin/bash
#
# go-xcat - Install xCAT automatically.
#
function usage()
{
local script="${0##*/}"
while read ; do echo "${REPLY}" ; done <<-EOF
Usage: ${script} [OPTION]...
Install xCAT automatically
Options:
--help display this help and exit
--install installs all the latest versions from the
repository
--xcat-version=[VERSION] specify the version of xCAT
-y, --yes answer yes for all questions
Examples:
${script}
${script} --install
${script} --install --yes
${script} --install --xcat-version=2.12 --yes
EOF
}
# The package list of xcat-core
GO_XCAT_CORE_PACKAGE_LIST=(perl-xCAT xCAT xCAT-SoftLayer xCAT-buildkit
xCAT-client xCAT-confluent xCAT-genesis-scripts-ppc64
xCAT-genesis-scripts-x86_64 xCAT-server xCAT-test xCAT-vlan xCATsn)
# For Debian/Ubuntu, it will need a sight different package list
type dpkg >/dev/null 2>&1 &&
GO_XCAT_CORE_PACKAGE_LIST=(perl-xcat xcat xcat-buildkit xcat-client
xcat-confluent xcat-genesis-scripts xcat-server xcat-test xcat-vlan
xcatsn)
GO_XCAT_DEP_PACKAGE_LIST=()
# The package list of all the packages should be installed
GO_XCAT_CORE_INSTALL_LIST=(perl-xCAT xCAT xCAT-buildkit xCAT-client
xCAT-genesis-scripts-ppc64 xCAT-genesis-scripts-x86_64 xCAT-server
conserver-xcat elilo-xcat grub2-xcat ipmitool-xcat syslinux-xcat
xCAT-genesis-base-ppc64 xCAT-genesis-base-x86_64 xnba-undi yaboot-xcat)
# For Debian/Ubuntu, it will need a sight different package list
type dpkg >/dev/null 2>&1 &&
GO_XCAT_CORE_INSTALL_LIST=(perl-xcat xcat xcat-buildkit xcat-client
xcat-genesis-scripts xcat-server
conserver-xcat elilo-xcat grub2-xcat ipmitool-xcat syslinux-xcat
xcat-genesis-base-amd64 xcat-genesis-base-ppc64 xnba-undi)
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
export PATH
#
# warn_if_bad Put out warning message(s) if $1 has bad RC.
#
# $1 0 (pass) or non-zero (fail).
# $2+ Remaining arguments printed only if the $1 is non-zero.
#
# Incoming $1 is returned unless it is 0
#
function warn_if_bad()
{
local -i rc="$1"
local script="${0##*/}"
# Ignore if no problems
[ "${rc}" -eq "0" ] && return 0
# Broken
shift
echo "${script}: $@" >&2
return "${rc}"
}
#
# exit_if_bad Put out error message(s) if $1 has bad RC.
#
# $1 0 (pass) or non-zero (fail).
# $2+ Remaining arguments printed only if the $1 is non-zero.
#
# Exits with 1 unless $1 is 0
#
function exit_if_bad()
{
warn_if_bad "$@" || exit 1
return 0
}
#
# check_root_or_exit
#
# Breaks the script if not running as root.
#
# If this returns 1, the invoker MUST abort the script.
#
# Returns 0 if running as root
# Returns 1 if not (and breaks the script)
#
function check_root_or_exit()
{
[ "${UID}" -eq "0" ]
exit_if_bad "$?" "Must be run by UID=0. Actual UID=${UID}."
return 0
}
#
# check_executes Check for executable(s)
#
# Returns 0 if true.
# Returns 1 if not.
#
function check_executes()
{
local cmd
local all_ok="yes"
for cmd in "$@"
do
if ! type "${cmd}" &>/dev/null
then
echo "Command \"${cmd}\" not found." >&2
all_ok="no"
fi
done
[ "${all_ok}" = "yes" ]
}
#
# check_exec_or_exit Check for required executables.
#
# Exits (not returns) if commands listed on command line do not exist.
#
# Returns 0 if true.
# Exits with 1 if not.
#
function check_exec_or_exit()
{
check_executes "$@"
exit_if_bad "$?" "Above listed required command(s) not found."
return 0
}
TMP_DIR=""
#
# internal_setup Script setup
#
# Returns 0 on success.
# Exits (not returns) with 1 on failure.
#
function internal_setup()
{
shopt -s extglob
# Trap exit for internal_cleanup function.
trap "internal_cleanup" EXIT
check_exec_or_exit mktemp rm
umask 0077
TMP_DIR="$(mktemp -d "/tmp/${0##*/}.XXXXXXXX" 2>/dev/null)"
[ -d "${TMP_DIR}" ]
exit_if_bad "$?" "Make temporary directory failed."
custom_setup
}
#
# internal_cleanup Script cleanup (reached via trap 0)
#
# Destory any temporarily facility created by internal_setup.
#
function internal_cleanup()
{
custom_cleanup
[ -d "${TMP_DIR}" ] && rm -rf "${TMP_DIR}"
}
#
# custom_setup
#
function custom_setup()
{
check_exec_or_exit awk cat printf sort sleep tee
check_root_or_exit
}
#
# custom_cleanup
#
function custom_cleanup()
{
:
}
#
# cleanup_n_exec Do the cleanup, then execute the command
#
# $1+ The command to execute
#
function cleanup_n_exec()
{
internal_cleanup
exec "$@"
}
internal_setup
# Check operating system
function check_os()
{
case "${OSTYPE}" in
"aix"*) # AIX
echo "aix"
;;
"darwin"*) # OS X
echo "darwin"
;;
"linux"*) # Linux
echo "linux"
;;
*)
# Unknown
echo "${OSTYPE}"
;;
esac
}
# Check instruction set architecture
function check_arch()
{
case "${HOSTTYPE}" in
"powerpc64")
echo "ppc64"
;;
"powerpc64le")
echo "ppc64le"
;;
"mipsel")
echo "mips"
;;
"i"?"86")
echo "i386"
;;
*)
echo "${HOSTTYPE}"
;;
esac
}
function check_linux_distro()
{
local distro="$(source /etc/os-release >/dev/null 2>&1 &&
echo "${ID}")"
[[ -z "${distro}" ]] && [[ -f /etc/redhat-release ]] && distro="rhel"
[[ -z "${distro}" ]] && [[ -f /etc/SuSE-release ]] && distro="sles"
echo "${distro}"
}
function check_linux_version()
{
local ver="$(source /etc/os-release >/dev/null 2>&1 &&
echo "${VERSION_ID}")"
[[ -z "${ver}" ]] && [[ -f /etc/redhat-release ]] &&
ver="$(awk '{ print $(NF - 1) }' /etc/redhat-release)"
[[ -z "${ver}" ]] && [[ -f /etc/SuSE-release ]] &&
ver="$(awk '/VERSION/ { print $NF }' /etc/SuSE-release)"
echo "${ver}"
}
function function_dispatch()
{
local base="$1"
local cmd=""
local ret=""
shift
for cmd in $(compgen -A function "${base}_")
do
"${cmd}" "$@"
ret="$?"
[[ "${ret}" -ne "255" ]] && break
done
[[ "${ret}" -ne "255" ]]
exit_if_bad "$?" "${base}: unsupported function"
return "${ret}"
}
# $@ package names
function check_package_version_rpm()
{
! type rpm >/dev/null 2>&1 && return 255
local ver=""
while read ver
do
if [[ -z "${ver}" || "${ver}" =~ not\ installed ]]
then
echo "(not installed)"
else
echo "${ver}"
fi
done < <(rpm -q --qf '%{version}-%{release}\n' "$@")
return 0
}
# $@ package names
function check_package_version_deb()
{
! type dpkg-query >/dev/null 2>&1 && return 255
local name=""
local ver=""
while read name ver
do
name+=("${name}")
ver+=("${ver}")
done < <(dpkg-query --show '--showformat=${Package} ${Version}\n' \
"$@" 2>/dev/null)
local -i i
while [[ -n "$1" ]]
do
for i in "${!name[@]}"
do
if [[ "$1" = "${name[i]}" ]]
then
echo "${ver[i]}"
unset "name[${i}]" "ver[${i}]"
shift && continue 2
fi
done
echo "(not installed)"
shift
done
return 0
}
function check_package_version()
{
function_dispatch "${FUNCNAME}" "$@"
}
# $@ package names
function check_repo_version_yum()
{
! type repoquery >/dev/null 2>&1 && return 255
local -a name=()
local -a ver=()
while read name ver
do
name+=("${name}")
ver+=("${ver}")
done < <(repoquery --qf '%{name} %{version}-%{release}' "$@" 2>/dev/null)
local -i i
while [[ -n "$1" ]]
do
for i in "${!name[@]}"
do
if [[ "$1" = "${name[i]}" ]]
then
echo "${ver[i]}"
unset "name[${i}]" "ver[${i}]"
shift && continue 2
fi
done
echo "(not found)"
shift
done
return 0
}
# $@ package names
function check_repo_version_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
local -a name=()
local -a ver=()
while read name ver
do
name+=("${name}")
ver+=("${ver}")
done < <(zypper --no-gpg-checks -n search -s --match-exact "$@" \
2>/dev/null | awk -F ' *\\| *' '/ package / { print $2, $4 }')
local -i i
while [[ -n "$1" ]]
do
for i in "${!name[@]}"
do
if [[ "$1" = "${name[i]}" ]]
then
echo "${ver[i]}"
unset "name[${i}]" "ver[${i}]"
shift && continue 2
fi
done
echo "(not found)"
shift
done
return 0
}
# $@ package names
function check_repo_version_apt()
{
! type apt-cache >/dev/null 2>&1 && return 255
local name=""
local ver=""
while read name ver
do
if [[ "${name}" =~ ^[a-z] ]]
then
while [[ -n "$1" ]]
do
[[ "${name}" = "${1}:" ]] && break
echo "(not found)"
shift
done
fi
if [[ "${name}" = "Candidate:" ]]
then
echo "$ver"
shift
fi
done < <(apt-cache policy "$@" 2>/dev/null)
while [[ -n "$1" ]]
do
echo "(not found)"
shift
done
return 0
}
function check_repo_version()
{
function_dispatch "${FUNCNAME}" "$@"
}
# $1 repo_id
function get_package_list_yum()
{
! type repoquery >/dev/null 2>&1 && return 255
local repo_id="$1"
[[ -z "${repo_id}" ]] && return 1
repoquery -qa "--repoid=${repo_id}" --qf "%{name}" 2>/dev/null
}
# $1 repo_id
function get_package_list_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
local repo_id="$1"
[[ -z "${repo_id}" ]] && return 1
zypper --no-gpg-checks -n search -r "${repo_id}" 2>/dev/null |
awk -F ' *\\| *' '/ package$/ { print $2 }'
}
# $1 repo_id
function get_package_list_apt()
{
[[ ! -d /var/lib/apt/lists ]] && return 255
local repo_id="$1"
[[ -z "${repo_id}" ]] && return 1
awk '/^Package: / { print $2 }' \
<"/var/lib/apt/lists/"*"_${repo_id}_dists"*"_main_binary-"*"_Packages" \
2>/dev/null
}
# $1 repo_id
function get_package_list()
{
function_dispatch "${FUNCNAME}" "$@"
}
function download_file()
{
local url="$1"
local local_file="$2"
! type wget >/dev/null 2>&1 && return 255
wget -q "${url}" -O "${local_file}"
}
# $1 repo file
# $2 repo_id
function add_repo_by_file_yum()
{
! type yum-config-manager >/dev/null 2>&1 && return 255
local repo_file="$1"
local repo_id="$2"
[[ -f "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: no such file"
[[ -r "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: permission denied"
[[ -n "${repo_id}" ]]
exit_if_bad "$?" "empty repo id"
[[ "${repo_id}" =~ ^[a-zA-Z][0-9a-zA-Z-]*$ ]]
exit_if_bad "$?" "${repo_id} illigal character in repo id"
local tmp_repo_file="${TMP_DIR}/${repo_id}.repo"
{
echo "[${repo_id}]"
grep -v '^\[' "${repo_file}"
} >"${tmp_repo_file}"
remove_repo_yum "${repo_id}"
yum-config-manager "--add-repo=${tmp_repo_file}" >/dev/null 2>&1
}
# $1 repo file
# $2 repo_id
function add_repo_by_file_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
local repo_file="$1"
local repo_id="$2"
[[ -f "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: no such file"
[[ -r "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: permission denied"
[[ -n "${repo_id}" ]]
exit_if_bad "$?" "empty repo id"
[[ "${repo_id}" =~ ^[a-zA-Z][0-9a-zA-Z-]*$ ]]
exit_if_bad "$?" "${repo_id} illigal character in repo id"
local tmp_repo_file="${TMP_DIR}/${repo_id}.repo"
{
echo "[${repo_id}]"
grep -v '^\[' "${repo_file}"
} >"${tmp_repo_file}"
remove_repo_zypper "${repo_id}"
zypper addrepo "${tmp_repo_file}" >/dev/null 2>&1
}
# $1 repo file
# $2 repo_id
function add_repo_by_file_apt()
{
[[ -d /etc/apt/sources.list.d/ ]] || return 255
local repo_file="$1"
local repo_id="$2"
[[ -f "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: no such file"
[[ -r "${repo_file}" ]]
exit_if_bad "$?" "${repo_file}: permission denied"
[[ -n "${repo_id}" ]]
exit_if_bad "$?" "empty repo id"
[[ "${repo_id}" =~ ^[a-zA-Z][0-9a-zA-Z-]*$ ]]
exit_if_bad "$?" "${repo_id} illigal character in repo id"
cp "${repo_file}" "/etc/apt/sources.list.d/${repo_id}.list"
}
function add_repo_by_file()
{
function_dispatch "${FUNCNAME}" "$@"
}
# $1 base url
# $2 repo_id
function add_repo_by_url_yum_or_zypper()
{
local base_url="$1"
local repo_id="$2"
local tmp_repo_file="${TMP_DIR}/tmp_repo_file"
while read ; do echo "${REPLY}" ; done >"${tmp_repo_file}" <<-EOF
[${repo_id}]
name=${repo_id}
baseurl=${base_url}
enabled=1
gpgcheck=0
EOF
add_repo_by_file "${tmp_repo_file}" "${repo_id}"
}
# $1 base url
# $2 repo_id
function add_repo_by_url_apt()
{
[[ -d /etc/apt/sources.list.d/ ]] || return 255
local base_url="$1"
local repo_id="$2"
local codename="$(source /etc/lsb-release && echo "${DISTRIB_CODENAME}")"
[[ -n "${codename}" ]]
exit_if_bad "$?" "unknown debian/ubuntu codename"
local tmp_repo_file="${TMP_DIR}/tmp_repo_file"
echo "deb ${base_url} ${codename} main" >"${tmp_repo_file}"
add_repo_by_file_apt "${tmp_repo_file}" "${repo_id}"
}
function add_repo_by_url()
{
function_dispatch "${FUNCNAME}" "$@"
}
# $1 repo_id
function remove_repo_yum()
{
[[ -d "/etc/yum.repos.d" ]] || return 255
local repo_id="$1"
[[ -f "/etc/yum.repos.d/${repo_id}.repo" ]] &&
rm -f "/etc/yum.repos.d/${repo_id}.repo" &&
yum clean metadata >/dev/null 2>&1
}
function remove_repo_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
local repo_id="$1"
zypper removerepo "${repo_id}"
}
function remove_repo_apt()
{
[[ -d "/etc/apt/sources.list.d" ]] || return 255
local repo_id="$1"
rm -f "/etc/apt/sources.list.d/${repo_id}.list"
}
function remove_repo()
{
function_dispatch "${FUNCNAME}" "$@"
}
# $1 version
# can be "2.10", "2.11", "2.12" or "latest"
function add_xcat_core_repo_yum_or_zypper()
{
! type rpm >/dev/null 2>&1 && return 255
local ver="$1"
[[ -z "${ver}" ]] && ver="latest"
local online_repo_file="http://xcat.org/files/xcat/repos/yum/${ver}/xcat-core/xCAT-core.repo"
local tmp_repo_file="${TMP_DIR}/tmp_repo_file"
download_file "${online_repo_file}" "${tmp_repo_file}"
exit_if_bad "$?" "download xcat-core repo file failed"
add_repo_by_file "${tmp_repo_file}" "xcat-core"
}
# $1 version
# can be "2.10", "2.11", "2.12" or "latest"
function add_xcat_core_repo_apt()
{
[[ -d "/etc/apt/sources.list.d" ]] || return 255
local ver="$1"
[[ -z "${ver}" ]] && ver="latest"
local apt_key_url="http://xcat.org/files/xcat/repos/apt/apt.key"
local apt_key_file="${TMP_DIR}/xcat.key"
download_file "${apt_key_url}" "${apt_key_file}"
exit_if_bad "$?" "download xcat apt key failed"
apt-key add "${apt_key_file}" >/dev/null 2>&1
local online_repo_base_url="http://xcat.org/files/xcat/repos/apt/${ver}/xcat-core"
add_repo_by_url_apt "${online_repo_base_url}" "xcat-core"
}
function add_xcat_core_repo()
{
function_dispatch "${FUNCNAME}" "$@"
}
function remove_xcat_core_repo_yum()
{
rm -f /etc/yum.repos.d/xCAT-core.repo
}
function add_xcat_dep_repo_yum_or_zypper()
{
! type rpm >/dev/null 2>&1 && return 255
local distro="${GO_XCAT_LINUX_DISTRO}"
case "${distro}" in
"fedora") ;;
"rhel") distro="rh" ;;
"sles") ;;
*) exit_if_bad 1 "${distro}: unsupported Linux distro"
esac
local online_repo_file="http://xcat.org/files/xcat/repos/yum/xcat-dep/${distro}${GO_XCAT_LINUX_VERSION%%.*}/${GO_XCAT_ARCH}/xCAT-dep.repo"
local tmp_repo_file="${TMP_DIR}/tmp_repo_file"
download_file "${online_repo_file}" "${tmp_repo_file}"
exit_if_bad "$?" "download xcat-dep repo file failed"
add_repo_by_file "${tmp_repo_file}" "xcat-dep"
}
function add_xcat_dep_repo_apt()
{
! type dpkg >/dev/null 2>&1 && return 255
local online_repo_base_url="http://xcat.org/files/xcat/repos/apt/xcat-dep"
add_repo_by_url_apt "${online_repo_base_url}" "xcat-dep"
}
function add_xcat_dep_repo()
{
function_dispatch "${FUNCNAME}" "$@"
}
function update_repo_yum()
{
! type yum >/dev/null 2>&1 && return 255
yum --nogpgcheck updateinfo </dev/null >/dev/null 2>&1
}
function update_repo_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
zypper --gpg-auto-import-keys refresh </dev/null >/dev/null 2>&1
}
function update_repo_apt()
{
! type apt-get >/dev/null 2>&1 && return 255
apt-get update </dev/null >/dev/null 2>&1
}
function update_repo()
{
function_dispatch "${FUNCNAME}" "$@"
}
function install_packages_yum()
{
! type yum >/dev/null 2>&1 && return 255
local -a yes=()
[[ "$1" = "-y" ]] && yes=("-y") && shift
yum --nogpgcheck "${yes[@]}" install "$@"
}
function install_packages_zypper()
{
! type zypper >/dev/null 2>&1 && return 255
local -a yes=()
[[ "$1" = "-y" ]] && yes=("-n") && shift
zypper --no-gpg-checks "${yes[@]}" install "$@"
}
function install_packages_apt()
{
! type apt-get >/dev/null 2>&1 && return 255
local -a yes=()
[[ "$1" = "-y" ]] && yes=("-y") && shift
apt-get install "${yes[@]}" "$@"
}
function install_packages()
{
function_dispatch "${FUNCNAME}" "$@"
}
function install_xcat()
{
install_packages "$@" "${GO_XCAT_CORE_INSTALL_LIST[@]}"
}
function list_xcat_packages()
{
GO_XCAT_CORE_PACKAGE_LIST=($(
for p in "${GO_XCAT_CORE_PACKAGE_LIST[@]}" \
$(get_package_list xcat-core)
do
echo "${p}"
done | sort -u
))
GO_XCAT_DEP_PACKAGE_LIST=($(get_package_list xcat-dep))
local -i cols="$(type tput >/dev/null 2>&1 && tput cols)"
[[ "${cols}" -lt 80 ]] && cols=80
[[ "${cols}" -gt 90 ]] && cols=90
local -i first_col=27
local -i second_col=$(( ( cols - 30 ) / 2 ))
local -i third_col=${second_col}
local pkg=""
echo
echo "xCAT Core Packages"
echo "=================="
echo
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"Package Name" "Installed" "In Repository"
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"------------" "---------" "-------------"
for pkg in "${GO_XCAT_CORE_PACKAGE_LIST[@]}"
do
read i_ver && read -u 42 r_ver
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"${pkg:0:${first_col}}" \
"${i_ver:0:${second_col}}" \
"${r_ver:0:${third_col}}"
done < <(check_package_version "${GO_XCAT_CORE_PACKAGE_LIST[@]}") \
42< <(check_repo_version "${GO_XCAT_CORE_PACKAGE_LIST[@]}")
echo
echo "xCAT Dependency Packages"
echo "========================"
echo
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"Package Name" "Installed" "In Repository"
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"------------" "---------" "-------------"
for pkg in "${GO_XCAT_DEP_PACKAGE_LIST[@]}"
do
read i_ver
read -u 42 r_ver
printf "%-${first_col}s %-${second_col}s %-${third_col}s\n" \
"${pkg:0:${first_col}}" \
"${i_ver:0:${second_col}}" \
"${r_ver:0:${third_col}}"
done < <(check_package_version "${GO_XCAT_DEP_PACKAGE_LIST[@]}") \
42< <(check_repo_version "${GO_XCAT_DEP_PACKAGE_LIST[@]}")
}
# Test case 001
# Check if xcatd is running
function test_case_001_xcatd()
{
local pid_file=""
local pid=""
local -i ret=0
for pid_file in /var/run/xcat/{installservice.pid,mainservice.pid,udpservice.pid}
do
[[ -f "${pid_file}" ]]
warn_if_bad "$?" "${pid_file} not found"
[[ "$?" -ne 0 ]] && (( ++ret ))
pid="$(<"${pid_file}")"
kill -0 "${pid}"
warn_if_bad "$?" "process ${pid} is not running"
[[ "$?" -ne 0 ]] && (( ++ret ))
done
for pid_file in /var/run/xcat/cmdlogservice.pid
do
[[ -f "${pid_file}" ]] || continue
pid="$(<"${pid_file}")"
kill -0 "${pid}"
warn_if_bad "$?" "process ${pid} is not running"
[[ "$?" -ne 0 ]] && (( ++ret ))
done
return "${ret}"
}
# Test case 002
# Check if command lsdef can be run
function test_case_002_lsdef()
{
(source /etc/profile.d/xcat.sh && lsdef)
}
# Preform basic test
function perform_smoke_test()
{
local test_case=""
local -i ret=0
for test_case in $(compgen -A function "test_case_")
do
"${test_case}" >"${TMP_DIR}/${test_case}.stdout" \
2>"${TMP_DIR}/${test_case}.stderr"
ret="$?"
if [[ "${ret}" -ne "0" || -s "${TMP_DIR}/${test_case}.stderr" ]]
then
# Something went wrong
echo "-- 8< -- -- -- -- -- -- -- -- -- -- -- -- -- -- --"
echo "==== ${test_case} failed with exit code ${ret} ===="
echo "-- 8< ${test_case} stdout -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/${test_case}.stdout"
echo "-- 8< ${test_case} stderr -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/${test_case}.stderr"
echo "-- 8< -- -- -- -- -- -- -- -- -- -- -- -- -- -- --"
(( ++ret ))
fi >&2
done
[[ "${ret}" -eq "0" ]] && echo "It seems everything went well. :)"
return "${ret}"
}
GO_XCAT_METERS=""
function show_progress_meters()
{
! tty -s 2>/dev/null && return 0
# Show the progress meters
(
declare -i length=0
while :
do
for bar in \
"...... " \
".o..o. " \
"oOooOo " \
"OoUUoO " \
"ooUUoo " \
"oOooOo " \
"Oo..oO " \
"o....o "
#12345678901234567890123456789012345678901
do
msg="${bar}"
for (( i = 0; i < length; ++i ))
do
echo -ne "\b"
done
length=${#msg}
echo -n "${msg}"
sleep 0.1 2>/dev/null || sleep 1
kill -0 "$$" &>/dev/null || break 2
done
done
) >&2 &
GO_XCAT_METERS="$!"
disown "${GO_XCAT_METERS}"
}
function stop_progress_meters()
{
! tty -s 2>/dev/null && echo -n "...... " && return 0
kill "${GO_XCAT_METERS}" >/dev/null 2>&1
echo -ne "\b\b\b\b\b\b\b" >&2
echo -n "...... "
}
#
# |\/| _.o._ ._ .__ _ .__.._ _ _ _ _ _ |_ _ .__
# | |(_||| | |_)|(_)(_||(_|| | | (_|(_)(/__> | |(/_|(/_ o
# | _| _|
declare -a GO_XCAT_YES=()
GO_XCAT_ACTION=""
GO_XCAT_VERSION="latest"
while [ "$#" -gt "0" ]
do
case "$1" in
"--smoke-test")
perform_smoke_test
exit "$?"
;;
"--help")
usage
exit 0
;;
"--install")
GO_XCAT_ACTION="install"
;;
"--xcat-version="*)
GO_XCAT_VERSION="${1##--xcat-version=}"
;;
"-y"|"--yes")
GO_XCAT_YES=("-y")
;;
*)
[ "$1" == "--" ] && shift
;;
esac
shift
done
GO_XCAT_OS="$(check_os)"
GO_XCAT_ARCH="$(check_arch)"
while read ; do echo "${REPLY}" ; echo "${REPLY}" >&2
done 2>"${TMP_DIR}/go-xcat.log.000" <<EOF
Operating system: ${GO_XCAT_OS}
Architecture: ${GO_XCAT_ARCH}
EOF
case "${GO_XCAT_OS}" in
"linux")
;;
*)
exit_if_bad 1 "${GO_XCAT_OS}: unsupported operating system"
;;
esac
case "${GO_XCAT_ARCH}" in
"ppc64"|"ppc64le"|"x86_64")
;;
*)
exit_if_bad 1 "${GO_XCAT_ARCH}: unsupported instruction set architecture"
;;
esac
GO_XCAT_LINUX_DISTRO="$(check_linux_distro)"
GO_XCAT_LINUX_VERSION="$(check_linux_version)"
while read ; do echo "${REPLY}" ; echo "${REPLY}" >&2
done 2>"${TMP_DIR}/go-xcat.log.001" <<EOF
Linux Distribution: ${GO_XCAT_LINUX_DISTRO}
Version: ${GO_XCAT_LINUX_VERSION}
EOF
case "${GO_XCAT_LINUX_DISTRO}" in
"rhel"|"sles"|"ubuntu")
;;
*)
warn_if_bad 1 "${GO_XCAT_LINUX_DISTRO}: unsupported Linux distro"
;;
esac
echo
echo -n "Reading repositories "
show_progress_meters
ERR_MSG="$({
add_xcat_core_repo "${GO_XCAT_VERSION}"
add_xcat_dep_repo
update_repo
RET="$?"
if [[ "${RET}" -ne "0" ]]
then
remove_repo "xcat-core"
remove_repo "xcat-dep"
fi
exit "${RET}"
} 2>&1)"
RET="$?"
stop_progress_meters
if [[ "${RET}" -ne 0 ]]
then
echo "failed"
echo "${ERR_MSG}" >&2
exit "${RET}"
fi
echo "done"
case "${GO_XCAT_ACTION}" in
"install")
if [[ "${#GO_XCAT_YES[@]}" -eq "0" ]]
then
echo
echo "xCAT is going to be installed."
read -p "Continue? [y/n] "
case "${REPLY}" in
"Y"*|"y"*)
;;
*)
echo "Aborting ..."
exit 0
esac
fi
(
install_xcat -y 2>&1 1>&42 |
tee "${TMP_DIR}/install_xcat.stderr" >&2
exit "${PIPESTATUS[0]}"
) 42>&1 | tee "${TMP_DIR}/install_xcat.stdout"
RET="${PIPESTATUS[0]}"
{
# Creating logs
echo "-- 8< -- -- -- -- -- -- -- -- -- -- -- -- -- -- --"
echo "==== install_xcat exited with exit code ${RET} ===="
echo "-- 8< install_xcat stdout -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/install_xcat.stdout"
echo "-- 8< install_xcat stderr -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/install_xcat.stderr"
echo "-- 8< -- -- -- -- -- -- -- -- -- -- -- -- -- -- --"
} >"${TMP_DIR}/go-xcat.log.005"
if [[ "${RET}" -eq "0" && ! -s "${TMP_DIR}/install_xcat.stderr" ]]
then
# xCAT has been installed and so far so good
perform_smoke_test >"${TMP_DIR}/perform_smoke_test.stdout" \
2>"${TMP_DIR}/perform_smoke_test.stderr"
RET="$?"
if [[ "${RET}" -ne "0" || -s "${TMP_DIR}/perform_smoke_test.stderr" ]]
then
# Smoke test failed
echo "-- 8< -- -- -- -- vv -- -- -- vv -- -- -- -- 8< --"
echo "==== perform_smoke_test failed with exit code ${RET} ===="
echo "-- 8< perform_smoke_test stdout -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/perform_smoke_test.stdout"
echo "-- 8< perform_smoke_test stderr -- --"
while read ; do echo "${REPLY}" ; done \
<"${TMP_DIR}/perform_smoke_test.stderr"
echo "-- 8< -- -- -- -- ^^ -- -- -- ^^ -- -- -- -- 8< --"
fi
fi >"${TMP_DIR}/go-xcat.log.008"
list_xcat_packages | tee "${TMP_DIR}/go-xcat.log.099"
if [[ "${RET}" -ne "0" ]]
then
GO_XCAT_LOG="/tmp/go-xcat.log"
cat "${TMP_DIR}/go-xcat.log."* >"${GO_XCAT_LOG}" 2>/dev/null
while read ; do echo "${REPLY}" ; done >&2 <<-EOF
Boo-boo
=======
Something went wrong. :(
Please check log file \`${GO_XCAT_LOG}' for more details.
EOF
exit "${RET}"
fi
while read ; do echo "${REPLY}" ; done <<-EOF
Congratulations
===============
The fact that you got this far is a strong indication that xCAT bas been
installed correctly.
Please notice if this is the first time you install xCAT. You need to do one
of the following.
1. Log out and then log in again, or
2. run the following command to set the environment variables.
for sh,
\`source /etc/profile.d/xcat.sh\`
or csh,
\`source /etc/profile.d/xcat.csh\`
EOF
;;
*)
list_xcat_packages
;;
esac
exit 0