Home | History | Annotate | Line # | Download | only in files
ec2_init revision 1.5.2.1
      1      1.1  jmcneill #!/bin/sh
      2      1.1  jmcneill #
      3  1.5.2.1    martin # $NetBSD: ec2_init,v 1.5.2.1 2023/10/02 13:27:41 martin Exp $
      4      1.1  jmcneill #
      5      1.1  jmcneill # PROVIDE: ec2_init
      6      1.1  jmcneill # REQUIRE: NETWORKING
      7      1.1  jmcneill # BEFORE:  LOGIN
      8      1.1  jmcneill 
      9      1.1  jmcneill $_rc_subr_loaded . /etc/rc.subr
     10      1.1  jmcneill 
     11      1.1  jmcneill name="ec2_init"
     12      1.1  jmcneill rcvar=${name}
     13      1.1  jmcneill start_cmd="ec2_init"
     14      1.1  jmcneill stop_cmd=":"
     15      1.1  jmcneill 
     16      1.5  jmcneill CLOUD_TYPE=EC2	# default
     17      1.5  jmcneill 
     18  1.5.2.1    martin case "$(/sbin/sysctl -n machdep.dmi.chassis-asset-tag 2>/dev/null)" in
     19      1.5  jmcneill OracleCloud*)
     20      1.5  jmcneill 	CLOUD_TYPE=OCI
     21      1.5  jmcneill 	;;
     22      1.5  jmcneill esac
     23      1.5  jmcneill 
     24      1.5  jmcneill case ${CLOUD_TYPE} in
     25      1.5  jmcneill EC2)
     26      1.5  jmcneill 	EC2_USER="ec2-user"
     27      1.5  jmcneill 	METADATA_URL="http://169.254.169.254/latest/meta-data/"
     28      1.5  jmcneill 	SSH_KEY_URL="public-keys/0/openssh-key"
     29      1.5  jmcneill 	;;
     30      1.5  jmcneill OCI)
     31      1.5  jmcneill 	EC2_USER="opc"
     32      1.5  jmcneill 	METADATA_URL="http://169.254.169.254/opc/v1/instance/"
     33      1.5  jmcneill 	SSH_KEY_URL="metadata/ssh_authorized_keys"
     34      1.5  jmcneill 	;;
     35      1.5  jmcneill esac
     36      1.5  jmcneill 
     37      1.1  jmcneill HOSTNAME_URL="hostname"
     38      1.1  jmcneill 
     39      1.2  jmcneill SSH_KEY_FILE="/home/${EC2_USER}/.ssh/authorized_keys"
     40      1.2  jmcneill 
     41      1.3   rhialto OS_METADATA_URL="http://169.254.169.254/openstack/latest/meta_data.json"
     42      1.3   rhialto 
     43      1.2  jmcneill ec2_newuser()
     44      1.2  jmcneill {
     45      1.5  jmcneill 	echo "Creating ${CLOUD_TYPE} user account ${EC2_USER}"
     46      1.2  jmcneill 	useradd -g users -G wheel,operator -m "${EC2_USER}"
     47      1.2  jmcneill }
     48      1.1  jmcneill 
     49      1.4   rhialto extract_random_seed()
     50      1.4   rhialto {
     51      1.4   rhialto 	sed -n -e '/random_seed/s/.*"random_seed": *"\([A-Za-z0-9+/=]*\)".*/\1/p'
     52      1.4   rhialto }
     53      1.4   rhialto 
     54      1.1  jmcneill ec2_init()
     55      1.1  jmcneill {
     56      1.1  jmcneill 	(
     57      1.1  jmcneill 	umask 022
     58      1.2  jmcneill 
     59      1.3   rhialto 	# set hostname; it may be 5-10 seconds for the metadata service
     60      1.5  jmcneill 	# to become reachable.
     61      1.3   rhialto 	try=0
     62      1.3   rhialto 	while [ $((try++)) -lt 20 ]
     63      1.3   rhialto 	do
     64      1.4   rhialto 		HOSTNAME=$(ftp -o - -q 2 "${METADATA_URL}${HOSTNAME_URL}")
     65      1.3   rhialto 		if [ -n "$HOSTNAME" ]; then
     66      1.5  jmcneill 			echo "Setting ${CLOUD_TYPE} hostname: ${HOSTNAME}"
     67      1.3   rhialto 			echo "$HOSTNAME" > /etc/myname
     68      1.3   rhialto 			hostname "$HOSTNAME"
     69      1.3   rhialto 			break
     70      1.3   rhialto 		fi
     71      1.5  jmcneill 		echo "${CLOUD_TYPE} hostname not available yet (try $try)"
     72      1.3   rhialto 		sleep 1
     73      1.3   rhialto 	done
     74      1.3   rhialto 
     75      1.5  jmcneill 	# create cloud user
     76      1.2  jmcneill 	id "${EC2_USER}" >/dev/null 2>&1 || ec2_newuser
     77      1.2  jmcneill 
     78      1.5  jmcneill 	# fetch the public key from the metadata service
     79      1.4   rhialto 	EC2_SSH_KEY=$(ftp -o - -q 2 "${METADATA_URL}${SSH_KEY_URL}")
     80      1.1  jmcneill 
     81      1.1  jmcneill 	if [ -n "$EC2_SSH_KEY" ]; then
     82      1.1  jmcneill 		# A key pair is associated with this instance, add it
     83      1.2  jmcneill 		# to EC2_USER's 'authorized_keys' file
     84      1.1  jmcneill 		mkdir -p $(dirname "$SSH_KEY_FILE")
     85      1.2  jmcneill 		chown "${EC2_USER}:users" $(dirname "$SSH_KEY_FILE")
     86      1.1  jmcneill 		touch "$SSH_KEY_FILE"
     87      1.2  jmcneill 		chown "${EC2_USER}:users" "$SSH_KEY_FILE"
     88      1.1  jmcneill 		cd $(dirname "$SSH_KEY_FILE")
     89      1.1  jmcneill 
     90      1.1  jmcneill 		grep -q "$EC2_SSH_KEY" "$SSH_KEY_FILE"
     91      1.1  jmcneill 		if [ $? -ne 0 ]; then
     92      1.5  jmcneill 			echo "Setting ${CLOUD_TYPE} SSH public key for user ${EC2_USER}: ${EC2_SSH_KEY##* }"
     93      1.1  jmcneill 			echo "$EC2_SSH_KEY" >> "$SSH_KEY_FILE"
     94      1.1  jmcneill 		fi
     95      1.1  jmcneill 	fi
     96      1.1  jmcneill 
     97      1.4   rhialto 	# May contain a "random_seed".
     98      1.4   rhialto 	OS_METADATA="$(ftp -o - -q 2 ${OS_METADATA_URL})"
     99      1.3   rhialto 	if echo "$OS_METADATA" | grep -q random_seed; then
    100      1.4   rhialto 		echo "$OS_METADATA" | extract_random_seed |
    101      1.4   rhialto 		    base64 -di >> /dev/urandom
    102      1.3   rhialto 	fi
    103      1.1  jmcneill 	)
    104      1.1  jmcneill }
    105      1.1  jmcneill 
    106      1.1  jmcneill load_rc_config $name
    107      1.1  jmcneill run_rc_command "$1"
    108