diff --git a/scripts/deploy/1-check-env/check_env.sh b/scripts/deploy/1-check-env/check_env.sh index da11e195344e7668e96c2d96e9d6ad71b5549d2f..d54c49410e19f3319d619b432b5a1a82760d5834 100644 --- a/scripts/deploy/1-check-env/check_env.sh +++ b/scripts/deploy/1-check-env/check_env.sh @@ -347,46 +347,40 @@ function set_hostname { } # 检查单个软件包是否可用 +# 参数: 包名 [备用包名1] [备用包名2] ... check_package() { - local pkg=$1 - if dnf list "$pkg" &>/dev/null; then - echo -e "${COLOR_INFO}[Info] $(printf '%-30s' "$pkg") \t(可用)${COLOR_RESET}" + local primary_pkg=$1 + shift + local alternate_pkgs=("$@") + + # 先检查主包名 + if dnf list "$primary_pkg" &>/dev/null; then + echo -e "${COLOR_INFO}[Info] $(printf '%-30s' "$primary_pkg") \t(可用)${COLOR_RESET}" return 0 + fi + + # 如果主包名不可用,尝试备用包名 + for alt_pkg in "${alternate_pkgs[@]}"; do + if dnf list "$alt_pkg" &>/dev/null; then + echo -e "${COLOR_INFO}[Info] $(printf '%-30s' "$primary_pkg") \t(可用,使用 $alt_pkg)${COLOR_RESET}" + return 0 + fi + done + + # 所有包名都不可用 + if [ ${#alternate_pkgs[@]} -gt 0 ]; then + echo -e "${COLOR_ERROR}[Error] $(printf '%-30s' "$primary_pkg") \t(不可用,已尝试: ${alternate_pkgs[*]})${COLOR_RESET}" else - echo -e "${COLOR_ERROR}[Error] $(printf '%-30s' "$pkg") \t(不可用)${COLOR_RESET}" - return 1 + echo -e "${COLOR_ERROR}[Error] $(printf '%-30s' "$primary_pkg") \t(不可用)${COLOR_RESET}" fi + return 1 } -# 需要检查的软件包列表 -PACKAGES=( - "euler-copilot-web" - "euler-copilot-witchaind-web" - "authHub" - "authhub-web" - "euler-copilot-rag" - "euler-copilot-framework" - "nginx" - "redis" - "mysql" - "mysql-server" - "java-17-openjdk" - "postgresql-server" - "postgresql-server-devel" - "postgresql" - "libpq-devel" - "git" - "make" - "gcc" - "gcc-c++" - "clang" - "llvm" - "tar" - "python3-pip" -) + all_available=true # 检查所有软件包 -check_all_packages() { - local PACKAGES=("$@") +# 包名格式: "package_name" 或 "package_name:alternate1:alternate2" +check_packages() { + local packages=("$@") local timeout_seconds=30 local start_time @@ -394,7 +388,7 @@ check_all_packages() { echo -e "${COLOR_INFO}--------------------------------${COLOR_RESET}" - for pkg in "${PACKAGES[@]}"; do + for pkg_spec in "${packages[@]}"; do # 检查是否超时 local current_time current_time=$(date +%s) @@ -405,17 +399,19 @@ check_all_packages() { echo -e "${COLOR_INFO}--------------------------------${COLOR_RESET}" return 2 fi - if ! check_package "$pkg"; then + + # 分割包名和备用名(使用冒号分隔) + IFS=':' read -ra pkg_names <<<"$pkg_spec" + if ! check_package "${pkg_names[@]}"; then all_available=false fi sleep 0.1 # 避免请求过快 done - } check_web_pkg() { local pkgs=( "nginx" - "redis" + "redis:redis6" # 支持 redis 或 redis6 包名 "mysql" "mysql-server" "authHub" @@ -423,7 +419,7 @@ check_web_pkg() { "euler-copilot-web" "euler-copilot-witchaind-web" ) - if ! check_all_packages "${pkgs[@]}"; then + if ! check_packages "${pkgs[@]}"; then return 1 fi } @@ -437,7 +433,7 @@ check_framework_pkg() { "tar" "python3-pip" ) - if ! check_all_packages "${pkgs[@]}"; then + if ! check_packages "${pkgs[@]}"; then return 1 fi } @@ -452,7 +448,7 @@ check_rag_pkg() { "postgresql-server-devel" "libpq-devel" ) - if ! check_all_packages "${pkgs[@]}"; then + if ! check_packages "${pkgs[@]}"; then return 1 fi } diff --git a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh index c6e881667cc5f4a9acf22b4a3eed494292481fad..01eb57ad1d62668ac6e0d68651d63a2eb4677db7 100644 --- a/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh +++ b/scripts/deploy/2-install-dependency/install_openEulerIntelligence.sh @@ -218,46 +218,57 @@ install_minio() { esac } # 智能安装函数 +# 参数: 包名 或 "包名:备用包名1:备用包名2" smart_install() { - local pkg=$1 + local pkg_spec=$1 local retry=3 local LOCAL_REPO_DIR="/var/cache/rpms" local use_local=false + # 解析包名和备用包名 + IFS=':' read -ra pkg_names <<<"$pkg_spec" + local primary_pkg="${pkg_names[0]}" + # 检查本地仓库目录是否存在 if [ -d "$LOCAL_REPO_DIR" ]; then use_local=true fi - echo -e "${COLOR_INFO}[Info] 正在安装 $pkg ...${COLOR_RESET}" + echo -e "${COLOR_INFO}[Info] 正在安装 $primary_pkg ...${COLOR_RESET}" - while [ $retry -gt 0 ]; do - # 本地安装模式(仅在本地仓库可用时尝试) - if [[ "$use_local" == true ]]; then - # 检查本地是否存在包(支持模糊匹配) - local local_pkg - local_pkg=$(find "$LOCAL_REPO_DIR" -name "${pkg}-*.rpm" | head -1) + # 尝试安装主包名和备用包名 + for pkg in "${pkg_names[@]}"; do + local current_retry=$retry - if [[ -n "$local_pkg" ]]; then - if dnf --disablerepo='*' --enablerepo=local-rpms install -y "$pkg"; then - installed_pkgs+=("$pkg") - return 0 + while [ $current_retry -gt 0 ]; do + # 本地安装模式(仅在本地仓库可用时尝试) + if [[ "$use_local" == true ]]; then + # 检查本地是否存在包(支持模糊匹配) + local local_pkg + local_pkg=$(find "$LOCAL_REPO_DIR" -name "${pkg}-*.rpm" | head -1) + + if [[ -n "$local_pkg" ]]; then + if dnf --disablerepo='*' --enablerepo=local-rpms install -y "$pkg"; then + installed_pkgs+=("$primary_pkg") + return 0 + fi fi fi - fi - # 在线安装模式(本地仓库不可用或本地安装失败) - if dnf install -y "$pkg"; then - installed_pkgs+=("$pkg") - return 0 - fi + # 在线安装模式(本地仓库不可用或本地安装失败) + if dnf install -y "$pkg"; then + installed_pkgs+=("$primary_pkg") + return 0 + fi - ((retry--)) - sleep 1 + ((current_retry--)) + sleep 1 + done done - echo "${COLOR_ERROR}[Error] 错误: $pkg 安装失败!${COLOR_RESET}" - missing_pkgs+=("$pkg") + # 所有包名都尝试失败 + echo "${COLOR_ERROR}[Error] 错误: $primary_pkg 安装失败!${COLOR_RESET}" + missing_pkgs+=("$primary_pkg") install_success=false return 1 @@ -767,7 +778,7 @@ install_rag() { install_web() { local pkgs=( "nginx" - "redis" + "redis:redis6" # 支持 redis 或 redis6 包名 "mysql" "mysql-server" "authHub" diff --git a/scripts/deploy/2-install-dependency/uninstall_dependency.sh b/scripts/deploy/2-install-dependency/uninstall_dependency.sh index c2187f3c9ee39b4f2b6283c61c2048174493510f..31c09d8ef071cd7bad3b4eaea3c4eb21c1f607ab 100644 --- a/scripts/deploy/2-install-dependency/uninstall_dependency.sh +++ b/scripts/deploy/2-install-dependency/uninstall_dependency.sh @@ -8,9 +8,10 @@ COLOR_RESET='\033[0m' # 重置颜色 declare -a uninstalled_pkgs=() uninstall_success=true missing_pkgs=() +# 包名格式: "package_name" 或 "package_name:alternate1:alternate2" pkgs=( "nginx" - "redis" + "redis:redis6" # 支持 redis 或 redis6 包名 "mysql" "java-17-openjdk" "postgresql" @@ -76,33 +77,45 @@ uninstall_dependency() { trap cleanup INT TERM ERR # 检查并卸载每个包 - for pkg in "${pkgs[@]}"; do + for pkg_spec in "${pkgs[@]}"; do + # 解析包名和备用包名(使用冒号分隔) + IFS=':' read -ra pkg_names <<<"$pkg_spec" + local primary_pkg="${pkg_names[0]}" + # MinIO 使用专门的卸载函数处理 - if [ "$pkg" = "minio" ]; then + if [ "$primary_pkg" = "minio" ]; then uninstall_minio || { uninstall_success=false - missing_pkgs+=("$pkg") + missing_pkgs+=("$primary_pkg") } continue fi - if rpm -q "$pkg" >/dev/null 2>&1; then - echo -e "${COLOR_INFO}[Info] 正在卸载 $pkg...${COLOR_RESET}" - if [ "$pkg" = "nginx" ]; then - dnf remove -y nginx >/dev/null 2>&1 - elif dnf remove -y "$pkg" >/dev/null 2>&1; then - uninstalled_pkgs+=("$pkg") - else - echo -e "${COLOR_ERROR}[Error] 卸载 $pkg 失败!${COLOR_RESET}" - uninstall_success=false - missing_pkgs+=("$pkg") - cleanup + # 尝试检查并卸载主包名或备用包名 + local pkg_found=false + for pkg in "${pkg_names[@]}"; do + if rpm -q "$pkg" >/dev/null 2>&1; then + pkg_found=true + echo -e "${COLOR_INFO}[Info] 正在卸载 $pkg...${COLOR_RESET}" + if [ "$pkg" = "nginx" ]; then + dnf remove -y nginx >/dev/null 2>&1 + elif dnf remove -y "$pkg" >/dev/null 2>&1; then + uninstalled_pkgs+=("$pkg") + break # 成功卸载后跳出循环 + else + echo -e "${COLOR_ERROR}[Error] 卸载 $pkg 失败!${COLOR_RESET}" + uninstall_success=false + missing_pkgs+=("$pkg") + cleanup + fi fi - else - echo -e "${COLOR_INFO}[Info] $pkg 未安装,跳过...${COLOR_RESET}" - fi + done + if [ "$pkg_found" = false ]; then + echo -e "${COLOR_INFO}[Info] $primary_pkg 未安装,跳过...${COLOR_RESET}" + fi done + # 取消捕获 trap - INT TERM ERR # 检查安装结果 @@ -160,11 +173,11 @@ delete_dir() { local target="$BASE_PWD/$dir" # 检查目录是否存在 - if ls -d $target &>/dev/null; then + if ls -d "$target" &>/dev/null; then echo -e "${COLOR_INFO}[Info] 正在删除: $target${COLOR_RESET}" | tee -a "$LOG_FILE" # 实际删除操作 - if rm -rf $target; then + if rm -rf "$target"; then deleted_dirs+=("$target") echo -e "${COLOR_INFO}[Info] 成功删除: $target${COLOR_RESET}" | tee -a "$LOG_FILE" else