#!/bin/bash

declare -a SLOTS
declare -a OSDS_BY_NVME
declare -a IDS
declare -a LVS
declare -a LUKS

# Obtenir disques probl      matiques
DEVS=$(lsblk | awk '{print $1}' | grep n2)

# OSDs Down
OSDS=$(ceph osd tree-from $(hostname -s) | grep down | awk '{print $1}')

for DEV in $DEVS; do
  IDX=$(echo ${DEV} | grep -o '[[:digit:]]*' |head -1)
  # Slot physique d'un NVME
  SLOTS[$IDX]=$(cat /sys/block/${DEV}/device/address | xargs -i{} lspci -v -s {} | grep "Physical Slot"| awk -F':' '{print $2}'|xargs)
  for OSD in $OSDS; do
    DEVICE=$(ceph osd metadata $OSD |jq .devices)
    if [[ "$DEVICE" =~ "nvme$IDX" ]]; then
        # Ajouter un OSD        un NVME
        OSDS_BY_NVME[$IDX]="${OSDS_BY_NVME[$IDX]} $OSD"
        # ID d'un OSD
        IDS[$OSD]=$(cat /var/lib/ceph/osd/ceph-${OSD}/lockbox.keyring | grep client | awk -F'.' '{print $3}'| tr -d "]")
        IDL=${IDS[$OSD]//"-"/"--"}

        echo $IDL
        DM=$(dmsetup ls --tree -o compact,notrunc | grep ${IDL})
        # Container LUKS d'un OSD
        LUKS[$OSD]=$(echo $DM | awk '{print $1}')
        if [[ "${LUKS[$OSD]}" =~ "ceph--" ]]; then
            LVS[$OSD]=${LUKS[$OSD]}
            if [ -L "/var/lib/ceph/osd/ceph-${OSD}/block" ]; then
                LUKS[$OSD]=$(ls -l /var/lib/ceph/osd/ceph-${OSD}/block | awk '{print $11}' | awk -F'/' '{print $4}')
            else
                LUKS[$OSD]=$(echo ${IDS[$OSD]}|md5sum)
            fi
        else
            # LV d'un OSD
            LVS[$OSD]=$(echo $DM | awk -F'---' '{print $2}'| awk '{print $1}')
        fi
    fi
  done
done

echo NVMEs Reset
for nvme in ${!SLOTS[@]}; do
    echo Nvme${nvme}:
    echo -e "\tSLOT: ${SLOTS[$nvme]}"
    echo -e "\tOSDS:${OSDS_BY_NVME[$nvme]}"
    for OSD in ${OSDS_BY_NVME[$nvme]}; do
        echo osd.${OSD}
        echo -e "\tIDS: ${IDS[$OSD]}"
        echo -e "\tLUKS: ${LUKS[$OSD]}"
        echo -e "\tLVS: ${LVS[$OSD]}"
    done
done

# Pour chaque disque
for nvme in ${!SLOTS[@]}; do
    # arreter le disque
    echo Stopping nvme${nvme}
    (echo 0 > /sys/bus/pci/slots/${SLOTS[$nvme]}/power)
    # Nettoyer la table des Devicee Mapper
    for OSD in ${OSDS_BY_NVME[$nvme]}; do
        echo Cleaning ${LUKS[$OSD]}
        dmsetup remove ${LUKS[$OSD]}
        echo Cleaning ${LVS[$OSD]}
        dmsetup remove ${LVS[$OSD]}
    done
    # Redemarrer le disque 
    echo Restart nvme${nvme}
    (echo 1 > /sys/bus/pci/slots/${SLOTS[$nvme]}/power)
    sleep 5
    
    for OSD in ${OSDS_BY_NVME[$nvme]}; do
        echo Open LUKS ${LUKS[$OSD]}
        (ceph config-key get dm-crypt/osd/${IDS[$OSD]}/luks | /usr/sbin/cryptsetup --key-file - --allow-discards luksOpen /dev/mapper/${LVS[$OSD]} ${LUKS[$OSD]})

        echo Enable osd.${OSD}
        chown -R ceph:ceph /var/lib/ceph/osd/ceph-${OSD}
        ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev /dev/mapper/${LUKS[$OSD]} --path /var/lib/ceph/osd/ceph-${OSD} --no-mon-config
        rm -f /var/lib/ceph/osd/ceph-43/block
        ln -snf /dev/mapper/${LUKS[$OSD]} /var/lib/ceph/osd/ceph-${OSD}/block
        DM=$(ls -l /dev/mapper/${LUKS[$OSD]} | awk -F'->' '{print $2}'| awk -F'/' '{print $2}')
        chown -R ceph:ceph /dev/${DM}
        chown -R ceph:ceph /var/lib/ceph/osd/ceph-${OSD}
        systemctl enable ceph-volume@lvm-${OSD}-${IDS[$OSD]}
        systemctl enable --runtime ceph-osd@${OSD}

        echo restart OSD service
        systemctl start ceph-osd@${OSD}
    done
done
