#!/bin/bash

# 定义认证信息和网段
USER="gmitwmaint"
PASS="kV.#93f;TbM%"
BASE_IP="10.1.4"

# 打印绝对左对齐的表头 (对齐了新增加的电源规格列，中英文视觉完美计算)
echo "BMC IP          | 主机型号         | BIOS版本             | 冗余开关 | 高可用监控 | 冗余模式 | 电源(数量x容量) | 功耗(W)  | PSU接线分布(推测)"
echo "----------------+------------------+----------------------+----------+------------+----------+-----------------+----------+---------------------------------"

# 循环遍历 1~16 节点
for i in {1..16}; do
  IP="${BASE_IP}.${i}"
  URL_POWER="https://${IP}/redfish/v1/Chassis/Self/Power"
  URL_SYSTEM="https://${IP}/redfish/v1/Systems/Self"
  
  RESP_PWR=$(curl -s -k -u "${USER}:${PASS}" --connect-timeout 5 "${URL_POWER}")
  RESP_SYS=$(curl -s -k -u "${USER}:${PASS}" --connect-timeout 5 "${URL_SYSTEM}")
  
  # 错误处理行的对齐 (注意此处拓宽了电源列的占位到 15)
  if [ -z "$RESP_PWR" ] || echo "$RESP_PWR" | grep -q "\"error\""; then
    printf "%-15s | %-16s | %-20s | %-8s | %-10s | %-8s | %-15s | %-8s | %s\n" "${IP}" "Error" "Error" "N/A" "N/A" "N/A" "N/A" "N/A" "N/A"
    continue
  fi
  
  # --- 提取系统与冗余信息 ---
  SYS_MODEL=$(echo "$RESP_SYS" | jq -r '.Model // "Unknown"')
  SYS_BIOS=$(echo "$RESP_SYS" | jq -r '.BiosVersion // "Unknown"')
  RED_ENABLED=$(echo "$RESP_PWR" | jq -r '.Redundancy[0].RedundancyEnabled')
  RED_STATE=$(echo "$RESP_PWR" | jq -r '.Redundancy[0].Status.State')
  RED_MODE=$(echo "$RESP_PWR" | jq -r '.Redundancy[0].Mode // "N/A"')
  POWER_CONSUMED=$(echo "$RESP_PWR" | jq -r '.PowerControl[0].PowerConsumedWatts // "N/A"')
  
  # --- 提取电源数量与单体功率 (新增逻辑) ---
  # 1. 统计在线电源数量
  PSU_COUNT=$(echo "$RESP_PWR" | jq -r '[.PowerSupplies[]? | select(.Status.State=="Enabled")] | length')
  # 2. 抓取第一个在线电源的单体功率 (例如 3600)
  PSU_CAPACITY=$(echo "$RESP_PWR" | jq -r 'first(.PowerSupplies[]? | select(.Status.State=="Enabled") | .PowerCapacityWatts) // "N/A"')
  
  # 3. 拼接显示格式，如果正常则显示 "6 x 3600W"，如果没电源则显示 "0"
  if [ "$PSU_COUNT" -gt 0 ] && [ "$PSU_CAPACITY" != "N/A" ]; then
      PSU_DISPLAY="${PSU_COUNT} x ${PSU_CAPACITY}W"
  else
      PSU_DISPLAY="${PSU_COUNT}"
  fi
  
  # --- 提取电压分组逻辑 ---
  VOLTS_GROUP=$(echo "$RESP_PWR" | jq -r '.PowerSupplies[]? | select(.Status.State=="Enabled") | .LineInputVoltage' | sort | uniq -c | awk '{print $1"x"$2"V"}' | paste -sd, -)
  if [ -z "$VOLTS_GROUP" ]; then VOLTS_GROUP="No active PSUs"; fi

  # 格式化输出: 电源列使用 %-15s 完美包裹 "6 x 3600W" 这样的字符长度
  printf "%-15s | %-16s | %-20s | %-8s | %-10s | %-8s | %-15s | %-8s | %s\n" \
  "${IP}" "${SYS_MODEL}" "${SYS_BIOS}" "${RED_ENABLED}" "${RED_STATE}" "${RED_MODE}" "${PSU_DISPLAY}" "${POWER_CONSUMED}" "${VOLTS_GROUP}"
done

echo ""
echo "=========================================================================================================================================================="
echo "                                              【 巡 检 结 果 与 配 置 规 范 诊 断 说 明 】"
echo "=========================================================================================================================================================="
cat << 'EOF'
一、 正确的配置方法 (高可用金标准)
一台合格的高可用 GPU 节点，必须同时满足以下条件，消除所有单点故障(SPOF)：
  1. 冗余开关 (RedundancyEnabled)：必须为 true (激活底层高可用逻辑)。
  2. 高可用监控 (Status.State)：必须为 Enabled (BMC实时监控接管预案)。
  3. 冗余模式 (Mode)：必须为 Failover 或 N+m (确保故障转移策略明确)。
  4. 物理接线 (推测)：必须为均衡分布 (如 6电源机器应严格体现为 3xA路电压, 3xB路电压)。

二、 核心字段可能出现的值
  1. 冗余开关 (RedundancyEnabled)：
     - true  ：总闸开启，允许硬件执行冗余逻辑。
     - false ：总闸关闭，系统处于非冗余（联合供电）状态。
  2. 高可用监控 (Status.State)：
     - Enabled       ：监控开启，随时准备故障转移。
     - Disabled      ：监控关闭，对单点故障无反应。
     - Absent        ：硬件不支持或模块缺失。
  3. 冗余模式 (Mode)：
     - Failover      ：故障转移。一台或多台PSU掉线时，无缝转移负载。
     - Shared        ：均摊共享。不侧重容错，仅侧重负载均衡。
     - N+m           ：N个主用，m个备用。

三、 常见配置组合带来的作用/结果
  [安全] true  + Enabled  + Failover : 完美。市电单路闪断时，电压平滑过渡，机器无感，业务不断断。
  [危险] false + Disabled + Failover : 逻辑裸奔 (当前集群现状)。空有战术毫无监控。单路闪断导致瞬态电压下沉，触发主板断电保护。
  [冲突] true  + Disabled + Failover : 固件 Bug 或配置冲突。总闸开了但监控没起，实际效果等同于裸奔。
==========================================================================================================================================================
EOF
