# Scaleway Instance MetaData Service variables and functions
# vim:set filetype=sh:
# shellcheck shell=sh

IMDS_URI="conf"

IMDS_HOSTNAME="HOSTNAME"
IMDS_LOCAL_HOSTNAME="$IMDS_HOSTNAME"
IMDS_SSH_KEYS="SSH_PUBLIC_KEYS_[0-9]+_KEY"

_imds() {
	local data endpoint

	for endpoint in $(_imds_endpoints); do
		data=$(wget --quiet --timeout 1 --output-document - \
			"http://$endpoint/$IMDS_URI$IMDS_QUERY") || continue
		_imds_cache_endpoint "$endpoint"
		printf '%s\n' "$data" | grep -E "^${1}=" | cut -d= -f2
		return
	done
	return 1
}

_imds_ssh_keys() {
	imds "$IMDS_SSH_KEYS" | tr -d "'" | sort -u
}

_imds_userdata() {
	local endpoint host port rv=1 status tmpfile
	mkdir -p "$ROOT/run/tiny-cloud"
	tmpfile=$(mktemp "$ROOT/run/tiny-cloud/userdata.XXXXXX") || return
	trap 'rm -f "$tmpfile"' 0

	# Scaleway requires IMDS to use low-numbered ports to fetch
	# userdata, which wget can't do
	for endpoint in $(_imds_endpoints); do
		set -- $(imds_host_port "$endpoint") || continue
		host="$1"
		port="$2"
		printf "GET /user_data/cloud-init HTTP/1.0\r\n\r\n" |
			nc -w 1 -p 1000 "$host" "$port" > "$tmpfile" ||
			continue
		status=$(head -n 1 "$tmpfile" | cut -d ' ' -f 2)
		[ "$status" = 200 ] || continue
		_imds_cache_endpoint "$endpoint"
		awk 'NR==1,/^\r$/ {next} {printf "%s%s",$0,RT}' "$tmpfile"
		rv=0
		break
	done
	rm -f "$tmpfile"
	trap - 0
	return "$rv"
}
