#!/bin/bash

# 定义颜色常量
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

# 定义关键变量
TARGET_VERSION="1.1.1"          # 目标最低版本（包含该版本）
OPENSSL_VERSION="1.1.1k"        # 待安装的具体版本
OPENSSL_SOURCE_URL="http://dw.chan.ink/组件源码/openssl-1.1.1k.tar.gz"
OPENSSL_INSTALL_DIR="/usr/local/openssl"
SOURCE_TAR="openssl-${OPENSSL_VERSION}.tar.gz"
SOURCE_DIR="openssl-${OPENSSL_VERSION}"
OLD_OPENSSL="/usr/bin/openssl.old"  # 旧版本备份路径

# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[错误]${RESET} 请使用 root 用户运行此脚本"
    exit 1
fi

# 记录当前目录
ORIGINAL_DIR=$(pwd)

# 获取当前 OpenSSL 版本（去除可能的后缀）
get_current_version() {
    local current=$(openssl version | awk '{print $2}' | cut -d '-' -f1 | cut -d '+' -f1)
    echo "${current}"
}

# 版本比较函数（严格低于目标版本时返回 true）
version_less_than() {
    printf '%s\n' "$1" "$2" | sort -V | head -n1 | grep -q "^$1\$"
}

# 主流程
main() {
    local current_version=$(get_current_version)
    
    # 版本检查（仅当前版本 < 目标版本时执行升级）
    if ! version_less_than "$current_version" "$TARGET_VERSION"; then
        echo -e "${GREEN}[信息]${RESET} 当前 OpenSSL 版本 ${current_version} ≥ ${TARGET_VERSION}，无需升级"
        return
    fi

    echo -e "${YELLOW}[提示]${RESET} 当前 OpenSSL 版本 ${current_version} < ${TARGET_VERSION}，开始升级"
    
    # 安装依赖
    echo -e "${GREEN}[步骤1/6]${RESET} 安装编译依赖"
    yum install -y wget gcc make perl-core zlib-devel || {
        echo -e "${RED}[错误]${RESET} 依赖安装失败"
        exit 1
    }

    # 下载源码（支持断点续传）
    echo -e "${GREEN}[步骤2/6]${RESET} 下载 OpenSSL 源码"
    wget -c --tries=3 "$OPENSSL_SOURCE_URL" || {
        echo -e "${RED}[错误]${RESET} 源码下载失败（尝试3次后仍失败）"
        exit 1
    }

    # 解压源码
    echo -e "${GREEN}[步骤3/6]${RESET} 解压源码包"
    tar -zxvf "$SOURCE_TAR" &> /dev/null || {
        echo -e "${RED}[错误]${RESET} 解压源码失败"
        exit 1
    }

    # 编译安装
    echo -e "${GREEN}[步骤4/6]${RESET} 编译并安装"
    cd "$SOURCE_DIR" || {
        echo -e "${RED}[错误]${RESET} 进入源码目录失败"
        exit 1
    }
    
    # 配置编译选项（添加静默输出）
    ./config --prefix="$OPENSSL_INSTALL_DIR" --openssldir="$OPENSSL_INSTALL_DIR" shared zlib &> /dev/null || {
        echo -e "${RED}[错误]${RESET} 配置编译选项失败"
        exit 1
    }
    
    make -j$(nproc) &> /dev/null || {
        echo -e "${RED}[错误]${RESET} 编译过程失败"
        exit 1
    }
    
    make install &> /dev/null || {
        echo -e "${RED}[错误]${RESET} 安装过程失败"
        exit 1
    }
    cd ..

    # 配置系统环境（非交互式文件处理）
    echo -e "${GREEN}[步骤5/6]${RESET} 配置系统环境"
    # 更新动态链接库
    echo "$OPENSSL_INSTALL_DIR/lib" > /etc/ld.so.conf.d/openssl.conf
    ldconfig -v &> /dev/null
    
    # 处理旧版本备份（强制覆盖旧备份）
    if [ -f /usr/bin/openssl ]; then
        if [ -f "$OLD_OPENSSL" ]; then
            rm -f "$OLD_OPENSSL"  # 先删除旧备份
        fi
        mv -f /usr/bin/openssl "$OLD_OPENSSL"  # 非交互式移动
    fi
    ln -sf "$OPENSSL_INSTALL_DIR/bin/openssl" /usr/bin/openssl  # 强制更新软链接

    # 清理临时文件
    echo -e "${GREEN}[步骤6/6]${RESET} 清理临时文件"
    rm -f "$SOURCE_TAR"
    rm -rf "$SOURCE_DIR"

    # 验证升级结果
    echo -e "${GREEN}[完成]${RESET} 升级后的 OpenSSL 版本："
    openssl version
}

# 执行主函数
main

# 回到原始目录
cd "$ORIGINAL_DIR"