305 lines
9.6 KiB
Bash
305 lines
9.6 KiB
Bash
#!/bin/sh
|
||
# -----------------------------------------------------------------------------------------------------------
|
||
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
||
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
||
# CANN Open Software License Agreement Version 2.0 (the "License").
|
||
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
||
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||
# See LICENSE in the root of the software repository for the full text of the License.
|
||
# -----------------------------------------------------------------------------------------------------------
|
||
|
||
# 多版本函数库
|
||
# 创建版本目录
|
||
create_version_dir() {
|
||
local install_path="$1"
|
||
local version_dir="$2"
|
||
local username="$3"
|
||
local usergroup="$4"
|
||
local install_for_all="$5"
|
||
local ret
|
||
|
||
if [ ! -d "${install_path}/${version_dir}" ]; then
|
||
make_dir "${install_path}/${version_dir}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
fi
|
||
|
||
# 约束版本号目录权限
|
||
change_mod "${install_path}/${version_dir}" "750" "${install_for_all}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
change_own "${install_path}/${version_dir}" "${username}:${usergroup}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
return 0
|
||
}
|
||
|
||
# 检查版本包安装结果
|
||
check_version_install() {
|
||
local install_path="$1"
|
||
local version_dir="$2"
|
||
local package="$3"
|
||
local version_info_path
|
||
|
||
get_package_version_info "version_info_path" "$install_path" "$version_dir" "$package"
|
||
|
||
if [ ! -f "$version_info_path" ]; then
|
||
comm_log "ERROR" "$version_info_path doesn't exist in check version install!"
|
||
return 1
|
||
fi
|
||
return 0
|
||
}
|
||
|
||
# 安装latest管理器
|
||
install_latest_manager() {
|
||
local var_path="$1"
|
||
shift 1
|
||
sh latest_manager/install.sh --install-path="$var_path" "$@"
|
||
}
|
||
|
||
# 卸载latest管理器
|
||
uninstall_latest_manager_for_upgrade() {
|
||
local var_path="$1"
|
||
${var_path}/manager/uninstall.sh --upgrade
|
||
}
|
||
|
||
# 升级latest管理器
|
||
upgrade_latest_manager() {
|
||
local var_path="$1"
|
||
local latest_version_info latest_manager_version local_manager_version
|
||
|
||
latest_version_info="$var_path/manager/version.info"
|
||
if [ -f "$latest_version_info" ]; then
|
||
get_version latest_manager_version "$latest_version_info"
|
||
get_version local_manager_version "latest_manager/version.info"
|
||
|
||
set_default "latest_manager_version" "$latest_manager_version" "0"
|
||
set_default "local_manager_version" "$local_manager_version" "0"
|
||
|
||
if [ "$latest_manager_version" -lt "$local_manager_version" ]; then
|
||
uninstall_latest_manager_for_upgrade "$var_path"
|
||
install_latest_manager "$var_path" "--upgrade"
|
||
fi
|
||
else
|
||
install_latest_manager "$var_path"
|
||
fi
|
||
}
|
||
|
||
get_install_for_all_param() {
|
||
local _outvar="$1"
|
||
local _install_for_all="$2"
|
||
local _result=""
|
||
|
||
if [ "$_install_for_all" = "y" ]; then
|
||
_result="--install-for-all"
|
||
fi
|
||
|
||
eval "${_outvar}=\"${_result}\""
|
||
}
|
||
|
||
get_docker_root_param() {
|
||
local _outvar="$1"
|
||
local _docker_root="$2"
|
||
local _result=""
|
||
|
||
if [ "$_docker_root" != "" ]; then
|
||
_result="--docker-root \\\"$_docker_root\\\""
|
||
fi
|
||
|
||
eval "${_outvar}=\"${_result}\""
|
||
}
|
||
|
||
# 通知latest管理器
|
||
notify_latest_manager() {
|
||
local var_path="$1"
|
||
local package="$2"
|
||
local version="$3"
|
||
local version_dir="$4"
|
||
local install_for_all="$5"
|
||
local docker_root="$6"
|
||
local ext_params="$7"
|
||
local operation="$8"
|
||
local ret package_dir install_for_all_param docker_root_param
|
||
|
||
if [ ! -f "$var_path/manager.sh" ]; then
|
||
return 1
|
||
fi
|
||
|
||
if [ "${USE_SHARE_INFO}" == "y" ]; then
|
||
ext_params="$ext_params --use-share-info"
|
||
fi
|
||
|
||
get_package_dir package_dir "$package"
|
||
get_install_for_all_param "install_for_all_param" "$install_for_all"
|
||
get_docker_root_param "docker_root_param" "$docker_root"
|
||
|
||
eval "\"$var_path/manager.sh\"" --version "\"$version\"" --version-dir "\"$version_dir\"" \
|
||
--package "\"$package\"" --package-dir "\"$package_dir\"" \
|
||
"$install_for_all_param" "$docker_root_param" "$ext_params" "$operation"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
return 0
|
||
}
|
||
|
||
# 通知latest管理器安装完成
|
||
notify_latest_manager_installed() {
|
||
local local_manager_version
|
||
local ext_params
|
||
|
||
get_version local_manager_version "latest_manager/version.info"
|
||
set_default "local_manager_version" "$local_manager_version" "0"
|
||
|
||
if [ "$INCREMENT" = "y" ]; then
|
||
ext_params="--serial $local_manager_version --increment"
|
||
else
|
||
ext_params="--serial $local_manager_version"
|
||
fi
|
||
|
||
notify_latest_manager "$@" "$ext_params" "package_installed"
|
||
}
|
||
|
||
# 通知latest管理器创建软链
|
||
# 老版本全部卸载后,latest回滚到新版本时,会用老版本的install_common_parser.sh,
|
||
# 调用新版本的--create-package-latest-softlink,会走到这个流程。
|
||
notify_latest_manager_create_softlink() {
|
||
notify_latest_manager "$@" "" "package_create_softlink"
|
||
}
|
||
|
||
# 通知latest管理器删除软链
|
||
notify_latest_manager_remove_softlink() {
|
||
notify_latest_manager "$@" "" "package_remove_softlink"
|
||
}
|
||
|
||
# 通知latest管理器准备卸载
|
||
notify_latest_manager_pre_uninstall() {
|
||
notify_latest_manager "$@" "" "package_pre_uninstall"
|
||
}
|
||
|
||
# 通知latest管理器卸载完成
|
||
notify_latest_manager_uninstalled() {
|
||
local is_recreate_softlink="$1"
|
||
local recreate_softlink=""
|
||
local ret
|
||
shift 1
|
||
|
||
if [ "$is_recreate_softlink" = "y" ]; then
|
||
recreate_softlink="--recreate-softlink"
|
||
fi
|
||
|
||
notify_latest_manager "$@" "$recreate_softlink" "package_uninstalled"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
return 0
|
||
}
|
||
|
||
# 多版本安装流程
|
||
multi_version_install() {
|
||
local install_type="$1"
|
||
local install_path="$2"
|
||
local filelist_path="$3"
|
||
local package="$4"
|
||
local feature_param="$5"
|
||
local version="$6"
|
||
local version_dir="$7"
|
||
local username="$8"
|
||
local usergroup="$9"
|
||
local setenv="${10}"
|
||
local is_upgrade="${11}"
|
||
local docker_root="${12}"
|
||
local custom_options="${13}"
|
||
local install_for_all="${14}"
|
||
local ret total_ret="0" pkg_running_version version_pair_arr last_version last_version_dir
|
||
|
||
create_version_dir "${install_path}" "${version_dir}" "${username}" "${usergroup}" "${install_for_all}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
version_install "${install_type}" "${install_path}" "${filelist_path}" "${package}" "${feature_param}" \
|
||
"${version_dir}" "${username}" "${usergroup}" "${setenv}" "${is_upgrade}" "${docker_root}" "${custom_options}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
check_version_install "$install_path" "$version_dir" "$package"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
return ${total_ret}
|
||
}
|
||
|
||
# 删除latest下空目录
|
||
del_empty_dirs_in_latest() {
|
||
local install_type="$1"
|
||
local install_path="$2"
|
||
local latest_dir="$3"
|
||
local filelist_path="$4"
|
||
local feature_param="$5"
|
||
local ret
|
||
|
||
create_stash_mod "${install_path}/${latest_dir}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
foreach_filelist "filter_common_dirs" "reset_mod_dirs_with_stash_mod" "${install_type}" "${install_path}/${latest_dir}" "mkdir" \
|
||
"${filelist_path}" "${feature_param}" "no" "normal"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
foreach_filelist "filter_common_dirs" "remove_install_dirs" "${install_type}" "${install_path}/${latest_dir}" "mkdir" \
|
||
"${filelist_path}" "${feature_param}" "reverse" "normal"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
foreach_stashmod "restore_stash_mod" "${install_path}/${latest_dir}" "reverse"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
remove_stash_mod "${install_path}/${latest_dir}"
|
||
ret="$?" && [ $ret -ne 0 ] && return $ret
|
||
|
||
return 0
|
||
}
|
||
|
||
# 多版本卸载流程
|
||
multi_version_uninstall() {
|
||
local install_type="$1"
|
||
local install_path="$2"
|
||
local filelist_path="$3"
|
||
local package="$4"
|
||
local feature_param="$5"
|
||
local version="$6"
|
||
local version_dir="$7"
|
||
local username="$8"
|
||
local usergroup="$9"
|
||
local docker_root="${10}"
|
||
local custom_options="${11}"
|
||
local is_recreate_softlink="${12}"
|
||
local tmp_root tmp_filelist_path
|
||
local ret total_ret=0 install_path_full="" is_running="" is_upgrade
|
||
local running_packages is_final_running="false"
|
||
|
||
check_param_not_empty "usergroup" "need set usergroup parameter in multi version uninstall!"
|
||
ret="$?" && [ ${ret} -ne 0 ] && return ${ret}
|
||
|
||
get_tmp_root "tmp_root"
|
||
tmp_filelist_path=$(mktemp "$tmp_root/filelist_XXXXXX" || exit 1)
|
||
cp -f "${filelist_path}" "${tmp_filelist_path}"
|
||
|
||
if [ $? -ne 0 ]; then
|
||
log "ERROR" "cp -f ${filelist_path} ${tmp_filelist_path} failed!"
|
||
exit 1
|
||
fi
|
||
|
||
del_tmp_filelist="rm -f \"${tmp_filelist_path}\""
|
||
|
||
version_uninstall "${install_type}" "${install_path}" "${filelist_path}" "${package}" "${feature_param}" \
|
||
"${version_dir}" "${username}" "${docker_root}" "${custom_options}"
|
||
if [ $? -ne 0 ]; then
|
||
eval "${del_tmp_filelist}"
|
||
return 1
|
||
fi
|
||
|
||
# 删除临时文件tmp_filelist_path
|
||
eval "${del_tmp_filelist}"
|
||
|
||
# 删除版本空目录
|
||
is_dir_empty "${install_path}/${version_dir}"
|
||
if [ $? -eq 0 ]; then
|
||
remove_dir_icp "${install_path}/${version_dir}"
|
||
ret="$?" && [ $ret -ne 0 ] && total_ret="1"
|
||
fi
|
||
|
||
return ${total_ret}
|
||
} |