#!/bin/sh
#
# $NetBSD: ec2_init,v 1.3 2021/07/15 19:03:17 rhialto Exp $
#
# PROVIDE: ec2_init
# REQUIRE: NETWORKING
# BEFORE:  LOGIN

$_rc_subr_loaded . /etc/rc.subr

name="ec2_init"
rcvar=${name}
start_cmd="ec2_init"
stop_cmd=":"

EC2_USER="ec2-user"
METADATA_URL="http://169.254.169.254/latest/meta-data/"
SSH_KEY_URL="public-keys/0/openssh-key"
HOSTNAME_URL="hostname"

SSH_KEY_FILE="/home/${EC2_USER}/.ssh/authorized_keys"

OS_METADATA_URL="http://169.254.169.254/openstack/latest/meta_data.json"

ec2_newuser()
{
	echo "Creating EC2 user account ${EC2_USER}"
	useradd -g users -G wheel,operator -m "${EC2_USER}"
}

ec2_init()
{
	(
	umask 022

	# set hostname; it may be 5-10 seconds for the metadata service
	# to  become reachable.
	try=0
	while [ $((try++)) -lt 20 ]
	do
		HOSTNAME=$(ftp -o - -q 1 "${METADATA_URL}${HOSTNAME_URL}")
		if [ -n "$HOSTNAME" ]; then
			echo "Setting EC2 hostname: ${HOSTNAME}"
			echo "$HOSTNAME" > /etc/myname
			hostname "$HOSTNAME"
			break
		fi
		echo "EC2 hostname not available yet (try $try)"
		sleep 1
	done

	# create EC2 user
	id "${EC2_USER}" >/dev/null 2>&1 || ec2_newuser

	# fetch the public key from Amazon Web Services
	EC2_SSH_KEY=$(ftp -o - -q 1 "${METADATA_URL}${SSH_KEY_URL}")

	if [ -n "$EC2_SSH_KEY" ]; then
		# A key pair is associated with this instance, add it
		# to EC2_USER's 'authorized_keys' file
		mkdir -p $(dirname "$SSH_KEY_FILE")
		chown "${EC2_USER}:users" $(dirname "$SSH_KEY_FILE")
		touch "$SSH_KEY_FILE"
		chown "${EC2_USER}:users" "$SSH_KEY_FILE"
		cd $(dirname "$SSH_KEY_FILE")

		grep -q "$EC2_SSH_KEY" "$SSH_KEY_FILE"
		if [ $? -ne 0 ]; then
			echo "Setting EC2 SSH public key for user ${EC2_USER}: ${EC2_SSH_KEY##* }"
			echo "$EC2_SSH_KEY" >> "$SSH_KEY_FILE"
		fi
	fi

	# May contain a "random_seed". Everything else doesn't matter.
	OS_METADATA="$(ftp -o - -q 1 ${OS_METADATA_URL})"
	if echo "$OS_METADATA" | grep -q random_seed; then
		echo "$OS_METADATA" >> /dev/urandom
	fi
	)
}

load_rc_config $name
run_rc_command "$1"
