#!/bin/sh

set -e
set -x

if ! [ -r /etc/oci-poc/oci-poc.conf ] ; then
	echo "Could not read /etc/oci-poc/oci-poc.conf"
	exit 1
fi
. /etc/oci-poc/oci-poc.conf

### SETUP REPOSITORIES ###
if [ -e /etc/oci-poc/oci-repository-key.asc ] ; then
	OCI_REPO_SIGNED_BY="[signed-by=/etc/oci/oci-repository-key.asc]"
	mkdir -p ${BODI_CHROOT_PATH}/etc/oci
	cp /etc/oci-poc/oci-repository-key.asc ${BODI_CHROOT_PATH}/etc/oci/
else
	OCI_REPO_SIGNED_BY=""
fi

if [ "${use_debian_dot_net_backport}" = "yes" ] ; then
	if [ -n "${REPO_TOKEN_DEBIAN_DOT_NET_REPO}" ] ; then
		OSBPO_URL=${REPO_TOKEN_DEBIAN_DOT_NET_REPO}
	else
		OSBPO_URL=http://osbpo.debian.net/debian
	fi
	echo "deb ${OCI_REPO_SIGNED_BY} ${OSBPO_URL} ${debian_release}-${openstack_release}-backports main
deb-src ${OCI_REPO_SIGNED_BY} ${OSBPO_URL} ${debian_release}-${openstack_release}-backports main

deb ${OCI_REPO_SIGNED_BY} ${OSBPO_URL} ${debian_release}-${openstack_release}-backports-nochange main
deb-src ${OCI_REPO_SIGNED_BY} ${OSBPO_URL} ${debian_release}-${openstack_release}-backports-nochange main
" >${BODI_CHROOT_PATH}/etc/apt/sources.list.d/openstack.list

	if ! [ -e /etc/oci-poc/oci-repository-key.asc ] ; then
		wget http://${debian_release}-${openstack_release}.debian.net/debian/pool/${debian_release}-${openstack_release}-backports/main/o/openstack-backports-archive-keyring/openstack-backports-archive-keyring_0.1_all.deb \
			-O ${BODI_CHROOT_PATH}/openstack-backports-archive-keyring_0.1_all.deb
		chroot ${BODI_CHROOT_PATH} dpkg -i /openstack-backports-archive-keyring_0.1_all.deb
		rm -f /openstack-backports-archive-keyring_0.1_all.deb
	fi
	chroot ${BODI_CHROOT_PATH} apt-get update
	chroot ${BODI_CHROOT_PATH} apt-get -y dist-upgrade -o Dpkg::Options::="--force-confnew"
fi

if [ "${install_buildd_incoming}" = "yes" ] ; then
	echo "deb ${REPO_TOKEN_DEBIAN_INCOMING_BUILDD} buildd-sid main
deb-src ${REPO_TOKEN_DEBIAN_INCOMING_BUILDD} buildd-sid main
" >${BODI_CHROOT_PATH}/etc/apt/sources.list.d/buildd-incoming.list
	chroot ${BODI_CHROOT_PATH} apt-get update
	chroot ${BODI_CHROOT_PATH} apt-get -y dist-upgrade -o Dpkg::Options::="--force-confnew"
fi

### INSTALL openstack-cluster-installer ###
DEBIAN_FRONTEND=noninteractive chroot ${BODI_CHROOT_PATH} apt-get install -y -o Dpkg::Options::="--force-confnew" openstack-cluster-installer haveged openstack-cluster-installer-cli bash-completion

# configure it with the settings from oci-poc
sed -i "s#^OPENSTACK_CLUSTER_NETWORK=.*#OPENSTACK_CLUSTER_NETWORK=${HOST_BRIDGE_NET}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^debian_mirror=.*#debian_mirror=${REPO_TOKEN_DEBIAN_MIRROR}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^debian_security_mirror=.*#debian_security_mirror=${REPO_TOKEN_DEBIAN_SECURITY_MIRROR}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^debian_backport_mirror=.*#debian_backport_mirror=${REPO_TOKEN_DEBIAN_BACKPORT_MIRROR}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^OCI_IP=.*#OCI_IP=${OCI_VM_IP}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
# Forward settings of PoC inside OCI
if [ -z "${disable_check_valid_until}" ] ; then
	disable_check_valid_until=no
fi
if [ -z "${disable_check_valid_until_security}" ] ; then
	disable_check_valid_until_security=no
fi
if [ -z "${disable_check_valid_until_backports}" ] ; then
	disable_check_valid_until_backports=no
fi
sed -i "s#^openstack_release=.*#openstack_release=${openstack_release}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^debian_release=.*#debian_release=${debian_release}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^disable_check_valid_until=.*#disable_check_valid_until=${disable_check_valid_until}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^disable_check_valid_until_security=.*#disable_check_valid_until_security=${disable_check_valid_until_security}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^disable_check_valid_until_backports=.*#disable_check_valid_until_backports=${disable_check_valid_until_backports}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
# http_proxy stuff for oci-poc-provision-cloud
sed -i "s#^USE_HTTP_PROXY=.*#USE_HTTP_PROXY=${USE_HTTP_PROXY}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
sed -i "s#^HTTP_PROXY_ADDR=.*#HTTP_PROXY_ADDR=${HTTP_PROXY_ADDR}#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf

# Apply the repository token overrides from oci-poc.conf into the
# [repo_tokens] section of openstack-cluster-installer.conf.
OCI_CONF=${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
for VAR in $(set | grep -o '^REPO_TOKEN_[A-Za-z0-9_]*') ; do
	TOKEN=${VAR#REPO_TOKEN_}
	VALUE=$(eval "echo \${$VAR}")
	if [ -n "${VALUE}" ] ; then
		if grep -q "^#\?${TOKEN}=" ${OCI_CONF} ; then
			sed -i "s|^\#\?${TOKEN}=.*|${TOKEN}=${VALUE}|" ${OCI_CONF}
		else
			sed -i "/^\[repo_tokens\]$/a ${TOKEN}=${VALUE}" ${OCI_CONF}
		fi
	fi
done

# Use correct Debian image name, depending on release
case "${debian_release}" in
"buster")	DEB_REL_NUM=10	;;
"bullseye")	DEB_REL_NUM=11	;;
"bookworm")	DEB_REL_NUM=12	;;
"trixie")	DEB_REL_NUM=13	;;
"forky")	DEB_REL_NUM=14	;;
*)		echo "Release not defined" ; exit 1 ;;
esac
if [ "${USE_DAILY_IMAGE}" = "yes" ] ; then
	sed -i  "s#^image_name=.*#image_name=debian-${DEB_REL_NUM}-generic-amd64-daily.qcow2#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
else
	sed -i  "s#^image_name=.*#image_name=debian-${DEB_REL_NUM}-generic-amd64.qcow2#" ${BODI_CHROOT_PATH}/etc/openstack-cluster-installer/openstack-cluster-installer.conf
fi

if [ "${USE_IKVSWITCH}" = "yes" ] ; then
	HOST_VIRTUAL_SUBNET_START_PREFIX=$(cat /etc/ikvswitch/ikvswitch.conf | grep HOST_VIRTUAL_SUBNET_START_PREFIX= | sed s/HOST_VIRTUAL_SUBNET_START_PREFIX=//)
	HOST_VIRTUAL_SUBNET_END_PREFIX=$(cat /etc/ikvswitch/ikvswitch.conf | grep HOST_VIRTUAL_SUBNET_END_PREFIX= | sed s/HOST_VIRTUAL_SUBNET_END_PREFIX=//)
	HOST_VIRTUAL_SUBNET_END_PREFIX=$(( ${HOST_VIRTUAL_SUBNET_END_PREFIX} + 5 ))
	SUB_DEF="subnet ${HOST_VIRTUAL_SUBNET_START_PREFIX}.${HOST_VIRTUAL_SUBNET_END_PREFIX}.0 netmask 255.255.255.0 {
}
"
fi

### CONFIGURE isc-dhcpd ###
sed -i 's/INTERFACESv4=.*/INTERFACESv4="eth0"/' ${BODI_CHROOT_PATH}/etc/default/isc-dhcp-server

echo "allow booting;
allow bootp;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
authoritative;
ignore-client-uids On;

${SUB_DEF}

subnet ${HOST_NETWORK_PREFIX}.0 netmask 255.255.255.0 {
	range ${GUEST_FIRST_SLAVE_IP} ${GUEST_LAST_SLAVE_IP};
	option domain-name \"${GUESTS_DOMAIN_NAME}\";
	option domain-name-servers ${PRIMARY_DNS}, ${SECONDA_DNS};
	option routers ${HOST_NETWORK_PREFIX}.1;
	option subnet-mask 255.255.255.0;
	option broadcast-address ${HOST_NETWORK_PREFIX}.255;
	next-server ${OCI_VM_IP};
	if exists user-class and option user-class = \"iPXE\" {
		filename \"http://${OCI_VM_IP}/oci/ipxe.php\";
	} elsif exists pxe-system-type {
		if option pxe-system-type = 00:00 {
			filename \"lpxelinux.0\";
		} elsif option pxe-system-type = 00:07 {
			filename \"shimx64.efi.signed\";
		} elsif option pxe-system-type = 00:09 {
			filename \"shimx64.efi.signed\";
		}
	} else {
		filename \"pxelinux.0\";
	}
}
" >${BODI_CHROOT_PATH}/etc/dhcp/dhcpd.conf

### CONFIGURE tftpd ###
sed -i 's#TFTP_DIRECTORY=.*#TFTP_DIRECTORY="/var/lib/openstack-cluster-installer/tftp"#' ${BODI_CHROOT_PATH}/etc/default/tftpd-hpa

# Copy our authorized_keys in the image BEFORE we build the live image
# so that it will be there
if [ -e /root/.ssh/authorized_keys ] ; then
	mkdir -p ${BODI_CHROOT_PATH}/root/.ssh
	chmod 700 ${BODI_CHROOT_PATH}/root/.ssh
	cat /root/.ssh/authorized_keys >>${BODI_CHROOT_PATH}/root/.ssh/authorized_keys
fi

### Build OCI's live image ###
mkdir -p ${BODI_CHROOT_PATH}/root/live-image
chroot ${BODI_CHROOT_PATH} /bin/bash <<EOF
cd /root/live-image
openstack-cluster-installer-build-live-image --pxe-server-ip ${OCI_VM_IP} --debian-mirror-addr ${REPO_TOKEN_DEBIAN_MIRROR} --debian-security-mirror-addr ${REPO_TOKEN_DEBIAN_SECURITY_MIRROR}
EOF
# We remove the workdir, because it's too heavy to copy
rm -rf ${BODI_CHROOT_PATH}/root/live-image

# Configure puppet's ENC
. /usr/share/openstack-pkg-tools/pkgos_func

if ! grep -q -E '^\[master\]' ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf ; then
	echo '[master]' >>${BODI_CHROOT_PATH}/etc/puppet/puppet.conf
fi

pkgos_add_directive ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf master "external_nodes = /usr/bin/oci-puppet-external-node-classifier" "# Path to enc"
pkgos_inifile set ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf master external_nodes /usr/bin/oci-puppet-external-node-classifier
pkgos_add_directive ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf master "node_terminus = exec" "# Tell what type of ENC"
pkgos_inifile set ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf master node_terminus exec

# Needed for puppetserver >= 7:
# Set [main]/server to point to itself, so that we can manage certs
if ! grep -q -E '^\[main\]' ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf ; then
	echo '[main]' >>${BODI_CHROOT_PATH}/etc/puppet/puppet.conf
fi
pkgos_add_directive ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf main "server = oci-puppet-master.example.com" "# puppet master address"
pkgos_inifile set ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf main server oci-puppet-master.example.com

# Under puppet 7, we need [main]/server to be set for "puppetserver ca" to work
if [ -e ${BODI_CHROOT_PATH}/usr/bin/puppetserver ] ; then
	if ! grep '\[main\]' ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf ; then
		echo '[main]' >>${BODI_CHROOT_PATH}/etc/puppet/puppet.conf
	fi
	pkgos_add_directive ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf main "server = oci-puppet-master.example.com" "#puppet master address"
	pkgos_inifile set ${BODI_CHROOT_PATH}/etc/puppet/puppet.conf main server oci-puppet-master.example.com
fi

if [ -r "${DEB_IMAGE_FILE}" ] ; then
	cp ${DEB_IMAGE_FILE} ${BODI_CHROOT_PATH}/root
fi

# Configure OCI_API_URL export var
echo "export OCI_API_URL=\"http://127.0.0.1/oci/api.php?\"" >>${BODI_CHROOT_PATH}/root/.bashrc

# Copy joe editor preference file from host
if [ -e /root/.joerc ] ; then
	cp /root/.joerc ${BODI_CHROOT_PATH}/root
fi

if [ -d /root/.joe ] ; then
	cp -r /root/.joe ${BODI_CHROOT_PATH}/root
fi
