#!/bin/bash
# Amazon EC2 Pandora FMS Server plugin
# (c) Sancho Lerena 2011

# .. Config

# location of default config file
default_config_file=/usr/share/pandora_server/util/plugin/aws_plugin.conf
default_java_home=/usr


# .. Functions

function help {

	echo -e "Amazon EC2 Plugin for Pandora FMS Plugin server. http://pandorafms.com" 
	echo " "
	echo "This plugin is used to check performance of Volumes and Instances in the EC2 Cloud"
	echo "Syntax:" 
	echo -e "\t\t-A Access KEY ID, p.e AKIAILTVCAS26GTKLD4A"
	echo -e "\t\t-S Secret Access Key, p.e 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"
	echo -e "\t\t-R Region, p.e us-east-1"
	echo -e "\t\t-m Metric to gather (see doc for a metric list) "
	echo -e "\t\t-n Namespace (p.e: AWS/EC2, AWS/EBS) "
	echo -e "\t\t-i Target Instance or Target LB name (p.e: i-9d0b4af1) "
	echo -e "\t\t-a Availability Zone option for AWS/ELB (p.e: us-west-1b) "
	echo -e "\t\t-z Show default metrics "
	echo -e "\t\t-h Show this messages "
	echo "Samples:"
	echo "   ./ec2_plugin.sh -A AKIAILTVCAS26GTKLD4A -S CgmQ6DxUWES05txju+alJLoM57acDudHogkLotWk -i i-9d0b4af1 -n AWS/EC2 -m CPUUtilization"
	echo 

	exit 0
}

function check_required_variables {
	_result=OK;

# .. AWS_CLOUDWATCH_HOME
	if [ ! -d "$AWS_CLOUDWATCH_HOME" ] || [ ! -x $AWS_CLOUDWATCH_HOME/bin/mon-get-stats ]
	then
		echo "You need to define AWS_CLOUDWATCH_HOME settings."
		_result=NG;
	fi
	export AWS_CLOUDWATCH_HOME

# .. JAVA_HOME
	if [ -z "$JAVA_HOME" ] && [ -d "$default_java_home" ] && [ -x "$default_java_home/bin/java" ]
	then
		JAVA_HOME=$default_java_home
	fi
	if [ ! -d "$JAVA_HOME" ] || [ ! -x "$JAVA_HOME/bin/java" ]
	then
		echo "You need to define JAVA_HOME settings."
		_result=NG;
	fi
	export JAVA_HOME

# .. AWS_CREDENTIAL_FILE
	if [ ! -f "$AWS_CREDENTIAL_FILE" ] || [ ! -r "$AWS_CREDENTIAL_FILE" ]
	then
		echo "You need to define AWS_CREDENTIAL_FILE settings."
		_result=NG;
	fi
	export AWS_CREDENTIAL_FILE 

# .. EC2_REGION or AWS_CLOUDWATCH_URL
	if [ -z "$AWS_CLOUDWATCH_URL" ] && [ -z "$EC2_REGION" ]
	then
		echo "You need to define EC2_REGION or AWS_CLOUDWATCH_URL settings."
		_result=NG;
	fi
	if [ -z "$AWS_CLOUDWATCH_URL" ]
	then
		AWS_CLOUDWATCH_URL="http://monitoring.${EC2_REGION}.amazonaws.com"
	fi
	export AWS_CLOUDWATCH_URL

# check the result and abort if shomething wrong

	if [ "$_result" != "OK" ]
	then
		echo "Please read the documentation."
		echo "aborting..."
		exit 1;
	fi

	# optional settings...

	[ -n "$SERVICE_JVM_ARGS" ] && export SERVICE_JVM_ARGS 
}

function list_available_metrics {

	if [ -n "$list_metrics_in_raw_format" ]
	then
		${AWS_CLOUDWATCH_HOME}/bin/mon-list-metrics -show-long ${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY}
	else
		${AWS_CLOUDWATCH_HOME}/bin/mon-list-metrics -show-long ${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} |
			sed -e 's/\([^,]*\),\([^,]*\),{*\([^{}]*\)}.*/\2  \3  \1/' | sort
	fi

	exit 
}

function help_metrics {
    echo -e "Amazon EC2 Plugin for Pandora FMS Plugin server. http://pandorafms.com" 
    echo " "
    echo -e "This the default metric list, you can use any metric available these are the default"

    echo " "
    echo "For AWS/EC2 Namespace"
    echo " "
    echo "CPUUtilization"
    echo "DiskReadBytes"
    echo "DiskReadOps"
    echo "DiskWriteBytes"
    echo "DiskWriteOps"
    echo "NetworkIn"
    echo "NetworkOut "

    echo " " 
    echo "For AWS/EBS Namespace"
    echo " "
    echo "VolumeIdleTime"
    echo "VolumeQueueLength"
    echo "VolumeReadBytes"
    echo "VolumeReadOps"
    echo "VolumeTotalReadTime"
    echo "VolumeTotalWriteTime"
    echo "VolumeWriteBytes"
    echo "VolumeWriteOps"

    echo " " 
    echo "For AWS/RDS Namespace"
    echo " "
    echo "CPUUtilization"
    echo "DatabaseConnections"
    echo "DiskQueueDepth"
    echo "FreeStorageSpace"
    echo "FreeableMemory"
    echo "ReadIOPS"
    echo "ReadLatency"
    echo "ReadThroughput"
    echo "SwapUsage"
    echo "WriteIOPS"
    echo "WriteLatency"
    echo "WriteThroughput"

    echo " " 
    echo "For AWS/ELB Namespace"
    echo " "
    echo "HTTPCode_Backend_2XX"
    echo "HTTPCode_Backend_3XX"
    echo "HTTPCode_Backend_4XX"
    echo "HTTPCode_Backend_5XX"
    echo "HTTPCode_ELB_4XX"
    echo "HTTPCode_ELB_5XX"
    echo "HealthyHostCount"
    echo "Latency"
    echo "RequestCount"
    echo "UnHealthyHostCount"

    echo " "
    exit
}


if [ $# -eq 0 ]
then
        help
fi

TIMEOUT_CHECK=0
DOMAIN_CHECK=""
IP_CHECK=""
DNS_CHECK=""


# Main parsing code
while getopts ":zhlLf:d:i:n:m:A:S:R:a:C:" optname
  do
    case "$optname" in
      "f")
                arg_config_file="$OPTARG" ;;
      "h")
                help ;;
      "l")
                list_metrics=1 ;;
      "L")
		list_metrics_in_raw_format="yes"
                list_metrics=1 ;;
      "z")
                help_metrics ;;
      "A")
                OPT_ACCESS_KEY="--I $OPTARG" ;;
      "S")
                OPT_SECRET_KEY="--S $OPTARG" ;;
      "R")
                OPT_REGION="--region $OPTARG" ;;
      "n")
                NAMESPACE=$OPTARG ;;
      "d")
                arg_dimensions="$OPTARG" ;;
      "i")
                INSTANCE=$OPTARG ;;
      "m")
                METRIC=$OPTARG ;;
      "a")
                ZONE=$OPTARG ;;
      "C")
                CACHENODEID=$OPTARG ;;
      *)
                help ;;
    esac
done

config_file=${arg_config_file:-$default_config_file}
# Read config file
if [ -f "$config_file" ] && [ -r "$config_file" ]
then
	. $config_file
else
	echo "Cannot read $config_file."
fi

check_required_variables

if [ ! -z $list_metrics ]
then
        list_available_metrics
fi
if [ -z "$METRIC" ]
then
        help
fi
if [ -z "$NAMESPACE" ]
then
        help
fi

case "$NAMESPACE" in
  AWS/RDS)
	DIMENSIONS="${arg_dimensions:-DBInstanceIdentifier=$INSTANCE}" ;;
  AWS/ElastiCache)
	DIMENSIONS=${arg_dimensions:-"CacheClusterId=$INSTANCE,CacheNodeId=$CACHENODEID"} ;;
  AWS/ELB)
	if [ ! -z "$arg_dimensions" ]
	then
		DIMENSIONS=${arg_dimensions};
	else
		if [ ! -z "$INSTANCE" ]
		then
			DIMENSIONS="LoadBalancerName=$INSTANCE"
		fi
		if [ ! -z "$ZONE" ]
		then
			DIMENSIONS="${DIMENSIONS:+$DIMENSIONS,}AvailabilityZone=$ZONE"
		fi
	fi
	;;
  *)
	DIMENSIONS=
  #${arg_dimensions:-"InstanceId=$INSTANCE"}
  ;;
esac

if [ "$DIMENSIONS" == "" ]; then
  ${AWS_CLOUDWATCH_HOME}/bin/mon-get-stats ${METRIC} --namespace $NAMESPACE \
    ${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} -s Average --period 300 | \
    tail -1 | \
    awk '$3 ~ /^[-]?[0-9]+[.][0-9]+[Ee][+-]?[0-9]+$/{$3 = sprintf("%.3f",$3)} {print $3}'
else
  ${AWS_CLOUDWATCH_HOME}/bin/mon-get-stats ${METRIC} --namespace $NAMESPACE \
  	${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} -s Average --period 300 \
  	--dimensions "$DIMENSIONS" | tail -1 | \
  	awk '$3 ~ /^[-]?[0-9]+[.][0-9]+[Ee][+-]?[0-9]+$/{$3 = sprintf("%.3f",$3)} {print $3}'
fi