#!/bin/sh

set -ex

HDD_DEV=${1}
if [ -e /dev/${HDD_DEV} ] ; then
	if ! blkid | grep -q ${HDD_DEV} ; then
		mkfs.xfs -f /dev/${HDD_DEV}
	fi
fi
HDD_UUID=$(blkid -o value -s UUID /dev/${HDD_DEV})
MAJOR_NUM=$(hostname -s | sed 's#[a-z0-9]*-cephosd-##')
DRIVE_LETTER=$(echo ${HDD_DEV} | sed 's#[sv]d##')
case "${DRIVE_LETTER}" in
b)
	CEPH_OSD_ID=${MAJOR_NUM}02
	CEPH_OSD_PORT=6806
	;;
c)
	CEPH_OSD_ID=${MAJOR_NUM}03
	CEPH_OSD_PORT=6809
	;;
d)
	CEPH_OSD_ID=${MAJOR_NUM}04
	CEPH_OSD_PORT=6812
	;;
e)
	CEPH_OSD_ID=${MAJOR_NUM}05
	CEPH_OSD_PORT=6815
	;;
f)
	CEPH_OSD_ID=${MAJOR_NUM}06
	CEPH_OSD_PORT=6818
	;;
g)
	CEPH_OSD_ID=${MAJOR_NUM}07
	CEPH_OSD_PORT=6821
	;;
h)
	CEPH_OSD_ID=${MAJOR_NUM}08
	CEPH_OSD_PORT=6824
	;;
i)
	CEPH_OSD_ID=${MAJOR_NUM}09
	CEPH_OSD_PORT=6827
	;;
j)
	CEPH_OSD_ID=${MAJOR_NUM}10
	CEPH_OSD_PORT=6830
	;;
k)
	CEPH_OSD_ID=${MAJOR_NUM}11
	CEPH_OSD_PORT=6833
	;;
l)
	CEPH_OSD_ID=${MAJOR_NUM}12
	CEPH_OSD_PORT=6836
	;;
m)
	CEPH_OSD_ID=${MAJOR_NUM}13
	CEPH_OSD_PORT=6839
	;;
n)
	CEPH_OSD_ID=${MAJOR_NUM}14
	CEPH_OSD_PORT=6842
	;;
o)
	CEPH_OSD_ID=${MAJOR_NUM}15
	CEPH_OSD_PORT=6845
	;;
p)
	CEPH_OSD_ID=${MAJOR_NUM}16
	CEPH_OSD_PORT=6848
	;;
q)
	CEPH_OSD_ID=${MAJOR_NUM}17
	CEPH_OSD_PORT=6851
	;;
r)
	CEPH_OSD_ID=${MAJOR_NUM}18
	CEPH_OSD_PORT=6854
	;;
s)
	CEPH_OSD_ID=${MAJOR_NUM}19
	CEPH_OSD_PORT=6857
	;;
t)
	CEPH_OSD_ID=${MAJOR_NUM}20
	CEPH_OSD_PORT=6860
	;;
u)
	CEPH_OSD_ID=${MAJOR_NUM}21
	CEPH_OSD_PORT=6863
	;;
v)
	CEPH_OSD_ID=${MAJOR_NUM}22
	CEPH_OSD_PORT=6866
	;;
w)
	CEPH_OSD_ID=${MAJOR_NUM}23
	CEPH_OSD_PORT=6869
	;;
x)
	CEPH_OSD_ID=${MAJOR_NUM}24
	CEPH_OSD_PORT=6872
	;;
y)
	CEPH_OSD_ID=${MAJOR_NUM}25
	CEPH_OSD_PORT=6875
	;;
z)
	CEPH_OSD_ID=${MAJOR_NUM}26
	CEPH_OSD_PORT=6878
	;;
esac
MOUNT_POINT=/var/lib/ceph/osd/ceph-${CEPH_OSD_ID}

DEFROUTE_IF=`awk '{ if ( $2 == "00000000" ) print $1 }' /proc/net/route`
if [ -n "${DEFROUTE_IF}" ] ; then
	if [ -x /bin/ip ] ; then
		DEFROUTE_IP=`LC_ALL=C ip addr show "${DEFROUTE_IF}" | grep inet | head -n 1 | awk '{print $2}' | cut -d/ -f1 | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'`
	else
		DEFROUTE_IP=`hostname -i | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'`
	fi
fi

# Check if the OSD is in ceph.conf
if ! grep -q "osd.${CEPH_OSD_ID}" /etc/ceph/ceph.conf ; then
	echo "[osd.${CEPH_OSD_ID}]
public addr = ${DEFROUTE_IP}:${CEPH_OSD_PORT}
cluster addr = ${DEFROUTE_IP}
" >>/etc/ceph/ceph.conf
fi

# Create fstab mountpoint and mount the drive
if ! grep -q ${HDD_UUID} /etc/fstab ; then
	sudo -u ceph mkdir -p ${MOUNT_POINT}
	echo "UUID=${HDD_UUID} ${MOUNT_POINT} xfs noatime,nodiratime,logbufs=8 0 0" >> /etc/fstab
	mount ${MOUNT_POINT}
fi

# Create a fsid if it doesn't exist, otherwise load it
if [ -r /var/lib/ceph/osd/ceph-${CEPH_OSD_ID}/fsid ] ; then
	UUID=$(cat /var/lib/ceph/osd/ceph-${CEPH_OSD_ID}/fsid)
else
	UUID=$(uuidgen)
fi

# Run ceph osd new
if ! [ -e ${MOUNT_POINT}/oci_ceph_osd_new_done ] ; then
	OSD_SECRET=$(ceph-authtool --gen-print-key)
	echo "{\"cephx_secret\": \"$OSD_SECRET\"}" | ceph osd new ${UUID} ${CEPH_OSD_ID} -i - -n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring
	# Create the OSD keyring file
	ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-${CEPH_OSD_ID}/keyring --name osd.${CEPH_OSD_ID} --add-key ${OSD_SECRET}
	echo "" >${MOUNT_POINT}/oci_ceph_osd_new_done
fi

if ! [ -r /var/lib/ceph/osd/ceph-${CEPH_OSD_ID}/fsid ] ; then
	ceph-osd -i ${CEPH_OSD_ID} --osd-data /var/lib/ceph/osd/ceph-${CEPH_OSD_ID} --mkfs --osd-uuid $UUID
	chown -R ceph:ceph /var/lib/ceph/osd/ceph-${CEPH_OSD_ID}
fi
if ! [ -L /etc/systemd/system/ceph-osd.target.wants/ceph-osd@${CEPH_OSD_ID}.service ] ; then
	systemctl enable ceph-osd@${CEPH_OSD_ID}
fi
systemctl start ceph-osd@${CEPH_OSD_ID}
echo "Waiting 5 seconds to settle-up before next run..."
sleep 5
