#!/usr/bin/env bash
set -euo pipefail
ROOT=$(git rev-parse --show-toplevel)

IPXE_VERSION=b41bda4413bf286d7b7a449bc05e1531da1eec2e
IPXE_BIN=(bin/ipxe.pxe bin-x86_64-efi/ipxe.efi)

IPXE_DIR=${ROOT}/.ipxe/ipxe-${IPXE_VERSION}
HTTP_URL="http://192.168.1.1:8000"

function download_ipxe() {
	base_dir=$(dirname ${IPXE_DIR})
	# Download the iPXE source if needed
	if [ ! -d "${IPXE_DIR}" ]; then
		mkdir -p "${base_dir}"
		curl -L https://github.com/ipxe/ipxe/archive/${IPXE_VERSION}.tar.gz | tar -xz -C "${base_dir}"
	fi
}

function patch_ipxe() {
	# Apply patches to iPXE source
	cd "${IPXE_DIR}/src"
	sed -i 's/^#undef[\t ]DOWNLOAD_PROTO_HTTPS.*$/#define DOWNLOAD_PROTO_HTTPS/g' config/general.h

	cat > embed.ipxe << EOF
#!ipxe

dhcp
chain ${HTTP_URL}/boot.ipxe || shell
# chain boot.ipxe || shell
EOF

	cd - > /dev/null
}

function build_ipxe() {
	cd "${IPXE_DIR}/src"
	for bin in "${IPXE_BIN[@]}"; do
		path=${IPXE_DIR}/src/${bin}
		if [ ! -f "${path}" ]; then
			make -j$(nproc) ${bin} EMBED=embed.ipxe
		fi
	done
	cd - > /dev/null
}


function host_tftp() {
	TFTP_DIR=$(mktemp --tmpdir -d tftp.XXX)
	chmod 755 ${TFTP_DIR}
	function cleanup() {
		rm -rf ${TFTP_DIR}
	}
	trap cleanup EXIT

	cp ${ROOT}/rendered/boot.ipxe ${TFTP_DIR}
	for bin in "${IPXE_BIN[@]}"; do
		path=${IPXE_DIR}/src/${bin}
		cp ${path} ${TFTP_DIR}
	done

	echo "Starting tftpd"
	sudo in.tftpd --verbosity 100 --permissive -L --secure ${TFTP_DIR}
}

function host_http() {
	HTTP_DIR=$(mktemp --tmpdir -d http.XXX)
	chmod 755 ${HTTP_DIR}
	function cleanup() {
		rm -rf ${HTTP_DIR}
	}
	trap cleanup EXIT

	ln -s ${ROOT}/rendered/boot.ipxe ${HTTP_DIR}
	for bin in "${IPXE_BIN[@]}"; do
		path=${IPXE_DIR}/src/${bin}
		ln -s ${path} ${HTTP_DIR}
	done

	ln -s ${ROOT}/configs ${HTTP_DIR}

	echo "Starting http"
	cd ${HTTP_DIR}
	python -m http.server 8000
	cd -
}

download_ipxe
patch_ipxe
build_ipxe
crete generate
host_http
