Skip to content

Instantly share code, notes, and snippets.

@muhqu
Created January 2, 2012 07:36
Show Gist options
  • Save muhqu/1549730 to your computer and use it in GitHub Desktop.
Save muhqu/1549730 to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
usage() {
echo "Usage: $(basename $0) [ -i|--internal ] [ -s|--skip-cached ] [ --name NAME | --prefix PREFIX ] [-- options]"
echo " -i | --internal use internal IPs instead of external"
echo " -e | --external use external IPs instead of internal (default)"
echo " -s | --skip-cached skip the cached result of ec2-describe-instances, it gets cached for max 1 hour"
echo " --name NAME filter the output by instance NAME"
echo " --prefix PREFIX filter the output by instance name PREFIX"
echo " options passed to 'ec2-describe-instances'"
echo ""
echo "Examples: "
echo " $(basename $0) --name db16"
echo " $(basename $0) --prefix web"
echo " $(basename $0) -i -- --filter group-name=db"
echo ""
}
require_var() {
for name in $*; do
var=${!name}
[ -z "$var" ] && fatal "Missing environment variable \"$name\"" || true
done
}
require_bin() {
for binary in $*; do
which $binary >/dev/null \
|| fatal "Command \"$binary\" not found." \
"Did you run 'make' from $BASEDIR ?"
done
}
fatal() {
echo "ERROR: $1" >&2
shift
while [ ! -z "$1" ]; do
echo " $1" >&2
shift
done
echo -e "\nexiting." >&2
exit 1
}
error() {
echo "ERROR: $1" >&2
shift
while [ ! -z "$1" ]; do
echo " $1" >&2
shift
done
}
logn() {
echo -n [$(date +'%Y-%m-%d %H:%M:%S')] $*
}
log() {
echo [$(date +'%Y-%m-%d %H:%M:%S')] $*
}
timer() {
if [[ $# -eq 0 ]]; then
echo $(date '+%s')
else
local stime=$1
etime=$(date '+%s')
if [[ -z "$stime" ]]; then stime=$etime; fi
dt=$((etime - stime))
ds=$((dt % 60))
dm=$(((dt / 60) % 60))
dh=$((dt / 3600))
if [[ $dh -gt 0 ]]; then
printf '%d hours %2d min' $dh $dm $ds
elif [[ $dm -gt 0 ]]; then
printf '%2d min %2d sec' $dm $ds
else
printf '%2d sec' $ds
fi
fi
}
require_var "EC2_PRIVATE_KEY" "EC2_CERT" \
"EC2_HOME" "EC2_REGION" "EC2_ZONE"
require_bin "ec2-describe-instances"
INTERNAL="NO"
CACHED=""
PASS_OPTS=
FILTER_NAME=""
FILTER_PREFIX=""
until [ -z "$1" ]; do
case $1 in
-i|--internal)
shift; INTERNAL="YEA";
;;
-e|--external)
shift; INTERNAL="NO";
;;
-c|--cached)
shift; CACHED="YEA";
;;
-s|--skip-cached)
shift; CACHED="NO";
;;
--name)
shift; FILTER_NAME="$1"; shift
;;
--prefix)
shift; FILTER_PREFIX="$1"; shift
;;
--)
shift; PASS_OPTS=$*
break;
;;
-h|--help)
usage;
exit 0
;;
*)
echo "unknown option: $1";
usage;
exit 1
;;
esac
done
if [ -z "$CACHED" ]; then
if [ ! -z "$PASS_OPTS" ]; then
CACHED="NO"
else
CACHED="YEA"
fi
fi
if [ "$CACHED" = "YEA" -a ! -z "$PASS_OPTS" ]; then
echo "invalid argument: can not use opt -c|--cached when passing special params to ec2-describe-instances"
exit 1;
fi
CACHEFILE="/tmp/.ec2-hosts-cache"
if [ "$CACHED" = "YEA" ]; then
if [ ! -e $CACHEFILE -o ! "$(find $CACHEFILE -mmin +60 2>/dev/null)" = "" ]; then
OUTPUT=$(ec2-describe-instances | tee $CACHEFILE)
else
OUTPUT=$(cat $CACHEFILE)
fi
elif [ -z "$PASS_OPTS" ]; then
OUTPUT=$(ec2-describe-instances | tee $CACHEFILE)
else
OUTPUT=$(ec2-describe-instances $PASS_OPTS)
fi
#OUTPUT=$(cat dogbarf)
NAMES=$(echo "$OUTPUT" | grep ^TAG | grep Name | awk '{print $3" "$5}')
HOSTS=$(echo "$OUTPUT" | grep ^INSTANCE | grep running | awk 'BEGIN{FS="\t"};{print $2"\t"$18"\t"$5"\t"$17"\t"$4}')
(
IFS=$'\t'
echo "$HOSTS" | while read line; do
set -- $line
ID="$1"
PRIVATE_IP="$2"
PRIVATE_HOST="$3"
PUBLIC_IP="$4"
PUBLIC_HOST="$5"
NAME=$(echo "$NAMES" | grep ^$ID | awk '{print $2}')
IP=$(test "$INTERNAL" = "YEA" && echo "$PRIVATE_IP" || echo "$PUBLIC_IP")
SHOW="YEA"
if [ ! -z "$FILTER_NAME" ]; then
[ "$FILTER_NAME" = "$NAME" ] || SHOW="NO"
elif [ ! -z "$FILTER_PREFIX" ]; then
[ "$FILTER_PREFIX" = "${NAME:0:${#FILTER_PREFIX}}" ] || SHOW="NO"
fi
[ "$SHOW" = "YEA" ] && printf '%-16s %s %-16s % 52s % 45s\n' "$IP" "$ID" "$NAME" "$PUBLIC_HOST" "$PRIVATE_HOST"
done
) | sort -k 3 # sorting by name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment