#!/bin/bash
#
# (c) 2019-2024 m-privacy GmbH
#
# Last change: ao, 05/Apr/2024
#

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

ISOIMAGE="/srv/tftp/install/tightgate.iso"
MOUNTPOINT="/tmp/tgpromnt"

if test -z "$1"
then
	echo "Use: $0 number"
	echo "Create a CephFS tgpro\$number with quota 50G"
	echo "using $ISOIMAGE"
	echo "e.g.: $0 1"
	exit
fi

TGNUM="$1"
case "$TGNUM" in
	[123456789])
		;;
	[123456789][0123456789])
		;;
	*)
		echo -e "${RED}Number \"$TGNUM\" is not a number${RESET}"
		exit 1
esac

if ! test -e $ISOIMAGE
then
	echo -e "${RED}ISO image $ISOIMAGE not found${RESET}"
	exit 2
fi

TMPFILE=/tmp/tgpro-cephfs-create.$$

if ceph osd pool ls | grep -q tgpro${TGNUM}_data
then
	echo -e "${RED}Pool tgpro${TGNUM}_data already exists${RESET}"
	exit 3
fi

echo -e "${BLUE}Create CephFS tgpro$TGNUM now${RESET}"
echo "Using ISO image $ISOIMAGE"
echo "Press return to continue or CTLR-C to abort"
read dummy

echo -e "${MAGENTA}o--> ceph osd pool create tgpro${TGNUM}_data 16${RESET}"
ceph osd pool create tgpro${TGNUM}_data 16 || exit $LINENO
echo -e "${MAGENTA}o--> ceph osd pool set tgpro${TGNUM}_data pg_num_min 8${RESET}"
ceph osd pool set tgpro${TGNUM}_data pg_num_min 8
echo -e "${MAGENTA}o--> ceph osd pool create tgpro${TGNUM}_metadata 16${RESET}"
ceph osd pool create tgpro${TGNUM}_metadata 16 || exit $LINENO
echo -e "${MAGENTA}o--> ceph osd pool set tgpro${TGNUM}_metadata pg_num_min 8${RESET}"
ceph osd pool set tgpro${TGNUM}_metadata pg_num_min 8
echo -e "${MAGENTA}o--> ceph osd pool set tgpro${TGNUM}_data pg_autoscale_mode on${RESET}"
ceph osd pool set tgpro${TGNUM}_data pg_autoscale_mode on
echo -e "${MAGENTA}o--> ceph osd pool set tgpro${TGNUM}_metadata pg_autoscale_mode on${RESET}"
ceph osd pool set tgpro${TGNUM}_metadata pg_autoscale_mode on
echo "Pools now:"
ceph osd pool ls

echo -e "${MAGENTA}o--> ceph fs new tgpro${TGNUM} tgpro${TGNUM}_metadata tgpro${TGNUM}_data${RESET}"
ceph fs new tgpro${TGNUM} tgpro${TGNUM}_metadata tgpro${TGNUM}_data || exit $LINENO
echo -e "${MAGENTA}o--> ceph fs set tgpro${TGNUM} session_autoclose 180${RESET}"
ceph fs set tgpro${TGNUM} session_autoclose 180 || exit $LINENO

mkdir -p "$MOUNTPOINT"
KEY=$(grep "key = " "/etc/ceph/ceph.client.admin.keyring" | cut -d " " -f 3)
echo -e "${MAGENTA}o--> mount -t ceph $HOSTNAME:/ $MOUNTPOINT -o name=admin,secret=\"$KEY\",mds_namespace=\"tgpro${TGNUM}\"${RESET}"
mount -t ceph "$MYIP:/" "$MOUNTPOINT" -o name=admin,secret="$KEY",fs="tgpro${TGNUM}" || exit $LINENO

echo -e "${MAGENTA}o--> setfattr -n ceph.quota.max_bytes -v 50000000000 $MOUNTPOINT${RESET}"
setfattr -n ceph.quota.max_bytes -v 50000000000 "$MOUNTPOINT"

mkdir -p /cdrom
mount -r -o loop $ISOIMAGE /cdrom

echo -e "${BLUE}Unpack Tar archive ($(($(stat -c '%s' /cdrom/tightgate*-nosrc*.tar.xz)/1048576)) MiB, left column), please be patient!${RESET}"
cd "$MOUNTPOINT"
if ! pxz --verbose -dc /cdrom/tightgate*-nosrc*.tar.xz | tar xpf -
then
	echo -e "${RED}Failed to unpack Tar archive${RESET}"
	cd
	umount "$MOUNTPOINT"
	umount /cdrom
	rm -rf "$MOUNTPOINT"
	exit 8
fi
. etc/cu/general
test -z "$VENDORBRAND" && VENDORBRAND="TightGate-Pro"

echo -e -n "${BLUE}Create ssh host keys:${RESET}"
echo "exit 0" >etc/init.d/firewall
echo -n " dsa"
rm etc/ssh/ssh_host_dsa_key
ssh-keygen -t dsa -b 1024 -N "" -C "$VENDORBRAND" -f etc/ssh/ssh_host_dsa_key >/dev/null
echo -n " rsa"
rm etc/ssh/ssh_host_rsa_key
ssh-keygen -t rsa -b 4096 -N "" -C "$VENDORBRAND" -f etc/ssh/ssh_host_rsa_key >/dev/null
echo -n " ed25519"
rm etc/ssh/ssh_host_ed25519_key
ssh-keygen -t ed25519 -N "" -C "$VENDORBRAND" -f etc/ssh/ssh_host_ed25519_key >/dev/null
echo -n " ecdsa"
rm etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ecdsa -N "" -C "$VENDORBRAND" -f etc/ssh/ssh_host_ecdsa_key >/dev/null
echo ""

echo -e "${BLUE}Remove obsolete packages${RESET}"
chroot . dpkg -P kernel-tightgate-pro-p4-smp-64
chroot . dpkg -P mprivacy-rescue

rm -rf rsbac64.dat var/rsbac64.dat var/log/rsbac64.dat home/rsbac64.dat
mkdir -p -m 755 etc/cu/initialpw
touch etc/cu/initialpw/all
echo "CUSTATUSPASS=\"\"" >> etc/cu/netconfcluster
rm -f etc/rc*.d/K07networking
if grep -q "^/dev/.*swap" etc/fstab
then
	echo -e "${BLUE}Disable swap in fstab${RESET}"
	sed -i -e 's|^\(/dev/.*swap.*\)|#\1|g' etc/fstab
fi
sed -i -e 's|errors=remount-ro|errors=remount-ro,discard|g' -e 's|defaults|discard|g' -e 's|quota,noatime|quota,noatime,discard|g' etc/fstab

KEY="$(timeout 60 ceph auth get-key client.tgpro 2>/dev/null)"
if test -n "$KEY"
then
	echo "CUCEPHEXTHOMEUSERSECRET=\"$KEY\"" >> etc/cu/netconfcluster
fi

echo -e "${BLUE}Umount${RESET}"

cd
umount "$MOUNTPOINT"
umount /cdrom
rm -rf "$MOUNTPOINT"

if ! ceph auth get client.tgfs >/dev/null
then
        echo -e "${MAGENTA}o--> create Ceph user tgfs${RESET}"
        ceph auth get-or-create client.tgfs mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rw pool=*_data' mds "allow rwps path=/" -o /etc/ceph/ceph.client.tgfs.keyring
fi

KEY="$(timeout 60 ceph auth get-key client.tgfw 2>/dev/null)"
if test -n "$KEY" -a -e /srv/tftp/pxelinux.cfg/default.dist
then
	if ! test -e /srv/tftp/pxelinux.cfg/default
	then
		echo -e "${BLUE}Create /srv/tftp/pxelinux.cfg/default from .dist${RESET}"
		sed -e "s|+CEPHUSER+|tgfs|g" -e "s|+CEPHPASS+|$KEY|g" < /srv/tftp/pxelinux.cfg/default.dist > /srv/tftp/pxelinux.cfg/default
	fi
fi
if test -n "$KEY" -a -e /srv/tftp/grub/grub.cfg.dist
then
	if ! test -e /srv/tftp/grub/grub.cfg
	then
		echo -e "${BLUE}Create /srv/tftp/grub/grub.cfg from .dist${RESET}"
		sed -e "s|+CEPHUSER+|tgfs|g" -e "s|+CEPHPASS+|$KEY|g" < /srv/tftp/grub/grub.cfg.dist > /srv/tftp/grub/grub.cfg
	fi
fi

echo -e "${BLUE}Ready.${RESET}"
echo ""
echo "- Create a DHCP static host entry in /etc/dhcp/dhcpd.conf now."
echo "- Check user tgfw and key from /etc/ceph/ceph.client.tgfw.keyring at kernel"
echo "  parameters CEPHUSER and CEPHPASS and check parameters CEPHNET and CEPHMONS"
echo "  in /srv/tftp/pxelinux.cfg/default and /srv/tftp/grub/grub.cfg."
echo "- Adjust pool size and min_size values, if needed,"
echo "  Check: ceph osd pool get tgpro${TGNUM}_[meta]data [min_]size"
echo "  Set:   ceph osd pool set tgpro${TGNUM}_[meta]data [min_]size N"
echo "  Check: ceph osd pool get .mgr [min_]size"
echo "  Set:   ceph osd pool set .mgr [min_]size N"

exit 0
