ec2_init revision 1.3
11.1Sjmcneill#!/bin/sh
21.1Sjmcneill#
31.3Srhialto# $NetBSD: ec2_init,v 1.3 2021/07/15 19:03:17 rhialto Exp $
41.1Sjmcneill#
51.1Sjmcneill# PROVIDE: ec2_init
61.1Sjmcneill# REQUIRE: NETWORKING
71.1Sjmcneill# BEFORE:  LOGIN
81.1Sjmcneill
91.1Sjmcneill$_rc_subr_loaded . /etc/rc.subr
101.1Sjmcneill
111.1Sjmcneillname="ec2_init"
121.1Sjmcneillrcvar=${name}
131.1Sjmcneillstart_cmd="ec2_init"
141.1Sjmcneillstop_cmd=":"
151.1Sjmcneill
161.2SjmcneillEC2_USER="ec2-user"
171.1SjmcneillMETADATA_URL="http://169.254.169.254/latest/meta-data/"
181.1SjmcneillSSH_KEY_URL="public-keys/0/openssh-key"
191.1SjmcneillHOSTNAME_URL="hostname"
201.1Sjmcneill
211.2SjmcneillSSH_KEY_FILE="/home/${EC2_USER}/.ssh/authorized_keys"
221.2Sjmcneill
231.3SrhialtoOS_METADATA_URL="http://169.254.169.254/openstack/latest/meta_data.json"
241.3Srhialto
251.2Sjmcneillec2_newuser()
261.2Sjmcneill{
271.2Sjmcneill	echo "Creating EC2 user account ${EC2_USER}"
281.2Sjmcneill	useradd -g users -G wheel,operator -m "${EC2_USER}"
291.2Sjmcneill}
301.1Sjmcneill
311.1Sjmcneillec2_init()
321.1Sjmcneill{
331.1Sjmcneill	(
341.1Sjmcneill	umask 022
351.2Sjmcneill
361.3Srhialto	# set hostname; it may be 5-10 seconds for the metadata service
371.3Srhialto	# to  become reachable.
381.3Srhialto	try=0
391.3Srhialto	while [ $((try++)) -lt 20 ]
401.3Srhialto	do
411.3Srhialto		HOSTNAME=$(ftp -o - -q 1 "${METADATA_URL}${HOSTNAME_URL}")
421.3Srhialto		if [ -n "$HOSTNAME" ]; then
431.3Srhialto			echo "Setting EC2 hostname: ${HOSTNAME}"
441.3Srhialto			echo "$HOSTNAME" > /etc/myname
451.3Srhialto			hostname "$HOSTNAME"
461.3Srhialto			break
471.3Srhialto		fi
481.3Srhialto		echo "EC2 hostname not available yet (try $try)"
491.3Srhialto		sleep 1
501.3Srhialto	done
511.3Srhialto
521.2Sjmcneill	# create EC2 user
531.2Sjmcneill	id "${EC2_USER}" >/dev/null 2>&1 || ec2_newuser
541.2Sjmcneill
551.3Srhialto	# fetch the public key from Amazon Web Services
561.3Srhialto	EC2_SSH_KEY=$(ftp -o - -q 1 "${METADATA_URL}${SSH_KEY_URL}")
571.1Sjmcneill
581.1Sjmcneill	if [ -n "$EC2_SSH_KEY" ]; then
591.1Sjmcneill		# A key pair is associated with this instance, add it
601.2Sjmcneill		# to EC2_USER's 'authorized_keys' file
611.1Sjmcneill		mkdir -p $(dirname "$SSH_KEY_FILE")
621.2Sjmcneill		chown "${EC2_USER}:users" $(dirname "$SSH_KEY_FILE")
631.1Sjmcneill		touch "$SSH_KEY_FILE"
641.2Sjmcneill		chown "${EC2_USER}:users" "$SSH_KEY_FILE"
651.1Sjmcneill		cd $(dirname "$SSH_KEY_FILE")
661.1Sjmcneill
671.1Sjmcneill		grep -q "$EC2_SSH_KEY" "$SSH_KEY_FILE"
681.1Sjmcneill		if [ $? -ne 0 ]; then
691.3Srhialto			echo "Setting EC2 SSH public key for user ${EC2_USER}: ${EC2_SSH_KEY##* }"
701.1Sjmcneill			echo "$EC2_SSH_KEY" >> "$SSH_KEY_FILE"
711.1Sjmcneill		fi
721.1Sjmcneill	fi
731.1Sjmcneill
741.3Srhialto	# May contain a "random_seed". Everything else doesn't matter.
751.3Srhialto	OS_METADATA="$(ftp -o - -q 1 ${OS_METADATA_URL})"
761.3Srhialto	if echo "$OS_METADATA" | grep -q random_seed; then
771.3Srhialto		echo "$OS_METADATA" >> /dev/urandom
781.3Srhialto	fi
791.1Sjmcneill	)
801.1Sjmcneill}
811.1Sjmcneill
821.1Sjmcneillload_rc_config $name
831.1Sjmcneillrun_rc_command "$1"
84