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