#!/bin/bash
declare -a SUCCESS_LIST=()
declare -a FAIL_LIST=()
# 固定 racadm 最终路径，所有配置命令一律使用该路径
RACADM="/opt/dell/srvadmin/sbin/racadm"

run_cmd() {
    local desc="$1"
    shift
    echo -e "\n【执行】$desc"
    if "$@"; then
        echo "✅ $desc 成功"
        SUCCESS_LIST+=("$desc")
    else
        echo "❌ $desc 失败"
        FAIL_LIST+=("$desc")
    fi
}

echo "====================================="
echo "         iDRAC 初始化脚本开始执行"
echo "====================================="
# ============ 1. 核心：检查并安装 racadm ============
echo -e "\n【检测】正在检查 racadm 环境..."
if [ -x "$RACADM" ]; then
    echo "✅ 找到 racadm（固定绝对路径）：$RACADM"
    SUCCESS_LIST+=("检测到 racadm 已存在")
else
    echo -e "\n【安装】未找到 racadm，开始自动下载并安装 iDRACTools ..."
    
    TARBALL="DellEMC-iDRACTools-Web-LX-9.5.0-4111_A00.tar.gz"
    URL="https://forcedata.oss-cn-hangzhou.aliyuncs.com/tools/dell-update/${TARBALL}"
    
    if ! curl -fSL -O "$URL"; then
        echo "❌ iDRACTools 下载失败，请检查网络或 URL 是否有效。"
        FAIL_LIST+=("iDRACTools 下载")
        exit 1
    fi
    echo "✅ iDRACTools 下载成功"
    
    if ! tar -xzf "$TARBALL"; then
        echo "❌ iDRACTools 解压失败。"
        FAIL_LIST+=("iDRACTools 解压")
        exit 1
    fi
    echo "✅ iDRACTools 解压成功"
    
    INSTALL_DIR="iDRACTools/racadm"
    if [ ! -d "$INSTALL_DIR" ]; then
        INSTALL_DIR=$(find iDRACTools/racadm -maxdepth 2 -name "install_racadm.sh" -exec dirname {} \; | head -n 1)
    fi
    
    if [ -d "$INSTALL_DIR" ]; then
        pushd "$INSTALL_DIR" > /dev/null || { echo "❌ 无法进入安装目录"; exit 1; }
        
        # 安装依赖
        if command -v apt-get &> /dev/null; then
            apt-get update -qq && apt-get install -y -qq libargtable2-0 > /dev/null 2>&1
        elif command -v dnf &> /dev/null; then
            dnf install -y -q libargtable2 > /dev/null 2>&1
        elif command -v yum &> /dev/null; then
            yum install -y -q libargtable2 > /dev/null 2>&1
        fi
        
        if ./install_racadm.sh; then
            echo "✅ racadm 工具安装成功"
            SUCCESS_LIST+=("安装 racadm 工具")
        else
            echo "❌ racadm 工具安装失败"
            FAIL_LIST+=("安装 racadm 工具")
            exit 1
        fi
        popd > /dev/null
    else
        echo "❌ 未找到 install_racadm.sh，工具包结构可能不兼容。"
        FAIL_LIST+=("定位安装脚本")
        exit 1
    fi

    # 安装完成后直接校验固定路径二进制是否存在
    if [ ! -x "$RACADM" ]; then
        echo "❌ 安装完成但 $RACADM 不存在，请检查安装包。"
        FAIL_LIST+=("验证 racadm 安装")
        exit 1
    fi
fi

echo -e "\n====================================="
echo "使用 racadm：$RACADM"
echo "====================================="
# ============ 2. idrac用户初始化 ============
run_cmd "设置Users.10用户名irdeto" "$RACADM" set iDRAC.Users.10.UserName irdeto
run_cmd "设置Users.10密码" "$RACADM" set iDRAC.Users.10.Password Nihao0538
run_cmd "启用Users.10账号" "$RACADM" set iDRAC.Users.10.Enable 1
run_cmd "设置Users.10权限0x1ff" "$RACADM" set iDRAC.Users.10.Privilege 0x1ff
run_cmd "设置Users.10 IPMI LAN权限" "$RACADM" set iDRAC.Users.10.IpmiLanPrivilege 4
run_cmd "设置Users.10 IPMI串口权限" "$RACADM" set iDRAC.Users.10.IpmiSerialPrivilege 4
run_cmd "开启Users.10 SOL" "$RACADM" set iDRAC.Users.10.SolEnable 1
# ============ 3. 安全加固 ============
run_cmd "关闭SSH" "$RACADM" set iDRAC.SSH.Enable 0
run_cmd "关闭Telnet" "$RACADM" set iDRAC.Telnet.Enable 0
run_cmd "关闭SNMP" "$RACADM" set iDRAC.SNMP.AgentEnable 0
run_cmd "关闭VNC" "$RACADM" set iDRAC.VNCServer.Enable 0
run_cmd "关闭ASR自动重启" "$RACADM" config -g cfgRacTuning -o cfgRacTuneAsrEnable 0
run_cmd "关闭IPMI LAN" "$RACADM" set iDRAC.IPMILan.Enable 0
# ============ 4. 散热优化 ============
run_cmd "设置散热策略为性能优化" "$RACADM" set system.thermalsettings.ThermalProfile 0
run_cmd "设置排气温度上限60℃" "$RACADM" set system.thermalsettings.AirExhaustTemp 4
run_cmd "关闭风扇偏移" "$RACADM" set system.thermalsettings.FanSpeedOffset 255
run_cmd "设置最小风扇50%" "$RACADM" set system.thermalsettings.MinimumFanSpeed 50
# ============ 5. iDRAC 基础配置 ============
run_cmd "设置时区为上海" "$RACADM" set iDRAC.Time.Timezone Asia/Shanghai
run_cmd "关闭自动系统锁定" "$RACADM" set iDRAC.AutoOSLock.AutoOSLockState 0
run_cmd "关闭视频加密" "$RACADM" set iDRAC.VirtualConsole.EncryptEnable 0
run_cmd "设置远程存在端口10010" "$RACADM" set iDRAC.VirtualConsole.Port 10010
# ============ 6. 会话超时配置 ============
run_cmd "设置Web界面超时10800秒" "$RACADM" set iDRAC.WebServer.Timeout 10800
run_cmd "设置虚拟控制台超时10800秒" "$RACADM" set iDRAC.VirtualConsole.Timeout 10800
# ============ 7. 校验信息 ============
echo -e "\n\n====================================="
echo "                  校验信息"
echo "====================================="
echo -e "\n==== 用户信息 Users.10 ===="
"$RACADM" get iDRAC.Users.10
echo -e "\n==== 散热配置 ===="
"$RACADM" get system.thermalsettings
echo -e "\n==== 关键安全选项 ===="
"$RACADM" get iDRAC.SSH.Enable
"$RACADM" get iDRAC.Telnet.Enable
"$RACADM" get iDRAC.SNMP.AgentEnable
"$RACADM" get iDRAC.IPMILan.Enable
echo -e "\n==== iDRAC 基础配置 ===="
"$RACADM" get iDRAC.Time.Timezone
"$RACADM" get iDRAC.AutoOSLock.AutoOSLockState
"$RACADM" get iDRAC.VirtualConsole.EncryptEnable
"$RACADM" get iDRAC.VirtualConsole.Port
echo -e "\n==== 会话超时配置 ===="
"$RACADM" get iDRAC.WebServer.Timeout
"$RACADM" get iDRAC.VirtualConsole.Timeout
# ============ 8. 执行总结 ============
echo -e "\n\n====================================="
echo "                  执行总结"
echo "====================================="
echo "✅ 成功项总数：${#SUCCESS_LIST[@]}"
for s in "${SUCCESS_LIST[@]}"; do
    echo "    $s"
done
if [ ${#FAIL_LIST[@]} -gt 0 ]; then
    echo -e "\n❌ 失败项总数：${#FAIL_LIST[@]}"
    for f in "${FAIL_LIST[@]}"; do
        echo "    $f"
    done
else
    echo -e "\n🎉 全部任务执行成功！"
fi
echo "====================================="
