1 #!/bin/sh 2 # 3 # $NetBSD: ec2_init,v 1.4 2021/07/20 19:31:23 rhialto 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 EC2_USER="ec2-user" 17 METADATA_URL="http://169.254.169.254/latest/meta-data/" 18 SSH_KEY_URL="public-keys/0/openssh-key" 19 HOSTNAME_URL="hostname" 20 21 SSH_KEY_FILE="/home/${EC2_USER}/.ssh/authorized_keys" 22 23 OS_METADATA_URL="http://169.254.169.254/openstack/latest/meta_data.json" 24 25 ec2_newuser() 26 { 27 echo "Creating EC2 user account ${EC2_USER}" 28 useradd -g users -G wheel,operator -m "${EC2_USER}" 29 } 30 31 extract_random_seed() 32 { 33 sed -n -e '/random_seed/s/.*"random_seed": *"\([A-Za-z0-9+/=]*\)".*/\1/p' 34 } 35 36 ec2_init() 37 { 38 ( 39 umask 022 40 41 # set hostname; it may be 5-10 seconds for the metadata service 42 # to become reachable. 43 try=0 44 while [ $((try++)) -lt 20 ] 45 do 46 HOSTNAME=$(ftp -o - -q 2 "${METADATA_URL}${HOSTNAME_URL}") 47 if [ -n "$HOSTNAME" ]; then 48 echo "Setting EC2 hostname: ${HOSTNAME}" 49 echo "$HOSTNAME" > /etc/myname 50 hostname "$HOSTNAME" 51 break 52 fi 53 echo "EC2 hostname not available yet (try $try)" 54 sleep 1 55 done 56 57 # create EC2 user 58 id "${EC2_USER}" >/dev/null 2>&1 || ec2_newuser 59 60 # fetch the public key from Amazon Web Services 61 EC2_SSH_KEY=$(ftp -o - -q 2 "${METADATA_URL}${SSH_KEY_URL}") 62 63 if [ -n "$EC2_SSH_KEY" ]; then 64 # A key pair is associated with this instance, add it 65 # to EC2_USER's 'authorized_keys' file 66 mkdir -p $(dirname "$SSH_KEY_FILE") 67 chown "${EC2_USER}:users" $(dirname "$SSH_KEY_FILE") 68 touch "$SSH_KEY_FILE" 69 chown "${EC2_USER}:users" "$SSH_KEY_FILE" 70 cd $(dirname "$SSH_KEY_FILE") 71 72 grep -q "$EC2_SSH_KEY" "$SSH_KEY_FILE" 73 if [ $? -ne 0 ]; then 74 echo "Setting EC2 SSH public key for user ${EC2_USER}: ${EC2_SSH_KEY##* }" 75 echo "$EC2_SSH_KEY" >> "$SSH_KEY_FILE" 76 fi 77 fi 78 79 # May contain a "random_seed". 80 OS_METADATA="$(ftp -o - -q 2 ${OS_METADATA_URL})" 81 if echo "$OS_METADATA" | grep -q random_seed; then 82 echo "$OS_METADATA" | extract_random_seed | 83 base64 -di >> /dev/urandom 84 fi 85 ) 86 } 87 88 load_rc_config $name 89 run_rc_command "$1" 90