#!/bin/bash
# Copyright (c) 2020-2025 m-privacy GmbH
# ao
#
# Last change: 03/Jul/2025, ao

if test -z "$2"
then
	echo "Use: $0 target-hostname node-nr [osd-number [publicnet]]"
	echo "E.g: $0 ceph2 2 1 192.168.111."
	echo "Target node must have IP 192.168.111.node-nr reachable"
	exit 0
fi

TARGETHOST="$1"
NODENR="$2"
OSDNUM="$3"
PUBLIC="$4"
if test -z "$PUBLIC"
then
	PUBLIC="192.168.111."
fi
TARGETIP="$PUBLIC$NODENR"

RED="\033[31;01m"
BLUE="\033[34;01m"
GREEN="\033[32;01m"
MAGENTA="\033[35;01m"
RESET="\033[00m"

if ping -c 2 -q "$TARGETIP" > /dev/null
then
	PINGOK=true
else
	PINGOK=false
fi

if test -z "$OSDNUM"
then
	if test "$PINGOK" = "true"
	then
		echo -e "${MAGENTA}o--> get OSD number from $TARGETIP${RESET}"
		OSDNUM=$(ssh "root@$TARGETIP" 'ls /var/lib/ceph/osd/ 2>/dev/null|head -n 1|sed -e "s|ceph-||g"')
	fi
	if test -z "$OSDNUM"
	then
		OSDNUM=$(($NODENR-1))
		echo -e "${RED}o--> getting OSD number failed, assuming node-nr - 1 = $OSDNUM${RESET}"
	fi
fi

if test "$PINGOK" = "true"
then
	echo -e "${MAGENTA}o--> ssh root@$TARGETIP /bin/true${RESET}"
	ssh "root@$TARGETIP" "/bin/true" || exit $LINENO
fi
echo ""
echo "Remove $TARGETHOST/$TARGETIP with OSD number $OSDNUM from cephfs cluster"
if test "$PINGOK" = "true"
then
	echo "Target host is reachable, trying to cleanup Ceph there"
else
	echo "Target host is NOT reachable, please cleanup by hand"
fi
echo "Please check pool size and min_size values before you remove a node."
echo "Check: ceph osd pool get cephfs_[meta]data [min_]size"
echo "Set:   ceph osd pool set cephfs_[meta]data [min_]size N"
echo "Check: ceph osd pool get .mgr [min_]size"
echo "Set:   ceph osd pool set .mgr [min_]size N"
echo "Press return to continue or CTRL-C to exit."
read dummy

echo -e "${MAGENTA}o--> check /etc/hosts${RESET}"
if ! host "$TARGETHOST" &>/dev/null
then
	echo "$TARGETIP $TARGETHOST" >>/etc/hosts
fi
cd /etc/ceph || exit $LINENO
if test "$PINGOK" = "true"
then
	echo -e "${MAGENTA}o--> ceph-deploy mon destroy $TARGETHOST${RESET}"
	ceph-deploy mon destroy $TARGETHOST || exit $LINENO
else
	echo -e "${MAGENTA}o--> ceph mon rm $TARGETHOST${RESET}"
	ceph mon rm "$TARGETHOST"
fi

echo -e "${MAGENTA}o--> ceph osd reweight $OSDNUM 0.0${RESET}"
ceph osd reweight "$OSDNUM" 0.0
echo -e "${MAGENTA}o--> ceph osd crush reweight osd.$OSDNUM 0.0${RESET}"
ceph osd crush reweight "osd.$OSDNUM" 0.0
echo -e "${MAGENTA}o--> sleep 10 and start checking balancing state${RESET}"
sleep 10
while ceph status | grep -q "replay\|degraded"
do
	echo -e "${MAGENTA}o--> cluster is replaying or degraded, wait for cluster to move data${RESET}"
	sleep 5
done
#ceph status
echo "Please check cluster health, then press return to finally remove the OSD"
echo "Abort with CTRL-C"
read dummy
echo -e "${MAGENTA}o--> ceph osd out $OSDNUM${RESET}"
ceph osd out "$OSDNUM"
echo -e "${MAGENTA}o--> ceph osd down $OSDNUM${RESET}"
ceph osd down "$OSDNUM"
if test "$PINGOK" = "true"
then
	echo -e "${MAGENTA}o--> ssh root@$TARGETIP pkill ceph-osd${RESET}"
	ssh "root@$TARGETIP" 'pkill ceph-osd'
	while ssh "root@$TARGETIP" "pgrep ceph-osd >/dev/null"
	do
		echo -n "."
		sleep 2
	done
	echo ""
fi
echo -e "${MAGENTA}o--> ceph osd crush remove osd.$OSDNUM${RESET}"
ceph osd crush remove "osd.$OSDNUM"
echo -e "${MAGENTA}o--> ceph osd crush remove $TARGETHOST${RESET}"
ceph osd crush remove "$TARGETHOST"
echo -e "${MAGENTA}o--> ceph auth del osd.$OSDNUM${RESET}"
ceph auth del "osd.$OSDNUM"
echo -e "${MAGENTA}o--> ceph auth del mds.$TARGETHOST${RESET}"
ceph auth del "mds.$TARGETHOST"
echo -e "${MAGENTA}o--> ceph osd rm $OSDNUM${RESET}"
ceph osd rm "$OSDNUM"

if test "$PINGOK" = "true"
then
	ssh "root@$TARGETIP" "pkill ceph-mon"
	ssh "root@$TARGETIP" "pkill ceph-mgr"
	ssh "root@$TARGETIP" "pkill ceph-mds"
	ssh "root@$TARGETIP" "pkill ceph-osd"
	while ssh "root@$TARGETIP" "pgrep ceph-mon >/dev/null"
	do
		sleep 1
	done
	while ssh "root@$TARGETIP" "pgrep ceph-osd >/dev/null"
	do
		sleep 1
	done
	echo -e "${MAGENTA}o--> ssh root@$TARGETIP umount /var/lib/ceph/osd/*${RESET}"
	ssh "root@$TARGETIP" "umount /var/lib/ceph/osd/*"
	echo -e "${MAGENTA}o--> ssh root@$TARGETIP mkdir -p /etc/ceph.old ; cp -a /etc/ceph/* /etc/ceph.old/${RESET}"
	ssh "root@$TARGETIP" "mkdir -p /etc/ceph.old"
	ssh "root@$TARGETIP" "cp -a /etc/ceph/* /etc/ceph.old/"
	echo -e "${MAGENTA}o--> ssh root@$TARGETIP rm -rf /var/lib/ceph/*/* /var/lib/ceph/mgr /etc/ceph/ceph.*.keyring${RESET}"
	ssh "root@$TARGETIP" "rm -rf /var/lib/ceph/*/* /var/lib/ceph/mgr /etc/ceph/ceph.*.keyring"
	ssh "root@$TARGETIP" "rm /etc/ceph/*" || exit $LINENO
	echo -e "${MAGENTA}o--> adjust fstab${RESET}"
	ssh "root@$TARGETIP" "grep -v \"/var/lib/ceph/osd/\" /etc/fstab > /etc/fstab.new"
	ssh "root@$TARGETIP" "cat /etc/fstab.new > /etc/fstab"
	ssh "root@$TARGETIP" "rm -f /etc/fstab.new /usr/rsbac/tightgate/packages/zzz-ceph-journal"
fi
echo -e "${MAGENTA}o--> remove from known_hosts${RESET}"
ssh-keygen -R "$TARGETIP"
ssh-keygen -R "$TARGETHOST"
echo -e "${MAGENTA}o--> ceph health${RESET}"
ceph health
echo -e "${MAGENTA}o--> Ready.${RESET}"
