#!/bin/bash

# 检查输入的 OSD ID
if [[ -z "$1" ]]; then
  echo "Usage: $0 <osd-id>"
  exit 1
fi

OSD_ID=$1
OSD_DIR="/var/lib/ceph/osd/ceph-${OSD_ID}"
STORCLI_PATH="/opt/MegaRAID/storcli/storcli64"
STORCLI_DEB_URL="https://images.private.ows.us/packages/storcli/Ubuntu/storcli_007.2807.0000.0000_all.deb"
TEMP_DEB="/tmp/storcli.deb"

# 检查 StorCLI 是否存在
if [[ ! -f "$STORCLI_PATH" ]]; then
  echo "StorCLI not found at $STORCLI_PATH. Downloading and installing..."
  curl -o "$TEMP_DEB" "$STORCLI_DEB_URL"
  if [[ $? -ne 0 ]]; then
    echo "Failed to download StorCLI package."
    exit 1
  fi

  dpkg -i "$TEMP_DEB"
  if [[ $? -ne 0 ]]; then
    echo "Failed to install StorCLI package."
    exit 1
  fi

  echo "StorCLI installed successfully."
  rm -f "$TEMP_DEB"
fi

# 检查目录是否存在
if [[ ! -d "$OSD_DIR" ]]; then
  echo "OSD directory not found: $OSD_DIR"
  exit 1
fi

ceph pg stat |egrep 'back|degraded|undersized' >/dev/null
if [ $? -eq 0 ];then
  echo "Some PGs are not in active+clean state."
  exit 
fi

# 查找 block 符号链接
BLOCK_PATH=$(readlink "$OSD_DIR/block")
if [[ -z "$BLOCK_PATH" ]]; then
  echo "Block device link not found in $OSD_DIR"
  exit 1
fi

# 获取硬盘信息
VG_NAME=$(lvs --noheadings -o vg_name "$BLOCK_PATH" | tr -d '[:space:]')
DEVICE=$(pvs --noheadings -o pv_name,vg_name | grep "$VG_NAME" | awk '{print $1}' | sed 's#/dev/##g')
VENDOR=$(lsblk -S -o NAME,VENDOR | grep "$DEVICE" | awk '{print $2}')
if [[ "$VENDOR" != "ATA" ]]; then
  echo "The disk is not from VENDOR ATA. It might have been altered. Exiting."
  exit 1
fi

echo "Found block device: $BLOCK_PATH (Vendor: $VENDOR)"

# 使用 storcli64 获取 RAID 卡上的硬盘 DID 信息
RAID_DISKS=$($STORCLI_PATH /c0 /eall /sall show | grep "JBOD" | awk '{print $1":"$2}')
echo "Detected RAID Disks: $RAID_DISKS"

# 获取指定硬盘的 HCTL 信息
HCTL=$(lsblk -S | grep "$DEVICE" | awk '{print $2}')
if [[ -z "$HCTL" ]]; then
  echo "Failed to retrieve HCTL for device $DEVICE"
  exit 1
fi

# 提取 HCTL 中的第三段作为 DID
DID=$(echo "$HCTL" | awk -F: '{print $3}')
if [[ -z "$DID" ]]; then
  echo "Failed to extract DID from HCTL: $HCTL"
  exit 1
fi

# 通过 HCTL 中的 DID 查找对应的 EID:Slt
MATCH_EID_SLT=$(echo "$RAID_DISKS" | grep ":$DID\$" | awk -F":" '{print $1":"$2}')
if [[ -z "$MATCH_EID_SLT" ]]; then
  echo "No matching RAID slot found for OSD disk with DID=$DID"
  exit 1
fi

echo "OSD disk matches RAID slot EID:Slt=$MATCH_EID_SLT, DID=$DID, HCTL=$HCTL"

# 停止对应的 Ceph OSD 服务
systemctl stop ceph-osd@${OSD_ID}
if [[ $? -ne 0 ]]; then
  echo "Failed to stop Ceph OSD $OSD_ID"
  exit 1
fi

echo "Ceph OSD $OSD_ID stopped."

# 标记 OSD 为 destroyed
ceph osd destroy ${OSD_ID} --force
if [[ $? -ne 0 ]]; then
  echo "Failed to mark OSD $OSD_ID as destroyed."
  exit 1
fi

echo "OSD $OSD_ID successfully destroyed."

# 移除 LVM 逻辑卷
LV_PATH=$(lvs --noheadings -o lv_path | grep "$BLOCK_PATH" | awk '{print $1}')
if [[ -z "$LV_PATH" ]]; then
  echo "LVM logical volume not found for block device $BLOCK_PATH"
  exit 1
fi

echo "Removing LVM logical volume: $LV_PATH"
lvremove -f "$LV_PATH"
if [[ $? -ne 0 ]]; then
  echo "Failed to remove LVM logical volume $LV_PATH"
  exit 1
fi

echo "LVM logical volume $LV_PATH removed."

# 配置硬盘为 good 状态
$STORCLI_PATH /c0/e$(echo $MATCH_EID_SLT | cut -d: -f1)/s$(echo $MATCH_EID_SLT | cut -d: -f2) set good force 
if [[ $? -ne 0 ]]; then
  echo "Failed to set disk at EID:Slt=$MATCH_EID_SLT to good state."
  exit 1
fi

echo "Disk at EID:Slt=$MATCH_EID_SLT set to good state."

# 创建 RAID0 卷组
$STORCLI_PATH /c0 add vd type=raid0 drives=$MATCH_EID_SLT wt
if [[ $? -ne 0 ]]; then
  echo "Failed to create RAID0 volume for disk at EID:Slt=$MATCH_EID_SLT."
  exit 1
fi

echo "RAID0 volume created for disk at EID:Slt=$MATCH_EID_SLT."

sleep 5
VENDOR=$(lsblk -S -o NAME,VENDOR | grep "$DEVICE" | awk '{print $2}')
if [[ "$VENDOR" == "ATA" ]]; then
  echo "The disk is from VENDOR ATA. It does not match the expectation. Exiting."
  exit 1
fi

# 清文件系统
wipefs -af /dev/${DEVICE}

# 将新创建的 RAID0 卷加入到 Ceph 集群
ceph-volume lvm create --data "/dev/${DEVICE}" --osd-id $OSD_ID
if [[ $? -ne 0 ]]; then
  echo "Failed to add RAID0 device to Ceph cluster."
  exit 1
fi

echo "RAID0 device /dev/${DEVICE} successfully added to Ceph cluster as OSD $OSD_ID."


