#!/bin/bash

# Update EC2 kernel modules autmatically
udurl="http://169.254.169.254/1.0/user-data"
uddest="/etc/ec2/user-data"
uddir="/mnt/user-data"

##function: ensure_uddir
function ensure_uddir {
	mkdir -p "$uddir"
	if [ -d "$uddir" ]; then
		return 0
	else
		echo "Unable to create user-data directory"
		return 1
	fi
}

##function: handle_tar
function handle_tar {
	tarfile="$1"
	# Verify this is a tar (in case it was unpacked from something else)
	fileres=$(file -b "$tarfile")
	case "$fileres" in
	 "POSIX tar archive"*|"tar archive"*) ;;
	*) return 0;;
	esac
	echo "Trying to unpack user-data tarball"|logger -s -t "ec2"
	if [ $(type -p tar) ]; then
		(ensure_uddir && tar --extract --file="$tarfile" --directory="$uddir")|logger -s -t "ec2-user-data"
	else
		echo "tar not found"|logger -s -t "ec2"
	fi
}

ddir=$(dirname "$uddest")
mkdir -p "$ddir"

echo "Attempting to retreive user-data"
curl --retry 3 --retry-delay 0 --silent --fail -o "$uddest" "$udurl"
if [ $? -eq 0 -a -s "$uddest" ]; then
	echo "Retreived user-data"|logger -s -t "ec2"
	firstchars=$(head -c 2 "$uddest")
	if [ "$firstchars" == "#!" ]; then
		echo "Running user-data script"|logger -s -t "ec2"
		chmod a+x "$uddest"
		$uddest | logger -s -t "ec2-user-script"
	else
		echo "Trying to find file type for user-data"|logger -s -t "ec2"
		fileres=$(file -b "$uddest")
		case "$fileres" in
		"RPM v"* )
			echo "Trying to install user-data RPM"|logger -s -t "ec2"
			rpm -Uvh --nomanifest "$uddest"|logger -s -t "ec2-user-data" 
			;;
		"Zip archive data"*)
			echo "Trying to unpack user-data Zip"|logger -s -t "ec2"
			if [ $(type -p unzip) ]; then
				(ensure_uddir && unzip "$uddest" -d "$uddir")|logger -s -t "ec2-user-data"
			else
				echo "unzip not found"|logger -s -t "ec2"
			fi
			;;
		"POSIX tar archive"*|"tar archive"*)
			handle_tar "$uddest"
			;;
		"bzip2 compressed data"*)
			echo "Trying to unpack user-data bzip2"|logger -s -t "ec2"
			if [ $(type -p bzcat) ]; then
				(ensure_uddir && bzcat "$uddest" > "$uddir/uncompressed-user-data")|logger -s -t "ec2-user-data"
				[ -s "$uddir/uncompressed-user-data" ] && handle_tar "$uddir/uncompressed-user-data"
			else
				echo "bzcat not found"|logger -s -t "ec2"
			fi
			;;
		"gzip compressed data"*)
			echo "Trying to unpack user-data gzip"|logger -s -t "ec2"
			if [ $(type -p zcat) ]; then
				(ensure_uddir && zcat "$uddest" > "$uddir/uncompressed-user-data")|logger -s -t "ec2-user-data"
				[ -s "$uddir/uncompressed-user-data" ] && handle_tar "$uddir/uncompressed-user-data"
			else
				echo "zcat not found"|logger -s -t "ec2"
			fi
			;;
		*)
			echo "No user-data archive or package detected; not processing further"|logger -s -t "ec2"
			;;
		esac
	fi
else
	echo "Unable to retreive user-data"|logger -s -t "ec2"
fi
exit 0
