# NoCloud seed connection

: "${IMDS_TRANSPORT:=seed}"
: "${IMDS_DEFAULT_ENDPOINTS:=}"

nocloud_ds_options() {
	local options source

	for source in "$PROC/cmdline" "$SYS/class/dmi/id/product_serial"; do
		options=$(word_kval ds "$source" ';')
		set -- $options
		case "${1:-}" in
			nocloud|nocloud-net)
				printf '%s\n' "$options"
				return
				;;
		esac
	done
	return 1
}

expand_nocloud_dmi_seedfrom() {
	local seedfrom="$1" dmi_name dmi_file dmi_value marker prefix suffix
	for dmi_name in \
		baseboard-asset-tag baseboard-manufacturer baseboard-version \
		bios-release-date bios-vendor bios-version \
		chassis-asset-tag chassis-manufacturer chassis-serial-number \
		chassis-version system-manufacturer system-product-name \
		system-serial-number system-uuid system-version; do
		marker="__dmi.${dmi_name}__"
		case "$seedfrom" in *"$marker"*) ;; *) continue;; esac

		case "$dmi_name" in
			baseboard-asset-tag) dmi_file=board_asset_tag;;
			baseboard-manufacturer) dmi_file=board_vendor;;
			baseboard-version) dmi_file=board_version;;
			bios-release-date) dmi_file=bios_date;;
			bios-vendor) dmi_file=bios_vendor;;
			bios-version) dmi_file=bios_version;;
			chassis-asset-tag) dmi_file=chassis_asset_tag;;
			chassis-manufacturer) dmi_file=chassis_vendor;;
			chassis-serial-number) dmi_file=chassis_serial;;
			chassis-version) dmi_file=chassis_version;;
			system-manufacturer) dmi_file=sys_vendor;;
			system-product-name) dmi_file=product_name;;
			system-serial-number) dmi_file=product_serial;;
			system-uuid) dmi_file=product_uuid;;
			system-version) dmi_file=product_version;;
		esac
		dmi_value=$(cat "$SYS/class/dmi/id/$dmi_file" 2>/dev/null) || {
			log -s warning "Unable to read NoCloud DMI value '$dmi_name'"
			return 1
		}
		[ -n "$dmi_value" ] || {
			log -s warning "NoCloud DMI value '$dmi_name' is empty"
			return 1
		}

		while :; do
			case "$seedfrom" in *"$marker"*) ;; *) break;; esac
			prefix=${seedfrom%%"$marker"*}
			suffix=${seedfrom#*"$marker"}
			seedfrom="$prefix$dmi_value$suffix"
		done
	done

	case "$seedfrom" in
		*__dmi.*__*)
			log -s warning "Unknown NoCloud DMI variable in seedfrom '$seedfrom'"
			return 1
			;;
	esac
	printf '%s\n' "$seedfrom"
}

provider_imds_targets() {
	local k kv options v

	options=$(nocloud_ds_options) || return
	set -- $options
	shift
	for kv; do
		k="${kv%%=*}"
		v="${kv#*=}"
		case "$k" in
			s|seedfrom)
				v=$(expand_nocloud_dmi_seedfrom "$v") || return
				printf '%s\n' "${v%/}"
				return
				;;
		esac
	done
}
