#!/bin/bash

set -e
#set -x

show_disk_status () {
	if [ ""$(lshw -class storage -json 2>/dev/null | jq -r '.[]["id"]' | head -n1) = "raid" ] ; then
		HDRAID_PROD=$(lshw -class storage -json 2>/dev/null | jq -r '.[]["product"]')

		local en npd counter
		en=$(megacli -EncInfo -aALL -NoLog | awk '/Device ID/ {print $4}')
		npd=$(megacli -EncInfo -aALL -NoLog | awk '/Number of Slots/ {print $5}')
		nld=$(megacli -LDGetNum -aALL -NoLog | awk '/Number of Virtual Drives/ { print $NF }')
		counter=0

		echo "devname,VD,Slot,Status,Size,Model,Serial"
		while [ "$counter" -lt "$nld" ] ; do
			raw_pdinfo=$(megacli -LdPdInfo -a0 -NoLog | sed -n "/^Virtual\ Drive:\ $counter\ /,/^Virtual\ Drive:\ $(($counter+1))\ /{ /^Slot\ Number:/p }" | awk '{ print $NF }')
			(while read slotnb; do
				raw_dinfo=$(megacli -PDInfo -PhysDrv [${en}:${slotnb}] -aALL -NoLog)
				dstatus=$(echo "$raw_dinfo" | awk '/^Firmware state/ {print $3}'|tr -d ',')
				dsize=$(echo "$raw_dinfo" | awk '/^Raw Size/ {print $3}')
				dsize="${dsize} "$(echo "$raw_dinfo" | awk '/^Raw Size/ {print $4}')
				case $counter in
				0)
					devname=sda
				;;
				1)
					devname=sdb
				;;
				2)
					devname=sdc
				;;
				3)
					devname=sdd
				;;
				4)
					devname=sde
				;;
				5)
					devname=sdf
				;;
				6)
					devname=sdg
				;;
				7)
					devname=sdh
				;;
				8)
					devname=sdi
				;;
				9)
					devname=sdj
				;;
				10)
					devname=sdk
				;;
				11)
					devname=sdl
				;;
				12)
					devname=sdm
				;;
				13)
					devname=sdn
				;;
				14)
					devname=sdo
				;;
				15)
					devname=sdp
				;;
				16)
					devname=sdq
				;;
				17)
					devname=sdr
				;;
				18)
					devname=sds
				;;
				19)
					devname=sdt
				;;
				20)
					devname=sdu
				;;
				21)
					devname=sdv
				;;
				22)
					devname=sdw
				;;
				23)
					devname=sdx
				;;
				23)
					devname=sdy
				;;
				23)
					devname=sdz
				;;
				esac
				dmodel=$(smartctl -a -d megaraid,${slotnb} /dev/${devname} | grep "Device Model" | sed 's/Device Model:     //')
				dserial=$(smartctl -a -d megaraid,${slotnb} /dev/${devname} | grep "Serial Number" | sed 's/Serial Number:    //')
				echo $devname,$counter,$slotnb,$dstatus,$dsize,$dmodel,$dserial
			done) <<<$raw_pdinfo

			counter=$(($counter + 1))
		done
	else
#		echo "No raid card"
		echo "devname,Logical_ID,Size,Model,Serial"
		for i in $(ls -v /dev/disk/by-path/ | grep -v part | grep -v usb) ; do
			LOGICAL_ID=$(echo $i | cut -d: -f3)
			DISK_NAME=$(basename $(realpath /dev/disk/by-path/$i))
			dmodel=$(smartctl -a /dev/${DISK_NAME} | grep "Device Model" | sed 's/Device Model:     //')
			dserial=$(smartctl -a /dev/${DISK_NAME} | grep "Serial Number" | sed 's/Serial Number:    //')
			dsize=$(smartctl -a /dev/${DISK_NAME} | grep "User Capacity" | cut -d'[' -f2 | cut -d']' -f1)
			echo ${DISK_NAME},${LOGICAL_ID},$dsize,$dmodel,$dserial
		done
	fi
}

replace_disk () {
	OLD_DISK=$1
	NEW_DISK=$2
	OLD_UUID=$(cat /etc/fstab | grep /srv/node/${OLD_DISK} | awk '{print $1}' | sed -e 's/[#]*UUID=//')
	echo "===> Formating /dev/${NEW_DISK} with UUID ${OLD_UUID}"
	mkfs.xfs -f -m uuid=${OLD_UUID} /dev/${NEW_DISK}
	echo "===> Uncommenting from fstab"
	sed -i "s/[#]*UUID=${OLD_UUID}/UUID=${OLD_UUID}/" /etc/fstab
	echo "===> Mounting /srv/node/${OLD_DISK}"
	mount /srv/node/${OLD_DISK}
	echo "===> Changing disk's owner"
	chown swift:swift /srv/node/${OLD_DISK}
}

usage () {
	echo "                     -l : list devices (columns output)"
	echo "                   -csv : list devices (csv output)"
	echo "                -s <ID> : setup RAID device"
	echo "-r <hold-hdd> <new-hdd> : format and mount <new-hdd> to replace <old-hdd>"
	exit 1
}

if [ "${1}" = "-csv" ] ; then
	show_disk_status
	exit 0
else
	case ${1} in
	"-s")
		if [ -z "${2}" ] ; then
			usage
		fi
		if [ ""$(lshw -class storage -json 2>/dev/null | jq -r '.[]["id"]' | head -n1) = "raid" ] ; then
			echo "Setting up RAID for device ${2}..."
			megacli -DiscardPreservedCache -Lall -a0
			megacli -CfgLdAdd -r0[32:${2}] WB RA Direct -a0
		else
			echo "Didn't detect hardware RAID"
			exit 1
		fi
		;;
	"-l")
		$0 -csv | csvlook --blanks -I
		PRODUCT_NAME=$(dmidecode -s system-product-name)
		case "${PRODUCT_NAME}" in
		"PowerEdge R720xd")
			echo "HDD disposition:"
			echo "Col1,Col2,Col3,Col4
0,3,6,9
1,4,7,10
2,5,8,11" | csvlook --blanks -I
		;;
		"CL2800 Gen10")
			echo "HDD disposition:"
			echo "Col1,Col2,Col3,Col4
sda,sdb,sdc,sdd
sdg,sdh,sdi,sdj
sdk,sdl,sdm,sdn" | csvlook --blanks -I
		;;
		*)
		;;
		esac
		exit 0
		;;
	"-r")
		if [ -z "${2}" ] ; then
			usage
		fi
		if [ -z "${3}" ] ; then
			usage
		fi
		replace_disk ${2} ${3}
		;;
	*)
		usage
		;;
	esac
fi
