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

: "${IMDS_API_VERSION:=2021-05-01}"
IMDS_URI="metadata/instance"
IMDS_HEADER="Metadata"
IMDS_QUERY="?format=text&api-version=$IMDS_API_VERSION"

IMDS_HOSTNAME="compute/name"
IMDS_LOCAL_HOSTNAME="$IMDS_HOSTNAME"
IMDS_SSH_KEYS="compute/publicKeys"
IMDS_USERDATA="compute/userData"
IMDS_NICS="network/interface"
IMDS_MAC="macAddress"
IMDS_IPV4="ipv4/ipAddress"
IMDS_IPV6="ipv6/ipAddress"
IMDS_IPV4_NET="ipv4/subnet"

: "${DEFAULT_NAMESERVERS=168.63.129.16}"

_imds_header() {
	echo "$IMDS_HEADER: true"
}

# dig deeper than default
_imds_ssh_keys() {
	local key

	for key in $(imds "$IMDS_SSH_KEYS"); do
		imds "$IMDS_SSH_KEYS/${key}/keyData"
	done | sort -u
}

# decode userdata value
_imds_userdata() {
	imds "$IMDS_USERDATA" | base64 -d
}

_imds_nic_index() {
	local mac indexes index address

	mac=$(cat "$SYS/class/net/$1/address") || return 1
	mac=$(printf '%s' "$mac" | tr -d ':' | lower)
	[ -n "$mac" ] || return 1

	indexes=$(imds "$IMDS_NICS") || return 1
	for index in $indexes; do
		address=$(imds "$IMDS_NICS/$index/macAddress") || return 1
		address=$(printf '%s' "$address" | tr -d ':' | lower)
		[ "$address" = "$mac" ] || continue
		echo "$index"
		return 0
	done
	return 1
}

_imds_nic_value() {
	local path="$IMDS_NICS/$1" key="$3"
	local indexes index address prefix

	case "$2" in
		@mac)
			address=$(_imds "$path/$key") || return 1
			printf '%s\n' "$address" | lower |
				sed 's/../&:/g; s/:$//'
			;;
		@ipv4|@ipv6)
			indexes=$(_imds "$path/$key") || return 1
			for index in $indexes; do
				address=$(_imds "$path/$key/$index/privateIpAddress") ||
					return 1
				[ -z "$address" ] || printf '%s\n' "$address"
			done
			;;
		@ipv4-net)
			indexes=$(_imds "$path/$key") || return 1
			for index in $indexes; do
				address=$(_imds "$path/$key/$index/address") || return 1
				prefix=$(_imds "$path/$key/$index/prefix") || return 1
				printf '%s/%s\n' "$address" "$prefix"
			done
			;;
		*) _imds "$path/$key";;
	esac
}
