367 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| #clear env
 | |
| unalias -a
 | |
| 
 | |
| PWD="$(cd $(dirname $0); pwd)"
 | |
| 
 | |
| OS_ARCH="$(uname -m)" || exit 1
 | |
| OS_RELEASE="0"
 | |
| 
 | |
| if [[ ! -f /etc/os-release ]]; then
 | |
|   echo "[ERROR] os release info not found" 1>&2 && exit 1
 | |
| fi
 | |
| 
 | |
| source /etc/os-release || exit 1
 | |
| 
 | |
| PNAME=${PRETTY_NAME:-"${NAME} ${VERSION}"}
 | |
| PNAME="${PNAME} (${OS_ARCH})"
 | |
| 
 | |
| function compat_centos8() {
 | |
|   echo_log "[NOTICE] '$PNAME' is compatible with CentOS 8, use el8 dependencies list"
 | |
|   OS_RELEASE=8
 | |
| }
 | |
| 
 | |
| function compat_centos7() {
 | |
|   echo_log "[NOTICE] '$PNAME' is compatible with CentOS 7, use el7 dependencies list"
 | |
|   OS_RELEASE=7
 | |
| }
 | |
| 
 | |
| function not_supported() {
 | |
|   echo_log "[ERROR] '$PNAME' is not supported yet."
 | |
| }
 | |
| 
 | |
| function version_ge() {
 | |
|   test "$(awk -v v1=$VERSION_ID -v v2=$1 'BEGIN{print(v1>=v2)?"1":"0"}' 2>/dev/null)" == "1"
 | |
| }
 | |
| 
 | |
| function echo_log() {
 | |
|   echo -e "[dep_create.sh] $@"
 | |
| }
 | |
| 
 | |
| function echo_err() {
 | |
|   echo -e "[dep_create.sh][ERROR] $@" 1>&2
 | |
| }
 | |
| 
 | |
| function get_os_release() {
 | |
|   if [[ "${OS_ARCH}x" == "x86_64x" ]]; then
 | |
|     case "$ID" in
 | |
|       alinux)
 | |
|         version_ge "2.1903" && compat_centos7 && return
 | |
|         ;;
 | |
|       alios)
 | |
|         version_ge "8.0" && compat_centos8 && return
 | |
|         version_ge "7.2" && compat_centos7 && return
 | |
|         ;;
 | |
|       anolis)
 | |
|         version_ge "8.0" && compat_centos8 && return
 | |
|         version_ge "7.0" && compat_centos7 && return
 | |
|         ;;
 | |
|       ubuntu)
 | |
|         version_ge "16.04" && compat_centos7 && return
 | |
|         ;;
 | |
|       centos)
 | |
|         version_ge "8.0" && OS_RELEASE=8 && return
 | |
|         version_ge "7.0" && OS_RELEASE=7 && return
 | |
|         ;;
 | |
|       debian)
 | |
|         version_ge "9" && compat_centos7 && return
 | |
|         ;;
 | |
|       fedora)
 | |
|         version_ge "33" && compat_centos7 && return
 | |
|         ;;
 | |
|       opensuse-leap)
 | |
|         version_ge "15" && compat_centos7 && return
 | |
|         ;;
 | |
|       #suse
 | |
|       sles)
 | |
|         version_ge "15" && compat_centos7 && return
 | |
|         ;;
 | |
|       uos)
 | |
|         version_ge "20" && compat_centos7 && return
 | |
|         ;;
 | |
|       arch | garuda)
 | |
|         compat_centos8 && return
 | |
|         ;;
 | |
|       rocky)
 | |
|         version_ge "8.0" && compat_centos8 && return
 | |
|         ;;
 | |
|       tencentos)
 | |
|         version_ge "3.1" && compat_centos8 && return
 | |
|         ;;
 | |
|     esac
 | |
|   elif [[ "${OS_ARCH}x" == "aarch64x" ]]; then
 | |
|     case "$ID" in
 | |
|       alios)
 | |
|         version_ge "8.0" && compat_centos8 && return
 | |
|         version_ge "7.0" && compat_centos7 && return
 | |
|         ;;
 | |
|       centos)
 | |
|         version_ge "8.0" && OS_RELEASE=8 && return
 | |
|         version_ge "7.0" && OS_RELEASE=7 && return
 | |
|         ;;
 | |
|       ubuntu)
 | |
|         version_ge "16.04" && compat_centos7 && return
 | |
|         ;;
 | |
|     esac
 | |
|   elif [[ "${OS_ARCH}x" == "sw_64x" ]]; then
 | |
|     case "$ID" in
 | |
|       UOS)
 | |
| 	version_ge "20" && OS_RELEASE=20 && return
 | |
|       ;;
 | |
|     esac
 | |
|   fi
 | |
|   not_supported && return 1
 | |
| }
 | |
| 
 | |
| get_os_release || exit 1
 | |
| 
 | |
| OS_TAG="el$OS_RELEASE.$OS_ARCH"
 | |
| DEP_FILE="oceanbase.${OS_TAG}.deps"
 | |
| 
 | |
| MD5=`md5sum ${DEP_FILE} | cut -d" " -f1`
 | |
| 
 | |
| # 是否需要共享依赖缓存,默认为ON,在特定条件将OFF
 | |
| NEED_SHARE_CACHE=ON
 | |
| 
 | |
| WORKSACPE_DEPS_DIR="$(cd $(dirname $0); cd ..; pwd)"
 | |
| WORKSPACE_DEPS_3RD=${WORKSACPE_DEPS_DIR}/3rd
 | |
| WORKSAPCE_DEPS_3RD_DONE=${WORKSPACE_DEPS_3RD}/DONE
 | |
| WORKSAPCE_DEPS_3RD_MD5=${WORKSPACE_DEPS_3RD}/${MD5}
 | |
| 
 | |
| # 开始判断本地目录依赖目录是否存在
 | |
| if [ -f ${WORKSAPCE_DEPS_3RD_MD5} ]; then
 | |
|     if [ -f ${WORKSAPCE_DEPS_3RD_DONE} ]; then
 | |
|         echo_log "${DEP_FILE} has been initialized due to ${WORKSAPCE_DEPS_3RD_MD5} and ${WORKSAPCE_DEPS_3RD_DONE} exists"
 | |
|         exit 0
 | |
|     else
 | |
|         echo_log "${DEP_FILE} has been not initialized, due to ${WORKSAPCE_DEPS_3RD_DONE} not exists"
 | |
|     fi
 | |
| else
 | |
|     echo_log "${DEP_FILE} has been not initialized, due to ${WORKSAPCE_DEPS_3RD_MD5} not exists"
 | |
| fi
 | |
| 
 | |
| # 依赖目录不存在,停止缓存
 | |
| if [ "x${DEP_CACHE_DIR}" == "x" ]; then
 | |
|     NEED_SHARE_CACHE=OFF
 | |
|     echo_log "disable share dep cache due to env DEP_CACHE_DIR not set"
 | |
| else
 | |
|   if [ -d ${DEP_CACHE_DIR} ]; then
 | |
|     echo_log "FOUND env DEP_CACHE_DIR: ${DEP_CACHE_DIR}"
 | |
|   else
 | |
|       NEED_SHARE_CACHE=OFF
 | |
|       echo_log "disable share dep cache due to not exist env FOUND DEP_CACHE_DIR(${DEP_CACHE_DIR})"
 | |
|   fi
 | |
| fi
 | |
| 
 | |
| # 确定共享依赖缓存目录
 | |
| CACHE_DEPS_DIR=${DEP_CACHE_DIR}/${MD5}
 | |
| CACHE_DEPS_DIR_3RD=${DEP_CACHE_DIR}/${MD5}/3rd
 | |
| CACHE_DEPS_DIR_3RD_DONE=${DEP_CACHE_DIR}/${MD5}/3rd/DONE
 | |
| CACHE_DEPS_LOCKFILE=${DEP_CACHE_DIR}/${MD5}.lockfile
 | |
| 
 | |
| # 确定临时目录地址,如果关闭缓存,该目录也是实际目录的地址
 | |
| UUID=`cat /proc/sys/kernel/random/uuid`
 | |
| TARGET_DIR=${DEP_CACHE_DIR}/${MD5}.${UUID}
 | |
| TARGET_DIR_3RD=${DEP_CACHE_DIR}/${MD5}.${UUID}/3rd
 | |
| 
 | |
| # 保留环境变量入口,停止共享依赖缓存
 | |
| if [ "x${DISABLE_SHARE_DEP_CACHE}" == "x1" ]; then
 | |
|     NEED_SHARE_CACHE=OFF
 | |
|     echo_log "disable share deps cache due to env DISABLE_SHARE_DEP_CACHE=1"
 | |
| fi
 | |
| 
 | |
| if [ $NEED_SHARE_CACHE == "OFF" ]; then
 | |
|     # 不共享缓存,二则是相等的,直接下到当前的工作目录
 | |
|     TARGET_DIR_3RD=${WORKSPACE_DEPS_3RD}
 | |
| fi
 | |
| 
 | |
| # 删除本地依赖文件
 | |
| rm -rf ${WORKSPACE_DEPS_3RD}
 | |
| 
 | |
| if [ ${NEED_SHARE_CACHE} == "ON" ]; then
 | |
|     # 判断共享目录是否存在
 | |
|     if [ -f ${CACHE_DEPS_DIR_3RD_DONE} ]; then
 | |
|         echo_log "use cache deps ${WORKSPACE_DEPS_3RD} -> ${CACHE_DEPS_DIR_3RD}"
 | |
|         ln -sf ${CACHE_DEPS_DIR_3RD} ${WORKSPACE_DEPS_3RD}
 | |
|         exit $?
 | |
|     else
 | |
|         echo_log "cache deps ${CACHE_DEPS_DIR_3RD_DONE} not exist"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| if [[ ! -f "${DEP_FILE}" ]]; then
 | |
|     echo_err "check dependencies profile for ${DEP_FILE}... NOT FOUND"
 | |
|     exit 2
 | |
| else
 | |
|     echo_log "check dependencies profile for ${DEP_FILE}... FOUND"
 | |
| fi
 | |
| 
 | |
| declare -A targets
 | |
| declare -A packages
 | |
| section="default"
 | |
| content=""
 | |
| 
 | |
| function save_content {
 | |
|     if [[ "$content" != "" ]]
 | |
|     then
 | |
|         if [[ $(echo "$section" | grep -E "^target\-") != "" ]]
 | |
|         then
 | |
|             target_name=$(echo $section | sed 's|^target\-\(.*\)$|\1|g')
 | |
|             targets["$target_name"]="$(echo "${content}" | grep -Eo "repo=.*" | awk -F '=' '{ print $2 }')"
 | |
|             echo_log "target: $target_name, repo: ${targets["$target_name"]}"
 | |
|         else
 | |
|             packages["$section"]=$content
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| echo_log "check repository address in profile..."
 | |
| 
 | |
| while read -r line
 | |
| do
 | |
|     if [[ $(echo "$line" | grep -E "\[.*\]") != "" ]]
 | |
|     then
 | |
|         save_content
 | |
|         content=""
 | |
|         # section=${line//\[\(.*\)\]/\1}
 | |
|         section=$(echo $line | sed 's|.*\[\(.*\)\].*|\1|g')
 | |
|     else
 | |
|         [[ "$line" != "" ]] && [[ "$line" != '#'* ]] && content+=$'\n'"$line"
 | |
|     fi
 | |
| done < $DEP_FILE
 | |
| save_content
 | |
| 
 | |
| # 真正开始下载
 | |
| echo_log "start to download dependencies..."
 | |
| mkdir -p "${TARGET_DIR_3RD}/pkg"
 | |
| for sect in "${!packages[@]}"
 | |
| do
 | |
|     while read -r line
 | |
|     do
 | |
|         [[ "$line" == "" ]] && continue
 | |
|         pkg=${line%%\ *}
 | |
|         target_name="default"
 | |
|         temp=$(echo "$line" | grep -Eo "target=(\S*)")
 | |
|         [[ "$temp" != "" ]] && target_name=${temp#*=}
 | |
|         if [[ -f "${TARGET_DIR_3RD}/pkg/${pkg}" ]]; then
 | |
|             echo_log "find package <${pkg}> in cache"
 | |
|         else
 | |
|             echo_log "downloading package <${pkg}>"
 | |
|             repo=${targets["$target_name"]}
 | |
|             TEMP=$(mktemp -p "/" -u ".${pkg}.XXXX")
 | |
|             wget "$repo/${pkg}" -O "${TARGET_DIR_3RD}/pkg/${TEMP}" &> ${TARGET_DIR_3RD}/pkg/error.log
 | |
|             if (( $? == 0 )); then
 | |
|                 mv -f "${TARGET_DIR_3RD}/pkg/$TEMP" "${TARGET_DIR_3RD}/pkg/${pkg}"
 | |
|                 rm -rf ${TARGET_DIR_3RD}/pkg/error.log
 | |
|             else
 | |
|                 cat ${TARGET_DIR_3RD}/pkg/error.log
 | |
|                 rm -rf "${TARGET_DIR_3RD}/pkg/$TEMP"
 | |
|                 echo_err "wget $repo/${pkg}"
 | |
|                 echo_err "Failed to init rpm deps"
 | |
|                 exit 4
 | |
|             fi
 | |
|         fi
 | |
|         echo_log "unpack package <${pkg}>... \c"
 | |
|         if [[ "$ID" = "arch" || "$ID" = "garuda" ]]; then
 | |
|           (cd ${TARGET_DIR_3RD} && rpmextract.sh "${TARGET_DIR_3RD}/pkg/${pkg}")
 | |
|         else
 | |
|           (cd ${TARGET_DIR_3RD} && rpm2cpio "${TARGET_DIR_3RD}/pkg/${pkg}" | cpio -di -u --quiet)
 | |
|         fi
 | |
|         if [[ $? -eq 0 ]]; then
 | |
|           echo "SUCCESS"
 | |
|         else
 | |
|           echo "FAILED" 1>&2
 | |
|           echo_log "[ERROR] Failed to init rpm deps"
 | |
|           exit 5
 | |
|         fi
 | |
|     done <<< "${packages["$sect"]}"
 | |
| done
 | |
| 
 | |
| # 不进行缓存工作,直接结束
 | |
| if [ ${NEED_SHARE_CACHE} == "OFF" ]; then
 | |
|     touch ${WORKSAPCE_DEPS_3RD_MD5}
 | |
|     touch ${WORKSAPCE_DEPS_3RD_DONE}
 | |
|     exit $?
 | |
| fi
 | |
| 
 | |
| # 链接缓存目录
 | |
| LINK_CHACE_DIRECT=OFF
 | |
| # 链接当前目标目录
 | |
| LINK_TARGET_DIRECT=OFF
 | |
| 
 | |
| # 下载完成之后,发现目标已经存在,直接进行软链接
 | |
| if [ -d ${CACHE_DEPS_DIR} ]; then
 | |
|     echo_log "found ${CACHE_DEPS_DIR} exists"
 | |
|     if [ -f ${CACHE_DEPS_DIR_3RD_DONE} ]; then
 | |
|         echo_log "found ${CACHE_DEPS_DIR_3RD_DONE} exists"
 | |
|         LINK_CHACE_DIRECT=ON
 | |
|     else
 | |
|         echo_log "not found ${CACHE_DEPS_DIR_3RD_DONE} exists"
 | |
|         LINK_TARGET_DIRECT=ON
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| if [ -f ${CACHE_DEPS_LOCKFILE} ];then
 | |
|     # 超过一分钟的锁文件将失效,也将重新初始化缓存
 | |
|     echo_log "found lock file ${CACHE_DEPS_LOCKFILE}"
 | |
|     LINK_TARGET_DIRECT=ON
 | |
|     if test `find "${CACHE_DEPS_LOCKFILE}" -mmin +1`; then
 | |
|         echo_log "lock file ${CACHE_DEPS_LOCKFILE} escape 1 mins, and try to unlock"
 | |
|         rm -rf ${CACHE_DEPS_LOCKFILE}
 | |
|         if [ $? -eq 0 ]; then
 | |
|             LINK_TARGET_DIRECT=OFF
 | |
|             echo_log "unlock success"
 | |
|         else
 | |
|             echo_log "failed to unlock"
 | |
|         fi
 | |
|     else
 | |
|         echo_log "lock file ${CACHE_DEPS_LOCKFILE} in 1 mins"
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| if [ ${LINK_CHACE_DIRECT}  == "ON" ]; then
 | |
|     echo_log "give up current file and link direct, ${WORKSPACE_DEPS_3RD} -> ${CACHE_DEPS_DIR_3RD}"
 | |
|     rm -rf ${TARGET_DIR}
 | |
|     echo_log "link deps  ${WORKSPACE_DEPS_3RD} -> ${CACHE_DEPS_DIR_3RD}"
 | |
|     ln -sf ${CACHE_DEPS_DIR_3RD} ${WORKSPACE_DEPS_3RD}
 | |
|     exit $?
 | |
| fi
 | |
| 
 | |
| if [ ${LINK_TARGET_DIRECT} == "ON" ]; then
 | |
|     # 放弃缓存,直接软链接该目录
 | |
|     echo_log "give up mv and link dirct, ${WORKSPACE_DEPS_3RD} -> ${TARGET_DIR_3RD}"
 | |
|     ln -sf ${TARGET_DIR_3RD} ${WORKSPACE_DEPS_3RD}
 | |
|     if [ $? -ne 0 ]; then
 | |
|         echo_err "Failed to link ${WORKSPACE_DEPS_3RD} to ${TARGET_DIR_3RD}"
 | |
|         exit 1
 | |
|     fi
 | |
|     touch ${WORKSAPCE_DEPS_3RD_MD5}
 | |
|     touch ${WORKSAPCE_DEPS_3RD_DONE}
 | |
|     exit $?
 | |
| fi
 | |
| 
 | |
| touch ${CACHE_DEPS_LOCKFILE}
 | |
| chmod 777 ${CACHE_DEPS_LOCKFILE}
 | |
| echo_log "generate lock file ${CACHE_DEPS_LOCKFILE}"
 | |
| 
 | |
| mv ${TARGET_DIR} ${CACHE_DEPS_DIR}
 | |
| if [ $? -ne 0 ]; then
 | |
|     echo_err "Failed to mv ${TARGET_DIR} to ${CACHE_DEPS_DIR}"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| ln -sf ${CACHE_DEPS_DIR_3RD} ${WORKSPACE_DEPS_3RD}
 | |
| if [ $? -ne 0 ]; then
 | |
|     echo_err "Failed to link ${CACHE_DEPS_DIR_3RD} to ${WORKSPACE_DEPS_3RD}"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| rm -rf ${CACHE_DEPS_LOCKFILE}
 | |
| echo_log "unlock lock file ${CACHE_DEPS_LOCKFILE}"
 | |
| 
 | |
| echo_log "link deps ${WORKSPACE_DEPS_3RD} -> ${CACHE_DEPS_DIR_3RD}"
 | |
| 
 | |
| # 标记md5和done文件
 | |
| touch ${WORKSAPCE_DEPS_3RD_MD5}
 | |
| touch ${WORKSAPCE_DEPS_3RD_DONE}
 | 
