#!/bin/bash
# Copyright (c) 2019 m-privacy GmbH
# ao
#
# Last change: 02/Sep/2019, ao

ORIGPARA="$(echo $SSH_ORIGINAL_COMMAND | cut -d " " -f 2-)"

if test -z "$ORIGPARA"
then
	ORIGPARA="$@"
fi

if test -z "$ORIGPARA"
then
	echo "Parameters missing, SSH_ORIGINAL_COMMAND: $SSH_ORIGINAL_COMMAND"
	exit $LINENO
fi

COMMAND="$(echo $ORIGPARA | cut -d " " -f 1)"
PARAM1="$(echo $ORIGPARA | cut -d " " -f 2)"
PARAM2="$(echo $ORIGPARA | cut -d " " -f 3)"
PARAM3="$(echo $ORIGPARA | cut -d " " -f 4)"

if test "$COMMAND" = "test"
then
	exit 0
fi

IMAGENUMBER="$(echo $SSH_CLIENT|cut -d ' ' -f 1|cut -d '.' -f 4)"
if test -z "$IMAGENUMBER"
then
	echo "Cannot get image number from remote IP"
	exit $LINENO
fi

IMAGE="tgpro$IMAGENUMBER"
if ! sudo /usr/bin/rbd status "$IMAGE" &>/dev/null
then
	echo "Cannot find caller's image $IMAGE"
	exit $LINENO
fi

echo "$IMAGE $ORIGPARA" >>/tmp/cephboot.log

case "$COMMAND" in
	check)
		echo "Image $IMAGE found"
		exit 0
		;;
	snapshot-list)
		sudo /usr/bin/rbd snap ls "$IMAGE"
		exit $?
		;;
	snapshot-list-script)
		sudo /usr/bin/rbd snap ls "$IMAGE"|grep -v "^SNAPID "|tr -s " "|cut -d " " -f 3,6-
		exit $?
		;;
	snapshot-create)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter snapshot-name"
			exit $LINENO
		fi
		sudo /usr/bin/rbd --snap "$PARAM1" snap create "$IMAGE"
		exit $?
		;;
	snapshot-delete)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter snapshot-name"
			exit $LINENO
		fi
		sudo /usr/bin/rbd --snap "$PARAM1" snap rm "$IMAGE"
		exit $?
		;;
	snapshot-rollback)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter snapshot-name"
			exit $LINENO
		fi
		echo "Starting rollback in background, please reboot now"
		daemon -- /bin/bash -c "while ! sudo /usr/bin/rbd lock add \"$IMAGE\" rollback ; do sleep 3 ; done ; LOCKER=\"$(sudo /usr/bin/rbd lock ls \"$IMAGE\"|grep rollback|cut -d " " -f 1)\" ; sudo /usr/bin/rbd lock rm \"$IMAGE\" rollback \"$LOCKER\" ; sudo /usr/bin/rbd --snap \"$PARAM1\" snap rollback \"$IMAGE\""
		exit $?
		;;
	image-list)
		sudo /usr/bin/rbd ls -l|grep -v "@"
		exit $?
		;;
	image-list-script)
		sudo /usr/bin/rbd ls -l|grep "^tgpro"|grep -v "@"|cut -d " " -f 1|sed -e "s|tgpro||g"
		exit $?
		;;
	image-exists)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter image-number"
			exit $LINENO
		fi
		if ! sudo /usr/bin/rbd status "tgpro$PARAM1" &>/dev/null
		then
			echo "Cannot find image tgpro$PARAM1"
			exit $LINENO
		else
			echo "Image tgpro$PARAM1 found"
			exit 0
		fi
		;;
	image-create)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter image-number"
			exit $LINENO
		fi
		if test -z "$PARAM2" -o "$PARAM2" == "$PARAM1"
		then
			echo "$COMMAND: missing parameter MAC-address"
			exit $LINENO
		fi
		if test -z "$PARAM3" -o "$PARAM3" == "$PARAM2"
		then
			echo "$COMMAND: missing parameter IP-address"
			exit $LINENO
		fi
		if grep -q "$PARAM2" /etc/dhcp/dhcpd.conf
		then
			echo "MAC address $PARAM2 already in /etc/dhcp/dhcpd.conf"
			exit $LINENO
		fi
		if grep -q "$PARAM3" /etc/dhcp/dhcpd.conf
		then
			echo "IP address $PARAM3 already in /etc/dhcp/dhcpd.conf"
			exit $LINENO
		fi
		if sudo /usr/bin/rbd status "tgpro$PARAM1" &>/dev/null
		then
			echo "Image tgpro$PARAM1 already exists"
			exit $LINENO
		fi
		if ! sudo /sbin/tgpro-image-create "$PARAM1"
		then
			exit $?
		fi
		if ! echo "host tgpro$PARAM1 { hardware ethernet $PARAM2; fixed-address $PARAM3; }" >> /etc/dhcp/dhcpd.conf
		then
			exit $?
		fi
		sudo /etc/init.d/isc-dhcp-server restart
		echo "Image tgpro$PARAM1 with MAC $PARAM2 and IP $PARAM3 successfully created"
		exit 0
		;;
	image-copy)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter image-number"
			exit $LINENO
		fi
		if test -z "$PARAM2" -o "$PARAM2" == "$PARAM1"
		then
			echo "$COMMAND: missing parameter MAC-address"
			exit $LINENO
		fi
		if test -z "$PARAM3" -o "$PARAM3" == "$PARAM2"
		then
			echo "$COMMAND: missing parameter IP-address"
			exit $LINENO
		fi
		if grep -q "$PARAM2" /etc/dhcp/dhcpd.conf
		then
			echo "MAC address $PARAM2 already in /etc/dhcp/dhcpd.conf"
			exit $LINENO
		fi
		if grep -q "$PARAM3" /etc/dhcp/dhcpd.conf
		then
			echo "IP address $PARAM3 already in /etc/dhcp/dhcpd.conf"
			exit $LINENO
		fi
		if sudo /usr/bin/rbd status "tgpro$PARAM1" &>/dev/null
		then
			echo "Image tgpro$PARAM1 already exists"
			exit $LINENO
		fi
		if ! sudo /sbin/tgpro-image-copy "$IMAGENUMBER" "$PARAM1"
		then
			exit $?
		fi
		if ! echo "host tgpro$PARAM1 { hardware ethernet $PARAM2; fixed-address $PARAM3; }" >> /etc/dhcp/dhcpd.conf
		then
			exit $?
		fi
		sudo /etc/init.d/isc-dhcp-server restart
		echo "Image $IMAGE successfully copied to tgpro$PARAM1 with MAC $PARAM2 and IP $PARAM3"
		exit 0
		;;
	image-delete)
		if test -z "$PARAM1" -o "$PARAM1" == "$COMMAND"
		then
			echo "$COMMAND: missing parameter image-number"
			exit $LINENO
		fi
		if ! grep -q "host tgpro$PARAM1 " /etc/dhcp/dhcpd.conf
		then
			echo "host tgpro$PARAM1 not in /etc/dhcp/dhcpd.conf"
			exit $LINENO
		fi
		if ! sudo /usr/bin/rbd status "tgpro$PARAM1" &>/dev/null
		then
			echo "Image tgpro$PARAM1 does not exists"
			exit $LINENO
		fi
		if ! sudo /usr/bin/rbd snap purge "tgpro$PARAM1"
		then
			exit $?
		fi
		if ! sudo /usr/bin/rbd rm "tgpro$PARAM1"
		then
			exit $?
		fi
		grep -v "host tgpro$PARAM1" /etc/dhcp/dhcpd.conf > /tmp/dhcpd.conf.$$
		cat /tmp/dhcpd.conf.$$ > /etc/dhcp/dhcpd.conf
		rm /tmp/dhcpd.conf.$$
		sudo /etc/init.d/isc-dhcp-server restart
		echo "Image tgpro$PARAM1 successfully removed"
		exit 0
		;;
	*)
		echo "Invalid command $COMMAND"
		exit $LINENO
esac
