From 4507a038ba2bb1fa494ff2927f0a58cd4cd5d2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=E1=B4=8F=C9=B4=C9=A2=20Jie?= Date: Wed, 28 Mar 2018 17:47:44 +0800 Subject: [PATCH] Accumulated go-xcat updates (#4991) * Fix vim modelines * [go-xcat] Fix --long-help * [go-xcat] Add curl support * [go-xcat] Better tarball support * [go-xcat] Explaination of --xcat-version argument in help message * [go-xcat] Disable xCAT-core.repo and xCAT-dep.repo if they exist * [go-xcat] Add change logs --- xCAT-server/share/xcat/tools/go-xcat | 190 +++++++++++++++++++++++---- 1 file changed, 162 insertions(+), 28 deletions(-) diff --git a/xCAT-server/share/xcat/tools/go-xcat b/xCAT-server/share/xcat/tools/go-xcat index 41472163c..4ae3f65cc 100755 --- a/xCAT-server/share/xcat/tools/go-xcat +++ b/xCAT-server/share/xcat/tools/go-xcat @@ -2,18 +2,22 @@ # # go-xcat - Install xCAT automatically. # -# Version 1.0.21 +# Version 1.0.27 # -# Copyright (C) 2016 International Business Machines +# Copyright (C) 2016, 2017, 2018 International Business Machines # Eclipse Public License, Version 1.0 (EPL-1.0) # # # 2016-06-16 GONG Jie -# - created +# - Draft # 2016-06-20 GONG Jie -# - released to the field +# - Released to the field # 2016-09-20 GONG Jie -# - bug fix +# - Bug fix +# 2018-03-28 GONG Jie +# - Use curl when it is available. Otherwise fall back to use wget +# - Improved tarball file extension handling +# - Disable xCAT-core.repo and xCAT-dep.repo if they exist # function usage() @@ -34,8 +38,11 @@ function usage() repository --xcat-dep=[URL] use a different URL or path for the xcat-dep repository - -x, --xcat-version=[VERSION] specify the version of xCAT; cannot use with - --xcat-core + -x, --xcat-version=[VERSION] specify the version of xCAT; imply the subdirectory + of corresponding xCAT version under + http://xcat.org/files/xcat/repos/yum/ or + http://xcat.org/files/xcat/repos/apt/ + cannot use with --xcat-core -y, --yes answer yes for all questions Actions: @@ -89,7 +96,7 @@ function verbose_usage() -h, --help display a simply version of help and exit --long-help display this help and exit EOF - println 9 + println 12 while read -r ; do echo "${REPLY}" ; done <<-EOF check check the version of the installed packages of xCAT and packages in the repository @@ -98,7 +105,7 @@ function verbose_usage() while read -r ; do echo "${REPLY}" ; done <<-EOF smoke-test preform basic tests of the xCAT installation EOF - println 11 + println 10 while read -r ; do echo "${REPLY}" ; done <<-EOF ${script} --xcat-core=/path/to/xcat-core.repo install ${script} --xcat-core=/path/to/xcat-core install @@ -632,7 +639,112 @@ function get_package_list() function_dispatch "${FUNCNAME}" "$@" } -function download_file() +function download_file_curl() +{ + local script="${0##*/}" + local version="$(version)" + local user_agent="${script}/${version} (${GO_XCAT_OS}; ${GO_XCAT_ARCH}; ${GO_XCAT_LINUX_DISTRO} ${GO_XCAT_LINUX_VERSION})" + type curl >/dev/null 2>&1 || return 255 + local url="$1" + local local_file="$2" + local log_file="${TMP_DIR}/curl.log.${RANDOM}" + local -i rc=0 + curl -A "${user_agent}" "${url}" -f -o "${local_file}" -S -s >"${log_file}" 2>&1 + rc="$?" + if [[ "${rc}" -ne "0" ]] + then + while read -r ; do echo "${REPLY}" ; done <"${log_file}" + echo -n "${script}: \`curl' exited with an error: (exit code ${rc}, " + case "${rc}" in + 1) echo -n "unsupported protocol" ;; + 2) echo -n "failed to initialize" ;; + 3) echo -n "URL malformed" ;; + 4) echo -n "you probably need another build of libcurl!" ;; + 5) echo -n "couldn't resolve proxy" ;; + 6) echo -n "couldn't resolve host" ;; + 7) echo -n "failed to connect to host" ;; + 8) echo -n "weird server reply" ;; + 9) echo -n "FTP access denied" ;; + 10) echo -n "FTP accept failed" ;; + 11) echo -n "FTP weird PASS reply" ;; + 12) echo -n "During an active FTP session while waiting for the server to connect back to curl, the timeout expired." ;; + 13) echo -n "FTP weird PASV reply" ;; + 14) echo -n "FTP weird 227 format" ;; + 15) echo -n "FTP can't get host" ;; + 16) echo -n "HTTP/2 error" ;; + 17) echo -n "FTP couldn't set binary" ;; + 18) echo -n "Partial file" ;; + 19) echo -n "FTP couldn't download/access the given file" ;; + 21) echo -n "FTP quote error" ;; + 22) echo -n "HTTP page not retrieved" ;; + 23) echo -n "write error" ;; + 25) echo -n "FTP couldn't STOR file" ;; + 26) echo -n "read error" ;; + 27) echo -n "out of memory" ;; + 28) echo -n "operation timeout" ;; + 30) echo -n "FTP PORT failed" ;; + 31) echo -n "FTP couldn't use REST" ;; + 33) echo -n "HTTP range error" ;; + 34) echo -n "HTTP post error" ;; + 35) echo -n "SSL connect error" ;; + 36) echo -n "bad download resume" ;; + 37) echo -n "FILE couldn't read file" ;; + 38) echo -n "LDAP cannot bind" ;; + 39) echo -n "LDAP search failed." ;; + 41) echo -n "function not found" ;; + 42) echo -n "aborted by callback" ;; + 43) echo -n "internal error" ;; + 45) echo -n "interface error" ;; + 47) echo -n "too many redirects" ;; + 48) echo -n "unknown option specified to libcurl" ;; + 49) echo -n "malformed telnet option" ;; + 51) echo -n "the peer's SSL certificate or SSH MD5 fingerprint was not OK" ;; + 52) echo -n "the server didn't reply anything, which here is considered an error" ;; + 53) echo -n "SSL crypto engine not found" ;; + 54) echo -n "cannot set SSL crypto engine as default" ;; + 55) echo -n "failed sending network data" ;; + 56) echo -n "failure in receiving network data" ;; + 58) echo -n "problem with the local certificate" ;; + 59) echo -n "couldn't use specified SSL cipher" ;; + 60) echo -n "peer certificate cannot be authenticated with known CA certificates" ;; + 61) echo -n "unrecognized transfer encoding." ;; + 62) echo -n "invalid LDAP URL" ;; + 63) echo -n "maximum file size exceeded" ;; + 64) echo -n "requested FTP SSL level failed" ;; + 65) echo -n "sending the data requires a rewind that failed" ;; + 66) echo -n "failed to initialise SSL Engine" ;; + 67) echo -n "the user name, password, or similar was not accepted and curl failed to log in" ;; + 68) echo -n "file not found on TFTP server" ;; + 69) echo -n "permission problem on TFTP server" ;; + 70) echo -n "out of disk space on TFTP server" ;; + 71) echo -n "illegal TFTP operation" ;; + 72) echo -n "unknown TFTP transfer ID" ;; + 73) echo -n "file already exists (TFTP)" ;; + 74) echo -n "no such user (TFTP)" ;; + 75) echo -n "character conversion failed" ;; + 76) echo -n "character conversion functions required" ;; + 77) echo -n "problem with reading the SSL CA cert" ;; + 78) echo -n "the resource referenced in the URL does not exist" ;; + 79) echo -n "an unspecified error occurred during the SSH session" ;; + 80) echo -n "failed to shut down the SSL connection" ;; + 82) echo -n "could not load CRL file, missing or wrong format" ;; + 83) echo -n "issuer check failed" ;; + 84) echo -n "the FTP PRET command failed" ;; + 85) echo -n "RTSP: mismatch of CSeq numbers" ;; + 86) echo -n "RTSP: mismatch of Session Identifiers" ;; + 87) echo -n "unable to parse FTP file list" ;; + 88) echo -n "FTP chunk callback reported error" ;; + 89) echo -n "no connection available, the session will be queued" ;; + 90) echo -n "SSL public key does not matched pinned public key" ;; + *) echo -n "unknown error" ;; + esac + echo ")" + echo " ... while downloading \`${url}'" + fi >&2 + [[ "${rc}" -eq "0" ]] +} + +function download_file_wget() { local script="${0##*/}" local version="$(version)" @@ -665,6 +777,11 @@ function download_file() [[ "${rc}" -eq "0" ]] } +function download_file() +{ + function_dispatch "${FUNCNAME}" "$@" +} + # $1 repo file # $2 repo id function add_repo_by_file_yum() @@ -757,8 +874,8 @@ function extract_archive() warn_if_bad "${ret}" "Failed to create directory \`${install_path}'" || return 1 - case "${archive##*.}" in - "Z") + case "${archive##*/}" in + *".tar.Z") check_executes uncompress tar grep || return 1 uncompress -c "${archive}" | tar -t -f - | grep -v "^${repo_id}/" [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 0 && @@ -767,7 +884,7 @@ function extract_archive() rm -rf "${install_path}/${repo_id}" uncompress -c "${archive}" | ( cd "${install_path}" && tar -x -f - ) ;; - "tz"|"tgz"|"gz") + *".tz"|*".tgz"|*".tar.gz") check_executes gzip tar grep || return 1 gzip -d -c "${archive}" | tar -t -f - | grep -v "^${repo_id}/" [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 0 && @@ -776,7 +893,7 @@ function extract_archive() rm -rf "${install_path}/${repo_id}" gzip -d -c "${archive}" | ( cd "${install_path}" && tar -x -f - ) ;; - "tbz"|"tbz2"|"bz"|"bz2") + *".tbz"|*".tbz2"|*".tar.bz"|*".tar.bz2") check_executes bzip2 tar grep || return 1 bzip2 -d -c "${archive}" | tar -t -f - | grep -v "^${repo_id}/" [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 0 && @@ -785,7 +902,7 @@ function extract_archive() rm -rf "${install_path}/${repo_id}" bzip2 -d -c "${archive}" | ( cd "${install_path}" && tar -x -f - ) ;; - "txz"|"xz") + *".txz"|*".tar.xz") check_executes xz tar grep || return 1 xz -d -c "${archive}" | tar -t -f - | grep -v "^${repo_id}/" [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 0 && @@ -794,7 +911,7 @@ function extract_archive() rm -rf "${install_path}/${repo_id}" xz -d -c "${archive}" | ( cd "${install_path}" && tar -x -f - ) ;; - "tar") + *".tar") check_executes tar grep || return 1 tar -t -f "${archive}" | grep -v "^${repo_id}/" [[ "${PIPESTATUS[0]}" -eq 0 && "${PIPESTATUS[1]}" -eq 1 ]] @@ -823,8 +940,8 @@ function add_repo_by_url_yum_or_zypper() local install_path="${GO_XCAT_DEFAULT_INSTALL_PATH}" case "${url%%://*}" in "ftp"|"http"|"https") - case "${url##*.}" in - "repo"|"Z"|"bz"|"bz2"|"gz"|"tar"|"tbz"|"tbz2"|"tgz"|"tz"|"txz"|"xz") + case "${url##*/}" in + *".repo"|*".tar"|*".tar.Z"|*".tar.bz"|*".tar.bz2"|*".tar.gz"|*".tar.xz"|*".tbz"|*".tbz2"|*".tgz"|*".tz"|*".txz") # an online repo or tarball tmp="${TMP_DIR}/tmp_${url##*/}" download_file "${url}" "${tmp}" @@ -900,8 +1017,8 @@ function add_repo_by_url_apt() warn_if_bad "$?" "unknown debian/ubuntu codename" || return 1 case "${url%%://*}" in "ftp"|"http"|"https"|"ssh") - case "${url##*.}" in - "Z"|"bz"|"bz2"|"gz"|"tar"|"tbz"|"tbz2"|"tgz"|"tz"|"txz"|"xz") + case "${url##*/}" in + *".tar"|*".tar.Z"|*".tar.bz"|*".tar.bz2"|*".tar.gz"|*".tar.xz"|*".tbz"|*".tbz2"|*".tgz"|*".tz"|*".txz") # an online tarball tmp="${TMP_DIR}/tmp_${url##*/}" download_file "${url}" "${tmp}" @@ -953,9 +1070,17 @@ function remove_repo_yum() type yum >/dev/null 2>&1 || return 255 local repo_id="$1" # This deleting method is not good enough. Since there could be more - # than one repostory definitions in a single repo file. + # than one repository definitions in a single repo file. # This is a quick and dirty method. rm -f $(grep -l "^\[${repo_id}\]$" "/etc/yum.repos.d/"*".repo" 2>/dev/null) + case "${repo_id}" in + "xcat-core") + mv /etc/yum.repos.d/xCAT-core.repo{,.nouse} 2>/dev/null + ;; + "xcat-dep") + mv /etc/yum.repos.d/xCAT-dep.repo{,.nouse} 2>/dev/null + ;; + esac yum clean metadata : } @@ -966,6 +1091,15 @@ function remove_repo_zypper() type zypper >/dev/null 2>&1 || return 255 local repo_id="$1" zypper removerepo "${repo_id}" + case "${repo_id}" in + "xcat-core") + mv /etc/zypp/repos.d/xCAT-core.repo{,.nouse} 2>/dev/null + ;; + "xcat-dep") + mv /etc/zypp/repos.d/xCAT-dep.repo{,.nouse} 2>/dev/null + ;; + esac + : } # $1 repo id @@ -997,10 +1131,10 @@ function add_xcat_core_repo_yum_or_zypper() then case "${ver}" in "devel") - url="${GO_XCAT_DEFAULT_BASE_URL}/yum/devel/core-snap/xCAT-core.repo" + url="${GO_XCAT_DEFAULT_BASE_URL}/yum/devel/core-snap" ;; *) - url="${GO_XCAT_DEFAULT_BASE_URL}/yum/${ver}/xcat-core/xCAT-core.repo" + url="${GO_XCAT_DEFAULT_BASE_URL}/yum/${ver}/xcat-core" ;; esac fi @@ -1075,8 +1209,8 @@ function add_xcat_dep_repo_yum_or_zypper() esac case "${url%%://*}" in "ftp"|"http"|"https") - case "${url##*.}" in - "Z"|"bz"|"bz2"|"gz"|"tar"|"tbz"|"tbz2"|"tgz"|"tz"|"txz"|"xz") + case "${url##*/}" in + *".tar"|*".tar.Z"|*".tar.bz"|*".tar.bz2"|*".tar.gz"|*".tar.xz"|*".tbz"|*".tbz2"|*".tgz"|*".tz"|*".txz") # an online archive file tmp="${TMP_DIR}/tmp_${url##*/}" download_file "${url}" "${tmp}" @@ -1679,8 +1813,8 @@ esac # case "${GO_XCAT_ACTION}" in exit 0 -# vim: set filetype=bash -# vim: set noautoindent -# vim: set tabstop=4 shiftwidth=4 softtabstop=4 +# vim: filetype=sh +# vim: noautoindent +# vim: tabstop=4 shiftwidth=4 softtabstop=4 # End of file