Created
January 2, 2012 07:36
-
-
Save muhqu/1549730 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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