#!/bin/bash

depwarn() {
	DOCS="https://github.com/coreos/coreos-cloudinit#cloud-config"
	echo "DEPRECATION WARNING! $1 See docs for the new cloud-config format here: $DOCS" 1>&2;
}

# this will only run on generic images

C10N_ENDPOINT=https://core-api.appspot.com/v1/c10n/group
META_URL="http://169.254.169.254/latest"

ETCD_SERVICE_D="/run/systemd/system/etcd.service.d"
mkdir -p $ETCD_SERVICE_D

/usr/bin/block-until-url $META_URL
IP=$(curl -s $META_URL/meta-data/local-ipv4)

# Attempt to download userdata, exiting on failure or no user-data is found
USER_DATA=$(curl -s --fail $META_URL/user-data)
retcode=$?

# exit code 22 is http code 404, meaning user-data is blank
if [[ $retcode -ne 0 && $retcode -ne 22 ]]; then
	echo "Unable to communicate with EC2 metadata service"
	exit 1
elif [[ $retcode -eq 22 || -z "${USER_DATA}" ]]; then
	echo "No user-data provided"
	exit 0
fi

# Preserve the original user-data contents to use as the c10n token in case
# a discovery URL is not provided.
C10N_TOKEN="${USER_DATA}"

# If user-data is an HTTPS url, follow it
if echo "${USER_DATA}" | grep -q '^https://'; then
	depwarn "Resolving user-data as a URL is deprecated."

	# Backwards compatibility.  If we have a GitHub gist that doesn't end in /raw, we'll append it to before grabbing the gist
	if echo "${USER_DATA}" | grep -e '^https://gist.github.com' | grep -v -e 'raw$'; then
		USER_DATA="${USER_DATA}/raw"
	fi

	echo "Downloading contents of URL: ${USER_DATA}"

	USER_DATA="$(curl -s $USER_DATA)"
fi

# Create temporary file that gets cleaned up on exit
TMP=$(mktemp)
trap "rm -f ${TMP}" EXIT

# Write user-data to disk for future validation
echo "${USER_DATA}" > $TMP

# If user-data is a script, execute it
if  head -n 1 $TMP | grep -q '^#!'; then
	if grep -q '^ETCD_DISCOVERY_URL=' $TMP; then
		depwarn "The ETCD_DISCOVERY_URL variable is deprecated."
		eval $(grep  '^ETCD_DISCOVERY_URL=' $TMP | tail -n1)
	fi

	if grep -q '^START_FLEET=1' $TMP; then
		depwarn "The START_FLEET variable is deprecated."
		START_FLEET=1
	fi

# If user-data is a cloud-config, do not do c10n
elif head -n 1 $TMP | grep -q '^#cloud-config'; then
	# no c10n if this is a cloudconfig
	C10N_TOKEN=""

# Validate the user-data as an SSH key, installing it if so
else
	depwarn "Interpreting user-data as an SSH key is deprecated."

	# This just validates the key
	ssh-keygen -l -f $TMP > /dev/null 2>&1

	if [ $? -eq 0 ]; then
		update-ssh-keys -a c10n $TMP
	fi
fi

# After all that, if a script happened to set the discovery URL, write it to disk for etcd-bootstrap
if [ -n "${ETCD_DISCOVERY_URL}"  ]; then
	echo "Using '${ETCD_DISCOVERY_URL}' as etcd discovery url"
	echo "[Service]
Environment=ETCD_DISCOVERY=${ETCD_DISCOVERY_URL}" > ${ETCD_SERVICE_D}/21-c10n.conf
# ...otherwise, we treat the provided user-data as a legacy c10n URL
elif [ -n "${C10N_TOKEN}" ]; then
	depwarn "Bootstrapping etcd with the c10n service is deprecated."

	echo "Using '$C10N_TOKEN' as c10n token"

	# Assert we have networking up and able to access the c10n service
	/usr/bin/block-until-url $C10N_ENDPOINT

	ETCD_PEERS=$(curl -s $C10N_ENDPOINT -d "c10n_url=$C10N_TOKEN" -d"ip_list=$IP")
	IPS=$(echo "$ETCD_PEERS" | grep -v $IP | grep -v '^$' | sed 's/$/:7001/'| tr '\n' ','| sed 's/^,//' | sed 's/,$//')
	echo "[Service]" > ${ETCD_SERVICE_D}/22-c10n.conf
	echo "Environment=ETCD_PEERS=${IPS}" >> ${ETCD_SERVICE_D}/22-c10n.conf
fi

if [ "$START_FLEET" = "1" ]; then
	echo "Starting fleet"
	systemctl start --no-block fleet
fi

# on generic images, we only set the name to the internal IP
echo "[Service]
Environment=ETCD_NAME=${IP}
Environment=ETCD_ADDR=${IP}:4001
Environment=ETCD_PEER_ADDR=${IP}:7001" > ${ETCD_SERVICE_D}/23-c10n.conf
