#!/bin/bash
# 保留严格模式，仅临时关闭-u避免未定义变量报错（针对远端变量）
set -eo pipefail

# 1. 本地JAR包信息
JAR_FILE="/root/.jenkins/workspace/ruoyi-cloud/ruoyi-modules/xyiot-approval/target/xyiot-modules-approval-3.6.6.jar"
JAR_NAME=$(basename "$JAR_FILE")

# 2. 服务器配置（务必核对所有信息正确！）
DST_HOST="192.168.125.2"
SSH_USER="xunyuan"
SSH_PASS="xunyuan@123"
# 远端root密码和目标路径（直接用于expect，避免传递）
REMOTE_ROOT_PASS="xunyuan@123"
REMOTE_DST_PATH="/home/xunyuan/docker/ruoyi/modules/xyiot-approval/jar"

# 3. 日志配置
LOG_DIR=$(dirname "$JAR_FILE")
LOG_FILE="${LOG_DIR}/deploy-$(date +%F-%H%M%S).log"

# 日志函数
log() {
    local timestamp=$(date '+%F %T')
    echo "[$timestamp] $*" | tee -a "$LOG_FILE"
}

# 前置校验：JAR包是否存在
if [ ! -f "$JAR_FILE" ]; then
    log "❌ 错误：本地JAR包不存在！路径：$JAR_FILE"
    exit 1
fi

log "===== 开始部署 JAR 包 ====="
log "本地JAR包：$JAR_FILE"
log "远端目标：$SSH_USER@$DST_HOST:$REMOTE_DST_PATH/$JAR_NAME"

# 步骤1：传输JAR包到远端/tmp（这步已成功，保留逻辑）
log "步骤1/2：传输JAR包到远端/tmp目录..."
if ! sshpass -p "$SSH_PASS" scp -o StrictHostKeyChecking=no \
    "$JAR_FILE" "$SSH_USER@$DST_HOST:/tmp/$JAR_NAME" 2>&1 | tee -a "$LOG_FILE"; then
    log "❌ 步骤1失败：JAR包传输失败！"
    exit 1
fi
log "✅ 步骤1成功：JAR包已传输到/tmp目录"

# 步骤2：远端移动JAR包（核心：直接在expect写死变量，无传递冲突）
log "步骤2/2：移动JAR包到目标目录并授权..."
if ! sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no -T "$SSH_USER@$DST_HOST" <<'EOF' 2>&1 | tee -a "$LOG_FILE"; then
    # 检查expect是否安装
    if ! command -v expect &> /dev/null; then
        echo "❌ 错误：请先在远端执行 yum install -y expect 安装expect"
        exit 1
    fi

    # expect脚本：直接写死关键信息，彻底避免变量传递问题
    expect -c '
        set root_pass "xunyuan@123"
        set dst_path "/home/xunyuan/docker/ruoyi/modules/xyiot-approval/jar"
        set jar_name "xyiot-modules-approval-3.6.6.jar"

        # 拼接完整命令
        set cmd "mkdir -p $dst_path && mv -f /tmp/$jar_name $dst_path/ && chmod 644 $dst_path/$jar_name"
        
        spawn su -c "$cmd"

        # 处理密码和异常
        expect {
            "Password:" {send "$root_pass\r"}
            "口令：" {send "$root_pass\r"}
            timeout {puts "❌ 等待密码输入超时"; exit 1}
            eof {puts "❌ su命令异常退出"; exit 1}
        }

        expect eof

        # 检查执行结果
        if {[catch wait result]} {
            puts "❌ 移动命令执行失败"; exit 1
        } else {
            exit [lindex $result 3]
        }
    '

    # 验证JAR包是否存在（这里也直接写死路径，避免变量问题）
    if [ -f "/home/xunyuan/docker/ruoyi/modules/xyiot-approval/jar/xyiot-modules-approval-3.6.6.jar" ]; then
        echo "✅ 远端验证成功：JAR包已在目标目录"
    else
        echo "❌ 远端验证失败：目标目录无JAR包"
        exit 1
    fi
EOF
    log "❌ 步骤2失败：JAR包移动失败！"
    exit 1
fi

log "===== ✅ 全部部署步骤完成 ====="
log "日志文件路径：$LOG_FILE"
